permissions: store thread sessions as profiles

This commit is contained in:
Michael Bolin
2026-04-27 14:05:17 -07:00
parent 7aed116fa5
commit 64679ec8a5
4 changed files with 3 additions and 27 deletions

View File

@@ -2211,7 +2211,6 @@ async fn inactive_thread_approval_bubbles_into_active_view() -> Result<()> {
/*capacity*/ 1,
ThreadSessionState {
approval_policy: AskForApproval::OnRequest,
sandbox_policy: SandboxPolicy::new_workspace_write_policy(),
permission_profile: PermissionProfile::workspace_write(),
rollout_path: Some(test_path_buf("/tmp/agent-rollout.jsonl")),
..test_thread_session(agent_thread_id, test_path_buf("/tmp/agent"))
@@ -2371,7 +2370,6 @@ async fn side_defers_subagent_approval_overlay_until_side_exits() -> Result<()>
/*capacity*/ 4,
ThreadSessionState {
approval_policy: AskForApproval::OnRequest,
sandbox_policy: SandboxPolicy::new_workspace_write_policy(),
permission_profile: PermissionProfile::workspace_write(),
rollout_path: Some(test_path_buf("/tmp/agent-rollout.jsonl")),
..test_thread_session(agent_thread_id, test_path_buf("/tmp/agent"))
@@ -2663,7 +2661,6 @@ async fn inactive_thread_approval_badge_clears_after_turn_completion_notificatio
/*capacity*/ 4,
ThreadSessionState {
approval_policy: AskForApproval::OnRequest,
sandbox_policy: SandboxPolicy::new_workspace_write_policy(),
permission_profile: PermissionProfile::workspace_write(),
rollout_path: Some(test_path_buf("/tmp/agent-rollout.jsonl")),
..test_thread_session(agent_thread_id, test_path_buf("/tmp/agent"))
@@ -2717,7 +2714,6 @@ async fn inactive_thread_started_notification_initializes_replay_session() -> Re
ThreadId::from_string("00000000-0000-0000-0000-000000000202").expect("valid thread");
let primary_session = ThreadSessionState {
approval_policy: AskForApproval::OnRequest,
sandbox_policy: SandboxPolicy::new_workspace_write_policy(),
permission_profile: PermissionProfile::workspace_write(),
..test_thread_session(main_thread_id, test_path_buf("/tmp/main"))
};
@@ -2742,7 +2738,7 @@ async fn inactive_thread_started_notification_initializes_replay_session() -> Re
current_date: None,
timezone: None,
approval_policy: primary_session.approval_policy,
sandbox_policy: primary_session.sandbox_policy.clone(),
sandbox_policy: SandboxPolicy::new_workspace_write_policy(),
permission_profile: None,
network: None,
file_system_sandbox_policy: None,
@@ -2830,7 +2826,6 @@ async fn inactive_thread_started_notification_preserves_primary_model_when_path_
ThreadId::from_string("00000000-0000-0000-0000-000000000302").expect("valid thread");
let primary_session = ThreadSessionState {
approval_policy: AskForApproval::OnRequest,
sandbox_policy: SandboxPolicy::new_workspace_write_policy(),
permission_profile: PermissionProfile::workspace_write(),
..test_thread_session(main_thread_id, test_path_buf("/tmp/main"))
};
@@ -2899,7 +2894,6 @@ async fn thread_read_session_state_does_not_reuse_primary_permission_profile() {
ThreadId::from_string("00000000-0000-0000-0000-000000000402").expect("valid thread");
let primary_session = ThreadSessionState {
approval_policy: AskForApproval::OnRequest,
sandbox_policy: SandboxPolicy::new_workspace_write_policy(),
permission_profile: PermissionProfile::workspace_write(),
..test_thread_session(main_thread_id, test_path_buf("/tmp/main"))
};
@@ -3805,7 +3799,6 @@ fn test_thread_session(thread_id: ThreadId, cwd: PathBuf) -> ThreadSessionState
service_tier: None,
approval_policy: AskForApproval::Never,
approvals_reviewer: ApprovalsReviewer::User,
sandbox_policy: SandboxPolicy::new_read_only_policy(),
permission_profile: PermissionProfile::read_only(),
cwd: cwd.abs(),
instruction_source_paths: Vec::new(),

View File

@@ -335,7 +335,6 @@ mod tests {
use codex_config::types::ApprovalsReviewer;
use codex_protocol::models::PermissionProfile;
use codex_protocol::protocol::AskForApproval;
use codex_protocol::protocol::SandboxPolicy;
use pretty_assertions::assert_eq;
use std::path::PathBuf;
@@ -350,7 +349,6 @@ mod tests {
service_tier: None,
approval_policy: AskForApproval::Never,
approvals_reviewer: ApprovalsReviewer::User,
sandbox_policy: SandboxPolicy::new_read_only_policy(),
permission_profile: PermissionProfile::read_only(),
cwd: cwd.abs(),
instruction_source_paths: Vec::new(),

View File

@@ -14,10 +14,6 @@ impl App {
let approval_policy = self.config.permissions.approval_policy.value();
let approvals_reviewer = self.config.approvals_reviewer;
let sandbox_policy = self
.config
.permissions
.legacy_sandbox_policy(self.config.cwd.as_path());
let permission_profile = self
.chat_widget
.config_ref()
@@ -26,7 +22,6 @@ impl App {
let update_session = |session: &mut ThreadSessionState| {
session.approval_policy = approval_policy;
session.approvals_reviewer = approvals_reviewer;
session.sandbox_policy = sandbox_policy.clone();
session.permission_profile = permission_profile.clone();
};
@@ -49,7 +44,6 @@ impl App {
thread_id: ThreadId,
thread: &Thread,
) -> ThreadSessionState {
let sandbox_policy = self.active_legacy_sandbox_policy_for_cwd(thread.cwd.as_path());
let mut session = self
.primary_session_configured
.clone()
@@ -63,7 +57,6 @@ impl App {
service_tier: self.chat_widget.current_service_tier(),
approval_policy: self.config.permissions.approval_policy.value(),
approvals_reviewer: self.config.approvals_reviewer,
sandbox_policy,
permission_profile: self
.active_legacy_permission_profile_for_cwd(thread.cwd.as_path()),
cwd: thread.cwd.clone(),
@@ -78,7 +71,6 @@ impl App {
session.thread_name = thread.name.clone();
session.model_provider_id = thread.model_provider.clone();
session.cwd = thread.cwd.clone();
session.sandbox_policy = self.active_legacy_sandbox_policy_for_cwd(thread.cwd.as_path());
session.permission_profile =
self.active_legacy_permission_profile_for_cwd(thread.cwd.as_path());
session.instruction_source_paths = Vec::new();
@@ -140,7 +132,6 @@ mod tests {
service_tier: None,
approval_policy: AskForApproval::Never,
approvals_reviewer: ApprovalsReviewer::User,
sandbox_policy: SandboxPolicy::new_read_only_policy(),
permission_profile: PermissionProfile::read_only(),
cwd: cwd.abs(),
instruction_source_paths: Vec::new(),
@@ -162,7 +153,7 @@ mod tests {
let main_session = test_thread_session(main_thread_id, test_path_buf("/tmp/main"));
let side_session = ThreadSessionState {
approval_policy: AskForApproval::OnRequest,
sandbox_policy: SandboxPolicy::new_workspace_write_policy(),
permission_profile: PermissionProfile::workspace_write(),
..test_thread_session(side_thread_id, test_path_buf("/tmp/side"))
};
@@ -214,7 +205,6 @@ mod tests {
let expected_main_session = ThreadSessionState {
approval_policy: AskForApproval::OnRequest,
approvals_reviewer: ApprovalsReviewer::AutoReview,
sandbox_policy: expected_sandbox_policy,
permission_profile: expected_permission_profile,
..main_session
};
@@ -317,7 +307,7 @@ mod tests {
let read_thread_id =
ThreadId::from_string("00000000-0000-0000-0000-000000000405").expect("valid thread");
let primary_session = ThreadSessionState {
permission_profile: PermissionProfile::legacy_workspace_write_template(),
permission_profile: PermissionProfile::workspace_write(),
..test_thread_session(primary_thread_id, test_path_buf("/tmp/primary"))
};
let read_thread = Thread {
@@ -356,7 +346,6 @@ mod tests {
&expected_sandbox_policy,
read_thread.cwd.as_path(),
);
assert_eq!(session.sandbox_policy, expected_sandbox_policy);
assert_eq!(session.permission_profile, expected_permission_profile);
assert_ne!(
session.permission_profile,

View File

@@ -156,9 +156,6 @@ pub(crate) struct ThreadSessionState {
pub(crate) service_tier: Option<codex_protocol::config_types::ServiceTier>,
pub(crate) approval_policy: AskForApproval,
pub(crate) approvals_reviewer: codex_protocol::config_types::ApprovalsReviewer,
/// Legacy sandbox projection kept only for compatibility fields that have
/// not migrated to `PermissionProfile` yet.
pub(crate) sandbox_policy: SandboxPolicy,
/// Canonical active permissions for this session. Legacy app-server
/// responses are converted to a profile at ingestion time using the
/// response cwd so cached sessions do not reinterpret cwd-bound grants.
@@ -1420,7 +1417,6 @@ async fn thread_session_state_from_thread_response(
service_tier,
approval_policy,
approvals_reviewer,
sandbox_policy,
permission_profile,
cwd,
instruction_source_paths,