mirror of
https://github.com/openai/codex.git
synced 2026-09-15 12:08:01 +00:00
## What changed - Load an optional package-supplied config file as the lowest-precedence configuration layer, so every existing layer can override its values. - Report the layer as `packagedDefaults`, including its source path, through config diagnostics and the app-server protocol. - Return an error when a configured packaged defaults file is missing. ## Testing - Cover precedence across packaged, system, user, and session layers. - Cover the missing-file error path. GitOrigin-RevId: 52406890f4d580eedabc90bf2a9ee3affa36fee1
110 lines
4.1 KiB
Rust
110 lines
4.1 KiB
Rust
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 {
|
|
/// Default configuration supplied with the installed Codex package.
|
|
PackagedDefaults { file: AbsolutePathBuf },
|
|
/// 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<String>,
|
|
},
|
|
/// 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::PackagedDefaults { .. } => -10,
|
|
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<std::cmp::Ordering> {
|
|
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<String>,
|
|
}
|
|
|
|
pub fn format_config_layer_source(source: &ConfigLayerSource, config_toml_file: &str) -> String {
|
|
match source {
|
|
ConfigLayerSource::PackagedDefaults { file } => {
|
|
format!("packaged defaults ({})", file.as_path().display())
|
|
}
|
|
ConfigLayerSource::Mdm { domain, key } => {
|
|
format!("MDM ({domain}:{key})")
|
|
}
|
|
ConfigLayerSource::System { file } => {
|
|
format!("system ({})", file.as_path().display())
|
|
}
|
|
ConfigLayerSource::EnterpriseManaged { id, name } => {
|
|
format!("enterprise-managed ({name}, {id})")
|
|
}
|
|
ConfigLayerSource::User { file, .. } => {
|
|
format!("user ({})", file.as_path().display())
|
|
}
|
|
ConfigLayerSource::Project { dot_codex_folder } => {
|
|
format!(
|
|
"project ({}/{config_toml_file})",
|
|
dot_codex_folder.as_path().display()
|
|
)
|
|
}
|
|
ConfigLayerSource::SessionFlags => "session-flags".to_string(),
|
|
ConfigLayerSource::LegacyManagedConfigTomlFromFile { file } => {
|
|
format!("legacy managed_config.toml ({})", file.as_path().display())
|
|
}
|
|
ConfigLayerSource::LegacyManagedConfigTomlFromMdm => {
|
|
"legacy managed_config.toml (MDM)".to_string()
|
|
}
|
|
}
|
|
}
|