pub mod manifest;
pub mod optimizer;
pub mod report;
pub mod ris;
pub mod rules;
pub mod sarif;
use thiserror::Error;
pub use manifest::{Manifest, Tool};
pub use optimizer::{DescriptionOptimizer, HeuristicOptimizer, OptimizationOutcome};
pub use report::{Report, ToolReport};
pub use ris::{RisBreakdown, RisScore};
pub use rules::{Finding, RuleId, Severity};
#[derive(Debug, Error)]
pub enum SentinelError {
#[error("invalid MCP manifest: {0}")]
InvalidManifest(String),
#[error("io error: {0}")]
Io(#[from] std::io::Error),
#[error("json error: {0}")]
Json(#[from] serde_json::Error),
}
pub fn scan(bytes: &[u8]) -> Result<Report, SentinelError> {
let manifest = manifest::Manifest::from_slice(bytes)?;
Ok(Report::build(&manifest))
}
pub fn optimize(bytes: &[u8]) -> Result<Vec<OptimizationOutcome>, SentinelError> {
let manifest = manifest::Manifest::from_slice(bytes)?;
let opt = HeuristicOptimizer::default();
Ok(manifest
.tools
.iter()
.map(|t| opt.rewrite(t))
.collect::<Vec<_>>())
}