Synced from monorepo
Changes: - Gate session-lifecycle heap steady state with a dhat soak - Unbreak merge lifecycle e2e after default model → grok-4.5 - Scan home-scope rules dirs at <root>/rules - Complete text-input paste and terminal parity - Gate project roles and personas - Use canonical editing in dialogs - Use canonical editing in search bars - Reject ambiguous MCP tool IDs - Harden Git operands for plugins - Simplify queue drain API - Pass RFC 9207 iss through MCP OAuth token exchange - Show leader roster when local agents map is empty - Use canonical editing in Persona views - Remove marketplace default-skills auto-install and purge old installs - Use canonical editing in extension forms - Add canonical dashboard text editing - Use canonical editing in settings - Add /summarize as a /recap alias - Restore previous agent when exiting dashboard - Use tool_choice auto for compaction - Settings toggle for snap-prompt-to-top on send - Update default models to grok-4.5 - Source login shell once for local bash (env + alias/function snapshot) - Template hardcoded param names in server-native tool descriptions - Fix System-Reminder XML tag injection in CLAUDE.md via agents_md - Fix remote workspace-server hardcoding LSP trust (repo code execution risk) - Clear orphaned tool-call updates at turn end - Suppress task wake after cancel - Send x-grok-client-identifier on direct API tool calls - Harden dashboard peek lease transitions - Host /btw side panel in live region (minimal mode) - Bound scroll presentation latency - Highlight multi-line constructs correctly in diffs and the file viewer - Block web_fetch non-public IPs; local opt-in is explicit-host only - Seed coding_data_retention_opt_out=false for OAuth e2es in pty-harness - Follow up clipboard delivery feedback - Use canonical editing in pickers - Route TextArea through canonical editor - Persistent "watching" status row; quieter turn markers - Gate sensitive edit targets - Expose agent registry counts and gate session churn on them - Default coding data sharing to opt-out until server preference applies - Wire chat attachment ids through gateway prompts - On auth refresh failure, issue retry - Forward preview provenance and computer lifecycle state - Document independent privacy controls and scope /privacy output - Strip SamplingError Display prefix on rate-limit UI copy - Stop dumping Cloudflare HTML into Retry failed - Disable in-place prompt edit (scroll jank on enter) - Strip forced ANSI color from gh pr view JSON - Plumb bash tool description onto ToolUsageCard wire
This commit is contained in:
parent
98c3b2438a
commit
7cfcb20d2b
292 changed files with 23315 additions and 9209 deletions
|
|
@ -84,13 +84,21 @@ async fn gh_pr_view_by_branch(cwd: &str, branch: &str) -> Option<PrData> {
|
|||
.stdin(std::process::Stdio::null());
|
||||
xai_grok_tools::util::detach_command(&mut cmd);
|
||||
cmd.envs(xai_grok_tools::util::pager_env());
|
||||
// gh colorizes even piped --json output under CLICOLOR_FORCE or
|
||||
// GH_FORCE_TTY (inherited from terminal-launched dev environments), and
|
||||
// forcing beats NO_COLOR in gh's precedence; there is no --no-color flag
|
||||
// (cli/cli#9436). CLICOLOR_FORCE=0 is gh's documented off-switch.
|
||||
cmd.env("NO_COLOR", "1");
|
||||
cmd.env("CLICOLOR_FORCE", "0");
|
||||
cmd.env_remove("GH_FORCE_TTY");
|
||||
let output = cmd.output().await.ok()?;
|
||||
|
||||
if !output.status.success() {
|
||||
return None;
|
||||
}
|
||||
|
||||
let parsed = serde_json::from_slice::<GhPrViewResponse>(&output.stdout).ok()?;
|
||||
let parsed =
|
||||
serde_json::from_slice::<GhPrViewResponse>(&strip_ansi_csi(&output.stdout)).ok()?;
|
||||
let url = parsed.url?;
|
||||
let state = match parsed
|
||||
.state
|
||||
|
|
@ -131,7 +139,10 @@ async fn gh_pr_is_in_merge_queue(cwd: &str, pr_url: &str) -> bool {
|
|||
.stdin(std::process::Stdio::null());
|
||||
xai_grok_tools::util::detach_command(&mut cmd);
|
||||
cmd.envs(xai_grok_tools::util::pager_env());
|
||||
// Forcing (CLICOLOR_FORCE/GH_FORCE_TTY) beats NO_COLOR in gh's precedence.
|
||||
cmd.env("NO_COLOR", "1");
|
||||
cmd.env("CLICOLOR_FORCE", "0");
|
||||
cmd.env_remove("GH_FORCE_TTY");
|
||||
let output = match cmd.output().await {
|
||||
Ok(output) => output,
|
||||
Err(_) => return false,
|
||||
|
|
@ -187,6 +198,18 @@ fn strip_ansi_csi(bytes: &[u8]) -> Vec<u8> {
|
|||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn gh_pr_view_json_parses_after_stripping_forced_color() {
|
||||
let stdout = b"\x1b[1;37m{\x1b[m\n \x1b[1;34m\"isDraft\"\x1b[m\x1b[1;37m:\x1b[m \x1b[33mfalse\x1b[m\x1b[1;37m,\x1b[m\n \x1b[1;34m\"number\"\x1b[m\x1b[1;37m:\x1b[m 242682\x1b[1;37m,\x1b[m\n \x1b[1;34m\"state\"\x1b[m\x1b[1;37m:\x1b[m \x1b[32m\"OPEN\"\x1b[m\x1b[1;37m,\x1b[m\n \x1b[1;34m\"title\"\x1b[m\x1b[1;37m:\x1b[m \x1b[32m\"t\"\x1b[m\x1b[1;37m,\x1b[m\n \x1b[1;34m\"url\"\x1b[m\x1b[1;37m:\x1b[m \x1b[32m\"https://github.com/xai-org/xai/pull/242682\"\x1b[m\n\x1b[1;37m}\x1b[m\n";
|
||||
let parsed = serde_json::from_slice::<GhPrViewResponse>(&strip_ansi_csi(stdout)).unwrap();
|
||||
assert_eq!(parsed.number, Some(242682));
|
||||
assert_eq!(parsed.state.as_deref(), Some("OPEN"));
|
||||
assert_eq!(
|
||||
parsed.url.as_deref(),
|
||||
Some("https://github.com/xai-org/xai/pull/242682")
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_is_in_merge_queue_true() {
|
||||
let stdout = br#"{"data":{"resource":{"isInMergeQueue":true}}}"#;
|
||||
|
|
|
|||
Loading…
Reference in a new issue