Synced from monorepo
Synced from monorepo Changes: - Release a shell session's resources in one drop - Make the tools blocking-wait cap client-configurable and self-describing - Recognize API "exceeds budget" errors as context overflow - Retry /btw on model overload - Carry running background tasks and subagents across compaction - Require round-trip time for SDK liveness checks - Background-subagent completion reminders with a selectable delivery surface - Make a PTY shell reap itself until it reaches the registry - Recover the OS error code from a TLS-phase connection reset - Consume the attached-client signal and report why idle is withheld - Treat `.grok/sandbox.toml` edits as protected so auto mode prompts before writing - Surface history/search in the Ctrl+. cheatsheet and keep it working in history view - Delete sessions from the dashboard and welcome list - Release a session's activity record when the session ends - Stop charging auth-retry budget for fail-closed 401s; reset it across suspends - Scope skills watches on project vendor roots - Make [stop] cancel in-flight compaction - Make the leader soak measure the leader, not its harness Source-Revision: 8d69c91f02bcacf01e98d5aebbf2f92547c45738
This commit is contained in:
parent
dd04f397b1
commit
a422116582
165 changed files with 15161 additions and 1969 deletions
|
|
@ -31,6 +31,7 @@ const RPC_TIMEOUT: Duration = Duration::from_secs(60);
|
|||
#[serde(deny_unknown_fields)]
|
||||
struct Counts {
|
||||
sessions: usize,
|
||||
loading_sessions: usize,
|
||||
session_threads: usize,
|
||||
resident_resources: usize,
|
||||
retained_resources: usize,
|
||||
|
|
@ -45,6 +46,7 @@ struct Counts {
|
|||
subagent_active: usize,
|
||||
subagent_completed: usize,
|
||||
workspace_bindings: Option<usize>,
|
||||
workspace_activity_sessions: Option<usize>,
|
||||
}
|
||||
struct AutoApproveClient;
|
||||
#[async_trait::async_trait(?Send)]
|
||||
|
|
@ -91,6 +93,19 @@ async fn read_counts(conn: &acp::ClientSideConnection) -> Counts {
|
|||
serde_json::from_value(resp["result"]["registries"].clone())
|
||||
.unwrap_or_else(|e| panic!("x.ai/debug/agent: bad registries payload: {e}\n{resp}"))
|
||||
}
|
||||
/// Counts read once the actor threads are reaped. Nothing signals a thread
|
||||
/// exit, so this polls; both ends settle, so neither catches one mid-exit.
|
||||
async fn settled_counts(conn: &acp::ClientSideConnection) -> Counts {
|
||||
let mut counts = read_counts(conn).await;
|
||||
for _ in 0..100 {
|
||||
if counts.session_threads == 0 {
|
||||
break;
|
||||
}
|
||||
tokio::time::sleep(Duration::from_millis(100)).await;
|
||||
counts = read_counts(conn).await;
|
||||
}
|
||||
counts
|
||||
}
|
||||
async fn new_session(conn: &acp::ClientSideConnection, cwd: &std::path::Path) -> acp::SessionId {
|
||||
tokio::time::timeout(
|
||||
RPC_TIMEOUT,
|
||||
|
|
@ -252,21 +267,29 @@ fn session_churn_returns_registry_snapshot_to_baseline() {
|
|||
agent_rt.block_on(local.run_until(async move {
|
||||
let client_conn = connect_and_auth().await;
|
||||
churn_one(&client_conn, workdir.path(), 0).await;
|
||||
let baseline = read_counts(&client_conn).await;
|
||||
let baseline = settled_counts(&client_conn).await;
|
||||
assert_eq!(
|
||||
baseline.sessions, 0,
|
||||
"warmup session must be fully removed before baseline"
|
||||
);
|
||||
assert_eq!(
|
||||
(baseline.resident_resources, baseline.retained_resources),
|
||||
(0, 0),
|
||||
(
|
||||
baseline.resident_resources,
|
||||
baseline.retained_resources,
|
||||
baseline.loading_sessions
|
||||
),
|
||||
(0, 0, 0),
|
||||
"warmup must leave no per-session resource entries, including \
|
||||
entries holding no resources"
|
||||
);
|
||||
assert_eq!(
|
||||
baseline.workspace_bindings,
|
||||
Some(0),
|
||||
"warmup must have built the local workspace and released its binding"
|
||||
(
|
||||
baseline.workspace_bindings,
|
||||
baseline.workspace_activity_sessions
|
||||
),
|
||||
(Some(0), Some(0)),
|
||||
"warmup must have built the local workspace and released both its \
|
||||
binding and its activity record"
|
||||
);
|
||||
assert_eq!(
|
||||
(
|
||||
|
|
@ -295,7 +318,7 @@ fn session_churn_returns_registry_snapshot_to_baseline() {
|
|||
}))
|
||||
.await;
|
||||
futures::future::join_all(concurrent.iter().map(|sid| close_session(conn, sid))).await;
|
||||
let after = read_counts(&client_conn).await;
|
||||
let after = settled_counts(&client_conn).await;
|
||||
assert_eq!(
|
||||
after, baseline,
|
||||
"session churn must return every registry count to baseline \
|
||||
|
|
|
|||
Loading…
Reference in a new issue