Synced from monorepo
Synced from monorepo Changes: - grok-shell: send an expired external-provider credential to the sign-in flow, not a 401 loop - pager: clickable ▲ jumps to the top of the response being read - grok-shell: keep a large task log from making the completion message too long - Plan viewer scrollbar: widen grab zone to the border column; fix striped thumb in Terminal.app - pager: poll the tmux probe teardown grace instead of sleeping it - security: vendor-compat MCP kill switch is now actually enforced when reported as on - grok-shell: restore session eviction when a leader client disconnects - Bump rust-toolchain to 1.93.0 - workspace: lexical-normalize permission path patterns before glob matching - pager: reject garbage Enter in the /resume picker - pager: show Mermaid affordances in plan mode preview - pager: drop manage-account link from /session-info - workspace: auto-approve read-only git queries; defer write floor to auto classifier - Add free-form pattern editor to the "Always allow" command prompt - grok-shell: fix /btw caching - pager: Tab walks answers in the ask_user_question card - External-provider auth refresh: single 7s attempt instead of 3×5s - pager: don't resurrect finished background tasks as Running when completion arrives first - pager: report tmux truecolor clamping in Doctor - Fix plan viewer scrollbar click+drag hijacked by comment gutter - pager/shell: stop double Recap after the same last turn - sampler: preserve x-should-retry through stream collection - pager: clear plan-mode indicator immediately when the user approves a plan - pager: tmux does not re-read its config on reattach Source-Revision: 64c4de99cc822b25ce9c54ab5a4f372093d0885d
This commit is contained in:
parent
a422116582
commit
780d1388ff
323 changed files with 12258 additions and 7226 deletions
|
|
@ -27,6 +27,7 @@ use serde::Deserialize;
|
|||
|
||||
use super::{ExtResult, parse_params, to_raw_response};
|
||||
use crate::agent::MvpAgent;
|
||||
use crate::leader::protocol::InternalMethod;
|
||||
use crate::session::persistence::list_summaries;
|
||||
use crate::session::storage::StorageAdapter;
|
||||
use crate::session::storage::jsonl::JsonlStorageAdapter;
|
||||
|
|
@ -36,6 +37,9 @@ use xai_grok_telemetry::id::agent_id;
|
|||
|
||||
#[tracing::instrument(skip_all, fields(method = %args.method))]
|
||||
pub async fn handle(agent: &MvpAgent, args: &acp::ExtRequest) -> ExtResult {
|
||||
if let Some(method) = InternalMethod::from_name(args.method.as_ref()) {
|
||||
return handle_internal(agent, args, method).await;
|
||||
}
|
||||
match args.method.as_ref() {
|
||||
"x.ai/session/rename" => handle_session_rename(agent, args).await,
|
||||
"x.ai/session/delete" => handle_session_delete(agent, args).await,
|
||||
|
|
@ -43,21 +47,33 @@ pub async fn handle(agent: &MvpAgent, args: &acp::ExtRequest) -> ExtResult {
|
|||
#[cfg(feature = "local-workspace")]
|
||||
"x.ai/session/add_local_workspace" => handle_add_local_workspace(agent, args).await,
|
||||
"x.ai/session/fork" => handle_session_fork(agent, args).await,
|
||||
"x.ai/internal/reload_all_mcp_servers" => handle_reload_all_mcp_servers(agent).await,
|
||||
"x.ai/internal/reload_project_mcp_servers" => {
|
||||
handle_reload_project_mcp_servers(agent, args).await
|
||||
}
|
||||
"x.ai/internal/reload_skills" => handle_reload_skills(agent),
|
||||
"x.ai/internal/reload_workflows" => handle_reload_workflows(agent),
|
||||
"x.ai/internal/reload_models" => handle_reload_models(agent),
|
||||
"x.ai/internal/reload_models_cache" => handle_reload_models_cache(agent),
|
||||
"x.ai/internal/auth_cleared" => handle_auth_cleared(agent),
|
||||
"x.ai/plugins/reload" => handle_plugins_reload(agent).await,
|
||||
"x.ai/commands/list" => handle_commands_list(agent, args).await,
|
||||
_ => Err(acp::Error::method_not_found()),
|
||||
}
|
||||
}
|
||||
|
||||
/// Exhaustive, so a new [`InternalMethod`] cannot compile without a handler.
|
||||
async fn handle_internal(
|
||||
agent: &MvpAgent,
|
||||
args: &acp::ExtRequest,
|
||||
method: InternalMethod,
|
||||
) -> ExtResult {
|
||||
match method {
|
||||
InternalMethod::ReloadAllMcpServers => handle_reload_all_mcp_servers(agent).await,
|
||||
InternalMethod::ReloadProjectMcpServers => {
|
||||
handle_reload_project_mcp_servers(agent, args).await
|
||||
}
|
||||
InternalMethod::ReloadSkills => handle_reload_skills(agent),
|
||||
InternalMethod::ReloadWorkflows => handle_reload_workflows(agent),
|
||||
InternalMethod::ReloadModels => handle_reload_models(agent),
|
||||
InternalMethod::ReloadModelsCache => handle_reload_models_cache(agent),
|
||||
InternalMethod::AuthCleared => handle_auth_cleared(agent),
|
||||
// Arrives as a notification, so it never reaches this request path.
|
||||
InternalMethod::EvictSessions => Err(acp::Error::method_not_found()),
|
||||
}
|
||||
}
|
||||
|
||||
// session/rename
|
||||
|
||||
/// Handles renaming a session.
|
||||
|
|
@ -337,13 +353,18 @@ async fn handle_update_mcp_servers(agent: &MvpAgent, args: &acp::ExtRequest) ->
|
|||
(h, cwd)
|
||||
};
|
||||
|
||||
// Await managed first, then one compat snapshot for admit + merge so a
|
||||
// settings reapply mid-await cannot make the seed and spawned set disagree.
|
||||
let managed = agent.get_managed_mcp_configs().await;
|
||||
let compat = agent.cfg.borrow().compat_resolved;
|
||||
let admitted =
|
||||
crate::session::managed_mcp::admit_client_mcp_servers(params.mcp_servers, &cwd, &compat);
|
||||
let merged = crate::session::managed_mcp::merge_managed_mcp_servers(
|
||||
params.mcp_servers.clone(),
|
||||
admitted.clone(),
|
||||
&cwd,
|
||||
&managed,
|
||||
agent.plugin_registry_handle().snapshot().as_deref(),
|
||||
&agent.cfg.borrow().compat_resolved,
|
||||
&compat,
|
||||
);
|
||||
|
||||
let (tx, rx) = tokio::sync::oneshot::channel();
|
||||
|
|
@ -360,13 +381,11 @@ async fn handle_update_mcp_servers(agent: &MvpAgent, args: &acp::ExtRequest) ->
|
|||
.map_err(|_| acp::Error::internal_error().data("session closed"))?
|
||||
.map_err(|e| acp::Error::internal_error().data(e.to_string()))?;
|
||||
|
||||
// Persist the new client set on the handle so config hot-reloads
|
||||
// (`reload_all_mcp_servers` / `reload_project_mcp_servers`) re-merge from
|
||||
// the client's latest intent rather than the `session/new` snapshot —
|
||||
// otherwise a reload would resurrect servers the client just removed
|
||||
// (or drop ones it just added).
|
||||
// Store the admitted (not raw) client set: hot-reloads re-merge from this
|
||||
// seed, and a raw list would re-spawn a previously rejected vendor server
|
||||
// once on-disk attribution vanishes.
|
||||
if let Some(h) = agent.sessions.borrow_mut().get_mut(¶ms.session_id) {
|
||||
h.initial_client_mcp_servers = params.mcp_servers;
|
||||
h.initial_client_mcp_servers = admitted;
|
||||
}
|
||||
|
||||
ExtMethodResult::success(serde_json::json!({ "ok": true }))
|
||||
|
|
|
|||
Loading…
Reference in a new issue