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:
grokkybara[bot] 2026-08-03 08:17:57 +00:00
commit 780d1388ff
323 changed files with 12258 additions and 7226 deletions

View file

@ -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(&params.session_id) {
h.initial_client_mcp_servers = params.mcp_servers;
h.initial_client_mcp_servers = admitted;
}
ExtMethodResult::success(serde_json::json!({ "ok": true }))