Fix TUI turn context permissions merge

This commit is contained in:
Eric Traut
2026-05-16 12:40:37 -07:00
parent a987271f11
commit 11b4da4a58
5 changed files with 24 additions and 49 deletions

View File

@@ -5387,21 +5387,12 @@ fn override_turn_context_updates_app_server_next_turn_state() {
.expect("override should update app-server turn context");
assert_eq!(handled, true);
let current_cwd = app.chat_widget.config_ref().cwd.to_path_buf();
let response = app_server
.thread_turn_context_update(
thread_id,
/*cwd*/ None,
/*approval_policy*/ None,
/*approvals_reviewer*/ None,
/*permission_profile*/ None,
/*active_permission_profile*/ None,
current_cwd.as_path(),
/*model*/ None,
/*effort*/ None,
/*summary*/ None,
/*service_tier*/ None,
/*collaboration_mode*/ None,
thread_id, /*cwd*/ None, /*approval_policy*/ None,
/*approvals_reviewer*/ None, /*active_permission_profile*/ None,
/*model*/ None, /*effort*/ None, /*summary*/ None,
/*service_tier*/ None, /*collaboration_mode*/ None,
/*personality*/ None,
)
.await

View File

@@ -689,7 +689,7 @@ impl App {
cwd,
approval_policy,
approvals_reviewer,
permission_profile,
active_permission_profile,
windows_sandbox_level: _,
model,
effort,
@@ -698,23 +698,13 @@ impl App {
collaboration_mode,
personality,
} => {
let config = self.chat_widget.config_ref();
let current_cwd = config.cwd.to_path_buf();
let active_permission_profile =
permission_profile.as_ref().and_then(|permission_profile| {
(config.permissions.permission_profile() == permission_profile.clone())
.then(|| config.permissions.active_permission_profile())
.flatten()
});
app_server
.thread_turn_context_update(
thread_id,
cwd.clone(),
*approval_policy,
*approvals_reviewer,
permission_profile.clone(),
active_permission_profile,
current_cwd.as_path(),
active_permission_profile.clone(),
model.clone(),
*effort,
*summary,

View File

@@ -121,7 +121,6 @@ use color_eyre::eyre::ContextCompat;
use color_eyre::eyre::Result;
use color_eyre::eyre::WrapErr;
use std::collections::HashMap;
use std::path::Path;
use std::path::PathBuf;
fn bootstrap_request_error(context: &'static str, err: TypedRequestError) -> color_eyre::Report {
@@ -613,9 +612,7 @@ impl AppServerSession {
cwd: Option<PathBuf>,
approval_policy: Option<AskForApproval>,
approvals_reviewer: Option<codex_protocol::config_types::ApprovalsReviewer>,
permission_profile: Option<PermissionProfile>,
active_permission_profile: Option<ActivePermissionProfile>,
current_cwd: &Path,
model: Option<String>,
effort: Option<Option<codex_protocol::openai_models::ReasoningEffort>>,
summary: Option<codex_protocol::config_types::ReasoningSummary>,
@@ -624,18 +621,7 @@ impl AppServerSession {
personality: Option<codex_protocol::config_types::Personality>,
) -> Result<ThreadTurnContextUpdateResponse> {
let request_id = self.next_request_id();
let (sandbox_policy, permissions) = permission_profile
.as_ref()
.map(|permission_profile| {
let permission_cwd = cwd.as_deref().unwrap_or(current_cwd);
turn_permissions_overrides(
permission_profile,
active_permission_profile,
permission_cwd,
self.thread_params_mode(),
)
})
.unwrap_or((None, None));
let permissions = active_permission_profile.map(permissions_selection_from_active_profile);
self.client
.request_typed(ClientRequest::ThreadTurnContextUpdate {
request_id,
@@ -644,7 +630,7 @@ impl AppServerSession {
cwd,
approval_policy,
approvals_reviewer: approvals_reviewer.map(Into::into),
sandbox_policy,
sandbox_policy: None,
permissions,
model,
service_tier,

View File

@@ -268,18 +268,26 @@ impl ChatWidget {
let active_permission_profile = turn_context
.active_permission_profile
.map(codex_protocol::models::ActivePermissionProfile::from);
let permission_snapshot = PermissionProfileSnapshot::from_session_snapshot(
permission_profile,
active_permission_profile,
);
if let Err(err) = self
.config
.permissions
.set_permission_profile_with_active_profile(
permission_profile.clone(),
active_permission_profile.clone(),
)
.set_permission_profile_from_session_snapshot(permission_snapshot.clone())
{
tracing::warn!(%err, "failed to sync permissions from turn context update");
self.config.permissions.permission_profile =
Constrained::allow_only(permission_profile);
self.config.permissions.active_permission_profile = active_permission_profile;
if let Err(replace_err) = self
.config
.permissions
.replace_permission_profile_from_session_snapshot(permission_snapshot)
{
tracing::warn!(
%replace_err,
"failed to replace permissions from turn context update"
);
}
}
self.config.approvals_reviewer = turn_context.approvals_reviewer.to_core();
self.current_collaboration_mode = turn_context.collaboration_mode;

View File

@@ -55,7 +55,7 @@ async fn turn_context_updated_notification_refreshes_active_ui_state_without_his
);
assert_eq!(
chat.config_ref().permissions.permission_profile(),
permission_profile
&permission_profile
);
assert_eq!(
chat.config_ref().model_reasoning_summary,