use super::policy;
use super::registry;
use super::spawn_request::SpawnRequest;
use super::store;
use crate::tool::ToolResult;
pub(super) async fn validate_spawn_request(request: &SpawnRequest<'_>) -> Result<(), ToolResult> {
validate_model(request.model).await?;
validate_name_is_available(request.name)
}
async fn validate_model(model: &str) -> Result<(), ToolResult> {
let registry = match registry::get_registry().await {
Ok(registry) => registry,
Err(error) => return Err(ToolResult::error(error.to_string())),
};
if policy::is_free_or_eligible(model, ®istry).await {
return Ok(());
}
Err(ToolResult::error(ineligible_model_message(model)))
}
fn validate_name_is_available(name: &str) -> Result<(), ToolResult> {
if !store::contains(name) {
return Ok(());
}
Err(ToolResult::error(format!(
"Agent @{name} exists. Use kill first."
)))
}
fn ineligible_model_message(model: &str) -> String {
format!(
"Spawn blocked: '{model}' is not free/subscription-eligible. \
Use ':free' models, subscription providers, or OAuth providers."
)
}