use std::collections::HashMap;
use std::path::PathBuf;
use serde::{Serialize, Deserialize};
use async_trait::async_trait;
use serde_json::Value;
use crate::error::{Result, InstanceId};
use crate::config::AdvancedCapabilities;
use crate::monitoring::DetailedResourceUsage;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PluginManifest {
pub id: String,
pub name: String,
pub version: String,
pub description: String,
pub permissions: AdvancedCapabilities,
pub entry_points: Vec<EntryPoint>,
pub dependencies: Vec<Dependency>,
pub metadata: HashMap<String, Value>,
pub min_sandbox_version: String,
pub author: Option<String>,
pub license: Option<String>,
pub repository: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EntryPoint {
pub function_name: String,
pub display_name: String,
pub description: String,
pub input_schema: Option<Value>,
pub output_schema: Option<Value>,
pub supports_streaming: bool,
pub execution_category: ExecutionCategory,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ExecutionCategory {
Instant,
Fast,
Standard,
LongRunning,
Streaming,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Dependency {
pub name: String,
pub version_requirement: String,
pub optional: bool,
pub dependency_type: DependencyType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DependencyType {
Plugin,
System,
Service,
}
#[derive(Debug)]
pub struct ExecutionContext {
pub instance_id: InstanceId,
pub manifest: PluginManifest,
pub environment: HashMap<String, String>,
pub temp_dir: PathBuf,
pub resource_limits: crate::security::ResourceLimits,
pub metadata: HashMap<String, Value>,
}
#[async_trait]
pub trait WasmPlugin: Send + Sync {
fn manifest(&self) -> &PluginManifest;
async fn initialize(&mut self, context: &ExecutionContext) -> Result<()>;
fn validate_parameters(&self, entry_point: &str, params: &[Value]) -> Result<()>;
async fn execute(
&self,
entry_point: &str,
parameters: &[Value],
context: &ExecutionContext
) -> Result<Value>;
async fn execute_streaming(
&self,
entry_point: &str,
input_stream: Box<dyn futures::Stream<Item = Value> + Send + Unpin>,
context: &ExecutionContext
) -> Result<Box<dyn futures::Stream<Item = Result<Value>> + Send + Unpin>>;
async fn cleanup(&mut self, context: &ExecutionContext) -> Result<()>;
async fn health_check(&self) -> Result<PluginHealth>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PluginHealth {
pub status: HealthStatus,
pub timestamp: u64,
pub resource_usage: Option<DetailedResourceUsage>,
pub messages: Vec<String>,
pub metrics: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum HealthStatus {
Healthy,
Warning,
Error,
Unresponsive,
}
#[async_trait]
pub trait HotReload: Send + Sync {
async fn check_compatibility(
&self,
current_manifest: &PluginManifest,
new_wasm_bytes: &[u8]
) -> Result<CompatibilityReport>;
async fn hot_reload(
&mut self,
new_wasm_bytes: &[u8],
context: &ExecutionContext
) -> Result<()>;
async fn rollback(&mut self, context: &ExecutionContext) -> Result<()>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompatibilityReport {
pub is_compatible: bool,
pub breaking_changes: Vec<BreakingChange>,
pub warnings: Vec<String>,
pub recommendations: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BreakingChange {
pub change_type: BreakingChangeType,
pub description: String,
pub affected_items: Vec<String>,
pub migration_steps: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BreakingChangeType {
FunctionSignature,
EntryPointRemoved,
PermissionChange,
DependencyChange,
ApiVersion,
}
pub trait PluginValidator: Send + Sync {
fn validate_manifest(&self, manifest: &PluginManifest) -> Result<Vec<ValidationWarning>>;
fn validate_wasm(&self, wasm_bytes: &[u8]) -> Result<Vec<ValidationWarning>>;
fn security_audit(&self, manifest: &PluginManifest, wasm_bytes: &[u8]) -> Result<SecurityAuditReport>;
fn benchmark(&self, plugin: &dyn WasmPlugin) -> Result<BenchmarkReport>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValidationWarning {
pub severity: WarningSeverity,
pub message: String,
pub location: Option<String>,
pub suggestion: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum WarningSeverity {
Info,
Warning,
Error,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SecurityAuditReport {
pub security_score: u8,
pub issues: Vec<SecurityIssue>,
pub mitigations: Vec<String>,
pub production_ready: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SecurityIssue {
pub severity: SecuritySeverity,
pub description: String,
pub impact: String,
pub fix: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SecuritySeverity {
Low,
Medium,
High,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BenchmarkReport {
pub entry_points: HashMap<String, EntryPointBenchmark>,
pub performance_score: u8,
pub memory_score: u8,
pub cpu_score: u8,
pub optimizations: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EntryPointBenchmark {
pub avg_execution_time: std::time::Duration,
pub p95_execution_time: std::time::Duration,
pub memory_usage: crate::monitoring::MemoryUsage,
pub throughput: f64,
}
pub trait PluginRegistry: Send + Sync {
fn register_plugin(&mut self, manifest: PluginManifest, wasm_bytes: Vec<u8>) -> Result<()>;
fn unregister_plugin(&mut self, plugin_id: &str) -> Result<()>;
fn get_manifest(&self, plugin_id: &str) -> Result<&PluginManifest>;
fn list_plugins(&self) -> Vec<&PluginManifest>;
fn search_plugins(&self, query: &PluginQuery) -> Vec<&PluginManifest>;
fn get_dependencies(&self, plugin_id: &str) -> Result<Vec<&PluginManifest>>;
}
#[derive(Debug, Clone)]
pub struct PluginQuery {
pub text: Option<String>,
pub author: Option<String>,
pub tags: Vec<String>,
pub min_version: Option<String>,
pub required_capabilities: Vec<String>,
}
impl Default for PluginQuery {
fn default() -> Self {
Self {
text: None,
author: None,
tags: Vec::new(),
min_version: None,
required_capabilities: Vec::new(),
}
}
}