use crate::core::{DeclaredReach, Digest, ReachGrant};
use crate::manifest::Manifest;
pub(crate) fn declared(
manifest: &Manifest,
digest: Digest,
consults: impl Fn(&str) -> bool,
) -> DeclaredReach {
let grants = manifest
.spec
.tools
.iter()
.map(|grant| ReachGrant {
reference: grant.reference.clone(),
mutates: grant.mutates,
requires_approval: grant.requires_approval,
consults: crate::tools::ToolId::parse(&grant.reference)
.is_some_and(|id| id.server == crate::tools::AGENT_SERVER || consults(&id.server)),
})
.collect();
DeclaredReach {
agent: manifest.metadata.name.clone(),
version: manifest.metadata.version.clone(),
digest,
grants,
budgets: serde_json::to_value(&manifest.spec.budgets).expect("declared budgets serialize"),
max_delegation_depth: manifest.spec.security.max_delegation_depth,
}
}