@@ -548,7 +548,7 @@ impl AppServerSession {
548548 let request_id = self . next_request_id ( ) ;
549549 let ( sandbox_policy, permission_profile) = turn_start_permission_overrides (
550550 self . thread_params_mode ( ) ,
551- sandbox_policy,
551+ & sandbox_policy,
552552 permission_profile,
553553 ) ;
554554 self . client
@@ -1107,19 +1107,19 @@ fn sandbox_mode_from_policy(
11071107}
11081108
11091109fn turn_start_permission_overrides (
1110- mode : ThreadParamsMode ,
1111- sandbox_policy : SandboxPolicy ,
1110+ thread_params_mode : ThreadParamsMode ,
1111+ sandbox_policy : & SandboxPolicy ,
11121112 permission_profile : Option < PermissionProfile > ,
11131113) -> (
11141114 Option < codex_app_server_protocol:: SandboxPolicy > ,
11151115 Option < codex_app_server_protocol:: PermissionProfile > ,
11161116) {
1117- match ( mode , permission_profile ) {
1118- ( ThreadParamsMode :: Embedded , Some ( permission_profile ) ) => {
1119- ( None , Some ( permission_profile . into ( ) ) )
1120- }
1121- ( ThreadParamsMode :: Embedded , None ) => ( None , None ) ,
1122- ( ThreadParamsMode :: Remote , _ ) => ( Some ( sandbox_policy . into ( ) ) , None ) ,
1117+ if matches ! ( thread_params_mode , ThreadParamsMode :: Remote )
1118+ || matches ! ( sandbox_policy , SandboxPolicy :: ExternalSandbox { .. } )
1119+ {
1120+ ( Some ( sandbox_policy . clone ( ) . into ( ) ) , None )
1121+ } else {
1122+ ( None , permission_profile . map ( Into :: into ) )
11231123 }
11241124}
11251125
@@ -1131,7 +1131,16 @@ fn permission_profile_override_from_config(
11311131 return None ;
11321132 }
11331133
1134- Some ( config. permissions . permission_profile ( ) . into ( ) )
1134+ if matches ! (
1135+ config
1136+ . permissions
1137+ . legacy_sandbox_policy( config. cwd. as_path( ) ) ,
1138+ SandboxPolicy :: ExternalSandbox { .. }
1139+ ) {
1140+ None
1141+ } else {
1142+ Some ( config. permissions . permission_profile ( ) . into ( ) )
1143+ }
11351144}
11361145
11371146fn thread_start_params_from_config (
@@ -1520,6 +1529,48 @@ mod tests {
15201529 assert_eq ! ( params. model_provider, Some ( config. model_provider_id) ) ;
15211530 }
15221531
1532+ #[ test]
1533+ fn embedded_turn_start_permission_overrides_send_runtime_profile_only_when_provided ( ) {
1534+ let sandbox_policy = SandboxPolicy :: DangerFullAccess ;
1535+ let permission_profile = PermissionProfile :: from_legacy_sandbox_policy ( & sandbox_policy) ;
1536+
1537+ assert_eq ! (
1538+ turn_start_permission_overrides(
1539+ ThreadParamsMode :: Embedded ,
1540+ & sandbox_policy,
1541+ /*permission_profile*/ None ,
1542+ ) ,
1543+ ( None , None )
1544+ ) ;
1545+
1546+ assert_eq ! (
1547+ turn_start_permission_overrides(
1548+ ThreadParamsMode :: Embedded ,
1549+ & sandbox_policy,
1550+ Some ( permission_profile. clone( ) ) ,
1551+ ) ,
1552+ ( None , Some ( permission_profile. into( ) ) )
1553+ ) ;
1554+ }
1555+
1556+ #[ test]
1557+ fn remote_turn_start_permission_overrides_keep_legacy_sandbox_policy ( ) {
1558+ let sandbox_policy = SandboxPolicy :: DangerFullAccess ;
1559+ let permission_profile = PermissionProfile :: from_legacy_sandbox_policy ( & sandbox_policy) ;
1560+
1561+ assert_eq ! (
1562+ turn_start_permission_overrides(
1563+ ThreadParamsMode :: Remote ,
1564+ & sandbox_policy,
1565+ Some ( permission_profile) ,
1566+ ) ,
1567+ (
1568+ Some ( codex_app_server_protocol:: SandboxPolicy :: DangerFullAccess ) ,
1569+ None
1570+ )
1571+ ) ;
1572+ }
1573+
15231574 #[ tokio:: test]
15241575 async fn thread_start_params_can_mark_clear_source ( ) {
15251576 let temp_dir = tempfile:: tempdir ( ) . expect ( "tempdir" ) ;
@@ -1632,23 +1683,23 @@ mod tests {
16321683
16331684 let ( sandbox, profile) = turn_start_permission_overrides (
16341685 ThreadParamsMode :: Embedded ,
1635- workspace_write. clone ( ) ,
1686+ & workspace_write,
16361687 Some ( workspace_write_profile. clone ( ) ) ,
16371688 ) ;
16381689 assert_eq ! ( sandbox, None ) ;
16391690 assert_eq ! ( profile, Some ( workspace_write_profile. into( ) ) ) ;
16401691
16411692 let ( sandbox, profile) = turn_start_permission_overrides (
16421693 ThreadParamsMode :: Embedded ,
1643- workspace_write. clone ( ) ,
1694+ & workspace_write,
16441695 /*permission_profile*/ None ,
16451696 ) ;
16461697 assert_eq ! ( sandbox, None ) ;
16471698 assert_eq ! ( profile, None ) ;
16481699
16491700 let ( sandbox, profile) = turn_start_permission_overrides (
16501701 ThreadParamsMode :: Remote ,
1651- workspace_write. clone ( ) ,
1702+ & workspace_write,
16521703 Some ( PermissionProfile :: from_legacy_sandbox_policy (
16531704 & workspace_write,
16541705 ) ) ,
@@ -1661,16 +1712,13 @@ mod tests {
16611712 } ;
16621713 let ( sandbox, profile) = turn_start_permission_overrides (
16631714 ThreadParamsMode :: Embedded ,
1664- external_sandbox. clone ( ) ,
1715+ & external_sandbox,
16651716 Some ( PermissionProfile :: from_legacy_sandbox_policy (
16661717 & external_sandbox,
16671718 ) ) ,
16681719 ) ;
1669- assert_eq ! ( sandbox, None ) ;
1670- assert_eq ! (
1671- profile,
1672- Some ( PermissionProfile :: from_legacy_sandbox_policy( & external_sandbox) . into( ) )
1673- ) ;
1720+ assert_eq ! ( sandbox, Some ( external_sandbox. into( ) ) ) ;
1721+ assert_eq ! ( profile, None ) ;
16741722 }
16751723
16761724 #[ tokio:: test]
0 commit comments