use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct Manifest {
pub project: ProjectMetadata,
pub identity: IdentityConfig,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub capabilities: Option<AgentCapabilities>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub discovery: Option<DiscoveryMetadata>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub a2a: Option<A2AConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub deployment: Option<DeploymentConfig>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct ProjectMetadata {
pub name: String,
pub version: String,
pub description: Option<String>,
#[serde(default)]
pub authors: Vec<String>,
pub license: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct IdentityConfig {
pub model: String,
pub system_prompt_path: String,
pub tools_path: String,
pub system_prompt_hash: Option<String>,
pub tools_hash: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct AgentCapabilities {
#[serde(default)]
pub provides: Vec<String>,
#[serde(default)]
pub requires: Vec<String>,
#[serde(default)]
pub delegates_to: Vec<DelegationTarget>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct DelegationTarget {
pub agent_type: String,
#[serde(default)]
pub capabilities: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct DiscoveryMetadata {
#[serde(default)]
pub tags: Vec<String>,
#[serde(default)]
pub categories: Vec<String>,
#[serde(default)]
pub search_keywords: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct A2AConfig {
pub upstream_url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub public_base_url: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct DeploymentConfig {
#[serde(default)]
pub env: Vec<EnvVarSpec>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub docker_image: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct EnvVarSpec {
pub name: String,
#[serde(default)]
pub required: bool,
#[serde(default)]
pub secret: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub example: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default_value: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct PublishRequest {
pub manifest: Manifest,
pub sekuire_id: String, pub signature: String, pub public_key: String, #[serde(skip_serializing_if = "Option::is_none")]
pub publisher_org_id: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
pub visibility: Option<String>, }
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct AgentResponse {
pub sekuire_id: String,
pub public_key: String, pub name: String,
pub version: String,
pub description: Option<String>,
pub created_at: String, pub verification_status: VerificationStatus,
pub reputation_score: i32, #[serde(skip_serializing_if = "Option::is_none")]
pub manifest: Option<serde_json::Value>, #[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub publisher_user_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub publisher_email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub publisher_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub publisher_org_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub publisher_org_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub org_metadata: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub visibility: Option<AgentVisibility>,
#[serde(skip_serializing_if = "Option::is_none")]
pub public_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub git_repository: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub commit_hash: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub repository_verified: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub readme_content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub changelog_content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_review_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub security_score: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reviewed_by: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reviewed_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub review_notes: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
#[cfg_attr(feature = "backend", derive(sqlx::Type))]
#[serde(rename_all = "snake_case")]
#[cfg_attr(
feature = "backend",
sqlx(type_name = "verification_status", rename_all = "snake_case")
)]
pub enum VerificationStatus {
Unverified,
Pending,
Verified,
Suspended,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
#[cfg_attr(feature = "backend", derive(sqlx::Type))]
#[serde(rename_all = "snake_case")]
#[cfg_attr(
feature = "backend",
sqlx(type_name = "agent_visibility", rename_all = "snake_case")
)]
pub enum AgentVisibility {
Public,
Private,
Internal,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct ReputationResponse {
pub score: i32,
pub task_count: i32,
pub verification_badge: Option<String>, pub recent_logs: Vec<ReputationLog>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct ReputationLog {
pub id: String,
pub task_hash: String,
pub rating: i32, pub comment: Option<String>,
pub timestamp: String,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct SubmitReputationRequest {
pub sekuire_id: String,
pub task_hash: String,
pub rating: i32,
pub comment: Option<String>,
pub signature: String, }
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct HandshakeHello {
pub client_nonce: String, }
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct HandshakeWelcome {
pub agent_id: String,
pub agent_nonce: String, pub signature_c: String, pub credentials: Vec<String>, }
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct HandshakeAuth {
pub signature_a: String, }
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct Category {
pub id: String,
pub name: String,
pub slug: String,
pub description: Option<String>,
pub icon: Option<String>,
pub parent_id: Option<String>,
pub parent_name: Option<String>,
pub is_active: bool,
pub display_order: i32,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct AssignCategoryRequest {
pub sekuire_id: String,
pub category_ids: Vec<String>, pub primary_category_id: Option<String>, }
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct VerifyAgentRequest {
pub sekuire_id: String,
pub status: VerificationStatus, pub badge: Option<String>, pub reason: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct DisputeRequest {
pub sekuire_id: String,
pub accuser_id: String, pub reason: String,
pub evidence_log: String, }
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct CreateOrgRequest {
pub slug: String,
pub display_name: String,
pub billing_email: String,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct OrgResponse {
pub id: String,
pub slug: String,
pub role: String,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct CreateWorkspaceRequest {
pub name: String,
pub policy_preset: String,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct WorkspaceResponse {
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct InviteRequest {
pub email: String,
pub role: String,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct InviteResponse {
pub id: String,
pub status: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct UserContextResponse {
pub id: String,
pub email: String,
pub onboarded: bool,
pub mfa_enabled: bool,
pub role: Option<String>,
pub full_name: Option<String>,
pub avatar_url: Option<String>,
pub onboarding_step: i32,
pub profile_completed: bool,
pub orgs: Vec<OrgSummary>,
pub workspaces: Vec<WorkspaceSummary>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct OrgSummary {
pub id: String,
pub slug: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub workspaces: Vec<WorkspaceSummary>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct WorkspaceSummary {
pub id: String,
pub name: String,
pub org_id: String,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct TaskCompletionRequest {
pub sekuire_id: String,
pub task_hash: String,
pub rating: i32, pub comment: Option<String>,
pub employer_id: String, }
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct TaskCompletionResponse {
pub success: bool,
pub new_reputation_score: i32,
pub reputation_change: i32,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct LeaderboardEntry {
pub rank: i32,
pub sekuire_id: String,
pub name: String,
pub reputation_score: i32,
pub task_count: i32,
pub success_rate: f64,
pub average_rating: f64,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct EnhancedReputationResponse {
pub score: i32,
pub rank: Option<i32>,
pub total_agents: i32,
pub task_count: i32,
pub success_count: i32,
pub dispute_count: i32,
pub success_rate: f64,
pub average_rating: f64,
pub verification_badge: Option<String>,
pub recent_logs: Vec<ReputationLog>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct VerifyAgentResponse {
pub verified: bool,
pub sekuire_id: String,
pub name: String,
pub verification_status: VerificationStatus,
pub reputation_score: i32,
pub badges: Vec<String>, pub success_rate: Option<f64>,
pub task_count: i32,
pub risk_level: String, }
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct BadgeRequest {
pub sekuire_id: String,
pub badge_type: String, pub evidence: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct QuickVerifyRequest {
pub sekuire_id: String,
pub requesting_agent: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct QuickVerifyResponse {
pub verified: bool,
pub sekuire_id: String,
pub name: String,
pub verification_status: VerificationStatus,
pub reputation_score: i32,
pub badges: Vec<String>,
pub success_rate: Option<f64>,
pub task_count: i32,
pub risk_level: String,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct IssueBadgeRequest {
pub sekuire_id: String,
pub badge_type: String,
pub evidence: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct VerifyHeadersRequest {
pub agent_id: String,
pub reputation: i32,
pub credentials: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct VerifyHeadersResponse {
pub valid: bool,
pub message: String,
pub discrepancies: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[cfg_attr(feature = "backend", derive(sqlx::Type))]
#[serde(rename_all = "snake_case")]
#[cfg_attr(
feature = "backend",
sqlx(type_name = "text", rename_all = "snake_case")
)]
pub enum EventType {
ToolExecution,
ModelCall,
PolicyViolation,
PolicyCheck,
NetworkAccess,
FileAccess,
Health,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[cfg_attr(feature = "backend", derive(sqlx::Type))]
#[serde(rename_all = "lowercase")]
#[cfg_attr(
feature = "backend",
sqlx(type_name = "text", rename_all = "lowercase")
)]
pub enum Severity {
Debug,
Info,
Warn,
Error,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct AgentEventLog {
pub sekuire_id: String,
pub session_id: String,
pub workspace_id: Option<String>,
pub event_type: EventType,
pub severity: Severity,
pub event_timestamp: String, pub event_data: serde_json::Value,
pub metadata: serde_json::Value,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct LogEventRequest {
pub events: Vec<AgentEventLog>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct LogEventResponse {
pub success: bool,
pub events_logged: usize,
pub errors: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct AgentHealthRequest {
pub sekuire_id: String,
pub status: String,
pub session_id: String,
pub sdk_version: String,
pub environment: String,
pub metadata: serde_json::Value,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct AgentHealthResponse {
pub success: bool,
pub message: String,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct GetLogsQuery {
pub limit: Option<i64>,
pub offset: Option<i64>,
pub event_type: Option<EventType>,
pub severity: Option<Severity>,
pub session_id: Option<String>,
pub start_time: Option<String>, pub end_time: Option<String>, }
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct GetLogsResponse {
pub logs: Vec<AgentEventLogResponse>,
pub total: i64,
pub limit: i64,
pub offset: i64,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, Clone)]
pub struct AgentEventLogResponse {
pub id: i64,
pub sekuire_id: String,
pub session_id: String,
pub workspace_id: Option<String>,
pub event_type: EventType,
pub severity: Severity,
pub event_timestamp: String,
pub received_at: String,
pub event_data: serde_json::Value,
pub metadata: serde_json::Value,
}