diff --git a/CHANGELOG.md b/CHANGELOG.md index 0deb0a00..5e622b66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ them (`v0.1.0` … `v1.19.0`); the 1.x ranges below are derived from that history, not written from memory. Rust alpha and beta tags identify previews; the stable 2.0 release has not been cut. +## 2.0.0-beta.76 — 2026-11-12 + +**Protected Codex 0.165.0** + +- Update **`codex-current`** to protected Codex **0.165.0**, pinned to `360319d8dee62d87e2d59fc0c21805d79519cfed`. Fixes the blocked automatic update (#284). +- Port **`run_pre_compact_hooks`** to 0.165's environment hooks. Environment requirements hooks can stop compaction but cannot satisfy the trusted session-flags approval. +- Retain the exact 0.164.0 contract for saved Docker sessions and installer rollback. Build inputs stay Rust 1.99.1 and V8 152.2.0. + ## 2.0.0-beta.75 — 2026-11-12 **LORE 0.62.26** diff --git a/Cargo.lock b/Cargo.lock index 1c01b3b7..38b9a1c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -453,7 +453,7 @@ dependencies = [ [[package]] name = "doxa-claude" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "doxa-input", "doxa-isolation", @@ -465,7 +465,7 @@ dependencies = [ [[package]] name = "doxa-codegraph" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "libc", "proc-macro2", @@ -481,7 +481,7 @@ dependencies = [ [[package]] name = "doxa-daemon" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "doxa-claude", "doxa-engines", @@ -513,7 +513,7 @@ dependencies = [ [[package]] name = "doxa-engines" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "doxa-input", "doxa-isolation", @@ -529,7 +529,7 @@ dependencies = [ [[package]] name = "doxa-fleet" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "doxa-isolation", "doxa-protocol", @@ -547,7 +547,7 @@ dependencies = [ [[package]] name = "doxa-hub" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "base64 0.22.1", "bytes", @@ -571,7 +571,7 @@ dependencies = [ [[package]] name = "doxa-input" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "base64 0.22.1", "image", @@ -583,7 +583,7 @@ dependencies = [ [[package]] name = "doxa-isolation" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "doxa-router", "errno", @@ -597,7 +597,7 @@ dependencies = [ [[package]] name = "doxa-lore" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "doxa-codegraph", "doxa-state", @@ -611,7 +611,7 @@ dependencies = [ [[package]] name = "doxa-mcp" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "doxa-vendors", "libc", @@ -624,7 +624,7 @@ dependencies = [ [[package]] name = "doxa-peers" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "bytes", "doxa-isolation", @@ -646,7 +646,7 @@ dependencies = [ [[package]] name = "doxa-protocol" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "serde", "serde_json", @@ -654,7 +654,7 @@ dependencies = [ [[package]] name = "doxa-remote" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "bytes", "doxa-lore", @@ -676,7 +676,7 @@ dependencies = [ [[package]] name = "doxa-remote-wire" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "aes-gcm", "base64 0.22.1", @@ -688,7 +688,7 @@ dependencies = [ [[package]] name = "doxa-router" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "doxa-vendors", "libc", @@ -702,7 +702,7 @@ dependencies = [ [[package]] name = "doxa-runtime" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "doxa-input", "doxa-protocol", @@ -713,7 +713,7 @@ dependencies = [ [[package]] name = "doxa-state" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "libc", "serde", @@ -726,7 +726,7 @@ dependencies = [ [[package]] name = "doxa-transcript" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "doxa-vendors", "libc", @@ -737,7 +737,7 @@ dependencies = [ [[package]] name = "doxa-tui" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "crossterm", "doxa-claude", @@ -786,7 +786,7 @@ dependencies = [ [[package]] name = "doxa-vendors" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "futures-util", "libc", @@ -798,7 +798,7 @@ dependencies = [ [[package]] name = "doxa-worktrees" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" dependencies = [ "doxa-isolation", "doxa-state", diff --git a/rust/doxa-claude/Cargo.toml b/rust/doxa-claude/Cargo.toml index 690fae09..9178fdbb 100644 --- a/rust/doxa-claude/Cargo.toml +++ b/rust/doxa-claude/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-claude" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-codegraph/Cargo.toml b/rust/doxa-codegraph/Cargo.toml index c71c47ad..27d331b6 100644 --- a/rust/doxa-codegraph/Cargo.toml +++ b/rust/doxa-codegraph/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-codegraph" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-daemon/Cargo.toml b/rust/doxa-daemon/Cargo.toml index bfb25768..73d73c4e 100644 --- a/rust/doxa-daemon/Cargo.toml +++ b/rust/doxa-daemon/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-daemon" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-engines/Cargo.toml b/rust/doxa-engines/Cargo.toml index dc4813ae..aaa3e168 100644 --- a/rust/doxa-engines/Cargo.toml +++ b/rust/doxa-engines/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-engines" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-engines/README.md b/rust/doxa-engines/README.md index ad360490..25c3787d 100644 --- a/rust/doxa-engines/README.md +++ b/rust/doxa-engines/README.md @@ -22,7 +22,7 @@ Assistant text and reasoning are bounded and scrubbed as complete messages. The ## Compaction protection -Protected sessions require DOXA's private **Codex 0.164.0** app server with contract `doxa-precompact-fail-closed-v1`. Before thread startup, DOXA checks the build identity, trusted synchronous `PreCompact` hook hash, and disabled token-budget and asynchronous compaction flags. The protected payload also refuses speculative background compaction internally, regardless of client feature overrides. Stock or unsupported app servers fail before creating or resuming a protected thread. +Protected sessions require DOXA's private **Codex 0.165.0** app server with contract `doxa-precompact-fail-closed-v1`. Before thread startup, DOXA checks the build identity, trusted synchronous `PreCompact` hook hash, and disabled token-budget and asynchronous compaction flags. The protected payload also refuses speculative background compaction internally, regardless of client feature overrides. Stock or unsupported app servers fail before creating or resuming a protected thread. The hook binds the actual provider thread and owned rollout, prepares a scrubbed snapshot, and waits for the native LORE reviewer. Manual `/compact` independently reviews the same bound source and rechecks its identity and digest before submission. Missing, failed, timed-out, changed, asynchronous, or duplicate review blocks replacement; a worker exit code without an exact receipt is insufficient. DOXA also waits for matching hook and compaction events after submission. It does not overwrite global Codex settings or trust unrelated user hooks. @@ -34,7 +34,7 @@ On resume, current occupancy comes from the owned thread's latest bounded token DOXA disables Codex's internal multi-agent spawning and verifies that policy before starting a protected thread. Fleet/session creation and peer messages go through DOXA so visible identities, review and account limits remain authoritative. Existing injected peer tools remain available. -The private provider makes the decision inside `run_pre_compact_hooks`, before compaction inference or history replacement. Exactly one required synchronous command must return explicit JSON approval. The provider identifies itself as `doxa_codex_rs/0.164.0` and does not impersonate stock Codex. [Earlier 0.156.1 authenticated default-window verification](../../docs/live-default-window-compaction-2026-09-30.md). +The private provider makes the decision inside `run_pre_compact_hooks`, before compaction inference or history replacement. Exactly one required synchronous command must return explicit JSON approval. The provider identifies itself as `doxa_codex_rs/0.165.0` and does not impersonate stock Codex. [Earlier 0.156.1 authenticated default-window verification](../../docs/live-default-window-compaction-2026-09-30.md). ## Install the protected provider @@ -48,7 +48,7 @@ python3 scripts/install_codex_protected.py \ --launcher "$PWD/target/debug/doxa-codex-protected" ``` -The installer pins source commit `6aaac694803004a63c6f393d153c96d22521a6b9` and a reviewed patch checksum. Each upstream/patch identity gets a separate retained source checkout. Cross-version publication checks the old receipt and helper bytes before selecting a new immutable artifact; rollback retains that prior provider. The patch normalizes local workspace package versions in the upstream lockfile; external sources and checksums stay fixed. A bounded initialize probe checks the compiled contract. Receipts bind the source, patch, dispatcher, server, and helper bytes. The code-mode helper's V8 inputs come from checksum-verified official artifacts. Changed fingerprints, corrupt installs, or partial receipts are refused; a fresh reviewed rebuild publishes a new immutable directory and atomically selects it for new launches. Existing processes keep their original files. An explicit `--codex-bin` takes precedence. +The installer pins source commit `360319d8dee62d87e2d59fc0c21805d79519cfed` and a reviewed patch checksum. Each upstream/patch identity gets a separate retained source checkout. Cross-version publication checks the old receipt and helper bytes before selecting a new immutable artifact; rollback retains that prior provider. The patch normalizes local workspace package versions in the upstream lockfile; external sources and checksums stay fixed. A bounded initialize probe checks the compiled contract. Receipts bind the source, patch, dispatcher, server, and helper bytes. The code-mode helper's V8 inputs come from checksum-verified official artifacts. Changed fingerprints, corrupt installs, or partial receipts are refused; a fresh reviewed rebuild publishes a new immutable directory and atomically selects it for new launches. Existing processes keep their original files. An explicit `--codex-bin` takes precedence. Set `DOXA_CODEX_PROTECTED_CACHE` to choose the standard build cache, or pass `--cache` to the standalone builder. `DOXA_INSTALL_CODEX_PROTECTED=0` skips this optional provider. The official Codex CLI remains available for login and help; DOXA does not replace it. diff --git a/rust/doxa-engines/src/bin/doxa-codex-protected.rs b/rust/doxa-engines/src/bin/doxa-codex-protected.rs index d66e07d8..41ff77b6 100644 --- a/rust/doxa-engines/src/bin/doxa-codex-protected.rs +++ b/rust/doxa-engines/src/bin/doxa-codex-protected.rs @@ -18,9 +18,9 @@ use std::{ process::Command, }; -const SOURCE: &str = "6aaac694803004a63c6f393d153c96d22521a6b9"; +const SOURCE: &str = "360319d8dee62d87e2d59fc0c21805d79519cfed"; const CONTRACT: &str = "doxa-precompact-fail-closed-v1"; -const PATCH: &str = "f8759872787029e5bf7064fe5be7166c5367b1db09b4b60362ea625117658924"; +const PATCH: &str = "128293eb2e10aebdff916ab1d8fbce30fa10eba2dfac01cc501f9c1591034484"; const MAX_BINARY: u64 = 1024 * 1024 * 1024; #[derive(Deserialize)] diff --git a/rust/doxa-engines/src/codex_appserver.rs b/rust/doxa-engines/src/codex_appserver.rs index 68a6557b..682a7fba 100644 --- a/rust/doxa-engines/src/codex_appserver.rs +++ b/rust/doxa-engines/src/codex_appserver.rs @@ -2,7 +2,8 @@ //! Interactive requests require a host bridge; unknown requests are refused. //! //! The shapes below come from `codex app-server generate-ts --experimental` -//! (Codex 0.164.0). Stdio is newline-delimited JSON-RPC without LSP headers. +//! (Codex 0.164.0; the request shapes used here are unchanged in 0.165.0). +//! Stdio is newline-delimited JSON-RPC without LSP headers. use std::io; use std::os::unix::{process::CommandExt, net::UnixStream, io::AsRawFd}; use std::collections::VecDeque; @@ -1264,9 +1265,9 @@ for line in sys.stdin: #[test] fn provider_version_uses_only_the_authoritative_product_prefix() { - let desktop = "Codex Desktop/0.164.0 (Ubuntu 26.4.0; x86_64) dumb (doxa; 2.0.0-alpha.37)"; + let desktop = "Codex Desktop/0.165.0 (Ubuntu 26.4.0; x86_64) dumb (doxa; 2.0.0-alpha.37)"; assert_eq!(provider_version(desktop), Some(crate::codex_compact::SUPPORTED_VERSION)); - assert_eq!(provider_version("codex_cli_rs/0.164.0"), Some(crate::codex_compact::SUPPORTED_VERSION)); + assert_eq!(provider_version("codex_cli_rs/0.165.0"), Some(crate::codex_compact::SUPPORTED_VERSION)); let current = crate::codex_compact::SUPPORTED_VERSION; for agent in [ format!("Codex Desktop/0.1.0 (doxa; {current})"), diff --git a/rust/doxa-engines/src/codex_compact.rs b/rust/doxa-engines/src/codex_compact.rs index 62020c54..87044603 100644 --- a/rust/doxa-engines/src/codex_compact.rs +++ b/rust/doxa-engines/src/codex_compact.rs @@ -9,10 +9,10 @@ use std::io::Write; #[cfg(test)] use std::os::unix::fs::PermissionsExt; -pub const SUPPORTED_VERSION: &str = "0.164.0"; -pub const PROTECTED_AGENT_PREFIX: &str = "doxa_codex_rs/0.164.0 (doxa-precompact-fail-closed-v1; "; -pub const SUPPORTED_SOURCE: &str = "6aaac694803004a63c6f393d153c96d22521a6b9"; -pub const SUPPORTED_PATCH: &str = "f8759872787029e5bf7064fe5be7166c5367b1db09b4b60362ea625117658924"; +pub const SUPPORTED_VERSION: &str = "0.165.0"; +pub const PROTECTED_AGENT_PREFIX: &str = "doxa_codex_rs/0.165.0 (doxa-precompact-fail-closed-v1; "; +pub const SUPPORTED_SOURCE: &str = "360319d8dee62d87e2d59fc0c21805d79519cfed"; +pub const SUPPORTED_PATCH: &str = "128293eb2e10aebdff916ab1d8fbce30fa10eba2dfac01cc501f9c1591034484"; #[derive(serde::Deserialize)] #[serde(deny_unknown_fields)] diff --git a/rust/doxa-engines/src/codex_interaction.rs b/rust/doxa-engines/src/codex_interaction.rs index 16f8f835..fb94b53d 100644 --- a/rust/doxa-engines/src/codex_interaction.rs +++ b/rust/doxa-engines/src/codex_interaction.rs @@ -1,4 +1,4 @@ -//! Official Codex 0.164.0 server requests mapped to DOXA's input protocol. +//! Official Codex 0.165.0 server requests mapped to DOXA's input protocol. //! Replies are single use and apply only to the currently displayed request. use std::sync::{atomic::{AtomicU64, Ordering}, Mutex}; use serde_json::{json, Map, Value}; diff --git a/rust/doxa-engines/tests/codex_launcher.rs b/rust/doxa-engines/tests/codex_launcher.rs index 4e0411d5..b9524830 100644 --- a/rust/doxa-engines/tests/codex_launcher.rs +++ b/rust/doxa-engines/tests/codex_launcher.rs @@ -2,7 +2,7 @@ use serde_json::json; use sha2::{Digest, Sha256}; use std::{fs, os::unix::fs::PermissionsExt, process::Command}; -const PATCH: &str = "f8759872787029e5bf7064fe5be7166c5367b1db09b4b60362ea625117658924"; +const PATCH: &str = "128293eb2e10aebdff916ab1d8fbce30fa10eba2dfac01cc501f9c1591034484"; fn fixture() -> tempfile::TempDir { let dir = tempfile::tempdir().unwrap(); fs::set_permissions(dir.path(), fs::Permissions::from_mode(0o700)).unwrap(); @@ -38,8 +38,8 @@ fn fixture() -> tempfile::TempDir { ) .unwrap(); fs::write(dir.path().join("receipt.json"),json!({"contract":"doxa-precompact-fail-closed-v1", - "source_commit":"6aaac694803004a63c6f393d153c96d22521a6b9","patch_sha256":PATCH, - "code_mode_host_source_commit":"6aaac694803004a63c6f393d153c96d22521a6b9", + "source_commit":"360319d8dee62d87e2d59fc0c21805d79519cfed","patch_sha256":PATCH, + "code_mode_host_source_commit":"360319d8dee62d87e2d59fc0c21805d79519cfed", "code_mode_host_sha256":format!("{:x}",Sha256::digest(fs::read("/usr/bin/true").unwrap())), "code_mode_host_dispatcher_sha256":format!("{:x}",Sha256::digest(fs::read(env!("CARGO_BIN_EXE_doxa-codex-protected")).unwrap())), "binary_sha256":format!("{:x}",Sha256::digest(fs::read("/usr/bin/true").unwrap())),"official_cli":"/usr/bin/printf"}).to_string()).unwrap(); diff --git a/rust/doxa-engines/tests/fixtures/codex_protected_fixture.rs b/rust/doxa-engines/tests/fixtures/codex_protected_fixture.rs index 41082a4a..fcfa1905 100644 --- a/rust/doxa-engines/tests/fixtures/codex_protected_fixture.rs +++ b/rust/doxa-engines/tests/fixtures/codex_protected_fixture.rs @@ -34,7 +34,7 @@ def read(): def send(x): print(json.dumps(x),flush=True) def notice(method,**params): send({'method':method,'params':dict(threadId='thread-actual',**params)}) init=read(); assert init['method']=='initialize' -agent='codex_cli_rs/0.164.0' if mode=='stock' else 'doxa_codex_rs/'+('0.1.0' if mode=='version' else '0.164.0')+' (doxa-precompact-fail-closed-v1; upstream fixture)' +agent='codex_cli_rs/0.165.0' if mode=='stock' else 'doxa_codex_rs/'+('0.1.0' if mode=='version' else '0.165.0')+' (doxa-precompact-fail-closed-v1; upstream fixture)' send({'id':init['id'],'result':{'userAgent':agent}}) assert read()['method']=='initialized' if mode in ('version','stock'): @@ -150,7 +150,7 @@ else: "#).unwrap(); fs::set_permissions(&executable, fs::Permissions::from_mode(0o700)).unwrap(); let gate_dir = dir.path().join("gate"); fs::create_dir(&gate_dir).unwrap(); fs::set_permissions(&gate_dir, fs::Permissions::from_mode(0o700)).unwrap(); - let gate = CompactGate::prepare(&gate_dir, &std::env::current_exe().unwrap(), &dir.path().join("codex-home"), dir.path(), "doxa-fixture", "0.164.0").unwrap(); + let gate = CompactGate::prepare(&gate_dir, &std::env::current_exe().unwrap(), &dir.path().join("codex-home"), dir.path(), "doxa-fixture", "0.165.0").unwrap(); let options = AppServerOptions { executable, cwd:dir.path().to_owned(), model:None, sandbox:SandboxMode::WorkspaceWrite, permission:CodexPermission::OnRequest, resume_thread:None, turn_timeout:Duration::from_secs(3) }; (dir, options, gate) } diff --git a/rust/doxa-fleet/Cargo.toml b/rust/doxa-fleet/Cargo.toml index c3fc727d..8663583c 100644 --- a/rust/doxa-fleet/Cargo.toml +++ b/rust/doxa-fleet/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-fleet" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-hub/Cargo.toml b/rust/doxa-hub/Cargo.toml index e2520177..9544b1e4 100644 --- a/rust/doxa-hub/Cargo.toml +++ b/rust/doxa-hub/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-hub" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-input/Cargo.toml b/rust/doxa-input/Cargo.toml index 5ec9b90c..4412dcc3 100644 --- a/rust/doxa-input/Cargo.toml +++ b/rust/doxa-input/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-input" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-isolation/Cargo.toml b/rust/doxa-isolation/Cargo.toml index c74f6c81..574ac91c 100644 --- a/rust/doxa-isolation/Cargo.toml +++ b/rust/doxa-isolation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-isolation" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-lore/Cargo.toml b/rust/doxa-lore/Cargo.toml index 44dac761..35e97411 100644 --- a/rust/doxa-lore/Cargo.toml +++ b/rust/doxa-lore/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-lore" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-mcp/Cargo.toml b/rust/doxa-mcp/Cargo.toml index fea5dfc8..7163c394 100644 --- a/rust/doxa-mcp/Cargo.toml +++ b/rust/doxa-mcp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-mcp" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-peers/Cargo.toml b/rust/doxa-peers/Cargo.toml index 6b5b8739..52ccee48 100644 --- a/rust/doxa-peers/Cargo.toml +++ b/rust/doxa-peers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-peers" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-protocol/Cargo.toml b/rust/doxa-protocol/Cargo.toml index d8b7782e..eea897bb 100644 --- a/rust/doxa-protocol/Cargo.toml +++ b/rust/doxa-protocol/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-protocol" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-remote-wire/Cargo.toml b/rust/doxa-remote-wire/Cargo.toml index ca22edec..80caf527 100644 --- a/rust/doxa-remote-wire/Cargo.toml +++ b/rust/doxa-remote-wire/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-remote-wire" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-remote/Cargo.toml b/rust/doxa-remote/Cargo.toml index c72ba736..cdcc1ad3 100644 --- a/rust/doxa-remote/Cargo.toml +++ b/rust/doxa-remote/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-remote" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-router/Cargo.toml b/rust/doxa-router/Cargo.toml index 693c3909..9b1e55fb 100644 --- a/rust/doxa-router/Cargo.toml +++ b/rust/doxa-router/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-router" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-runtime/Cargo.toml b/rust/doxa-runtime/Cargo.toml index 1df1c890..792acdc4 100644 --- a/rust/doxa-runtime/Cargo.toml +++ b/rust/doxa-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-runtime" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-state/Cargo.toml b/rust/doxa-state/Cargo.toml index f0997468..d07d396f 100644 --- a/rust/doxa-state/Cargo.toml +++ b/rust/doxa-state/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-state" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-transcript/Cargo.toml b/rust/doxa-transcript/Cargo.toml index d99d6a57..a4d13c29 100644 --- a/rust/doxa-transcript/Cargo.toml +++ b/rust/doxa-transcript/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-transcript" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-tui/Cargo.toml b/rust/doxa-tui/Cargo.toml index bab6749c..35dc59a0 100644 --- a/rust/doxa-tui/Cargo.toml +++ b/rust/doxa-tui/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-tui" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-vendors/Cargo.toml b/rust/doxa-vendors/Cargo.toml index 0ed50446..83325066 100644 --- a/rust/doxa-vendors/Cargo.toml +++ b/rust/doxa-vendors/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-vendors" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-worktrees/Cargo.toml b/rust/doxa-worktrees/Cargo.toml index f777e24d..c2673d0e 100644 --- a/rust/doxa-worktrees/Cargo.toml +++ b/rust/doxa-worktrees/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-worktrees" -version = "2.0.0-beta.75" +version = "2.0.0-beta.76" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/scripts/build-session-image.py b/scripts/build-session-image.py index c47001e0..7cae6caf 100644 --- a/scripts/build-session-image.py +++ b/scripts/build-session-image.py @@ -26,8 +26,8 @@ "codex": "code_mode_host_dispatcher_sha256", } CONTRACT = "doxa-precompact-fail-closed-v1" -SOURCE = "6aaac694803004a63c6f393d153c96d22521a6b9" -PATCH = "f8759872787029e5bf7064fe5be7166c5367b1db09b4b60362ea625117658924" +SOURCE = "360319d8dee62d87e2d59fc0c21805d79519cfed" +PATCH = "128293eb2e10aebdff916ab1d8fbce30fa10eba2dfac01cc501f9c1591034484" MAX_BINARY = 1024 * 1024 * 1024 APT_SNAPSHOT = "20260901T000000Z" APT_PACKAGES = {"bash", "ca-certificates", "git", "python3"} diff --git a/scripts/codex-protected/README.md b/scripts/codex-protected/README.md index 4618902d..d59bef87 100644 --- a/scripts/codex-protected/README.md +++ b/scripts/codex-protected/README.md @@ -1,7 +1,7 @@ # Protected Codex provider -The reviewed patch targets official `rust-v0.164.0`, commit -`6aaac694803004a63c6f393d153c96d22521a6b9`. Source, patch, launcher, +The reviewed patch targets official `rust-v0.165.0`, commit +`360319d8dee62d87e2d59fc0c21805d79519cfed`. Source, patch, launcher, app-server and code-mode helper identities are checked independently. The installer uses a separate `source--` checkout and publishes immutable receipt-addressed artifacts; it never resets old build sources. @@ -62,24 +62,31 @@ none of these commands require account credentials or external model calls. See each verifier's `--help` for its exact options. These checks do not establish real-account model availability or live sandbox acceptance. -## Reviewed 0.164.0 port +## Reviewed 0.165.0 port -The 0.163.0-to-0.164.0 safety diff remains subject to manual semantic review; -the automatic updater still refuses unreviewed safety-sensitive paths. The -protection port preserves 0.164's structured approval source/cancellation -metadata when a live-auto switch refuses a stale result, and uses the live -step policy for remote execution routing. A regression exercises both an -already-pending approval and refusal before review. Current payloads use -Rust 1.99.1 and the official source-pinned V8 152.2.0 archive/binding manifests; -reviewed older receipts retain Rust 1.95.0 for migration and rollback. +The 0.164.0-to-0.165.0 safety diff (174 guard-sensitive paths) was reviewed +manually; the automatic updater still refuses unreviewed safety-sensitive +paths. The protection hunks carry over unchanged. 0.165 builds PreCompact +hooks together with executor environment requirements hooks. Those are +discovered as `System` hooks at `/requirements.toml`, so they +can stop compaction but never satisfy the required session-flags identity. +No new caller replaces history or starts compaction inference outside the +gate. The review record is `reviews/0.165.0.json`. + +The 0.164.0 port preserved structured approval source and cancellation +metadata when a live-auto switch refuses a stale result. It also made remote +execution routing use the live step policy. Current payloads use Rust 1.99.1 +and the official source-pinned V8 152.2.0 archive/binding manifests; reviewed +older receipts retain Rust 1.95.0 for migration and rollback. ## Retained Docker sessions after an upgrade Existing Docker sessions keep the exact image recorded in their isolation manifest. Installing a new host provider or selecting a new-session image does not replace that saved image. A saved Docker thread can resume with the -exact reviewed 0.163.0 contract (source `83086188`, patch `3a7b8c09`) as well as -the current 0.164.0 provider. The retained contract requires the protected +exact reviewed 0.163.0 contract (source `83086188`, patch `3a7b8c09`) or 0.164.0 +contract (source `6aaac694`, patch `f8759872`) as well as the current 0.165.0 +provider. The retained contract requires the protected DOXA/live-auto initialize prefix and all normal hook, feature and launcher receipt checks. It is unavailable to fresh sessions or native providers. diff --git a/scripts/codex-protected/pin.json b/scripts/codex-protected/pin.json index b96be5df..a5a83549 100644 --- a/scripts/codex-protected/pin.json +++ b/scripts/codex-protected/pin.json @@ -1,9 +1,9 @@ { "contract": "doxa-precompact-fail-closed-v1", - "patch_sha256": "f8759872787029e5bf7064fe5be7166c5367b1db09b4b60362ea625117658924", - "provider": "codex-0.164.0-precompact-v1", + "patch_sha256": "128293eb2e10aebdff916ab1d8fbce30fa10eba2dfac01cc501f9c1591034484", + "provider": "codex-0.165.0-precompact-v1", "schema": 1, - "source_commit": "6aaac694803004a63c6f393d153c96d22521a6b9", - "tag": "rust-v0.164.0", - "version": "0.164.0" + "source_commit": "360319d8dee62d87e2d59fc0c21805d79519cfed", + "tag": "rust-v0.165.0", + "version": "0.165.0" } diff --git a/scripts/codex-protected/precompact.patch b/scripts/codex-protected/precompact.patch index 174b314d..5ee17c48 100644 --- a/scripts/codex-protected/precompact.patch +++ b/scripts/codex-protected/precompact.patch @@ -1,5 +1,5 @@ diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock -index 1eb38f3..7aff2ec 100644 +index f2b0fba..57e1817 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -287,7 +287,7 @@ checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" @@ -7,7 +7,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "app_test_support" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "base64 0.22.1", @@ -16,7 +16,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-agent-extension" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-core", @@ -25,7 +25,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-agent-graph-store" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-protocol", "codex-state", @@ -34,7 +34,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-agent-identity" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "base64 0.22.1", @@ -43,7 +43,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-agent-message-board-client" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "chrono", @@ -52,7 +52,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-agent-message-board-extension" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-extension-api", "codex-message-board", @@ -61,7 +61,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-agent-roles" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-config", "codex-file-system", @@ -70,7 +70,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-analytics" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-app-server-protocol", "codex-git-utils", @@ -79,7 +79,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-ansi-escape" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "ansi-to-tui", "pretty_assertions", @@ -88,7 +88,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-api" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "assert_matches", @@ -97,7 +97,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-app-server" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "app_test_support", @@ -106,7 +106,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-app-server-client" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-app-server", "codex-app-server-protocol", @@ -115,7 +115,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-app-server-daemon" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "blake3", @@ -124,7 +124,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-app-server-protocol" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-app-server-protocol-noop-macros", @@ -133,12 +133,12 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-app-server-protocol-noop-macros" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" [[package]] name = "codex-app-server-test-client" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "clap", @@ -147,7 +147,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-app-server-transport" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "axum", "base64 0.22.1", @@ -156,7 +156,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-apply-patch" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "assert_cmd", @@ -165,7 +165,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-arg0" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-apply-patch", @@ -174,7 +174,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-async-utils" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "pretty_assertions", "rand 0.9.3", @@ -183,7 +183,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-attachment-store" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "pretty_assertions", "serde", @@ -192,7 +192,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-aws-auth" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "aws-config", "aws-credential-types", @@ -201,7 +201,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-backend-client" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-api", @@ -210,7 +210,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-backend-openapi-models" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "serde", "serde_json", @@ -219,7 +219,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-build-info" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-install-context", "pretty_assertions", @@ -228,7 +228,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-bwrap" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "cc", "libc", @@ -237,7 +237,7 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-chatgpt" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "clap", @@ -246,678 +246,687 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-cli" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "app_test_support", -@@ -2601,7 +2601,7 @@ dependencies = [ +@@ -2602,7 +2602,7 @@ dependencies = [ [[package]] name = "codex-client" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-http-client", "eventsource-stream", -@@ -2615,7 +2615,7 @@ dependencies = [ +@@ -2616,7 +2616,7 @@ dependencies = [ [[package]] name = "codex-cloud-client" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "async-stream", -@@ -2639,7 +2639,7 @@ dependencies = [ +@@ -2640,7 +2640,7 @@ dependencies = [ [[package]] name = "codex-cloud-config" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "chrono", -@@ -2665,7 +2665,7 @@ dependencies = [ +@@ -2668,7 +2668,7 @@ dependencies = [ [[package]] name = "codex-cloud-tasks" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "chrono", -@@ -2698,7 +2698,7 @@ dependencies = [ +@@ -2701,7 +2701,7 @@ dependencies = [ [[package]] name = "codex-cloud-tasks-client" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "chrono", -@@ -2713,7 +2713,7 @@ dependencies = [ +@@ -2716,7 +2716,7 @@ dependencies = [ [[package]] name = "codex-cloud-tasks-mock-client" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "chrono", "codex-cloud-tasks-client", -@@ -2722,7 +2722,7 @@ dependencies = [ +@@ -2725,7 +2725,7 @@ dependencies = [ [[package]] name = "codex-code-mode" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-code-mode-protocol", "codex-http-client", -@@ -2746,7 +2746,7 @@ dependencies = [ +@@ -2749,7 +2749,7 @@ dependencies = [ [[package]] name = "codex-code-mode-host" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "axum", -@@ -2775,7 +2775,7 @@ dependencies = [ +@@ -2778,7 +2778,7 @@ dependencies = [ [[package]] name = "codex-code-mode-protocol" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-protocol", "glob", -@@ -2793,7 +2793,7 @@ dependencies = [ +@@ -2796,7 +2796,7 @@ dependencies = [ [[package]] name = "codex-code-mode-runtime" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "codex-code-mode-protocol", -@@ -2811,11 +2811,11 @@ dependencies = [ +@@ -2814,11 +2814,11 @@ dependencies = [ [[package]] name = "codex-collaboration-mode-templates" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" [[package]] name = "codex-config" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "base64 0.22.1", -@@ -2868,7 +2868,7 @@ dependencies = [ +@@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "codex-config-schema" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "clap", -@@ -2877,7 +2877,7 @@ dependencies = [ +@@ -2880,7 +2880,7 @@ dependencies = [ [[package]] name = "codex-connectors" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "arc-swap", -@@ -2899,7 +2899,7 @@ dependencies = [ +@@ -2902,7 +2902,7 @@ dependencies = [ [[package]] name = "codex-connectors-extension" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-connectors", "codex-core-plugins", -@@ -2913,7 +2913,7 @@ dependencies = [ +@@ -2916,7 +2916,7 @@ dependencies = [ [[package]] name = "codex-context-fragments" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-protocol", "codex-protocol-test-support", -@@ -2924,7 +2924,7 @@ dependencies = [ +@@ -2927,7 +2927,7 @@ dependencies = [ [[package]] name = "codex-core" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "arc-swap", -@@ -3070,7 +3070,7 @@ dependencies = [ +@@ -3073,7 +3073,7 @@ dependencies = [ [[package]] name = "codex-core-api" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-analytics", "codex-app-server-protocol", -@@ -3093,7 +3093,7 @@ dependencies = [ +@@ -3096,7 +3096,7 @@ dependencies = [ [[package]] name = "codex-core-plugin-common" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-utils-absolute-path", "semver", -@@ -3104,7 +3104,7 @@ dependencies = [ +@@ -3107,7 +3107,7 @@ dependencies = [ [[package]] name = "codex-core-plugins" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "chrono", -@@ -3161,7 +3161,7 @@ dependencies = [ +@@ -3164,7 +3164,7 @@ dependencies = [ [[package]] name = "codex-diagnostics" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "libc", "pretty_assertions", -@@ -3169,7 +3169,7 @@ dependencies = [ +@@ -3172,7 +3172,7 @@ dependencies = [ [[package]] name = "codex-direct-tool-timing" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-utils-critical-path", "pretty_assertions", -@@ -3177,7 +3177,7 @@ dependencies = [ +@@ -3180,7 +3180,7 @@ dependencies = [ [[package]] name = "codex-exec" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "assert_cmd", -@@ -3230,7 +3230,7 @@ dependencies = [ +@@ -3233,7 +3233,7 @@ dependencies = [ [[package]] name = "codex-exec-server" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "arc-swap", -@@ -3302,7 +3302,7 @@ dependencies = [ +@@ -3305,7 +3305,7 @@ dependencies = [ [[package]] name = "codex-exec-server-protocol" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "codex-file-system", -@@ -3320,7 +3320,7 @@ dependencies = [ +@@ -3323,7 +3323,7 @@ dependencies = [ [[package]] name = "codex-exec-server-test-support" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-exec-server", -@@ -3335,7 +3335,7 @@ dependencies = [ +@@ -3338,7 +3338,7 @@ dependencies = [ [[package]] name = "codex-execpolicy" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "clap", -@@ -3353,7 +3353,7 @@ dependencies = [ +@@ -3356,7 +3356,7 @@ dependencies = [ [[package]] name = "codex-experimental-api-macros" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "proc-macro2", "quote", -@@ -3362,7 +3362,7 @@ dependencies = [ +@@ -3365,7 +3365,7 @@ dependencies = [ [[package]] name = "codex-extension-api" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-api", "codex-config", -@@ -3385,7 +3385,7 @@ dependencies = [ +@@ -3388,7 +3388,7 @@ dependencies = [ [[package]] name = "codex-extension-items" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-utils-absolute-path", "pretty_assertions", -@@ -3397,7 +3397,7 @@ dependencies = [ +@@ -3400,7 +3400,7 @@ dependencies = [ [[package]] name = "codex-external-agent-migration" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "chrono", "codex-analytics", -@@ -3428,7 +3428,7 @@ dependencies = [ +@@ -3431,7 +3431,7 @@ dependencies = [ [[package]] name = "codex-features" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-network-proxy", "codex-protocol", -@@ -3442,7 +3442,7 @@ dependencies = [ +@@ -3445,7 +3445,7 @@ dependencies = [ [[package]] name = "codex-feedback" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "bytes", -@@ -3470,7 +3470,7 @@ dependencies = [ +@@ -3473,7 +3473,7 @@ dependencies = [ [[package]] name = "codex-file-search" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "clap", -@@ -3486,7 +3486,7 @@ dependencies = [ +@@ -3489,7 +3489,7 @@ dependencies = [ [[package]] name = "codex-file-system" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "bytes", "codex-protocol", -@@ -3500,7 +3500,7 @@ dependencies = [ +@@ -3503,7 +3503,7 @@ dependencies = [ [[package]] name = "codex-file-watcher" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "notify", "pretty_assertions", -@@ -3511,7 +3511,7 @@ dependencies = [ +@@ -3514,7 +3514,7 @@ dependencies = [ [[package]] name = "codex-git-attribution" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-backend-client", "codex-extension-api", -@@ -3524,7 +3524,7 @@ dependencies = [ +@@ -3527,7 +3527,7 @@ dependencies = [ [[package]] name = "codex-git-utils" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "chrono", -@@ -3552,7 +3552,7 @@ dependencies = [ +@@ -3555,7 +3555,7 @@ dependencies = [ [[package]] name = "codex-goal-extension" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "chrono", -@@ -3577,7 +3577,7 @@ dependencies = [ +@@ -3580,7 +3580,7 @@ dependencies = [ [[package]] name = "codex-guardian-context" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-context-fragments", "codex-history", -@@ -3590,7 +3590,7 @@ dependencies = [ +@@ -3593,7 +3593,7 @@ dependencies = [ [[package]] name = "codex-guardian-reviewer" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-analytics", -@@ -3615,7 +3615,7 @@ dependencies = [ +@@ -3618,7 +3618,7 @@ dependencies = [ [[package]] name = "codex-guardian-v2" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-analytics", -@@ -3654,7 +3654,7 @@ dependencies = [ +@@ -3657,7 +3657,7 @@ dependencies = [ + + [[package]] + name = "codex-guardian-v3" +-version = "0.0.0" ++version = "0.165.0" + dependencies = [ + "codex-message-board", + "codex-protocol", +@@ -3666,7 +3666,7 @@ dependencies = [ [[package]] name = "codex-history" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-protocol", -@@ -3666,7 +3666,7 @@ dependencies = [ +@@ -3678,7 +3678,7 @@ dependencies = [ [[package]] name = "codex-history-notes-extension" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-analytics", "codex-client", -@@ -3691,7 +3691,7 @@ dependencies = [ +@@ -3704,7 +3704,7 @@ dependencies = [ [[package]] name = "codex-home" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-extension-api", "codex-utils-absolute-path", -@@ -3703,7 +3703,7 @@ dependencies = [ +@@ -3716,7 +3716,7 @@ dependencies = [ [[package]] name = "codex-hooks" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "async-channel", -@@ -3732,7 +3732,7 @@ dependencies = [ +@@ -3745,7 +3745,7 @@ dependencies = [ [[package]] name = "codex-http-client" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "bytes", "codex-utils-cargo-bin", -@@ -3772,7 +3772,7 @@ dependencies = [ +@@ -3785,7 +3785,7 @@ dependencies = [ [[package]] name = "codex-image-generation-extension" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "codex-api", -@@ -3804,7 +3804,7 @@ dependencies = [ +@@ -3817,7 +3817,7 @@ dependencies = [ [[package]] name = "codex-install-context" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-utils-absolute-path", "codex-utils-home-dir", -@@ -3817,7 +3817,7 @@ dependencies = [ +@@ -3830,7 +3830,7 @@ dependencies = [ [[package]] name = "codex-keyring-store" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "keyring", "pretty_assertions", -@@ -3828,7 +3828,7 @@ dependencies = [ +@@ -3841,7 +3841,7 @@ dependencies = [ [[package]] name = "codex-linux-sandbox" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "clap", "codex-core", -@@ -3857,7 +3857,7 @@ dependencies = [ +@@ -3870,7 +3870,7 @@ dependencies = [ [[package]] name = "codex-lmstudio" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-core", "codex-http-client", -@@ -3871,7 +3871,7 @@ dependencies = [ +@@ -3884,7 +3884,7 @@ dependencies = [ [[package]] name = "codex-login" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "base64 0.22.1", -@@ -3917,7 +3917,7 @@ dependencies = [ +@@ -3930,7 +3930,7 @@ dependencies = [ [[package]] name = "codex-mcp" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "arc-swap", -@@ -3960,7 +3960,7 @@ dependencies = [ +@@ -3974,7 +3974,7 @@ dependencies = [ [[package]] name = "codex-mcp-extension" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "axum", -@@ -3993,7 +3993,7 @@ dependencies = [ +@@ -4007,7 +4007,7 @@ dependencies = [ [[package]] name = "codex-memories-extension" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-core", "codex-extension-api", -@@ -4015,7 +4015,7 @@ dependencies = [ +@@ -4029,7 +4029,7 @@ dependencies = [ [[package]] name = "codex-memories-read" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-protocol", "codex-shell-command", -@@ -4025,7 +4025,7 @@ dependencies = [ +@@ -4039,7 +4039,7 @@ dependencies = [ [[package]] name = "codex-memories-write" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "chrono", -@@ -4062,7 +4062,7 @@ dependencies = [ +@@ -4076,7 +4076,7 @@ dependencies = [ [[package]] name = "codex-mermaid" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "insta", "pretty_assertions", -@@ -4071,7 +4071,7 @@ dependencies = [ +@@ -4085,7 +4085,7 @@ dependencies = [ [[package]] name = "codex-message-board" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "caseless", -@@ -4094,7 +4094,7 @@ dependencies = [ +@@ -4108,7 +4108,7 @@ dependencies = [ [[package]] name = "codex-message-history" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-config", "memchr", -@@ -4108,7 +4108,7 @@ dependencies = [ +@@ -4122,7 +4122,7 @@ dependencies = [ [[package]] name = "codex-model-provider" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "chrono", -@@ -4142,7 +4142,7 @@ dependencies = [ +@@ -4156,7 +4156,7 @@ dependencies = [ [[package]] name = "codex-model-provider-info" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-client", "codex-http-client", -@@ -4160,7 +4160,7 @@ dependencies = [ +@@ -4174,7 +4174,7 @@ dependencies = [ [[package]] name = "codex-models-manager" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "chrono", "codex-http-client", -@@ -4179,7 +4179,7 @@ dependencies = [ +@@ -4193,7 +4193,7 @@ dependencies = [ [[package]] name = "codex-multi-env-copy-file" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-config", -@@ -4205,7 +4205,7 @@ dependencies = [ +@@ -4219,7 +4219,7 @@ dependencies = [ [[package]] name = "codex-mxc-sandbox" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-network-proxy", -@@ -4226,7 +4226,7 @@ dependencies = [ +@@ -4240,7 +4240,7 @@ dependencies = [ [[package]] name = "codex-network-proxy" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", - "base64 0.22.1", -@@ -4275,7 +4275,7 @@ dependencies = [ + "aws-credential-types", +@@ -4291,7 +4291,7 @@ dependencies = [ [[package]] name = "codex-ollama" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "assert_matches", "async-stream", -@@ -4295,7 +4295,7 @@ dependencies = [ +@@ -4311,7 +4311,7 @@ dependencies = [ [[package]] name = "codex-otel" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "bytes", "chrono", -@@ -4332,7 +4332,7 @@ dependencies = [ +@@ -4348,7 +4348,7 @@ dependencies = [ [[package]] name = "codex-otel-trace-websocket" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "axum", -@@ -4343,7 +4343,7 @@ dependencies = [ +@@ -4359,7 +4359,7 @@ dependencies = [ [[package]] name = "codex-plugin" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-config", "codex-core-plugin-common", -@@ -4358,7 +4358,7 @@ dependencies = [ +@@ -4374,7 +4374,7 @@ dependencies = [ [[package]] name = "codex-process-hardening" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "libc", "pretty_assertions", -@@ -4366,7 +4366,7 @@ dependencies = [ +@@ -4382,7 +4382,7 @@ dependencies = [ [[package]] name = "codex-prompts" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-collaboration-mode-templates", -@@ -4384,7 +4384,7 @@ dependencies = [ +@@ -4400,7 +4400,7 @@ dependencies = [ [[package]] name = "codex-protocol" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "chardetng", -@@ -4430,14 +4430,14 @@ dependencies = [ +@@ -4446,14 +4446,14 @@ dependencies = [ [[package]] name = "codex-protocol-test-support" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-protocol", ] @@ -925,232 +934,232 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-queue-extension" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-core", -@@ -4458,7 +4458,7 @@ dependencies = [ +@@ -4474,7 +4474,7 @@ dependencies = [ [[package]] name = "codex-realtime-webrtc" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-build-info", -@@ -4477,7 +4477,7 @@ dependencies = [ +@@ -4493,7 +4493,7 @@ dependencies = [ [[package]] name = "codex-response-debug-context" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "codex-api", -@@ -4488,7 +4488,7 @@ dependencies = [ +@@ -4504,7 +4504,7 @@ dependencies = [ [[package]] name = "codex-responses-api-proxy" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "bytes", -@@ -4512,7 +4512,7 @@ dependencies = [ +@@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "codex-rmcp-client" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "axum", -@@ -4563,7 +4563,7 @@ dependencies = [ +@@ -4579,7 +4579,7 @@ dependencies = [ [[package]] name = "codex-rollout" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "chrono", -@@ -4596,7 +4596,7 @@ dependencies = [ +@@ -4612,7 +4612,7 @@ dependencies = [ [[package]] name = "codex-rollout-trace" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-code-mode", -@@ -4612,7 +4612,7 @@ dependencies = [ +@@ -4629,7 +4629,7 @@ dependencies = [ [[package]] name = "codex-runtime-agent-instance" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "codex-agent-identity", -@@ -4638,7 +4638,7 @@ dependencies = [ +@@ -4655,7 +4655,7 @@ dependencies = [ [[package]] name = "codex-sandboxing" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-mxc-sandbox", -@@ -4666,7 +4666,7 @@ dependencies = [ +@@ -4683,7 +4683,7 @@ dependencies = [ [[package]] name = "codex-secrets" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "age", "anyhow", -@@ -4687,7 +4687,7 @@ dependencies = [ +@@ -4704,7 +4704,7 @@ dependencies = [ [[package]] name = "codex-shell-command" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "base64 0.22.1", -@@ -4710,7 +4710,7 @@ dependencies = [ +@@ -4727,7 +4727,7 @@ dependencies = [ [[package]] name = "codex-skills" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-protocol", "codex-shell-command", -@@ -4727,7 +4727,7 @@ dependencies = [ +@@ -4744,7 +4744,7 @@ dependencies = [ [[package]] name = "codex-skills-extension" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "assert_matches", "blake3", -@@ -4767,7 +4767,7 @@ dependencies = [ +@@ -4784,7 +4784,7 @@ dependencies = [ [[package]] name = "codex-state" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "chrono", -@@ -4795,7 +4795,7 @@ dependencies = [ +@@ -4812,7 +4812,7 @@ dependencies = [ [[package]] name = "codex-stdio-to-uds" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-uds", -@@ -4807,7 +4807,7 @@ dependencies = [ +@@ -4824,7 +4824,7 @@ dependencies = [ [[package]] name = "codex-tcp-tunnel" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "bytes", -@@ -4828,7 +4828,7 @@ dependencies = [ +@@ -4845,7 +4845,7 @@ dependencies = [ [[package]] name = "codex-terminal-detection" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "pretty_assertions", "tracing", -@@ -4836,7 +4836,7 @@ dependencies = [ +@@ -4853,7 +4853,7 @@ dependencies = [ [[package]] name = "codex-test-binary-support" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-arg0", "tempfile", -@@ -4844,7 +4844,7 @@ dependencies = [ +@@ -4861,7 +4861,7 @@ dependencies = [ [[package]] name = "codex-thread-manager-sample" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "clap", -@@ -4855,7 +4855,7 @@ dependencies = [ +@@ -4872,7 +4872,7 @@ dependencies = [ [[package]] name = "codex-thread-store" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "chrono", "codex-app-server-protocol", -@@ -4886,7 +4886,7 @@ dependencies = [ +@@ -4903,7 +4903,7 @@ dependencies = [ [[package]] name = "codex-tools" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "bitflags 2.13.1", "codex-attachment-store", -@@ -4911,7 +4911,7 @@ dependencies = [ +@@ -4929,7 +4929,7 @@ dependencies = [ [[package]] name = "codex-tui" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "app_test_support", -@@ -5039,7 +5039,7 @@ dependencies = [ +@@ -5057,7 +5057,7 @@ dependencies = [ [[package]] name = "codex-uds" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "async-io", "libc", -@@ -5053,7 +5053,7 @@ dependencies = [ +@@ -5071,7 +5071,7 @@ dependencies = [ [[package]] name = "codex-user-verification" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "block2", -@@ -5074,7 +5074,7 @@ dependencies = [ +@@ -5092,7 +5092,7 @@ dependencies = [ [[package]] name = "codex-utils-absolute-path" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "dirs", "dunce", -@@ -5088,14 +5088,14 @@ dependencies = [ +@@ -5106,14 +5106,14 @@ dependencies = [ [[package]] name = "codex-utils-approval-presets" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-protocol", ] @@ -1158,43 +1167,43 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-utils-audio" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "codex-protocol", -@@ -5109,7 +5109,7 @@ dependencies = [ +@@ -5127,7 +5127,7 @@ dependencies = [ [[package]] name = "codex-utils-cache" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "lru", "sha1 0.10.6", -@@ -5118,7 +5118,7 @@ dependencies = [ +@@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "codex-utils-cargo-bin" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "assert_cmd", "runfiles", -@@ -5127,7 +5127,7 @@ dependencies = [ +@@ -5145,7 +5145,7 @@ dependencies = [ [[package]] name = "codex-utils-cli" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "clap", "codex-protocol", -@@ -5139,22 +5139,22 @@ dependencies = [ +@@ -5157,22 +5157,22 @@ dependencies = [ [[package]] name = "codex-utils-critical-path" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "pretty_assertions", ] @@ -1202,134 +1211,134 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-utils-elapsed" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" [[package]] name = "codex-utils-fuzzy-match" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" [[package]] name = "codex-utils-git-discovery" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-git-utils", "codex-utils-absolute-path", -@@ -5167,7 +5167,7 @@ dependencies = [ +@@ -5185,7 +5185,7 @@ dependencies = [ [[package]] name = "codex-utils-home-dir" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-utils-absolute-path", "dirs", -@@ -5177,7 +5177,7 @@ dependencies = [ +@@ -5195,7 +5195,7 @@ dependencies = [ [[package]] name = "codex-utils-image" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "codex-utils-cache", -@@ -5191,7 +5191,7 @@ dependencies = [ +@@ -5209,7 +5209,7 @@ dependencies = [ [[package]] name = "codex-utils-json-to-toml" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "pretty_assertions", "serde_json", -@@ -5200,7 +5200,7 @@ dependencies = [ +@@ -5218,7 +5218,7 @@ dependencies = [ [[package]] name = "codex-utils-oss" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-core", "codex-lmstudio", -@@ -5210,7 +5210,7 @@ dependencies = [ +@@ -5228,7 +5228,7 @@ dependencies = [ [[package]] name = "codex-utils-output-truncation" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-protocol", "codex-utils-string", -@@ -5220,7 +5220,7 @@ dependencies = [ +@@ -5238,7 +5238,7 @@ dependencies = [ [[package]] name = "codex-utils-path" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-utils-absolute-path", "dunce", -@@ -5231,7 +5231,7 @@ dependencies = [ +@@ -5249,7 +5249,7 @@ dependencies = [ [[package]] name = "codex-utils-path-uri" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "base64 0.22.1", "codex-utils-absolute-path", -@@ -5247,7 +5247,7 @@ dependencies = [ +@@ -5265,7 +5265,7 @@ dependencies = [ [[package]] name = "codex-utils-plugins" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-exec-server", "codex-exec-server-protocol", -@@ -5261,7 +5261,7 @@ dependencies = [ +@@ -5279,7 +5279,7 @@ dependencies = [ [[package]] name = "codex-utils-process" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "pretty_assertions", "tokio", -@@ -5269,7 +5269,7 @@ dependencies = [ +@@ -5287,7 +5287,7 @@ dependencies = [ [[package]] name = "codex-utils-pty" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-utils-cargo-bin", -@@ -5288,7 +5288,7 @@ dependencies = [ +@@ -5306,7 +5306,7 @@ dependencies = [ [[package]] name = "codex-utils-readiness" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "assert_matches", "thiserror 2.0.18", -@@ -5298,7 +5298,7 @@ dependencies = [ +@@ -5316,7 +5316,7 @@ dependencies = [ [[package]] name = "codex-utils-redacted-string" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "schemars 0.8.22", "serde", -@@ -5306,14 +5306,14 @@ dependencies = [ +@@ -5324,14 +5324,14 @@ dependencies = [ [[package]] name = "codex-utils-rustls-provider" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "rustls", ] @@ -1337,25 +1346,25 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-utils-sandbox-summary" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-protocol", "codex-utils-absolute-path", -@@ -5323,7 +5323,7 @@ dependencies = [ +@@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "codex-utils-sleep-inhibitor" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "core-foundation 0.9.4", "libc", -@@ -5333,14 +5333,14 @@ dependencies = [ +@@ -5351,14 +5351,14 @@ dependencies = [ [[package]] name = "codex-utils-stream-parser" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "pretty_assertions", ] @@ -1363,16 +1372,16 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-utils-string" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "pretty_assertions", "regex-lite", -@@ -5350,14 +5350,14 @@ dependencies = [ +@@ -5368,14 +5368,14 @@ dependencies = [ [[package]] name = "codex-utils-template" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "pretty_assertions", ] @@ -1380,70 +1389,70 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-v8-poc" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "pretty_assertions", "v8", -@@ -5365,7 +5365,7 @@ dependencies = [ +@@ -5383,7 +5383,7 @@ dependencies = [ [[package]] name = "codex-voice-host" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-install-context", -@@ -5392,7 +5392,7 @@ dependencies = [ +@@ -5410,7 +5410,7 @@ dependencies = [ [[package]] name = "codex-web-search-extension" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-api", "codex-core", -@@ -5414,7 +5414,7 @@ dependencies = [ +@@ -5432,7 +5432,7 @@ dependencies = [ [[package]] name = "codex-websocket-auth" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "base64 0.22.1", -@@ -5433,7 +5433,7 @@ dependencies = [ +@@ -5451,7 +5451,7 @@ dependencies = [ [[package]] name = "codex-websocket-client" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-http-client", "codex-utils-rustls-provider", -@@ -5449,7 +5449,7 @@ dependencies = [ +@@ -5467,7 +5467,7 @@ dependencies = [ [[package]] name = "codex-windows-sandbox" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "base64 0.22.1", -@@ -5479,7 +5479,7 @@ dependencies = [ +@@ -5497,7 +5497,7 @@ dependencies = [ [[package]] name = "codex-windows-sandbox-service" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-cloud-config", -@@ -5497,14 +5497,14 @@ dependencies = [ +@@ -5515,14 +5515,14 @@ dependencies = [ [[package]] name = "codex-windows-sandbox-test-support" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "dirs", ] @@ -1451,25 +1460,25 @@ index 1eb38f3..7aff2ec 100644 [[package]] name = "codex-workload-identity" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "codex-http-client", "pretty_assertions", -@@ -5519,7 +5519,7 @@ dependencies = [ +@@ -5537,7 +5537,7 @@ dependencies = [ [[package]] name = "codex-worktree" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "codex-git-utils", -@@ -5772,7 +5772,7 @@ dependencies = [ +@@ -5790,7 +5790,7 @@ dependencies = [ [[package]] name = "core_test_support" -version = "0.0.0" -+version = "0.164.0" ++version = "0.165.0" dependencies = [ "anyhow", "assert_cmd", @@ -1489,7 +1498,7 @@ index 38b0022..b91a843 100644 /// Already captured steps and pending approvals retain their original reviewer. #[ts(optional = nullable)] diff --git a/codex-rs/app-server/src/request_processors/initialize_processor.rs b/codex-rs/app-server/src/request_processors/initialize_processor.rs -index d68a29d..23a0b39 100644 +index d68a29d..7098c0f 100644 --- a/codex-rs/app-server/src/request_processors/initialize_processor.rs +++ b/codex-rs/app-server/src/request_processors/initialize_processor.rs @@ -209,7 +209,11 @@ impl InitializeRequestProcessor { @@ -1499,7 +1508,7 @@ index d68a29d..23a0b39 100644 - let user_agent = get_codex_user_agent(); + // This is an explicitly identified private DOXA build, not stock Codex. + let user_agent = format!( -+ "doxa_codex_rs/0.164.0 (doxa-precompact-fail-closed-v1; doxa-midturn-auto-v1; {})", ++ "doxa_codex_rs/0.165.0 (doxa-precompact-fail-closed-v1; doxa-midturn-auto-v1; {})", + get_codex_user_agent() + ); let response = InitializeResponse { @@ -1631,22 +1640,30 @@ index 0000000..0358e17 + } +} diff --git a/codex-rs/core/src/hook_runtime.rs b/codex-rs/core/src/hook_runtime.rs -index 34f3351..27c3d97 100644 +index 3dde6e1..bf46a65 100644 --- a/codex-rs/core/src/hook_runtime.rs +++ b/codex-rs/core/src/hook_runtime.rs -@@ -513,12 +513,41 @@ pub(crate) async fn run_pre_compact_hooks( +@@ -558,17 +558,49 @@ pub(crate) async fn run_pre_compact_hooks( model: turn_context.model_info().slug.clone(), trigger: compaction_trigger_label(trigger).to_string(), }; + // DOXA private provider: a missing/disabled/untrusted hook cannot authorize + // compaction. Both local and remote callers check Stopped before inference + // or replace_compacted_history; this decision is made inside the provider. ++ // Environment requirements hooks are discovered as System hooks at ++ // `/requirements.toml`; they may stop compaction but can ++ // never satisfy this trusted session-flags identity. + let required = |run: &HookRunSummary| { + run.event_name == HookEventName::PreCompact + && run.source == HookSource::SessionFlags + && run.source_path.as_path() == std::path::Path::new("//config.toml") + }; - let preview_runs = sess.hooks().preview_pre_compact(&request); + let hooks = with_environment_hooks( + sess, + turn_context, + &turn_context.initial_environments.refresh_readiness(), + ); + let preview_runs = hooks.preview_pre_compact(&request); + let required_previews = preview_runs.iter().filter(|run| required(run)).count(); emit_hook_started_events(sess, turn_context, preview_runs).await; + // Review the complete materialized source, including the newest tool/input @@ -1655,7 +1672,7 @@ index 34f3351..27c3d97 100644 + return PreCompactHookOutcome::Stopped; + } - let outcome = sess.hooks().run_pre_compact(request).await; + let outcome = hooks.run_pre_compact(request).await; + let reviewed_runs = outcome + .hook_events + .iter() @@ -1678,7 +1695,7 @@ index 34f3351..27c3d97 100644 } else { PreCompactHookOutcome::Continue diff --git a/codex-rs/core/src/lib.rs b/codex-rs/core/src/lib.rs -index 390b658..916d73d 100644 +index 2c91c8e..b343854 100644 --- a/codex-rs/core/src/lib.rs +++ b/codex-rs/core/src/lib.rs @@ -90,6 +90,7 @@ pub mod context; @@ -1911,10 +1928,10 @@ index e4a0481..d622696 100644 shutdown(&sess).await; } diff --git a/codex-rs/core/src/session/mod.rs b/codex-rs/core/src/session/mod.rs -index 96cfaa1..5ada264 100644 +index aba4971..93cec01 100644 --- a/codex-rs/core/src/session/mod.rs +++ b/codex-rs/core/src/session/mod.rs -@@ -2976,6 +2976,11 @@ impl Session { +@@ -3034,6 +3034,11 @@ impl Session { available_decisions: Option>, plugin_attribution_override: Option, ) -> ReviewDecision { @@ -1926,7 +1943,7 @@ index 96cfaa1..5ada264 100644 let _elicitation = self.services.elicitations.register(); // command-level approvals use `call_id`. // `approval_id` identifies subcommand callbacks and stdin writes. -@@ -3047,7 +3052,14 @@ impl Session { +@@ -3105,7 +3110,14 @@ impl Session { parsed_cmd, }); self.send_event(turn_context, event).await; @@ -1942,7 +1959,7 @@ index 96cfaa1..5ada264 100644 } #[expect( -@@ -3062,6 +3074,11 @@ impl Session { +@@ -3120,6 +3132,11 @@ impl Session { reason: Option, grant_root: Option, ) -> ReviewDecision { @@ -1954,7 +1971,7 @@ index 96cfaa1..5ada264 100644 let _elicitation = self.services.elicitations.register(); // Add the tx_approve callback to the map before sending the request. let (tx_approve, rx_approve) = oneshot::channel(); -@@ -3089,7 +3106,14 @@ impl Session { +@@ -3147,7 +3164,14 @@ impl Session { grant_root, }); self.send_event(turn_context, event).await; @@ -1970,7 +1987,7 @@ index 96cfaa1..5ada264 100644 } #[expect( -@@ -3105,7 +3129,7 @@ impl Session { +@@ -3163,7 +3187,7 @@ impl Session { cancellation_token: CancellationToken, ) -> Option { let turn_context = &step_context.turn; @@ -1979,7 +1996,7 @@ index 96cfaa1..5ada264 100644 let Some(environment) = step_context .environments .turn_environments() -@@ -3173,6 +3197,13 @@ impl Session { +@@ -3231,6 +3255,13 @@ impl Session { ) => decision, }; if let Some(decision) = decision { @@ -1993,7 +2010,7 @@ index 96cfaa1..5ada264 100644 let (permissions, scope) = match decision { ReviewDecision::Approved | ReviewDecision::ApprovedExecpolicyAmendment { .. } -@@ -3211,11 +3242,13 @@ impl Session { +@@ -3269,11 +3300,13 @@ impl Session { response, &context, ); @@ -2012,7 +2029,7 @@ index 96cfaa1..5ada264 100644 return Some(response); } } -@@ -3224,6 +3257,15 @@ impl Session { +@@ -3282,6 +3315,15 @@ impl Session { let (tx_response, rx_response) = oneshot::channel(); let prev_entry = { let mut active = self.active_turn.lock().await; @@ -2028,7 +2045,7 @@ index 96cfaa1..5ada264 100644 match active.as_mut() { Some(at) => { let mut ts = at.turn_state.lock().await; -@@ -3368,6 +3410,15 @@ impl Session { +@@ -3426,6 +3468,15 @@ impl Session { }; match entry { Some(entry) => { @@ -2044,7 +2061,7 @@ index 96cfaa1..5ada264 100644 let sandbox_context = entry .environment .sandbox_context(/*additional_permissions*/ None); -@@ -3376,11 +3427,13 @@ impl Session { +@@ -3434,11 +3485,13 @@ impl Session { response, &sandbox_context.policy_context(), ); @@ -2063,7 +2080,7 @@ index 96cfaa1..5ada264 100644 entry.tx_response.send(response).ok(); } None => { -@@ -3418,14 +3471,24 @@ impl Session { +@@ -3476,14 +3529,24 @@ impl Session { } } @@ -2092,7 +2109,7 @@ index 96cfaa1..5ada264 100644 } match response.scope { PermissionGrantScope::Turn => { -@@ -3443,6 +3506,7 @@ impl Session { +@@ -3501,6 +3564,7 @@ impl Session { ); } } @@ -2101,7 +2118,7 @@ index 96cfaa1..5ada264 100644 pub(crate) async fn active_turn_context_and_strict_auto_review( diff --git a/codex-rs/core/src/session/step_activation.rs b/codex-rs/core/src/session/step_activation.rs -index c7a5de0..2e2ce58 100644 +index 48fe180..3aee52b 100644 --- a/codex-rs/core/src/session/step_activation.rs +++ b/codex-rs/core/src/session/step_activation.rs @@ -18,6 +18,7 @@ use codex_protocol::openai_models::GuardianV2ModelConfig; @@ -2176,7 +2193,7 @@ index c7a5de0..2e2ce58 100644 approvals_reviewer, model, effort, -@@ -320,10 +346,13 @@ impl Session { +@@ -321,10 +347,13 @@ impl Session { { return TurnSettingsUpdateOutcome::TargetUnavailable; } @@ -2621,7 +2638,7 @@ index a61493a..a881b22 100644 step: &StepContext, ) -> ( diff --git a/codex-rs/core/src/session/step_context.rs b/codex-rs/core/src/session/step_context.rs -index ac96683..b337f3f 100644 +index 5d4162a..d0a9b09 100644 --- a/codex-rs/core/src/session/step_context.rs +++ b/codex-rs/core/src/session/step_context.rs @@ -48,6 +48,16 @@ pub(crate) struct StepContext { @@ -2671,10 +2688,10 @@ index b66fb19..8abe98a 100644 .approvals_reviewer .or(self.mcp_approvals_reviewer_override); diff --git a/codex-rs/core/src/session/tests.rs b/codex-rs/core/src/session/tests.rs -index 7bd3a38..39cf917 100644 +index 182e03e..13f2be3 100644 --- a/codex-rs/core/src/session/tests.rs +++ b/codex-rs/core/src/session/tests.rs -@@ -7524,15 +7524,17 @@ async fn record_granted_request_permissions_for_turn_uses_originating_turn() { +@@ -7537,15 +7537,17 @@ async fn record_granted_request_permissions_for_turn_uses_originating_turn() { }), ..RequestPermissionProfile::default() }; @@ -2701,7 +2718,7 @@ index 7bd3a38..39cf917 100644 assert_eq!( turn_context.granted_permissions(codex_exec_server::LOCAL_ENVIRONMENT_ID), -@@ -7554,15 +7556,17 @@ async fn request_permission_grants_are_environment_keyed() { +@@ -7567,15 +7569,17 @@ async fn request_permission_grants_are_environment_keyed() { }), ..RequestPermissionProfile::default() }; @@ -2728,7 +2745,7 @@ index 7bd3a38..39cf917 100644 assert_eq!( turn_context.granted_permissions("remote"), -@@ -7570,15 +7574,17 @@ async fn request_permission_grants_are_environment_keyed() { +@@ -7583,15 +7587,17 @@ async fn request_permission_grants_are_environment_keyed() { ); assert_eq!(turn_context.granted_permissions("local"), None); @@ -2755,7 +2772,7 @@ index 7bd3a38..39cf917 100644 assert_eq!( session -@@ -7612,15 +7618,17 @@ async fn enable_strict_auto_review_for_turn_uses_originating_turn() { +@@ -7625,15 +7631,17 @@ async fn enable_strict_auto_review_for_turn_uses_originating_turn() { }), ..RequestPermissionProfile::default() }; @@ -2783,10 +2800,10 @@ index 7bd3a38..39cf917 100644 assert!(turn_context.strict_auto_review_enabled()); } diff --git a/codex-rs/core/src/session/tests/guardian_tests.rs b/codex-rs/core/src/session/tests/guardian_tests.rs -index adf4784..04afc43 100644 +index 669d529..c8188de 100644 --- a/codex-rs/core/src/session/tests/guardian_tests.rs +++ b/codex-rs/core/src/session/tests/guardian_tests.rs -@@ -663,20 +663,22 @@ async fn strict_auto_review_turn_grant_forces_guardian_for_exec_command_policy_s +@@ -664,20 +664,22 @@ async fn strict_auto_review_turn_grant_forces_guardian_for_exec_command_policy_s .await; let (mut session, mut turn_context_raw) = make_session_and_context().await; @@ -2823,7 +2840,7 @@ index adf4784..04afc43 100644 Arc::make_mut(&mut turn_context_raw.config) .permissions diff --git a/codex-rs/core/src/session/turn_context.rs b/codex-rs/core/src/session/turn_context.rs -index 1c2f977..c539b39 100644 +index b31eeca..ebe74cc 100644 --- a/codex-rs/core/src/session/turn_context.rs +++ b/codex-rs/core/src/session/turn_context.rs @@ -666,11 +666,14 @@ impl TurnContext { @@ -2843,10 +2860,10 @@ index 1c2f977..c539b39 100644 /// Step-scoped consumers should use their captured `StepContext::settings`. pub(crate) fn allow_prefix_rules(&self) -> AllowPrefixRules { diff --git a/codex-rs/core/src/tools/approvals.rs b/codex-rs/core/src/tools/approvals.rs -index cdd468c..f865331 100644 +index 245a638..e87c0f3 100644 --- a/codex-rs/core/src/tools/approvals.rs +++ b/codex-rs/core/src/tools/approvals.rs -@@ -456,6 +456,38 @@ impl Session { +@@ -468,6 +468,38 @@ impl Session { action: ApprovalAction, ctx: ApprovalContext, ) -> ApprovalResult { @@ -2885,7 +2902,7 @@ index cdd468c..f865331 100644 // Retained authority outside current grants needs a new sandbox approval. // Current grants permit review of the input; they never approve the input itself. let policy = ctx.review_context.turn().approval_policy(); -@@ -503,6 +535,13 @@ impl Session { +@@ -516,6 +548,13 @@ impl Session { }, None => self.request_reviewer_approval(action, &ctx).await, }; @@ -2900,10 +2917,10 @@ index cdd468c..f865331 100644 if !is_network_approval { record_resolution(&ctx, &resolution); diff --git a/codex-rs/core/src/tools/handlers/unified_exec/exec_command.rs b/codex-rs/core/src/tools/handlers/unified_exec/exec_command.rs -index ce0a502..886fd05 100644 +index ca15be3..5b6bdea 100644 --- a/codex-rs/core/src/tools/handlers/unified_exec/exec_command.rs +++ b/codex-rs/core/src/tools/handlers/unified_exec/exec_command.rs -@@ -319,7 +319,7 @@ impl ExecCommandHandler { +@@ -320,7 +320,7 @@ impl ExecCommandHandler { // Sticky turn permissions have already been approved, so they should // continue through the normal exec approval flow for the command. @@ -2926,10 +2943,10 @@ index a1a88e4..136bf14 100644 let otel_tn = flat_tool_name(&tool_ctx.tool_name).into_owned(); let otel_ci = &tool_ctx.call_id; diff --git a/codex-rs/core/src/tools/runtimes/unified_exec.rs b/codex-rs/core/src/tools/runtimes/unified_exec.rs -index 35c70df..e4af525 100644 +index 44a6ab9..4519bf8 100644 --- a/codex-rs/core/src/tools/runtimes/unified_exec.rs +++ b/codex-rs/core/src/tools/runtimes/unified_exec.rs -@@ -384,7 +384,7 @@ impl<'a> ToolRuntime for UnifiedExecRunt +@@ -357,7 +357,7 @@ impl<'a> ToolRuntime for UnifiedExecRunt ) .await; if routes_approval_policy_to_guardian( @@ -2939,10 +2956,10 @@ index 35c70df..e4af525 100644 ) && network .remote_policy_decider(launch.proxy.allow_local_binding) diff --git a/codex-rs/core/src/unified_exec/process_manager.rs b/codex-rs/core/src/unified_exec/process_manager.rs -index 5c4a429..6a54f96 100644 +index 0ba92cb..d576bd6 100644 --- a/codex-rs/core/src/unified_exec/process_manager.rs +++ b/codex-rs/core/src/unified_exec/process_manager.rs -@@ -1521,7 +1521,7 @@ impl UnifiedExecProcessManager { +@@ -1530,7 +1530,7 @@ impl UnifiedExecProcessManager { .create_exec_approval_requirement_for_shell( ExecApprovalRequest { command: &request.command, @@ -2965,10 +2982,10 @@ index 6606f67..e0ce08e 100644 ) || step_context.turn.network.is_some() diff --git a/codex-rs/hooks/src/events/compact.rs b/codex-rs/hooks/src/events/compact.rs -index cdc9846..e5f78eb 100644 +index 720e097..7abcfa2 100644 --- a/codex-rs/hooks/src/events/compact.rs +++ b/codex-rs/hooks/src/events/compact.rs -@@ -228,13 +228,26 @@ fn parse_pre_completed( +@@ -229,13 +229,26 @@ fn parse_pre_completed( run_result: HandlerRunResult, turn_id: Option, ) -> dispatcher::ParsedHandler { @@ -2997,7 +3014,7 @@ index cdc9846..e5f78eb 100644 } fn parse_post_completed( -@@ -495,6 +508,48 @@ mod tests { +@@ -492,6 +505,48 @@ mod tests { assert_eq!(parsed.completed.run.entries, Vec::new()); } @@ -3047,7 +3064,7 @@ index cdc9846..e5f78eb 100644 super::PreCompactRequest { session_id: ThreadId::from_string("00000000-0000-4000-8000-000000000001") diff --git a/codex-rs/protocol/src/protocol.rs b/codex-rs/protocol/src/protocol.rs -index dc5c2a3..da29d04 100644 +index 2ac7fe1..ffbd49c 100644 --- a/codex-rs/protocol/src/protocol.rs +++ b/codex-rs/protocol/src/protocol.rs @@ -532,6 +532,8 @@ pub struct ConversationSpeechParams { diff --git a/scripts/codex-protected/retained.json b/scripts/codex-protected/retained.json index cd5f8c54..b1081145 100644 --- a/scripts/codex-protected/retained.json +++ b/scripts/codex-protected/retained.json @@ -1,11 +1,16 @@ { - "schema": 1, "contract": "doxa-precompact-fail-closed-v1", "contracts": [ { - "version": "0.163.0", + "patch_sha256": "3a7b8c09b1f95bc523611202005aa71e6ba14d23f26a3833249487385e013e9c", "source_commit": "83086188ae0614bd882818ff1aa23f3194962012", - "patch_sha256": "3a7b8c09b1f95bc523611202005aa71e6ba14d23f26a3833249487385e013e9c" + "version": "0.163.0" + }, + { + "patch_sha256": "f8759872787029e5bf7064fe5be7166c5367b1db09b4b60362ea625117658924", + "source_commit": "6aaac694803004a63c6f393d153c96d22521a6b9", + "version": "0.164.0" } - ] + ], + "schema": 1 } diff --git a/scripts/codex-protected/reviews/0.165.0.json b/scripts/codex-protected/reviews/0.165.0.json new file mode 100644 index 00000000..36b0991f --- /dev/null +++ b/scripts/codex-protected/reviews/0.165.0.json @@ -0,0 +1,45 @@ +{ + "schema": 1, + "review_kind": "manual protected contract port; no automatic approval exception", + "before": { + "schema": 1, + "version": "0.164.0", + "tag": "rust-v0.164.0", + "source_commit": "6aaac694803004a63c6f393d153c96d22521a6b9", + "patch_sha256": "f8759872787029e5bf7064fe5be7166c5367b1db09b4b60362ea625117658924", + "contract": "doxa-precompact-fail-closed-v1", + "provider": "codex-0.164.0-precompact-v1" + }, + "after": { + "contract": "doxa-precompact-fail-closed-v1", + "patch_sha256": "128293eb2e10aebdff916ab1d8fbce30fa10eba2dfac01cc501f9c1591034484", + "provider": "codex-0.165.0-precompact-v1", + "schema": 1, + "source_commit": "360319d8dee62d87e2d59fc0c21805d79519cfed", + "tag": "rust-v0.165.0", + "version": "0.165.0" + }, + "upstream_diff_sha256": "c6321a9b013a3bfcf37777ec308ae90201874dc44f9471b6f8d4898761cf7472", + "changed_path_count": 685, + "guard_sensitive_path_count": 174, + "patch_delta": "Protection hunks are unchanged from 0.164.0 apart from release stamps (167 workspace Cargo.lock versions, one more crate than 0.164, and the initialize user-agent) and the hand-merged PreCompact hunk below.", + "reviewed_contracts": { + "compaction": "0.165 builds PreCompact hooks with environment requirements hooks. Those are discovered as HookSource::System at /requirements.toml and cannot satisfy the required SessionFlags //config.toml identity, so they can only stop compaction. Preview and run now share one hook set. Every history-replacement and compaction-inference caller (local, remote V2, token-budget new_context, Op::Compact entry points) is still dominated by run_pre_compact_hooks; there are no new callers. Async scheduler and direct background paths remain refused.", + "approval_result": "Live-auto checks remain on every user, reviewer, PermissionRequest-hook and Guardian path: command, write_stdin, apply_patch, network, MCP tool-call and request_permissions. run_permission_request_hooks gained a target environment and still runs between the pre- and post-review checks. Final grants are still sanitized and recorded under the active_turn lock that publishes the tightening.", + "execution": "Patched live approval-policy reads still sit on the live paths after upstream moved remote proxy launch into remote_network_proxy_launch. The executor-cannot-launch-proxy refusal stays fail-closed. New exec-server review-domain support checks are fail-closed.", + "turn_settings": "turn_processor and v2 turn settings are unchanged upstream. doxaAuto still cannot be combined with other updates, and the ThreadSettingsApplied resume de-duplication affects thread defaults only.", + "new_entrypoints": "Environment hook execution (hook_environment_executor) is unreachable: EnvironmentConfig has no Deserialize, environment_ready has no non-test caller, and every production constructor uses empty environment_hooks. Guardian recorded-item forwarding is off by default, and DOXA drops notifications for foreign thread ids. thread/memory/read, fork attachToSource and the gcp provider do not touch permissions, hooks or sandbox, and DOXA sends none of them. No new model tools. agents.enabled=false and multi_agent_v2=false still resolve to MultiAgentVersion::Disabled.", + "build_inputs": "Unchanged: Rust 1.99.1 (codex-rs/rust-toolchain.toml) and the official V8 152.2.0 archive/binding release manifests, byte-identical to 0.164.0." + }, + "source_inputs": { + "codex-rs/rust-toolchain.toml": "913d7e9d7adcd7abfeb0c4554c39a5a57c3cf84a694bc6a6aeae038a1f6ae33b", + "third_party/v8/rusty_v8_152_2_0_release_manifests.sha256": "1dd7c7f7d3d91af7f06a2846bddc6a1da7725acc67ecd7ab2c7dfc980dd8c6d4" + }, + "noted_not_regressions": { + "execpolicy_amendment_after_switch": "Present since 0.164.0: session/handlers.rs exec_approval persists an ApprovedExecpolicyAmendment before the live-auto post-review denial. Unreachable from DOXA, whose host answers only accept/decline and rejects amendment decisions. Candidate hardening for a later port.", + "context_management_token_budget": "Present since 0.164.0: with features.context_management=true, a supporting model and a Plus/Pro plan, session/token_budget.rs can enable TokenBudget at runtime despite the CLI override. Resets remain gated by run_pre_compact_hooks. Candidate hardening: also pin features.context_management=false." + }, + "required_new_regression": null, + "compiled_verification": "Separate hash-bound build and compiled guard proof required; this static review record is never an acceptance receipt.", + "automatic_sensitive_path_gate_changed": false +} diff --git a/scripts/codex-protected/verify_automatic.py b/scripts/codex-protected/verify_automatic.py index 1dfe0897..025de6ae 100755 --- a/scripts/codex-protected/verify_automatic.py +++ b/scripts/codex-protected/verify_automatic.py @@ -145,7 +145,7 @@ def do_POST(self): rpc = Rpc([str(binary), "--listen", "stdio://"] + hook_overrides(mode), environment, root) try: initialized = rpc.request("initialize", {"clientInfo": {"name": "doxa_fault_fixture", "version": "1"}, "capabilities": {"experimentalApi": True}}) - assert initialized["userAgent"].startswith("doxa_codex_rs/0.164.0 (doxa-precompact-fail-closed-v1; ") + assert initialized["userAgent"].startswith("doxa_codex_rs/0.165.0 (doxa-precompact-fail-closed-v1; ") rpc.send({"method": "initialized"}) inventory = rpc.request("hooks/list", {"cwds": [str(root)]}) hooks = [hook for entry in inventory["data"] for hook in entry["hooks"] if hook["eventName"] == "preCompact" and hook["source"] == "sessionFlags"] diff --git a/scripts/codex-protected/verify_code_mode.py b/scripts/codex-protected/verify_code_mode.py index 5406e950..170ff4d6 100644 --- a/scripts/codex-protected/verify_code_mode.py +++ b/scripts/codex-protected/verify_code_mode.py @@ -26,7 +26,7 @@ import threading import time -AGENT_PREFIX = "doxa_codex_rs/0.164.0 (doxa-precompact-fail-closed-v1; " +AGENT_PREFIX = "doxa_codex_rs/0.165.0 (doxa-precompact-fail-closed-v1; " MAX_BYTES = 8 * 1024 * 1024 DEADLINE = 45 CALL_ID = "owned-code-mode-read" diff --git a/scripts/install_codex_protected.py b/scripts/install_codex_protected.py index e3e755d1..ff0bfb61 100755 --- a/scripts/install_codex_protected.py +++ b/scripts/install_codex_protected.py @@ -19,25 +19,26 @@ import re from contextlib import contextmanager -SOURCE = "6aaac694803004a63c6f393d153c96d22521a6b9" -SOURCE_TAG = "rust-v0.164.0" +SOURCE = "360319d8dee62d87e2d59fc0c21805d79519cfed" +SOURCE_TAG = "rust-v0.165.0" CONTRACT = "doxa-precompact-fail-closed-v1" -PROVIDER = "codex-0.164.0-precompact-v1" +PROVIDER = "codex-0.165.0-precompact-v1" PATCH = Path(__file__).resolve().parent / "codex-protected/precompact.patch" -PATCH_SHA256 = "f8759872787029e5bf7064fe5be7166c5367b1db09b4b60362ea625117658924" +PATCH_SHA256 = "128293eb2e10aebdff916ab1d8fbce30fa10eba2dfac01cc501f9c1591034484" LEGACY_PATCH_SHA256 = "d6c8a41c0370c12dcace10d6babe13de7852f0095fed7b46289b38e7a6cd0f4b" -PREVIOUS_SOURCE = '83086188ae0614bd882818ff1aa23f3194962012' -PREVIOUS_PROVIDER = 'codex-0.163.0-precompact-v1' -PREVIOUS_PATCHES = {'3a7b8c09b1f95bc523611202005aa71e6ba14d23f26a3833249487385e013e9c'} +PREVIOUS_SOURCE = '6aaac694803004a63c6f393d153c96d22521a6b9' +PREVIOUS_PROVIDER = 'codex-0.164.0-precompact-v1' +PREVIOUS_PATCHES = {'f8759872787029e5bf7064fe5be7166c5367b1db09b4b60362ea625117658924'} # Installer migration/rollback trust only. The native launcher stays current-only. # Never infer identities from an active receipt or discard older reviewed entries. MAX_REVIEWED_INSTALLATIONS = 256 REVIEWED_INSTALLATIONS = ( + ('6aaac694803004a63c6f393d153c96d22521a6b9', 'f8759872787029e5bf7064fe5be7166c5367b1db09b4b60362ea625117658924', 'codex-0.164.0-precompact-v1'), ('83086188ae0614bd882818ff1aa23f3194962012', '3a7b8c09b1f95bc523611202005aa71e6ba14d23f26a3833249487385e013e9c', 'codex-0.163.0-precompact-v1'), ('b412ff32c417f855c2b2d1581b77058eed87c84b', '23bccbb08344fc70d1fd8a482b19814ca7f8edff07d478091b8c703e37a7ec6d', 'codex-0.156.1-precompact-v1'), ('b412ff32c417f855c2b2d1581b77058eed87c84b', 'd6c8a41c0370c12dcace10d6babe13de7852f0095fed7b46289b38e7a6cd0f4b', 'codex-0.156.1-precompact-v1'), ) -AGENT_PREFIX = "doxa_codex_rs/0.164.0 (doxa-precompact-fail-closed-v1; doxa-midturn-auto-v1; " +AGENT_PREFIX = "doxa_codex_rs/0.165.0 (doxa-precompact-fail-closed-v1; doxa-midturn-auto-v1; " # Older reviewed payloads retain their original compiler provenance during # migration and rollback. Exact source/patch keys prevent a toolchain relabel. diff --git a/scripts/tests/test_codex_protected_installer.py b/scripts/tests/test_codex_protected_installer.py index 0af3f9b3..e6b7289e 100644 --- a/scripts/tests/test_codex_protected_installer.py +++ b/scripts/tests/test_codex_protected_installer.py @@ -153,7 +153,9 @@ def test_verified_patch_upgrade_keeps_the_previous_provider_immutable(self): receipt["source_commit"] = installer.PREVIOUS_SOURCE receipt["code_mode_host_source_commit"] = installer.PREVIOUS_SOURCE receipt["patch_sha256"] = next(value for value in installer.PREVIOUS_PATCHES if value != installer.LEGACY_PATCH_SHA256) - receipt["toolchain"] = "1.95.0" + # The previous provider keeps the compiler it was actually built with. + receipt["toolchain"] = installer.LEGACY_BUILD_TOOLCHAINS.get( + (installer.PREVIOUS_SOURCE, receipt["patch_sha256"]), "1.99.1") receipt_path.write_text(json.dumps(receipt, sort_keys=True) + "\n") old = self.root / "providers" / (installer.PREVIOUS_PROVIDER + "-" + installer.digest(receipt_path)) self.destination.rename(old)