use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use crate::bridge::ids::{
ManagedMcpServerName, ManifestSignature, PluginId, Sha256Digest, SkillId, SkillName, ToolName,
ToolPolicy,
};
use crate::bridge::manifest_version::ManifestVersion;
use systemprompt_identifiers::{AgentId, AgentName, TenantId, UserId, ValidatedUrl};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SignedManifest {
pub manifest_version: ManifestVersion,
pub issued_at: String,
pub not_before: String,
pub user_id: UserId,
pub tenant_id: Option<TenantId>,
#[serde(default)]
pub user: Option<UserInfo>,
pub plugins: Vec<PluginEntry>,
#[serde(default)]
pub skills: Vec<SkillEntry>,
#[serde(default)]
pub agents: Vec<AgentEntry>,
pub managed_mcp_servers: Vec<ManagedMcpServer>,
pub revocations: Vec<String>,
#[serde(default)]
pub enabled_hosts: Vec<String>,
pub signature: ManifestSignature,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserInfo {
pub id: UserId,
pub name: String,
pub email: String,
#[serde(default)]
pub display_name: Option<String>,
#[serde(default)]
pub roles: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PluginEntry {
pub id: PluginId,
pub version: String,
pub sha256: Sha256Digest,
pub files: Vec<PluginFile>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PluginFile {
pub path: String,
pub sha256: Sha256Digest,
pub size: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SkillEntry {
pub id: SkillId,
pub name: SkillName,
pub description: String,
pub file_path: String,
#[serde(default)]
pub tags: Vec<String>,
pub sha256: Sha256Digest,
pub instructions: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AgentEntry {
pub id: AgentId,
pub name: AgentName,
pub display_name: String,
pub description: String,
pub version: String,
pub endpoint: String,
pub enabled: bool,
pub is_default: bool,
pub is_primary: bool,
#[serde(default)]
pub provider: Option<String>,
#[serde(default)]
pub model: Option<String>,
#[serde(default)]
pub mcp_servers: Vec<String>,
#[serde(default)]
pub skills: Vec<String>,
#[serde(default)]
pub tags: Vec<String>,
#[serde(default)]
pub system_prompt: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ManagedMcpServer {
pub name: ManagedMcpServerName,
pub url: ValidatedUrl,
#[serde(skip_serializing_if = "Option::is_none")]
pub transport: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<BTreeMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub oauth: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_policy: Option<BTreeMap<ToolName, ToolPolicy>>,
}