use sim_kernel::{CapabilityName, Cx, Result};
pub const OPENAI_GATEWAY_SERVE_CAPABILITY: &str = "openai-gateway.serve";
pub const OPENAI_GATEWAY_ADMIN_CAPABILITY: &str = "openai-gateway.admin";
pub const OPENAI_GATEWAY_PLAN_CAPABILITY: &str = "openai-gateway.plan";
pub const OPENAI_GATEWAY_PLAN_REMOTE_CAPABILITY: &str = "openai-gateway.plan.remote";
pub const OPENAI_GATEWAY_FEDERATE_CAPABILITY: &str = "openai-gateway.federate";
pub const OPENAI_GATEWAY_TOOLS_CAPABILITY: &str = "openai-gateway.tools";
pub const AI_RUNNER_CACHE_CAPABILITY: &str = "ai-runner-cache";
pub const NETWORK_CAPABILITY: &str = "net/http";
pub const WEBHOOK_SERVE_CAPABILITY: &str = "webhook-serve";
pub fn openai_gateway_serve_capability() -> CapabilityName {
CapabilityName::new(OPENAI_GATEWAY_SERVE_CAPABILITY)
}
pub fn openai_gateway_admin_capability() -> CapabilityName {
CapabilityName::new(OPENAI_GATEWAY_ADMIN_CAPABILITY)
}
pub fn openai_gateway_plan_capability() -> CapabilityName {
CapabilityName::new(OPENAI_GATEWAY_PLAN_CAPABILITY)
}
pub fn openai_gateway_plan_remote_capability() -> CapabilityName {
CapabilityName::new(OPENAI_GATEWAY_PLAN_REMOTE_CAPABILITY)
}
pub fn openai_gateway_federate_capability() -> CapabilityName {
CapabilityName::new(OPENAI_GATEWAY_FEDERATE_CAPABILITY)
}
pub fn openai_gateway_tools_capability() -> CapabilityName {
CapabilityName::new(OPENAI_GATEWAY_TOOLS_CAPABILITY)
}
pub fn ai_runner_cache_capability() -> CapabilityName {
CapabilityName::new(AI_RUNNER_CACHE_CAPABILITY)
}
pub fn network_capability() -> CapabilityName {
CapabilityName::new(NETWORK_CAPABILITY)
}
pub fn webhook_serve_capability() -> CapabilityName {
CapabilityName::new(WEBHOOK_SERVE_CAPABILITY)
}
pub fn openai_gateway_serve_capabilities() -> Vec<CapabilityName> {
vec![
openai_gateway_serve_capability(),
network_capability(),
webhook_serve_capability(),
]
}
pub fn require_openai_gateway_serve_capabilities(cx: &Cx) -> Result<()> {
cx.require(&openai_gateway_serve_capability())?;
require_with_aliases(cx, network_capability(), net_http_aliases())?;
cx.require(&webhook_serve_capability())
}
fn net_http_aliases() -> &'static [&'static str] {
&["net.http", "net-connect", "network"]
}
fn require_with_aliases(
cx: &Cx,
canonical: CapabilityName,
aliases: &'static [&'static str],
) -> Result<()> {
if cx.capabilities().contains(&canonical)
|| aliases
.iter()
.any(|alias| cx.capabilities().contains(&CapabilityName::new(*alias)))
{
Ok(())
} else {
Err(sim_kernel::Error::CapabilityDenied {
capability: canonical,
})
}
}