Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
1142642
sync(upstream): proxy feedback-image types and ptyctl client (1.0.6..…
TheStreamCode Aug 24, 2026
4577e5b
sync(upstream): chat-state, tracing client, proto-build exclude API (…
TheStreamCode Aug 24, 2026
1428a04
sync(upstream): kitty keyboard protocol tweak in pager-render
TheStreamCode Aug 24, 2026
8b7be0e
sync(upstream): tools 1.0.6..1.0.8 - MCP elicitation, shared HTTP cac…
TheStreamCode Aug 24, 2026
4b276de
sync(upstream): telemetry, version stamp, tty metrics, MCP wire/elici…
TheStreamCode Aug 24, 2026
75f77b6
fix(sync): drop the unused AsRawHandle import upstream's tty-utils ca…
TheStreamCode Aug 24, 2026
73a6210
fix(sync): gate the DirBuilder mut behind unix in telemetry's test he…
TheStreamCode Aug 24, 2026
cc48db0
sync(upstream): session-events gains McpOAuthProbeResolved
TheStreamCode Aug 24, 2026
973e437
sync(upstream): fast-worktree 1.0.6..1.0.8 - NFS backend, GC and safe…
TheStreamCode Aug 24, 2026
1f8315d
sync(upstream): workspace stack 1.0.6..1.0.8
TheStreamCode Aug 24, 2026
303ab8a
wip(sync): shell convergence - 12 error classes left, all mapped
TheStreamCode Aug 24, 2026
6cceca0
docs(sync): resume notes for the 1.0.8 branch
TheStreamCode Aug 24, 2026
636ca0c
wip(sync): shell fixes batch 2 - sampler consts, config field, notify…
TheStreamCode Aug 24, 2026
496e540
wip(sync): shell compiles - status_line/ui_config/sampler/extra-ca wi…
TheStreamCode Aug 24, 2026
fb4b13b
wip(sync): shell + pager compile - auth_method, billing, notification…
TheStreamCode Aug 24, 2026
f904488
test: record pager Windows baseline for the sync branch
TheStreamCode Aug 24, 2026
73abd3c
feat(privacy): compile-time deadening of the external OTEL stream
TheStreamCode Aug 24, 2026
ae33f07
docs: note compile-time telemetry deadening in PRIVACY.md and guides
TheStreamCode Aug 24, 2026
5e42ab0
fix(sync): pager-bin chat-mode env name + ClientCapabilities status_l…
TheStreamCode Aug 24, 2026
981cdf4
wip(sync): fix fast-worktree GcReport test + pager-bin chat-mode env
TheStreamCode Aug 24, 2026
5e432a4
fix(sync): restore Chutes env names and endpoint defaults in shell
TheStreamCode Aug 24, 2026
0404ee8
wip(sync): shell+pager compile; test-profile fixes pending
TheStreamCode Aug 24, 2026
15ae76c
fix(sync): base64 Engine import + transport String concat + auth fall…
TheStreamCode Aug 25, 2026
84d2598
fix(sync): shell test-profile fixes (BillingConfig, base64) + telemet…
TheStreamCode Aug 25, 2026
12f90a9
fix(auth): never default to xAI OAuth on Chutes Build
TheStreamCode Aug 25, 2026
00e9767
feat!: remove the advisor subagent and /advisor command
TheStreamCode Aug 25, 2026
a6adf85
feat(models): opt-in per-mode model switch ([models] plan_model/build…
TheStreamCode Aug 25, 2026
47d79c4
chore(ci): refresh Windows known-failure baseline after 1.0.8 port
TheStreamCode Aug 25, 2026
9a0db19
style: cargo fmt
TheStreamCode Aug 25, 2026
0e6da75
test(routing): serialize env mutation with a shared lock
TheStreamCode Aug 25, 2026
697d025
fix(auth): make the auth suite run on Windows and restore the Chutes …
TheStreamCode Aug 25, 2026
d623d4f
fix(sync): restore tool-text recovery lost in the session port
TheStreamCode Aug 25, 2026
f184309
chore(sync): apply rebrand across the 1.0.8 delta, advance to 1.0.8, …
TheStreamCode Aug 25, 2026
715e879
fix(brand): keep the upstream binary name out of generated completions
TheStreamCode Aug 25, 2026
cd044af
test(auth): pass quoted provider payloads via direct exec, not a shell
TheStreamCode Aug 25, 2026
f298a9d
style: cargo fmt
TheStreamCode Aug 25, 2026
a1802d6
fix(agent): re-apply the template-gate adaptation lost in the port
TheStreamCode Aug 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
16 changes: 16 additions & 0 deletions .github/known-failures/windows.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
# `scripts/known_failures.py`. A failure not listed here fails CI; an
# entry here that starts passing also fails CI, so the file cannot rot.
# Regenerate with `--record` and read the diff before committing it.
xai-grok-pager notifications::hooks::tests::omits_session_id_when_none
xai-grok-pager notifications::hooks::tests::run_hook_passes_correct_env_via_thread
xai-grok-pager notifications::hooks::tests::sets_environment_variables
xai-grok-pager notifications::hooks::tests::successful_command_completes_without_error
xai-grok-tools computer::local::terminal::tests::chunk_notifications_keep_flowing_after_truncation
xai-grok-tools computer::local::terminal::tests::chunk_notifications_sent_during_execution
xai-grok-tools computer::local::terminal::tests::output_file_capped_by_size_guard
Expand Down Expand Up @@ -77,9 +81,16 @@ xai-grok-tools types::resources::tests::resolve_model_path_quoted_literal_backsl
xai-grok-tools types::resources::tests::resolve_model_path_root_itself
xai-grok-tools types::resources::tests::resolve_model_path_trailing_newline_with_display
xai-grok-workspace discovery::tests::discover_agents_md_receives_normalized_rule_content
xai-grok-workspace discovery::tests::discover_plugins_finds_manifest_plugin
xai-grok-workspace discovery::tests::discover_plugins_json_has_expected_fields
xai-grok-workspace envrc::tests::test_path_add
xai-grok-workspace envrc::tests::test_simple_export
xai-grok-workspace folder_trust::tests::decide_inputs_flags_home_key_unrecordable
xai-grok-workspace folder_trust::tests::repo_config_kinds_matches_gate_and_reports_all_kinds
xai-grok-workspace folder_trust::tests::repo_configs_present_detects_project_agents
xai-grok-workspace folder_trust::tests::repo_configs_present_detects_project_agents_from_subdir
xai-grok-workspace folder_trust::tests::repo_configs_present_detects_project_plugins
xai-grok-workspace folder_trust::tests::repo_configs_present_detects_project_plugins_in_subdir
xai-grok-workspace permission::exec_risk::tests::attached_and_chained_c_paths
xai-grok-workspace permission::resolution::tests::accept_edits_unaffected_by_policy_pin
xai-grok-workspace permission::resolution::tests::bypass_permissions_blocked_by_policy_pin
Expand Down Expand Up @@ -112,9 +123,14 @@ xai-grok-workspace session::file_state::tests::test_truncate_from
xai-grok-workspace session::git::restore_code_tests::checkout_commit_with_fetch_pops_stash_on_unsupported_target
xai-grok-workspace session::git::restore_code_tests::pop_checkout_auto_stash_restores_dirty_tree
xai-grok-workspace session::git::restore_code_tests::soft_restore_restores_stash_when_reset_fails
xai-grok-workspace session::git::tests::get_worktree_info_db_record_without_marker
xai-grok-workspace session::git::tests::test_effective_cwd_roundtrip_with_compute_offset
xai-grok-workspace session::git::tests::test_effective_worktree_cwd_nested_offset
xai-grok-workspace session::git::tests::test_effective_worktree_cwd_single_level_offset
xai-grok-workspace trust::tests::workspace_key_collapses_standalone_grok_worktree_onto_source_repo
xai-grok-workspace trust::tests::workspace_key_collapses_worktree_onto_source_repo_git_root
xai-grok-workspace trust::tests::workspace_key_ignores_home_git_repo_for_subdir
xai-grok-workspace workspace_ops::tests::repos_list_does_not_load_user_global_manifest
xai-grok-workspace workspace_ops::tests::repos_manifest_search_dirs_skips_user_global_grok_home
xai-grok-workspace worktree::tests::lookup_worktree_label_resolves_from_nested_cwd
xai-grok-workspace worktree::tests::touch_worktree_for_cwd_sets_last_accessed_for_nested_cwd
6 changes: 3 additions & 3 deletions .github/upstream.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"repository": "xai-org/grok-build",
"branch": "main",
"versionManifest": "crates/codegen/xai-grok-pager-bin/Cargo.toml",
"lastReviewedCommit": "d71f6e0c",
"lastReviewedVersion": "1.0.5",
"lastReviewedCommit": "07b2f714",
"lastReviewedVersion": "1.0.8",
"lastReviewedRelease": null,
"reviewedAt": "2026-08-21"
"reviewedAt": "2026-08-25"
}
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,23 @@ All notable changes to Chutes Build will be documented in this file. The format
is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this
project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.3.0] - 2026-08-25

### Added

- **Opt-in model switching around plan mode.** `[models] plan_model` switches to a stronger model when plan mode engages and `[models] build_model` back to a cheaper one when it exits; each direction fires only when its key is set, a key that resolves to nothing logs a warning and keeps the current model, and the mode change itself never fails because of it. Client-driven transitions (Shift+Tab, `/plan`, the toggle ext method) are covered; approving an `exit_plan_mode` proposal keeps the current model.

### Changed

- **The runtime is synced to upstream `1.0.8` (`07b2f714`).** Ported by hand per area: MCP elicitation, shared HTTP client reuse, task-tool capability modes, kitty keyboard protocol, NFS fast-worktree backend, scheduled-task management, worktree detach/salvage, a new `xai-grok-status-line` crate, session-events, auth-manager bounded refresh, and the restructured agent tool registration.
- **The advisor subagent is removed.** The always-registered read-only reviewer (and its `/advisor` command writing untyped config tables) was an upstream concept this fork had no Chutes reason to keep; removing it shrinks the task-tool catalogue advertised to every model. Historical mentions in past changelog entries are records of past states.
- **Telemetry deadening verified end-to-end.** The external OTEL stream stays compile-time inert — `init` is a no-op, `is_active()` is constantly false, no exporter is ever constructed, and the silence tests pass regardless of environment or remote settings.

### Fixed

- **A fresh install is never sent through xAI's OAuth device flow.** The ported auth default constructed a hardcoded provider with the upstream issuer, so an unconfigured install opened `https://accounts.x.ai/oauth2/device` even with `CHUTES_API_KEY` present; the default now creates a provider only from explicit configuration, and the API-key scope constant returned to its Chutes value.
- **Tool calls a model emits as text are recovered again.** The upstream session port silently dropped the recovery shipped in 1.2.x — the module stayed in the tree unreferenced, compiling to nothing; the declaration, implementation, and call site are restored, and a new checker makes that failure mode impossible to miss.

## [1.2.4] - 2026-08-24

### Fixed
Expand Down
62 changes: 57 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ members = [
"crates/codegen/xai-grok-session-events",
"crates/codegen/xai-grok-session-search",
"crates/codegen/xai-grok-shared",
"crates/codegen/xai-grok-status-line",
"crates/codegen/xai-grok-shell",
"crates/codegen/xai-grok-shell-base",
"crates/codegen/xai-grok-shell-session-support",
Expand Down Expand Up @@ -200,6 +201,7 @@ num_cpus = "1"
oauth2 = "5"
obfstr = "0.4"
once_cell = "1"
loom = "0.7"
opentelemetry = "0.32"
opentelemetry-http = { version = "0.32", features = ["reqwest-blocking"] }
opentelemetry-otlp = { version = "0.32", features = ["grpc-tonic", "reqwest-blocking-client", "tls-roots"] }
Expand Down Expand Up @@ -332,6 +334,7 @@ xai-grok-session-events = { path = "crates/codegen/xai-grok-session-events" }
xai-grok-session-search = { path = "crates/codegen/xai-grok-session-search" }
xai-grok-shared = { path = "crates/codegen/xai-grok-shared" }
xai-grok-shell = { path = "crates/codegen/xai-grok-shell" }
xai-grok-status-line = { path = "crates/codegen/xai-grok-status-line" }
xai-grok-shell-base = { path = "crates/codegen/xai-grok-shell-base" }
xai-grok-shell-session-support = { path = "crates/codegen/xai-grok-shell-session-support" }
xai-grok-telemetry = { path = "crates/codegen/xai-grok-telemetry" }
Expand Down
5 changes: 5 additions & 0 deletions PRIVACY.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ Chutes Build is privacy-first: it collects no product analytics, emits no
telemetry, performs no remote error reporting, and does not upload traces or
sessions. There is no hidden opt-in or installation identifier.

The external OTEL telemetry stream is **deadened at compile time**: `init` is
a no-op, `is_active()` is always `false`, and no OTLP exporter is ever
constructed. No data can leave the process via this path regardless of any
environment variable or remote setting.

## Local data

The CLI may store configuration, an encrypted or OS-protected credential entry
Expand Down
21 changes: 21 additions & 0 deletions crates/build/xai-proto-build/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ pub struct XaiProtoBuilder {
gen_pbjson: bool,
pbjson_ignore_unknown_fields: bool,
pbjson_preserve_proto_field_names: bool,
pbjson_exclude: Vec<String>,
honor_debug_redact: bool,
}

Expand Down Expand Up @@ -87,6 +88,21 @@ impl XaiProtoBuilder {
self
}

/// Skip pbjson serde generation for these fully-qualified proto type
/// prefixes (e.g. `.model_config.RateLimit`). Use when a type is
/// `extern_path`'d into another crate that already provides its pbjson serde
/// impls, but the enclosing package's serde is still generated here —
/// otherwise pbjson would emit an orphan `impl Serialize for <foreign type>`.
/// Matching is segment-based, so `.pkg.Foo` does not match `.pkg.FooBar`.
pub fn pbjson_exclude<S: Into<String>>(
mut self,
prefixes: impl IntoIterator<Item = S>,
) -> Self {
self.pbjson_exclude
.extend(prefixes.into_iter().map(Into::into));
self
}

pub fn generate_default_stubs(self, enable: bool) -> Self {
self.map_builder(|b| b.generate_default_stubs(enable))
}
Expand Down Expand Up @@ -225,6 +241,7 @@ impl XaiProtoBuilder {
file_descriptor_set_path,
pbjson_ignore_unknown_fields,
pbjson_preserve_proto_field_names,
pbjson_exclude,
honor_debug_redact,
} = self;
let mut config = prost_build::Config::new();
Expand Down Expand Up @@ -320,6 +337,9 @@ impl XaiProtoBuilder {
if pbjson_preserve_proto_field_names {
builder.preserve_proto_field_names();
}
if !pbjson_exclude.is_empty() {
builder.exclude(pbjson_exclude);
}
builder
.build(&["."])
.context("Failed to build descriptor set")?;
Expand All @@ -340,6 +360,7 @@ pub fn configure() -> XaiProtoBuilder {
gen_pbjson: false,
pbjson_ignore_unknown_fields: false,
pbjson_preserve_proto_field_names: false,
pbjson_exclude: Vec::new(),
file_descriptor_set_path: None,
honor_debug_redact: false,
}
Expand Down
28 changes: 26 additions & 2 deletions crates/chutes-build-core/src/routing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,23 @@ pub fn auto_model_from_env() -> String {
)
}

/// Serialize process-global environment mutation across the routing tests.
///
/// `auto_model_from_env` and `auto_live_strategy` read
/// `CHUTES_ROUTING_STRATEGY`; the env-resolution test mutates it, and cargo
/// runs unit tests on parallel threads. A test that observes the ambient
/// strategy takes this lock so it cannot race the mutation.
#[cfg(test)]
pub(crate) mod test_support {
static ENV_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());

pub(crate) fn env_lock() -> std::sync::MutexGuard<'static, ()> {
ENV_LOCK
.lock()
.unwrap_or_else(|poisoned| poisoned.into_inner())
}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down Expand Up @@ -340,6 +357,11 @@ mod tests {

#[test]
fn live_auto_pool_appends_only_behind_the_dashboard_alias() {
// `auto_live_strategy` falls back to the ambient
// `CHUTES_ROUTING_STRATEGY` for the bare alias, so hold the env lock
// shared with `env_resolution_reads_pool_and_strategy` — cargo runs
// this crate's unit tests on parallel threads.
let _env = crate::routing::test_support::env_lock();
let live = ["a/One".to_owned(), "b/Two".to_owned()];
let mut chain = vec!["picked".to_owned(), "default".to_owned()];
append_live_auto_pool(&mut chain, &live, "default");
Expand Down Expand Up @@ -382,8 +404,10 @@ mod tests {

#[test]
fn env_resolution_reads_pool_and_strategy() {
// SAFETY: test-scoped env mutation, serialized by the suite runner
// (single-threaded harness for this crate's unit tests).
// Env mutation is process-global; the lock serializes it against the
// other tests that observe the ambient strategy.
let _env = crate::routing::test_support::env_lock();
// SAFETY: guarded by `env_lock`, test-scoped mutation only.
unsafe {
std::env::set_var(
"CHUTES_ROUTING_POOL",
Expand Down
Loading
Loading