From 9c84fb914f1782de228d36fb8243708fa6bfb8a6 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Thu, 30 Apr 2026 02:40:53 -0700 Subject: [PATCH] core: use permission profiles in small read-only contexts --- codex-rs/core/src/context_manager/history_tests.rs | 14 ++++++++++---- codex-rs/core/src/guardian/review_session.rs | 10 +++++++--- codex-rs/core/src/realtime_context_tests.rs | 8 ++++++-- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/codex-rs/core/src/context_manager/history_tests.rs b/codex-rs/core/src/context_manager/history_tests.rs index 74f4d29bfb..6ef5daec2a 100644 --- a/codex-rs/core/src/context_manager/history_tests.rs +++ b/codex-rs/core/src/context_manager/history_tests.rs @@ -13,13 +13,13 @@ use codex_protocol::models::ImageDetail; use codex_protocol::models::LocalShellAction; use codex_protocol::models::LocalShellExecAction; use codex_protocol::models::LocalShellStatus; +use codex_protocol::models::PermissionProfile; use codex_protocol::models::ReasoningItemContent; use codex_protocol::models::ReasoningItemReasoningSummary; use codex_protocol::openai_models::InputModality; use codex_protocol::openai_models::default_input_modalities; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::InterAgentCommunication; -use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::TurnContextItem; use codex_utils_output_truncation::TruncationPolicy; use codex_utils_output_truncation::truncate_text; @@ -119,15 +119,21 @@ fn developer_msg_with_fragments(texts: &[&str]) -> ResponseItem { } fn reference_context_item() -> TurnContextItem { + let cwd = PathBuf::from("/tmp/reference-cwd"); + let permission_profile = PermissionProfile::read_only(); + let sandbox_policy = permission_profile + .to_legacy_sandbox_policy(cwd.as_path()) + .expect("read-only permission profile should have a legacy projection"); + TurnContextItem { turn_id: Some("reference-turn".to_string()), trace_id: None, - cwd: PathBuf::from("/tmp/reference-cwd"), + cwd, current_date: Some("2026-03-23".to_string()), timezone: Some("America/Los_Angeles".to_string()), approval_policy: AskForApproval::OnRequest, - sandbox_policy: SandboxPolicy::new_read_only_policy(), - permission_profile: None, + sandbox_policy, + permission_profile: Some(permission_profile), network: None, file_system_sandbox_policy: None, model: "gpt-test".to_string(), diff --git a/codex-rs/core/src/guardian/review_session.rs b/codex-rs/core/src/guardian/review_session.rs index 7093d5e3d0..6070d20af6 100644 --- a/codex-rs/core/src/guardian/review_session.rs +++ b/codex-rs/core/src/guardian/review_session.rs @@ -18,7 +18,6 @@ use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::Op; use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SubAgentSource; use codex_protocol::protocol::TokenUsage; use serde_json::Value; @@ -703,6 +702,11 @@ async fn run_review_on_session( .await .unwrap_or_default(); + let permission_profile = PermissionProfile::read_only(); + let sandbox_policy = permission_profile + .to_legacy_sandbox_policy(params.parent_turn.cwd.as_path()) + .expect("read-only permission profile should have a legacy projection"); + let submit_result = run_before_review_deadline( deadline, params.external_cancel.as_ref(), @@ -712,8 +716,8 @@ async fn run_review_on_session( cwd: params.parent_turn.cwd.to_path_buf(), approval_policy: AskForApproval::Never, approvals_reviewer: None, - sandbox_policy: SandboxPolicy::new_read_only_policy(), - permission_profile: None, + sandbox_policy, + permission_profile: Some(permission_profile), model: params.model.clone(), effort: params.reasoning_effort, summary: Some(params.reasoning_summary), diff --git a/codex-rs/core/src/realtime_context_tests.rs b/codex-rs/core/src/realtime_context_tests.rs index 9c1eb3af4b..0375813ac3 100644 --- a/codex-rs/core/src/realtime_context_tests.rs +++ b/codex-rs/core/src/realtime_context_tests.rs @@ -13,10 +13,10 @@ use chrono::Utc; use codex_git_utils::GitSha; use codex_protocol::ThreadId; use codex_protocol::models::ContentItem; +use codex_protocol::models::PermissionProfile; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::GitInfo; -use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionSource; use codex_thread_store::StoredThread; use core_test_support::PathBufExt; @@ -28,6 +28,8 @@ use std::process::Command; use tempfile::TempDir; fn stored_thread(cwd: &str, title: &str, first_user_message: &str) -> StoredThread { + let permission_profile = PermissionProfile::read_only(); + StoredThread { thread_id: ThreadId::new(), rollout_path: Some(PathBuf::from("/tmp/rollout.jsonl")), @@ -58,7 +60,9 @@ fn stored_thread(cwd: &str, title: &str, first_user_message: &str) -> StoredThre repository_url: None, }), approval_mode: AskForApproval::Never, - sandbox_policy: SandboxPolicy::new_read_only_policy(), + sandbox_policy: permission_profile + .to_legacy_sandbox_policy(std::path::Path::new(cwd)) + .expect("read-only permission profile should have a legacy projection"), token_usage: None, first_user_message: Some(first_user_message.to_string()), history: None,