@@ -7,8 +7,8 @@ use toml_edit::{DocumentMut, Item, table, value};
77use crate :: {
88 config:: {
99 BASE_KEYS , auth_path, base_path, codex_config_path, ensure_layout, load_base,
10- providers_dir, read_auth, read_text, read_toml, take_snapshot , write_auth ,
11- write_default_base, write_secret, write_toml,
10+ providers_dir, read_auth, read_text, read_toml, restore_auth_profile , save_auth_profile ,
11+ take_snapshot , write_auth , write_default_base, write_secret, write_toml,
1212 } ,
1313 models:: {
1414 PROBE_PREFIX , Provider , ensure_provider_id, get_bool, get_i64, get_str,
@@ -313,9 +313,30 @@ pub fn extract_all_providers(current_name: Option<&str>) -> Result<Vec<Provider>
313313pub fn cmd_init ( name : Option < & str > ) -> Result < ( ) > {
314314 ensure_layout ( ) ?;
315315 write_default_base ( ) ?;
316+ let config_path = codex_config_path ( ) ;
317+ let before_config = read_text ( & config_path) ?;
318+ let current_model_provider = get_str ( & read_toml ( & config_path) ?, "model_provider" )
319+ . unwrap_or_else ( || "OpenAI" . to_string ( ) ) ;
316320 let providers = extract_all_providers ( name) ?;
321+ let mut current_provider_id = None ;
317322 for provider in & providers {
318323 write_provider ( provider) ?;
324+ if provider. model_providers == current_model_provider {
325+ save_auth_profile ( & provider. provider_id ) ?;
326+ current_provider_id = Some ( provider. provider_id . as_str ( ) ) ;
327+ }
328+ }
329+ if let Some ( provider_id) = current_provider_id {
330+ take_snapshot (
331+ & config_path,
332+ "codex-config" ,
333+ & read_provider_probe ( & before_config) ,
334+ "toml" ,
335+ ) ?;
336+ write_secret (
337+ & config_path,
338+ set_provider_probe ( & before_config, provider_id) . as_bytes ( ) ,
339+ ) ?;
319340 }
320341 println ! ( "initialized: {}" , providers_dir( ) . display( ) ) ;
321342 for provider in providers {
@@ -350,24 +371,28 @@ pub fn cmd_use(provider_id: &str) -> Result<()> {
350371 } else {
351372 String :: new ( )
352373 } ;
353- take_snapshot (
354- & config_path,
355- "codex-config" ,
356- & read_provider_probe ( & before_config) ,
357- "toml" ,
358- ) ?;
374+ let previous_provider = read_provider_probe ( & before_config) ;
375+ save_auth_profile ( & previous_provider) ?;
376+ take_snapshot ( & config_path, "codex-config" , & previous_provider, "toml" ) ?;
359377 let config = read_toml ( & config_path) ?;
360378 let after_doc = apply_provider ( config, & base, & provider) ?;
361379 let after_config = set_provider_probe ( & after_doc. to_string ( ) , & provider. provider_id ) ;
362380 write_secret ( & config_path, after_config. as_bytes ( ) ) ?;
363- if !provider. api_key . is_empty ( ) {
364- take_snapshot (
365- & auth_path,
366- "codex-auth" ,
367- & read_provider_probe ( & before_config) ,
368- "json" ,
369- ) ?;
370- write_auth ( & provider. api_key ) ?;
381+ let restored = restore_auth_profile ( & provider. provider_id ) ?;
382+ if provider. api_key . is_empty ( ) {
383+ if !restored {
384+ eprintln ! (
385+ "{} warning: no Codex auth profile for {}, leaving auth.json unchanged" ,
386+ yellow( "!" ) ,
387+ provider. provider_id
388+ ) ;
389+ }
390+ } else {
391+ let auth = read_auth ( ) ?;
392+ if auth. get ( "OPENAI_API_KEY" ) . and_then ( Value :: as_str) != Some ( provider. api_key . as_str ( ) ) {
393+ write_auth ( & provider. api_key ) ?;
394+ save_auth_profile ( & provider. provider_id ) ?;
395+ }
371396 }
372397 let after_auth = if auth_path. exists ( ) {
373398 read_text ( & auth_path) ?
0 commit comments