use crate::Feature; use crate::Features; use tracing::info; #[derive(Clone, Copy)] struct Alias { legacy_key: &'static str, feature: Feature, } const ALIASES: &[Alias] = &[ Alias { legacy_key: "connectors", feature: Feature::Apps, }, Alias { legacy_key: "enable_experimental_windows_sandbox", feature: Feature::WindowsSandbox, }, Alias { legacy_key: "experimental_use_unified_exec_tool", feature: Feature::UnifiedExec, }, Alias { legacy_key: "experimental_use_freeform_apply_patch", feature: Feature::ApplyPatchFreeform, }, Alias { legacy_key: "include_apply_patch_tool", feature: Feature::ApplyPatchFreeform, }, Alias { legacy_key: "request_permissions", feature: Feature::ExecPermissionApprovals, }, Alias { legacy_key: "web_search", feature: Feature::WebSearchRequest, }, Alias { legacy_key: "collab", feature: Feature::Collab, }, Alias { legacy_key: "memory_tool", feature: Feature::MemoryTool, }, ]; pub fn legacy_feature_keys() -> impl Iterator { ALIASES.iter().map(|alias| alias.legacy_key) } pub(crate) fn feature_for_key(key: &str) -> Option { ALIASES .iter() .find(|alias| alias.legacy_key == key) .map(|alias| { log_alias(alias.legacy_key, alias.feature); alias.feature }) } #[derive(Debug, Default)] pub(crate) struct LegacyFeatureToggles { pub include_apply_patch_tool: Option, pub experimental_use_freeform_apply_patch: Option, pub experimental_use_unified_exec_tool: Option, } impl LegacyFeatureToggles { pub fn apply(self, features: &mut Features) { set_if_some( features, Feature::ApplyPatchFreeform, self.include_apply_patch_tool, "include_apply_patch_tool", ); set_if_some( features, Feature::ApplyPatchFreeform, self.experimental_use_freeform_apply_patch, "experimental_use_freeform_apply_patch", ); set_if_some( features, Feature::UnifiedExec, self.experimental_use_unified_exec_tool, "experimental_use_unified_exec_tool", ); } } fn set_if_some( features: &mut Features, feature: Feature, maybe_value: Option, alias_key: &'static str, ) { if let Some(enabled) = maybe_value { set_feature(features, feature, enabled); log_alias(alias_key, feature); features.record_legacy_usage(alias_key, feature); } } fn set_feature(features: &mut Features, feature: Feature, enabled: bool) { if enabled { features.enable(feature); } else { features.disable(feature); } } fn log_alias(alias: &str, feature: Feature) { let canonical = feature.key(); if alias == canonical { return; } info!( %alias, canonical, "legacy feature toggle detected; prefer `[features].{canonical}`" ); }