@@ -6,6 +6,7 @@ use codex_protocol::account::PlanType;
66use codex_protocol:: approvals:: ExecPolicyAmendment as CoreExecPolicyAmendment ;
77use codex_protocol:: config_types:: ForcedLoginMethod ;
88use codex_protocol:: config_types:: ReasoningSummary ;
9+ use codex_protocol:: config_types:: SandboxMode as CoreSandboxMode ;
910use codex_protocol:: config_types:: Verbosity ;
1011use codex_protocol:: items:: AgentMessageContent as CoreAgentMessageContent ;
1112use codex_protocol:: items:: TurnItem as CoreTurnItem ;
@@ -125,17 +126,68 @@ impl From<CoreCodexErrorInfo> for CodexErrorInfo {
125126 }
126127}
127128
128- v2_enum_from_core ! (
129- pub enum AskForApproval from codex_protocol:: protocol:: AskForApproval {
130- UnlessTrusted , OnFailure , OnRequest , Never
129+ #[ derive( Serialize , Deserialize , Debug , Clone , Copy , PartialEq , Eq , JsonSchema , TS ) ]
130+ #[ serde( rename_all = "kebab-case" ) ]
131+ #[ ts( rename_all = "kebab-case" , export_to = "v2/" ) ]
132+ pub enum AskForApproval {
133+ #[ serde( rename = "untrusted" ) ]
134+ #[ ts( rename = "untrusted" ) ]
135+ UnlessTrusted ,
136+ OnFailure ,
137+ OnRequest ,
138+ Never ,
139+ }
140+
141+ impl AskForApproval {
142+ pub fn to_core ( self ) -> CoreAskForApproval {
143+ match self {
144+ AskForApproval :: UnlessTrusted => CoreAskForApproval :: UnlessTrusted ,
145+ AskForApproval :: OnFailure => CoreAskForApproval :: OnFailure ,
146+ AskForApproval :: OnRequest => CoreAskForApproval :: OnRequest ,
147+ AskForApproval :: Never => CoreAskForApproval :: Never ,
148+ }
131149 }
132- ) ;
150+ }
133151
134- v2_enum_from_core ! (
135- pub enum SandboxMode from codex_protocol:: config_types:: SandboxMode {
136- ReadOnly , WorkspaceWrite , DangerFullAccess
152+ impl From < CoreAskForApproval > for AskForApproval {
153+ fn from ( value : CoreAskForApproval ) -> Self {
154+ match value {
155+ CoreAskForApproval :: UnlessTrusted => AskForApproval :: UnlessTrusted ,
156+ CoreAskForApproval :: OnFailure => AskForApproval :: OnFailure ,
157+ CoreAskForApproval :: OnRequest => AskForApproval :: OnRequest ,
158+ CoreAskForApproval :: Never => AskForApproval :: Never ,
159+ }
137160 }
138- ) ;
161+ }
162+
163+ #[ derive( Serialize , Deserialize , Debug , Clone , Copy , PartialEq , Eq , JsonSchema , TS ) ]
164+ #[ serde( rename_all = "kebab-case" ) ]
165+ #[ ts( rename_all = "kebab-case" , export_to = "v2/" ) ]
166+ pub enum SandboxMode {
167+ ReadOnly ,
168+ WorkspaceWrite ,
169+ DangerFullAccess ,
170+ }
171+
172+ impl SandboxMode {
173+ pub fn to_core ( self ) -> CoreSandboxMode {
174+ match self {
175+ SandboxMode :: ReadOnly => CoreSandboxMode :: ReadOnly ,
176+ SandboxMode :: WorkspaceWrite => CoreSandboxMode :: WorkspaceWrite ,
177+ SandboxMode :: DangerFullAccess => CoreSandboxMode :: DangerFullAccess ,
178+ }
179+ }
180+ }
181+
182+ impl From < CoreSandboxMode > for SandboxMode {
183+ fn from ( value : CoreSandboxMode ) -> Self {
184+ match value {
185+ CoreSandboxMode :: ReadOnly => SandboxMode :: ReadOnly ,
186+ CoreSandboxMode :: WorkspaceWrite => SandboxMode :: WorkspaceWrite ,
187+ CoreSandboxMode :: DangerFullAccess => SandboxMode :: DangerFullAccess ,
188+ }
189+ }
190+ }
139191
140192v2_enum_from_core ! (
141193 pub enum ReviewDelivery from codex_protocol:: protocol:: ReviewDelivery {
@@ -240,6 +292,9 @@ pub struct Config {
240292 pub additional : HashMap < String , JsonValue > ,
241293}
242294
295+ /// Keep config read/write compatible with kebab-case values from `config.toml`
296+ /// by round-tripping through the core enum (which is kebab-case) before
297+ /// mapping to the v2 enum.
243298fn deserialize_approval_policy < ' de , D > ( deserializer : D ) -> Result < Option < AskForApproval > , D :: Error >
244299where
245300 D : serde:: Deserializer < ' de > ,
@@ -248,6 +303,8 @@ where
248303 Ok ( value. map ( AskForApproval :: from) )
249304}
250305
306+ /// Serialize using the kebab-case core enum so config responses match
307+ /// existing `config.toml` values.
251308fn serialize_approval_policy < S > (
252309 value : & Option < AskForApproval > ,
253310 serializer : S ,
@@ -257,25 +314,31 @@ where
257314{
258315 value
259316 . as_ref ( )
260- . map ( |policy| policy. to_core ( ) )
317+ . copied ( )
318+ . map ( AskForApproval :: to_core)
261319 . serialize ( serializer)
262320}
263321
322+ /// Preserve kebab-case sandbox_mode values from `config.toml` by deserializing
323+ /// via the core enum before converting to the v2 enum.
264324fn deserialize_sandbox_mode < ' de , D > ( deserializer : D ) -> Result < Option < SandboxMode > , D :: Error >
265325where
266326 D : serde:: Deserializer < ' de > ,
267327{
268- let value = Option :: < codex_protocol :: config_types :: SandboxMode > :: deserialize ( deserializer) ?;
328+ let value = Option :: < CoreSandboxMode > :: deserialize ( deserializer) ?;
269329 Ok ( value. map ( SandboxMode :: from) )
270330}
271331
332+ /// Serialize sandbox_mode using the kebab-case core enum so config endpoints
333+ /// emit values that align with `config.toml`.
272334fn serialize_sandbox_mode < S > ( value : & Option < SandboxMode > , serializer : S ) -> Result < S :: Ok , S :: Error >
273335where
274336 S : serde:: Serializer ,
275337{
276338 value
277339 . as_ref ( )
278- . map ( |mode| mode. to_core ( ) )
340+ . copied ( )
341+ . map ( SandboxMode :: to_core)
279342 . serialize ( serializer)
280343}
281344
0 commit comments