Synced from monorepo

Synced from monorepo

Changes:
- Temporarily disable session share link creation in the TUI
- Do not approve plan on empty Enter from the revise prompt
- Expose chat product Skills via ACP available_commands_update
- Return immediately from a blocking wait on an already-completed ACP task
- Split headless pager module for clearer structure
- Stop git worktree prune from removing user registrations on resume
- Use compaction sampler tokenizer for item token counts
- Opt-in extra root CAs via GROK_EXTRA_CA_BUNDLE
- Cancel all session subagents when the user stops
- Let the session persistence actor exit when its session ends
- Make fullscreen terminal resize much cheaper on long sessions
- Report honestly from kill_task when an ACP task does not exist
- Hide /usage for external-auth deployments
- Forward the history-load trailer’s computer_reason to the client
- Remove ineffective no-op tool reminder
- Declare slash-command screen-mode support in one place
- Keep settings enum picker on the committed value until Enter
- Reap a PTY’s full process tree
- Stream tool calls from headless mode over ACP
- Bridge gateway task lifecycle to ACP for chat session background tasks
- Don’t warn about truncated history on a suppressed replay
- Fit full-replace summarizer input and recover on context-length errors
- Stop dropping agents over an unrecognized frontmatter color
- Add /undo as a slash alias for /rewind
- Harden sleep/wake token-refresh paths against forced re-login
- Add session/list ACP method
- Give each sampling backend its own conversion module
- Treat an unenrolled child process as a lint error
- Suppress the cancelled marker on send-now wake turns
- Stop tearing down Roslyn on every edit, and read C# diagnostics

Source-Revision: 2a28b4a86cfc4a4c133c35b7fc2a6a9964387c39
This commit is contained in:
grokkybara[bot] 2026-07-30 19:07:40 +00:00
commit dd04f397b1
367 changed files with 29489 additions and 10051 deletions

View file

@ -6,7 +6,7 @@ use std::sync::{Arc, OnceLock};
use std::time::Instant;
use dashmap::DashMap;
use xai_file_utils::events::{Event, EventWriter, ToolOutcome};
use xai_file_utils::events::{Event, EventWriter, ToolCompletedSource, ToolOutcome};
use xai_file_utils::queue::UploadQueueStats;
use xai_tool_protocol::{ToolServerLifecycleStatus, ToolServerStatusPayload};
@ -442,11 +442,13 @@ impl ActivityTracker {
// captured writer handle keeps the file open). `duration_ms` is always
// truthful because the start time is paired with the writer.
if let Some((_, (started_ms, writer))) = self.call_started_ms.remove(call_id) {
let duration_ms = now.saturating_sub(started_ms);
// Workspace = hub/proxy hop; join package durations on shell rows (no source).
writer.emit(Event::ToolCompleted {
tool_name,
duration_ms,
duration_ms: now.saturating_sub(started_ms),
outcome,
tool_call_id: call_id.to_owned(),
source: ToolCompletedSource::Workspace,
});
}
}
@ -1879,6 +1881,7 @@ mod tests {
assert_eq!(events[1]["type"], "tool_completed");
assert_eq!(events[1]["tool_name"], "read_file");
assert_eq!(events[1]["outcome"], "success");
assert_eq!(events[1]["source"], "workspace");
assert!(
events[1]["duration_ms"].as_u64().is_some(),
"ToolCompleted must carry a duration_ms"