tui: sync session permission profiles

This commit is contained in:
Michael Bolin
2026-04-21 10:25:02 -07:00
parent 02b498e158
commit 8d1ce90d59
2 changed files with 34 additions and 1 deletions

View File

@@ -138,6 +138,7 @@ use codex_protocol::items::AgentMessageContent;
use codex_protocol::items::AgentMessageItem;
use codex_protocol::items::UserMessageItem;
use codex_protocol::models::MessagePhase;
use codex_protocol::models::PermissionProfile;
use codex_protocol::models::local_image_label_text;
use codex_protocol::parse_command::ParsedCommand;
use codex_protocol::plan_tool::PlanItemArg as UpdatePlanItemArg;
@@ -2099,6 +2100,12 @@ impl ChatWidget {
display: SessionConfiguredDisplay,
fork_parent_title: Option<String>,
) {
let permission_profile = event.permission_profile.clone().unwrap_or_else(|| {
PermissionProfile::from_legacy_sandbox_policy(&event.sandbox_policy, &event.cwd)
});
let (file_system_sandbox_policy, network_sandbox_policy) =
permission_profile.to_runtime_permissions();
self.last_agent_markdown = None;
self.agent_turn_markdowns.clear();
self.visible_user_turn_count = 0;
@@ -2135,6 +2142,8 @@ impl ChatWidget {
self.config.permissions.sandbox_policy =
Constrained::allow_only(event.sandbox_policy.clone());
}
self.config.permissions.file_system_sandbox_policy = file_system_sandbox_policy;
self.config.permissions.network_sandbox_policy = network_sandbox_policy;
self.config.approvals_reviewer = event.approvals_reviewer;
self.status_line_project_root_name_cache = None;
let forked_from_id = event.forked_from_id;

View File

@@ -252,6 +252,26 @@ async fn session_configured_syncs_widget_config_permissions_and_cwd() {
let expected_sandbox = SandboxPolicy::new_read_only_policy();
let expected_cwd = test_path_buf("/home/user/sub-agent").abs();
let expected_file_system_policy =
codex_protocol::permissions::FileSystemSandboxPolicy::restricted(vec![
codex_protocol::permissions::FileSystemSandboxEntry {
path: codex_protocol::permissions::FileSystemPath::Special {
value: codex_protocol::permissions::FileSystemSpecialPath::Root,
},
access: codex_protocol::permissions::FileSystemAccessMode::Read,
},
codex_protocol::permissions::FileSystemSandboxEntry {
path: codex_protocol::permissions::FileSystemPath::GlobPattern {
pattern: "**/.secret".to_string(),
},
access: codex_protocol::permissions::FileSystemAccessMode::None,
},
]);
let expected_permission_profile =
codex_protocol::models::PermissionProfile::from_runtime_permissions(
&expected_file_system_policy,
codex_protocol::permissions::NetworkSandboxPolicy::Restricted,
);
let configured = codex_protocol::protocol::SessionConfiguredEvent {
session_id: ThreadId::new(),
forked_from_id: None,
@@ -262,7 +282,7 @@ async fn session_configured_syncs_widget_config_permissions_and_cwd() {
approval_policy: AskForApproval::Never,
approvals_reviewer: ApprovalsReviewer::User,
sandbox_policy: expected_sandbox.clone(),
permission_profile: None,
permission_profile: Some(expected_permission_profile.clone()),
cwd: expected_cwd.clone(),
reasoning_effort: Some(ReasoningEffortConfig::default()),
history_log_id: 0,
@@ -285,6 +305,10 @@ async fn session_configured_syncs_widget_config_permissions_and_cwd() {
chat.config_ref().permissions.sandbox_policy.get(),
&expected_sandbox
);
assert_eq!(
chat.config_ref().permissions.permission_profile(),
expected_permission_profile
);
assert_eq!(&chat.config_ref().cwd, &expected_cwd);
}