From 1d65ccabd59795b0342bd4a60bd1944f5cc4763e Mon Sep 17 00:00:00 2001 From: "Adam Perry @ OpenAI" Date: Tue, 23 Jun 2026 21:03:04 -0700 Subject: [PATCH] config: own layer provenance types (#29722) ## Why Config layer provenance describes how effective configuration was assembled, so it belongs with the config loader rather than in app-server's serialized API types. ## What changed - Moved `ConfigLayerSource`, `ConfigLayerMetadata`, and `ConfigLayer` ownership into `codex-config`. - Kept app-server's wire payloads unchanged and added explicit conversions at the app boundary. - Removed lower-level app-server-protocol dependencies from config consumers. ## Stack This is PR 3 of 6, stacked on [PR #29721](https://github.com/openai/codex/pull/29721). Review only the delta from `codex/split-auth-domain-types`. Next: [PR #29723](https://github.com/openai/codex/pull/29723). ## Validation - `codex-config` coverage passed. - App-server config-manager and config RPC coverage passed. --- codex-rs/Cargo.lock | 2 - codex-rs/app-server/src/config_layer.rs | 63 ++++++++++++++++ .../app-server/src/config_manager_service.rs | 16 ++-- .../src/config_manager_service_tests.rs | 28 ++++--- codex-rs/app-server/src/lib.rs | 3 +- codex-rs/config/Cargo.toml | 1 - codex-rs/config/src/config_layer_source.rs | 74 ++++++++++++++++++- codex-rs/config/src/diagnostics.rs | 2 +- codex-rs/config/src/fingerprint.rs | 2 +- codex-rs/config/src/lib.rs | 4 +- codex-rs/config/src/loader/mod.rs | 2 +- codex-rs/config/src/state.rs | 6 +- codex-rs/config/src/thread_config.rs | 2 +- codex-rs/config/src/types.rs | 11 --- codex-rs/core-plugins/src/manager_tests.rs | 2 +- .../src/marketplace_policy_tests.rs | 2 +- .../src/marketplace_upgrade_tests.rs | 2 +- codex-rs/core-skills/Cargo.toml | 1 - codex-rs/core-skills/src/config_rules.rs | 2 +- codex-rs/core-skills/src/loader.rs | 2 +- codex-rs/core-skills/src/service_tests.rs | 2 +- codex-rs/core/src/agent/role.rs | 2 +- codex-rs/core/src/agents_md.rs | 2 +- .../core/src/config/config_loader_tests.rs | 4 +- codex-rs/core/src/config/config_tests.rs | 21 +++--- codex-rs/core/src/exec_policy.rs | 2 +- codex-rs/core/src/exec_policy_tests.rs | 2 +- codex-rs/core/src/mcp_tool_call.rs | 2 +- codex-rs/core/src/network_proxy_loader.rs | 2 +- .../core/src/network_proxy_loader_tests.rs | 2 +- .../core/src/session/tests/guardian_tests.rs | 2 +- codex-rs/tui/src/app.rs | 1 - codex-rs/tui/src/app/startup_prompts.rs | 1 + codex-rs/tui/src/chatwidget.rs | 1 - .../tui/src/chatwidget/status_surfaces.rs | 1 + codex-rs/tui/src/debug_config.rs | 4 +- 36 files changed, 206 insertions(+), 72 deletions(-) create mode 100644 codex-rs/app-server/src/config_layer.rs diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 2170c529f..1e4c204a0 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -2537,7 +2537,6 @@ version = "0.0.0" dependencies = [ "anyhow", "base64 0.22.1", - "codex-app-server-protocol", "codex-execpolicy", "codex-features", "codex-file-system", @@ -2801,7 +2800,6 @@ version = "0.0.0" dependencies = [ "anyhow", "codex-analytics", - "codex-app-server-protocol", "codex-config", "codex-context-fragments", "codex-exec-server", diff --git a/codex-rs/app-server/src/config_layer.rs b/codex-rs/app-server/src/config_layer.rs new file mode 100644 index 000000000..e7d98fc28 --- /dev/null +++ b/codex-rs/app-server/src/config_layer.rs @@ -0,0 +1,63 @@ +use codex_app_server_protocol::ConfigLayer as ApiConfigLayer; +use codex_app_server_protocol::ConfigLayerMetadata as ApiConfigLayerMetadata; +use codex_app_server_protocol::ConfigLayerSource as ApiConfigLayerSource; +use codex_config::ConfigLayer; +use codex_config::ConfigLayerMetadata; +use codex_config::ConfigLayerSource; + +/// Converts a config-layer source owned by `codex-config` into the app-server wire type owned by +/// `codex-app-server-protocol`. +/// +/// The types stay separate so app-server protocol ownership does not leak into the config domain +/// crate. Because this crate owns neither type, Rust's orphan rules require an explicit conversion +/// function instead of a `From` implementation. +pub(crate) fn config_layer_source_to_api(source: ConfigLayerSource) -> ApiConfigLayerSource { + match source { + ConfigLayerSource::Mdm { domain, key } => ApiConfigLayerSource::Mdm { domain, key }, + ConfigLayerSource::System { file } => ApiConfigLayerSource::System { file }, + ConfigLayerSource::EnterpriseManaged { id, name } => { + ApiConfigLayerSource::EnterpriseManaged { id, name } + } + ConfigLayerSource::User { file, profile } => ApiConfigLayerSource::User { file, profile }, + ConfigLayerSource::Project { dot_codex_folder } => { + ApiConfigLayerSource::Project { dot_codex_folder } + } + ConfigLayerSource::SessionFlags => ApiConfigLayerSource::SessionFlags, + ConfigLayerSource::LegacyManagedConfigTomlFromFile { file } => { + ApiConfigLayerSource::LegacyManagedConfigTomlFromFile { file } + } + ConfigLayerSource::LegacyManagedConfigTomlFromMdm => { + ApiConfigLayerSource::LegacyManagedConfigTomlFromMdm + } + } +} + +/// Converts config-layer metadata owned by `codex-config` into the app-server wire type owned by +/// `codex-app-server-protocol`. +/// +/// The types stay separate so app-server protocol ownership does not leak into the config domain +/// crate. Because this crate owns neither type, Rust's orphan rules require an explicit conversion +/// function instead of a `From` implementation. +pub(crate) fn config_layer_metadata_to_api( + metadata: ConfigLayerMetadata, +) -> ApiConfigLayerMetadata { + ApiConfigLayerMetadata { + name: config_layer_source_to_api(metadata.name), + version: metadata.version, + } +} + +/// Converts a config layer owned by `codex-config` into the app-server wire type owned by +/// `codex-app-server-protocol`. +/// +/// The types stay separate so app-server protocol ownership does not leak into the config domain +/// crate. Because this crate owns neither type, Rust's orphan rules require an explicit conversion +/// function instead of a `From` implementation. +pub(crate) fn config_layer_to_api(layer: ConfigLayer) -> ApiConfigLayer { + ApiConfigLayer { + name: config_layer_source_to_api(layer.name), + version: layer.version, + config: layer.config, + disabled_reason: layer.disabled_reason, + } +} diff --git a/codex-rs/app-server/src/config_manager_service.rs b/codex-rs/app-server/src/config_manager_service.rs index 4b42c28aa..94980bf8e 100644 --- a/codex-rs/app-server/src/config_manager_service.rs +++ b/codex-rs/app-server/src/config_manager_service.rs @@ -1,8 +1,8 @@ +use crate::config_layer::config_layer_metadata_to_api; +use crate::config_layer::config_layer_to_api; use crate::config_manager::ConfigManager; use codex_app_server_protocol::Config as ApiConfig; use codex_app_server_protocol::ConfigBatchWriteParams; -use codex_app_server_protocol::ConfigLayerMetadata; -use codex_app_server_protocol::ConfigLayerSource; use codex_app_server_protocol::ConfigReadParams; use codex_app_server_protocol::ConfigReadResponse; use codex_app_server_protocol::ConfigValueWriteParams; @@ -13,6 +13,8 @@ use codex_app_server_protocol::OverriddenMetadata; use codex_app_server_protocol::WriteStatus; use codex_config::CONFIG_TOML_FILE; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerMetadata; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigLayerStackOrdering; use codex_config::ConfigRequirementsToml; @@ -136,7 +138,11 @@ impl ConfigManager { Ok(ConfigReadResponse { config, - origins: layers.origins(), + origins: layers + .origins() + .into_iter() + .map(|(path, metadata)| (path, config_layer_metadata_to_api(metadata))) + .collect(), layers: params.include_layers.then(|| { layers .get_layers( @@ -144,7 +150,7 @@ impl ConfigManager { /*include_disabled*/ true, ) .iter() - .map(|layer| layer.as_layer()) + .map(|layer| config_layer_to_api(layer.as_layer())) .collect() }), }) @@ -671,7 +677,7 @@ fn compute_override_metadata( Some(OverriddenMetadata { message, - overriding_layer, + overriding_layer: config_layer_metadata_to_api(overriding_layer), effective_value: effective_value .and_then(|value| serde_json::to_value(value).ok()) .unwrap_or(JsonValue::Null), diff --git a/codex-rs/app-server/src/config_manager_service_tests.rs b/codex-rs/app-server/src/config_manager_service_tests.rs index 8deae8b06..1ec79a749 100644 --- a/codex-rs/app-server/src/config_manager_service_tests.rs +++ b/codex-rs/app-server/src/config_manager_service_tests.rs @@ -4,6 +4,7 @@ use codex_app_server_protocol::AppConfig; use codex_app_server_protocol::AppToolApproval; use codex_app_server_protocol::AppsConfig; use codex_app_server_protocol::AskForApproval; +use codex_app_server_protocol::ConfigLayerSource as ApiConfigLayerSource; use codex_config::CloudConfigBundleLoader; use codex_config::LoaderOverrides; use codex_config::test_support::CloudConfigBundleFixture; @@ -374,7 +375,7 @@ async fn read_includes_origins_and_layers() { .get("approval_policy") .expect("origin") .name, - ConfigLayerSource::LegacyManagedConfigTomlFromFile { + ApiConfigLayerSource::LegacyManagedConfigTomlFromFile { file: managed_file.clone() }, ); @@ -383,7 +384,7 @@ async fn read_includes_origins_and_layers() { // top of the stack; ignore it so this test stays focused on file/user/system ordering. let layers = if matches!( layers.first().map(|layer| &layer.name), - Some(ConfigLayerSource::LegacyManagedConfigTomlFromMdm) + Some(ApiConfigLayerSource::LegacyManagedConfigTomlFromMdm) ) { &layers[1..] } else { @@ -392,20 +393,20 @@ async fn read_includes_origins_and_layers() { assert_eq!(layers.len(), 3, "expected three layers"); assert_eq!( layers.first().unwrap().name, - ConfigLayerSource::LegacyManagedConfigTomlFromFile { + ApiConfigLayerSource::LegacyManagedConfigTomlFromFile { file: managed_file.clone() } ); assert_eq!( layers.get(1).unwrap().name, - ConfigLayerSource::User { + ApiConfigLayerSource::User { file: user_file.clone(), profile: None, } ); assert!(matches!( layers.get(2).unwrap().name, - ConfigLayerSource::System { .. } + ApiConfigLayerSource::System { .. } )); } @@ -505,7 +506,7 @@ async fn write_value_reports_override() { .get("approval_policy") .expect("origin") .name, - ConfigLayerSource::LegacyManagedConfigTomlFromFile { + ApiConfigLayerSource::LegacyManagedConfigTomlFromFile { file: managed_file.clone() } ); @@ -776,7 +777,7 @@ async fn read_reports_managed_overrides_user_and_session_flags() { assert_eq!(response.config.model.as_deref(), Some("system")); assert_eq!( response.origins.get("model").expect("origin").name, - ConfigLayerSource::LegacyManagedConfigTomlFromFile { + ApiConfigLayerSource::LegacyManagedConfigTomlFromFile { file: managed_file.clone() }, ); @@ -785,7 +786,7 @@ async fn read_reports_managed_overrides_user_and_session_flags() { // top of the stack; ignore it so this test stays focused on file/session/user ordering. let layers = if matches!( layers.first().map(|layer| &layer.name), - Some(ConfigLayerSource::LegacyManagedConfigTomlFromMdm) + Some(ApiConfigLayerSource::LegacyManagedConfigTomlFromMdm) ) { &layers[1..] } else { @@ -793,12 +794,15 @@ async fn read_reports_managed_overrides_user_and_session_flags() { }; assert_eq!( layers.first().unwrap().name, - ConfigLayerSource::LegacyManagedConfigTomlFromFile { file: managed_file } + ApiConfigLayerSource::LegacyManagedConfigTomlFromFile { file: managed_file } + ); + assert_eq!( + layers.get(1).unwrap().name, + ApiConfigLayerSource::SessionFlags ); - assert_eq!(layers.get(1).unwrap().name, ConfigLayerSource::SessionFlags); assert_eq!( layers.get(2).unwrap().name, - ConfigLayerSource::User { + ApiConfigLayerSource::User { file: user_file, profile: None } @@ -836,7 +840,7 @@ async fn write_value_reports_managed_override() { let overridden = result.overridden_metadata.expect("overridden metadata"); assert_eq!( overridden.overriding_layer.name, - ConfigLayerSource::LegacyManagedConfigTomlFromFile { file: managed_file } + ApiConfigLayerSource::LegacyManagedConfigTomlFromFile { file: managed_file } ); assert_eq!(overridden.effective_value, serde_json::json!("never")); } diff --git a/codex-rs/app-server/src/lib.rs b/codex-rs/app-server/src/lib.rs index 0a237de9c..40cda6d42 100644 --- a/codex-rs/app-server/src/lib.rs +++ b/codex-rs/app-server/src/lib.rs @@ -47,12 +47,12 @@ use crate::transport::start_remote_control; use crate::transport::start_stdio_connection; use crate::transport::start_websocket_acceptor; use codex_analytics::AppServerRpcTransport; -use codex_app_server_protocol::ConfigLayerSource; use codex_app_server_protocol::ConfigWarningNotification; use codex_app_server_protocol::JSONRPCMessage; use codex_app_server_protocol::ServerNotification; use codex_app_server_protocol::TextPosition as AppTextPosition; use codex_app_server_protocol::TextRange as AppTextRange; +use codex_config::ConfigLayerSource; use codex_config::ConfigLoadError; use codex_config::TextRange as CoreTextRange; use codex_core::ExecPolicyError; @@ -86,6 +86,7 @@ mod auth_mode; mod bespoke_event_handling; mod command_exec; mod config; +mod config_layer; mod config_manager; mod config_manager_service; mod connection_cleanup; diff --git a/codex-rs/config/Cargo.toml b/codex-rs/config/Cargo.toml index 54ad61f94..509ffd189 100644 --- a/codex-rs/config/Cargo.toml +++ b/codex-rs/config/Cargo.toml @@ -14,7 +14,6 @@ workspace = true [dependencies] anyhow = { workspace = true } base64 = { workspace = true } -codex-app-server-protocol = { workspace = true } codex-execpolicy = { workspace = true } codex-features = { workspace = true } codex-file-system = { workspace = true } diff --git a/codex-rs/config/src/config_layer_source.rs b/codex-rs/config/src/config_layer_source.rs index 7bff779b1..15257af58 100644 --- a/codex-rs/config/src/config_layer_source.rs +++ b/codex-rs/config/src/config_layer_source.rs @@ -1,4 +1,76 @@ -use codex_app_server_protocol::ConfigLayerSource; +use codex_utils_absolute_path::AbsolutePathBuf; +use serde_json::Value as JsonValue; + +/// Provenance for one layer in the effective Codex configuration. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ConfigLayerSource { + /// Managed preferences delivered by MDM. + Mdm { domain: String, key: String }, + /// Host-wide configuration loaded from a file. + System { file: AbsolutePathBuf }, + /// Configuration delivered by an enterprise cloud bundle. + EnterpriseManaged { id: String, name: String }, + /// User configuration, optionally augmented by a selected profile. + User { + file: AbsolutePathBuf, + profile: Option, + }, + /// Configuration loaded from a project's `.codex` directory. + Project { dot_codex_folder: AbsolutePathBuf }, + /// Overrides supplied for the current session. + SessionFlags, + /// Legacy managed configuration loaded from a file. + LegacyManagedConfigTomlFromFile { file: AbsolutePathBuf }, + /// Legacy managed configuration delivered by MDM. + LegacyManagedConfigTomlFromMdm, +} + +impl ConfigLayerSource { + /// A setting from a layer with a higher precedence overrides a setting + /// from a layer with a lower precedence. + pub fn precedence(&self) -> i16 { + match self { + ConfigLayerSource::Mdm { .. } => 0, + ConfigLayerSource::System { .. } => 10, + ConfigLayerSource::EnterpriseManaged { .. } => 15, + ConfigLayerSource::User { profile, .. } => { + if profile.is_some() { + 21 + } else { + 20 + } + } + ConfigLayerSource::Project { .. } => 25, + ConfigLayerSource::SessionFlags => 30, + ConfigLayerSource::LegacyManagedConfigTomlFromFile { .. } => 40, + ConfigLayerSource::LegacyManagedConfigTomlFromMdm => 50, + } + } +} + +/// Compares [`ConfigLayerSource`] by precedence, so `A < B` means settings +/// from layer `A` will be overridden by settings from layer `B`. +impl PartialOrd for ConfigLayerSource { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.precedence().cmp(&other.precedence())) + } +} + +/// Identity and version information for a configuration layer. +#[derive(Debug, Clone, PartialEq)] +pub struct ConfigLayerMetadata { + pub name: ConfigLayerSource, + pub version: String, +} + +/// A materialized configuration layer and its provenance. +#[derive(Debug, Clone, PartialEq)] +pub struct ConfigLayer { + pub name: ConfigLayerSource, + pub version: String, + pub config: JsonValue, + pub disabled_reason: Option, +} pub fn format_config_layer_source(source: &ConfigLayerSource, config_toml_file: &str) -> String { match source { diff --git a/codex-rs/config/src/diagnostics.rs b/codex-rs/config/src/diagnostics.rs index ca7df712d..789affe51 100644 --- a/codex-rs/config/src/diagnostics.rs +++ b/codex-rs/config/src/diagnostics.rs @@ -2,10 +2,10 @@ //! rendering them in a user-friendly way. use crate::ConfigLayerEntry; +use crate::ConfigLayerSource; use crate::ConfigLayerStack; use crate::ConfigLayerStackOrdering; use crate::format_config_layer_source; -use codex_app_server_protocol::ConfigLayerSource; use codex_utils_absolute_path::AbsolutePathBufGuard; use serde::de::DeserializeOwned; use serde_path_to_error::Path as SerdePath; diff --git a/codex-rs/config/src/fingerprint.rs b/codex-rs/config/src/fingerprint.rs index d8e026338..7a48b6d41 100644 --- a/codex-rs/config/src/fingerprint.rs +++ b/codex-rs/config/src/fingerprint.rs @@ -1,4 +1,4 @@ -use codex_app_server_protocol::ConfigLayerMetadata; +use crate::ConfigLayerMetadata; use serde_json::Value as JsonValue; use sha2::Digest; use sha2::Sha256; diff --git a/codex-rs/config/src/lib.rs b/codex-rs/config/src/lib.rs index 9423b6ff0..1cbbbaf0a 100644 --- a/codex-rs/config/src/lib.rs +++ b/codex-rs/config/src/lib.rs @@ -44,10 +44,12 @@ pub use cloud_config_layers::CloudConfigFragment; pub use cloud_config_layers::CloudConfigFragmentSource; pub use cloud_config_layers::CloudConfigLayerError; pub use cloud_config_layers::cloud_config_layers_from_fragments; -pub use codex_app_server_protocol::ConfigLayerSource; pub use codex_protocol::config_types::ProfileV2Name; pub use codex_protocol::config_types::ProfileV2NameParseError; pub use codex_utils_absolute_path::AbsolutePathBuf; +pub use config_layer_source::ConfigLayer; +pub use config_layer_source::ConfigLayerMetadata; +pub use config_layer_source::ConfigLayerSource; pub use config_layer_source::format_config_layer_source; pub use config_requirements::AppRequirementToml; pub use config_requirements::AppToolRequirementToml; diff --git a/codex-rs/config/src/loader/mod.rs b/codex-rs/config/src/loader/mod.rs index e3c7ee112..00110bc08 100644 --- a/codex-rs/config/src/loader/mod.rs +++ b/codex-rs/config/src/loader/mod.rs @@ -7,6 +7,7 @@ mod tests; use self::layer_io::LoadedConfigLayers; use crate::CONFIG_TOML_FILE; use crate::CloudConfigBundleLayers; +use crate::ConfigLayerSource; use crate::ProfileV2Name; use crate::RequirementsLayerEntry; use crate::compose_requirements; @@ -31,7 +32,6 @@ use crate::strict_config::ignored_toml_value_field; use crate::strict_config::unknown_feature_toml_value_field; use crate::thread_config::ThreadConfigContext; use crate::thread_config::ThreadConfigLoader; -use codex_app_server_protocol::ConfigLayerSource; use codex_file_system::ExecutorFileSystem; use codex_git_utils::resolve_root_git_project_for_trust; use codex_protocol::config_types::ApprovalsReviewer; diff --git a/codex-rs/config/src/state.rs b/codex-rs/config/src/state.rs index 9d8de1c88..2f9db9576 100644 --- a/codex-rs/config/src/state.rs +++ b/codex-rs/config/src/state.rs @@ -6,10 +6,10 @@ use super::fingerprint::version_for_toml; use super::key_aliases::normalized_with_key_aliases; use super::merge::merge_toml_values; use crate::CloudConfigBundleLoader; +use crate::ConfigLayer; +use crate::ConfigLayerMetadata; +use crate::ConfigLayerSource; use crate::ProfileV2Name; -use codex_app_server_protocol::ConfigLayer; -use codex_app_server_protocol::ConfigLayerMetadata; -use codex_app_server_protocol::ConfigLayerSource; use codex_utils_absolute_path::AbsolutePathBuf; use serde_json::Value as JsonValue; use std::collections::HashMap; diff --git a/codex-rs/config/src/thread_config.rs b/codex-rs/config/src/thread_config.rs index 273680d5e..f534b492b 100644 --- a/codex-rs/config/src/thread_config.rs +++ b/codex-rs/config/src/thread_config.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use std::future::Future; use std::pin::Pin; -use codex_app_server_protocol::ConfigLayerSource; +use crate::ConfigLayerSource; use codex_model_provider_info::ModelProviderInfo; use codex_utils_absolute_path::AbsolutePathBuf; use thiserror::Error; diff --git a/codex-rs/config/src/types.rs b/codex-rs/config/src/types.rs index e459f9585..d25ab64c6 100644 --- a/codex-rs/config/src/types.rs +++ b/codex-rs/config/src/types.rs @@ -920,17 +920,6 @@ pub struct SandboxWorkspaceWrite { pub exclude_slash_tmp: bool, } -impl From for codex_app_server_protocol::SandboxSettings { - fn from(sandbox_workspace_write: SandboxWorkspaceWrite) -> Self { - Self { - writable_roots: sandbox_workspace_write.writable_roots, - network_access: Some(sandbox_workspace_write.network_access), - exclude_tmpdir_env_var: Some(sandbox_workspace_write.exclude_tmpdir_env_var), - exclude_slash_tmp: Some(sandbox_workspace_write.exclude_slash_tmp), - } - } -} - /// Policy for building the `env` when spawning a process via shell-like tools. #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default, JsonSchema)] #[schemars(deny_unknown_fields)] diff --git a/codex-rs/core-plugins/src/manager_tests.rs b/codex-rs/core-plugins/src/manager_tests.rs index 7131a2c97..72d357b90 100644 --- a/codex-rs/core-plugins/src/manager_tests.rs +++ b/codex-rs/core-plugins/src/manager_tests.rs @@ -25,10 +25,10 @@ use crate::test_support::write_curated_plugin_sha_with as write_curated_plugin_s use crate::test_support::write_file; use crate::test_support::write_openai_api_curated_marketplace; use crate::test_support::write_openai_curated_marketplace; -use codex_app_server_protocol::ConfigLayerSource; use codex_config::AppToolApproval; use codex_config::CONFIG_TOML_FILE; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigRequirements; use codex_config::ConfigRequirementsToml; diff --git a/codex-rs/core-plugins/src/marketplace_policy_tests.rs b/codex-rs/core-plugins/src/marketplace_policy_tests.rs index 706139be9..63518dfb3 100644 --- a/codex-rs/core-plugins/src/marketplace_policy_tests.rs +++ b/codex-rs/core-plugins/src/marketplace_policy_tests.rs @@ -1,7 +1,7 @@ use super::*; use crate::marketplace_upgrade::upgrade_configured_git_marketplaces; -use codex_app_server_protocol::ConfigLayerSource; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerSource; use codex_config::RequirementSource; use codex_config::RequirementsLayerEntry; use codex_config::compose_requirements; diff --git a/codex-rs/core-plugins/src/marketplace_upgrade_tests.rs b/codex-rs/core-plugins/src/marketplace_upgrade_tests.rs index 72df8f30a..41f3fd67d 100644 --- a/codex-rs/core-plugins/src/marketplace_upgrade_tests.rs +++ b/codex-rs/core-plugins/src/marketplace_upgrade_tests.rs @@ -1,6 +1,6 @@ use super::*; -use codex_app_server_protocol::ConfigLayerSource; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerSource; use codex_config::ConfigRequirements; use codex_config::ConfigRequirementsToml; use pretty_assertions::assert_eq; diff --git a/codex-rs/core-skills/Cargo.toml b/codex-rs/core-skills/Cargo.toml index 3ac82be9a..f86ecdf75 100644 --- a/codex-rs/core-skills/Cargo.toml +++ b/codex-rs/core-skills/Cargo.toml @@ -15,7 +15,6 @@ workspace = true [dependencies] anyhow = { workspace = true } codex-analytics = { workspace = true } -codex-app-server-protocol = { workspace = true } codex-config = { workspace = true } codex-context-fragments = { workspace = true } codex-exec-server = { workspace = true } diff --git a/codex-rs/core-skills/src/config_rules.rs b/codex-rs/core-skills/src/config_rules.rs index 92ad2ab1a..05f3e48c1 100644 --- a/codex-rs/core-skills/src/config_rules.rs +++ b/codex-rs/core-skills/src/config_rules.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use codex_app_server_protocol::ConfigLayerSource; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigLayerStackOrdering; use codex_config::SkillConfig; diff --git a/codex-rs/core-skills/src/loader.rs b/codex-rs/core-skills/src/loader.rs index deab6f395..97e31737c 100644 --- a/codex-rs/core-skills/src/loader.rs +++ b/codex-rs/core-skills/src/loader.rs @@ -12,7 +12,7 @@ use crate::model::SkillMetadata; use crate::model::SkillPolicy; use crate::model::SkillToolDependency; use crate::system::system_cache_root_dir; -use codex_app_server_protocol::ConfigLayerSource; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigLayerStackOrdering; use codex_config::default_project_root_markers; diff --git a/codex-rs/core-skills/src/service_tests.rs b/codex-rs/core-skills/src/service_tests.rs index 23a15f795..602697509 100644 --- a/codex-rs/core-skills/src/service_tests.rs +++ b/codex-rs/core-skills/src/service_tests.rs @@ -2,9 +2,9 @@ use super::*; use crate::SkillMetadata; use crate::config_rules::resolve_disabled_skill_paths; use crate::config_rules::skill_config_rules_from_stack; -use codex_app_server_protocol::ConfigLayerSource; use codex_config::CONFIG_TOML_FILE; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigRequirementsToml; use codex_exec_server::LOCAL_FS; diff --git a/codex-rs/core/src/agent/role.rs b/codex-rs/core/src/agent/role.rs index 6d49c0557..b34aa8aa2 100644 --- a/codex-rs/core/src/agent/role.rs +++ b/codex-rs/core/src/agent/role.rs @@ -12,8 +12,8 @@ use crate::config::ConfigOverrides; use crate::config::agent_roles::parse_agent_role_file_contents; use crate::config::deserialize_config_toml_with_base; use anyhow::anyhow; -use codex_app_server_protocol::ConfigLayerSource; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigLayerStackOrdering; use codex_config::config_toml::ConfigToml; diff --git a/codex-rs/core/src/agents_md.rs b/codex-rs/core/src/agents_md.rs index d0dc7026a..73dfbeb54 100644 --- a/codex-rs/core/src/agents_md.rs +++ b/codex-rs/core/src/agents_md.rs @@ -19,7 +19,7 @@ use crate::config::Config; use crate::context::ContextualUserFragment; use crate::context::UserInstructions as ContextUserInstructions; use crate::environment_selection::TurnEnvironmentSnapshot; -use codex_app_server_protocol::ConfigLayerSource; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStackOrdering; use codex_config::default_project_root_markers; use codex_config::merge_toml_values; diff --git a/codex-rs/core/src/config/config_loader_tests.rs b/codex-rs/core/src/config/config_loader_tests.rs index 9142ac51d..9857e08f1 100644 --- a/codex-rs/core/src/config/config_loader_tests.rs +++ b/codex-rs/core/src/config/config_loader_tests.rs @@ -3,12 +3,12 @@ use crate::config::ConfigOverrides; use crate::config::ConstraintError; use crate::config::PermissionProfileCatalogEntry; use crate::config::permission_profile_catalog; -use codex_app_server_protocol::ConfigLayerSource; use codex_config::CONFIG_TOML_FILE; use codex_config::CloudConfigBundleLoadError; use codex_config::CloudConfigBundleLoader; use codex_config::ConfigError; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStackOrdering; use codex_config::ConfigLoadError; use codex_config::ConfigLoadOptions; @@ -3501,8 +3501,8 @@ async fn project_root_markers_supports_alternate_markers() -> std::io::Result<() mod requirements_exec_policy_tests { use crate::exec_policy::load_exec_policy; - use codex_app_server_protocol::ConfigLayerSource; use codex_config::ConfigLayerEntry; + use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigRequirements; use codex_config::ConfigRequirementsToml; diff --git a/codex-rs/core/src/config/config_tests.rs b/codex-rs/core/src/config/config_tests.rs index 97993b59c..62d9f792e 100644 --- a/codex-rs/core/src/config/config_tests.rs +++ b/codex-rs/core/src/config/config_tests.rs @@ -4,6 +4,7 @@ use crate::config::edit::apply_blocking; use assert_matches::assert_matches; use codex_config::CONFIG_TOML_FILE; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ProfileV2Name; use codex_config::RequirementSource; @@ -4401,7 +4402,7 @@ async fn rebuild_preserving_session_layers_refreshes_requirements() -> std::io:: let refreshed_layer_stack = ConfigLayerStack::new( vec![ ConfigLayerEntry::new( - codex_app_server_protocol::ConfigLayerSource::User { + ConfigLayerSource::User { file: user_file.clone(), profile: None, }, @@ -4416,7 +4417,7 @@ async fn rebuild_preserving_session_layers_refreshes_requirements() -> std::io:: .into(), ), ConfigLayerEntry::new( - codex_app_server_protocol::ConfigLayerSource::Project { + ConfigLayerSource::Project { dot_codex_folder: project_dot_codex.clone(), }, toml::toml! { @@ -4426,7 +4427,7 @@ async fn rebuild_preserving_session_layers_refreshes_requirements() -> std::io:: .into(), ), ConfigLayerEntry::new( - codex_app_server_protocol::ConfigLayerSource::LegacyManagedConfigTomlFromMdm, + ConfigLayerSource::LegacyManagedConfigTomlFromMdm, toml::toml! { [mcp_servers.managed_overrides_session] command = "managed-command" @@ -4456,7 +4457,7 @@ async fn rebuild_preserving_session_layers_refreshes_requirements() -> std::io:: let thread_layer_stack = ConfigLayerStack::new( vec![ ConfigLayerEntry::new( - codex_app_server_protocol::ConfigLayerSource::User { + ConfigLayerSource::User { file: user_file.clone(), profile: None, }, @@ -4471,7 +4472,7 @@ async fn rebuild_preserving_session_layers_refreshes_requirements() -> std::io:: .into(), ), ConfigLayerEntry::new( - codex_app_server_protocol::ConfigLayerSource::Project { + ConfigLayerSource::Project { dot_codex_folder: project_dot_codex, }, toml::toml! { @@ -4481,7 +4482,7 @@ async fn rebuild_preserving_session_layers_refreshes_requirements() -> std::io:: .into(), ), ConfigLayerEntry::new( - codex_app_server_protocol::ConfigLayerSource::SessionFlags, + ConfigLayerSource::SessionFlags, toml::toml! { [mcp_servers.session_overrides_user] command = "session-command" @@ -4493,7 +4494,7 @@ async fn rebuild_preserving_session_layers_refreshes_requirements() -> std::io:: .into(), ), ConfigLayerEntry::new( - codex_app_server_protocol::ConfigLayerSource::LegacyManagedConfigTomlFromMdm, + ConfigLayerSource::LegacyManagedConfigTomlFromMdm, toml::toml! { [mcp_servers.managed_overrides_session] command = "old-managed-command" @@ -4587,7 +4588,7 @@ async fn rebuild_preserving_session_layers_refreshes_plugin_derived_mcp_config() let user_file = AbsolutePathBuf::resolve_path_against_base(CONFIG_TOML_FILE, codex_home.path()); let refreshed_layer_stack = ConfigLayerStack::new( vec![ConfigLayerEntry::new( - codex_app_server_protocol::ConfigLayerSource::User { + ConfigLayerSource::User { file: user_file.clone(), profile: None, }, @@ -4616,7 +4617,7 @@ async fn rebuild_preserving_session_layers_refreshes_plugin_derived_mcp_config() .await?; let thread_layer_stack = ConfigLayerStack::new( vec![ConfigLayerEntry::new( - codex_app_server_protocol::ConfigLayerSource::User { + ConfigLayerSource::User { file: user_file, profile: None, }, @@ -7193,7 +7194,7 @@ config_file = "./agents/researcher.toml" .expect("agent role layer config should parse"); let config_layer_stack = codex_config::ConfigLayerStack::new( vec![codex_config::ConfigLayerEntry::new( - codex_app_server_protocol::ConfigLayerSource::User { + ConfigLayerSource::User { file: codex_home.path().join(CONFIG_TOML_FILE).abs(), profile: None, }, diff --git a/codex-rs/core/src/exec_policy.rs b/codex-rs/core/src/exec_policy.rs index d79faba1a..cbffcd7e4 100644 --- a/codex-rs/core/src/exec_policy.rs +++ b/codex-rs/core/src/exec_policy.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use arc_swap::ArcSwap; -use codex_app_server_protocol::ConfigLayerSource; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigLayerStackOrdering; use codex_execpolicy::AmendError; diff --git a/codex-rs/core/src/exec_policy_tests.rs b/codex-rs/core/src/exec_policy_tests.rs index a74cd5d2d..cf17387ef 100644 --- a/codex-rs/core/src/exec_policy_tests.rs +++ b/codex-rs/core/src/exec_policy_tests.rs @@ -1,9 +1,9 @@ use super::*; use crate::config::Config; use crate::config::ConfigBuilder; -use codex_app_server_protocol::ConfigLayerSource; use codex_config::CONFIG_TOML_FILE; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigLayerStackOrdering; use codex_config::ConfigRequirements; diff --git a/codex-rs/core/src/mcp_tool_call.rs b/codex-rs/core/src/mcp_tool_call.rs index 085fd496d..c95c49eb5 100644 --- a/codex-rs/core/src/mcp_tool_call.rs +++ b/codex-rs/core/src/mcp_tool_call.rs @@ -26,11 +26,11 @@ use crate::turn_metadata::McpTurnMetadataContext; use codex_analytics::AppInvocation; use codex_analytics::InvocationType; use codex_analytics::build_track_events_context; -use codex_app_server_protocol::ConfigLayerSource; use codex_app_server_protocol::McpElicitationObjectType; use codex_app_server_protocol::McpElicitationSchema; use codex_app_server_protocol::McpServerElicitationRequest; use codex_app_server_protocol::McpServerElicitationRequestParams; +use codex_config::ConfigLayerSource; use codex_config::types::AppToolApproval; use codex_config::types::ApprovalsReviewer; use codex_connectors::AppToolPolicy; diff --git a/codex-rs/core/src/network_proxy_loader.rs b/codex-rs/core/src/network_proxy_loader.rs index e0ffe9925..0a4fe2d7c 100644 --- a/codex-rs/core/src/network_proxy_loader.rs +++ b/codex-rs/core/src/network_proxy_loader.rs @@ -7,8 +7,8 @@ use crate::exec_policy::format_exec_policy_error_with_source; use crate::exec_policy::load_exec_policy; use anyhow::Context; use anyhow::Result; -use codex_app_server_protocol::ConfigLayerSource; use codex_config::CONFIG_TOML_FILE; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigLayerStackOrdering; use codex_config::LoaderOverrides; diff --git a/codex-rs/core/src/network_proxy_loader_tests.rs b/codex-rs/core/src/network_proxy_loader_tests.rs index 33ca54019..d6c8efc9a 100644 --- a/codex-rs/core/src/network_proxy_loader_tests.rs +++ b/codex-rs/core/src/network_proxy_loader_tests.rs @@ -1,7 +1,7 @@ use super::*; -use codex_app_server_protocol::ConfigLayerSource; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigRequirements; use codex_config::ConfigRequirementsToml; diff --git a/codex-rs/core/src/session/tests/guardian_tests.rs b/codex-rs/core/src/session/tests/guardian_tests.rs index 6f23cb096..17e349e66 100644 --- a/codex-rs/core/src/session/tests/guardian_tests.rs +++ b/codex-rs/core/src/session/tests/guardian_tests.rs @@ -9,8 +9,8 @@ use crate::tools::context::ToolCallSource; use crate::tools::context::ToolOutput; use crate::tools::context::ToolPayload; use crate::turn_diff_tracker::TurnDiffTracker; -use codex_app_server_protocol::ConfigLayerSource; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerSource; use codex_config::ConfigRequirements; use codex_config::ConfigRequirementsToml; use codex_exec_server::EnvironmentManager; diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index 52823d838..b7f2b9df6 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -88,7 +88,6 @@ use codex_app_server_protocol::AskForApproval; use codex_app_server_protocol::ClientRequest; use codex_app_server_protocol::CodexErrorInfo as AppServerCodexErrorInfo; use codex_app_server_protocol::ConfigBatchWriteParams; -use codex_app_server_protocol::ConfigLayerSource; use codex_app_server_protocol::ConfigReadResponse; use codex_app_server_protocol::ConfigValueWriteParams; use codex_app_server_protocol::ConfigWriteResponse; diff --git a/codex-rs/tui/src/app/startup_prompts.rs b/codex-rs/tui/src/app/startup_prompts.rs index 57f70a559..55a377ec1 100644 --- a/codex-rs/tui/src/app/startup_prompts.rs +++ b/codex-rs/tui/src/app/startup_prompts.rs @@ -4,6 +4,7 @@ //! catalog state into one-time TUI prompts or warning cells without owning the main event loop. use super::*; +use codex_config::ConfigLayerSource; use std::collections::HashSet; use std::path::PathBuf; diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index aa7879f76..89408c4e5 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -87,7 +87,6 @@ use codex_app_server_protocol::CollabAgentTool; use codex_app_server_protocol::CollabAgentToolCallStatus; use codex_app_server_protocol::CommandExecutionRequestApprovalParams; use codex_app_server_protocol::CommandExecutionSource as ExecCommandSource; -use codex_app_server_protocol::ConfigLayerSource; use codex_app_server_protocol::CreditsSnapshot; use codex_app_server_protocol::ErrorNotification; use codex_app_server_protocol::FileChangeRequestApprovalParams; diff --git a/codex-rs/tui/src/chatwidget/status_surfaces.rs b/codex-rs/tui/src/chatwidget/status_surfaces.rs index 5f02dd8d6..712046233 100644 --- a/codex-rs/tui/src/chatwidget/status_surfaces.rs +++ b/codex-rs/tui/src/chatwidget/status_surfaces.rs @@ -11,6 +11,7 @@ use crate::chatwidget::rate_limits::get_limits_duration; use crate::legacy_core::config::Config; use crate::status::format_tokens_compact; use codex_app_server_protocol::AskForApproval; +use codex_config::ConfigLayerSource; use codex_protocol::config_types::ApprovalsReviewer; use codex_protocol::config_types::ServiceTier; use codex_protocol::models::PermissionProfile; diff --git a/codex-rs/tui/src/debug_config.rs b/codex-rs/tui/src/debug_config.rs index f8da379fd..ed9aeffdd 100644 --- a/codex-rs/tui/src/debug_config.rs +++ b/codex-rs/tui/src/debug_config.rs @@ -2,9 +2,9 @@ use crate::history_cell::PlainHistoryCell; use crate::legacy_core::config::Config; use crate::legacy_core::config::Permissions; use crate::session_state::SessionNetworkProxyRuntime; -use codex_app_server_protocol::ConfigLayerSource; use codex_config::CONFIG_TOML_FILE; use codex_config::ConfigLayerEntry; +use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigLayerStackOrdering; use codex_config::ManagedHooksRequirementsToml; @@ -557,8 +557,8 @@ mod tests { use super::session_all_proxy_url; use crate::legacy_core::config::Permissions; use codex_app_server_protocol::AskForApproval; - use codex_app_server_protocol::ConfigLayerSource; use codex_config::ConfigLayerEntry; + use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigRequirements; use codex_config::ConfigRequirementsToml;