use alog::{MessageLevel, alog_channel, use_channel};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use_channel!("RCFG");
include!(concat!(
env!("OUT_DIR"),
"/generated_recommended_configs.rs"
));
pub static BUILTIN_RECOMMENDED_CONFIGS: std::sync::LazyLock<Vec<RecommendedConfiguration>> =
std::sync::LazyLock::new(|| {
RECOMMENDED_CONFIG_SOURCES
.iter()
.filter_map(|(name, yaml)| {
match serde_yaml::from_str::<RecommendedConfiguration>(yaml) {
Ok(cfg) => Some(cfg),
Err(e) => {
alog_channel!(
MessageLevel::Warning,
"Failed to parse recommended config '{}': {}",
name,
e
);
None
}
}
})
.collect()
});
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct RecommendedConfiguration {
pub launcher: String,
pub capabilities: Vec<RecommendedCapability>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct RecommendedCapability {
pub capability: String,
pub models: HashMap<String, RecommendedModelSet>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct RecommendedModelSet {
pub min_context_length: Option<u64>,
pub models: Vec<RecommendedModel>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct RecommendedModel {
pub model: StringMatch,
#[serde(default)]
pub variant_formats: Vec<StringMatch>,
#[serde(default)]
pub variant_precisions: Vec<StringMatch>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(untagged)]
pub enum StringMatch {
Exact(String),
Regex { regex: String },
}
impl StringMatch {
pub fn matches(&self, s: &str) -> bool {
match self {
StringMatch::Exact(pattern) => s == pattern,
StringMatch::Regex { regex: pattern } => match regex::Regex::new(pattern) {
Ok(re) => re.is_match(s),
Err(e) => {
alog_channel!(
MessageLevel::Warning,
"Invalid regex pattern '{}': {}",
pattern,
e
);
false
}
},
}
}
}
fn resolve_entry<'a>(
key: &str,
builtin: &'a [RecommendedConfiguration],
user: &'a HashMap<String, RecommendedConfiguration>,
) -> Option<&'a RecommendedConfiguration> {
user.get(key)
.or_else(|| builtin.iter().find(|c| c.launcher == key))
}
pub fn effective_capabilities(
launcher_type: &str,
builtin: &[RecommendedConfiguration],
user: &HashMap<String, RecommendedConfiguration>,
) -> Vec<RecommendedCapability> {
if let Some(specific) = resolve_entry(launcher_type, builtin, user) {
return specific.capabilities.clone();
}
resolve_entry("*", builtin, user)
.map(|wildcard| wildcard.capabilities.clone())
.unwrap_or_default()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn exact_match_matches() {
let m = StringMatch::Exact("foo".to_string());
assert!(m.matches("foo"));
}
#[test]
fn exact_non_match_does_not_match() {
let m = StringMatch::Exact("foo".to_string());
assert!(!m.matches("bar"));
}
#[test]
fn regex_pattern_matches() {
let m = StringMatch::Regex {
regex: "fo.*".to_string(),
};
assert!(m.matches("foobar"));
assert!(m.matches("fo"));
}
#[test]
fn regex_pattern_non_match() {
let m = StringMatch::Regex {
regex: "fo.*".to_string(),
};
assert!(!m.matches("baz"));
}
#[test]
fn invalid_regex_returns_false_not_panic() {
let m = StringMatch::Regex {
regex: "[invalid".to_string(),
};
assert!(!m.matches("anything"));
}
#[test]
fn exact_version_string_does_not_treat_dot_as_regex() {
let m = StringMatch::Exact("4.2".to_string());
assert!(m.matches("4.2"));
assert!(!m.matches("4x2"));
assert!(!m.matches("42"));
assert!(!m.matches("4.a2"));
}
fn make_config(launcher: &str, capability: &str, model_val: &str) -> RecommendedConfiguration {
let mut models = HashMap::new();
models.insert(
"model_id".to_string(),
RecommendedModelSet {
min_context_length: None,
models: vec![RecommendedModel {
model: StringMatch::Exact(model_val.to_string()),
variant_formats: vec![],
variant_precisions: vec![],
}],
},
);
RecommendedConfiguration {
launcher: launcher.to_string(),
capabilities: vec![RecommendedCapability {
capability: capability.to_string(),
models,
}],
}
}
#[test]
fn user_entry_fully_replaces_builtin_for_same_launcher() {
let builtin = vec![make_config("claude", "cap-x", "builtin-model")];
let mut user = HashMap::new();
user.insert(
"claude".to_string(),
make_config("claude", "cap-y", "user-model"),
);
let caps = effective_capabilities("claude", &builtin, &user);
assert_eq!(caps.len(), 1);
assert_eq!(caps[0].capability, "cap-y");
}
#[test]
fn wildcard_applies_to_launcher_with_no_specific_entry() {
let builtin = vec![make_config("*", "wildcap", "wildcard-model")];
let user = HashMap::new();
let caps = effective_capabilities("bob", &builtin, &user);
assert_eq!(caps.len(), 1);
assert_eq!(caps[0].capability, "wildcap");
}
#[test]
fn specific_entry_wins_over_wildcard_when_both_define_the_same_capability() {
let mut specific_models = HashMap::new();
specific_models.insert(
"model_id".to_string(),
RecommendedModelSet {
min_context_length: None,
models: vec![RecommendedModel {
model: StringMatch::Exact("specific-model".to_string()),
variant_formats: vec![],
variant_precisions: vec![],
}],
},
);
let mut wildcard_models = HashMap::new();
wildcard_models.insert(
"model_id".to_string(),
RecommendedModelSet {
min_context_length: None,
models: vec![RecommendedModel {
model: StringMatch::Exact("wildcard-model".to_string()),
variant_formats: vec![],
variant_precisions: vec![],
}],
},
);
let builtin = vec![
RecommendedConfiguration {
launcher: "claude".to_string(),
capabilities: vec![RecommendedCapability {
capability: "agent-model".to_string(),
models: specific_models,
}],
},
RecommendedConfiguration {
launcher: "*".to_string(),
capabilities: vec![RecommendedCapability {
capability: "agent-model".to_string(),
models: wildcard_models,
}],
},
];
let user = HashMap::new();
let caps = effective_capabilities("claude", &builtin, &user);
assert_eq!(caps.len(), 1);
let model_slot = caps[0].models.get("model_id").expect("model_id present");
assert_eq!(
model_slot.models[0].model,
StringMatch::Exact("specific-model".to_string())
);
}
#[test]
fn a_launchers_own_entry_excludes_wildcard_capabilities_entirely() {
let builtin = vec![
make_config("claude", "agent-model", "specific-model"),
make_config("*", "sub-agent-cap", "wildcard-model"),
];
let user = HashMap::new();
let caps = effective_capabilities("claude", &builtin, &user);
assert_eq!(caps.len(), 1);
assert_eq!(caps[0].capability, "agent-model");
}
#[test]
fn no_builtin_no_user_returns_empty() {
let builtin: Vec<RecommendedConfiguration> = vec![];
let user = HashMap::new();
let caps = effective_capabilities("claude", &builtin, &user);
assert!(caps.is_empty());
}
#[test]
fn builtin_recommended_configs_is_non_empty() {
assert!(
!BUILTIN_RECOMMENDED_CONFIGS.is_empty(),
"BUILTIN_RECOMMENDED_CONFIGS must contain at least one entry"
);
}
#[test]
fn builtin_contains_claude_sub_agent_code() {
let mut found_claude = false;
for cfg in &*BUILTIN_RECOMMENDED_CONFIGS {
if cfg.launcher == "claude" {
found_claude = true;
let sub_agent_code = cfg
.capabilities
.iter()
.find(|c| c.capability == "sub-agent-code");
assert!(
sub_agent_code.is_some(),
"claude config must define 'sub-agent-code' capability"
);
let sub_agent_code = sub_agent_code.unwrap();
assert!(
sub_agent_code.models.contains_key("model_id"),
"claude sub-agent-code must have a 'model_id' slot"
);
}
}
assert!(
found_claude,
"BUILTIN_RECOMMENDED_CONFIGS must contain a 'claude' launcher entry"
);
}
#[test]
fn claude_never_gets_agent_model_from_the_wildcard() {
let caps = effective_capabilities("claude", &BUILTIN_RECOMMENDED_CONFIGS, &HashMap::new());
assert!(
!caps.iter().any(|c| c.capability == "agent-model"),
"claude has its own recommended config, so it must not inherit agent-model \
from the wildcard"
);
}
#[test]
fn every_builtin_recommended_config_parses() {
let names: Vec<&str> = RECOMMENDED_CONFIG_SOURCES
.iter()
.map(|(name, _)| *name)
.collect();
assert_eq!(
BUILTIN_RECOMMENDED_CONFIGS.len(),
RECOMMENDED_CONFIG_SOURCES.len(),
"some of {names:?} did not parse"
);
}
#[test]
fn unknown_fields_are_rejected() {
let result = serde_yaml::from_str::<RecommendedModel>(
"model: granite-4.2-3b\nvariant_precision: [Q8_0]\n",
);
assert!(result.is_err());
let result =
serde_yaml::from_str::<RecommendedModelSet>("min_context_lenght: 65536\nmodels: []\n");
assert!(result.is_err());
}
#[test]
fn builtin_contains_wildcard() {
assert!(
BUILTIN_RECOMMENDED_CONFIGS
.iter()
.any(|c| c.launcher == "*"),
"must have a wildcard (*) entry"
);
}
#[test]
fn builtin_contains_opencode() {
assert!(
BUILTIN_RECOMMENDED_CONFIGS
.iter()
.any(|c| c.launcher == "opencode"),
"must have an 'opencode' launcher entry"
);
}
}