use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::BTreeMap;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct SupportedCommand {
pub name: String,
pub idempotent: bool,
pub timeout_seconds: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct TargetProcessRegistration {
pub target_id: String,
pub display_name: String,
pub ipc_path: String,
pub lease_seconds: u64,
pub supported_commands: Vec<SupportedCommand>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum RegistrationState {
Active,
Rejected,
Expired,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TargetConnectionState {
Registered,
Connecting,
Connected,
Reconnecting,
Unavailable,
Expired,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct TargetProcessIdentity {
pub target_id: String,
pub display_name: String,
pub registration_state: RegistrationState,
pub connection_state: TargetConnectionState,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct DashboardState {
pub target: TargetProcessIdentity,
pub topology: SupervisorTopology,
pub runtime_state: Vec<RuntimeState>,
pub recent_events: Vec<EventRecord>,
pub recent_logs: Vec<LogRecord>,
pub dropped_event_count: u64,
pub dropped_log_count: u64,
pub config_version: String,
pub generated_at_unix_nanos: u128,
pub state_generation: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct SupervisorTopology {
pub root: SupervisorNode,
pub nodes: Vec<SupervisorNode>,
pub edges: Vec<SupervisorEdge>,
pub declaration_order: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SupervisorNodeKind {
RootSupervisor,
ChildTask,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum DashboardCriticality {
Critical,
Standard,
BestEffort,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct SupervisorNode {
pub node_id: String,
pub child_id: Option<String>,
pub path: String,
pub name: String,
pub kind: SupervisorNodeKind,
pub tags: Vec<String>,
pub criticality: DashboardCriticality,
pub state_summary: String,
pub diagnostics: BTreeMap<String, String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SupervisorEdgeKind {
ParentChild,
Dependency,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct SupervisorEdge {
pub edge_id: String,
pub source_path: String,
pub target_path: String,
pub kind: SupervisorEdgeKind,
pub order: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct RuntimeState {
pub child_path: String,
pub lifecycle_state: String,
pub health: String,
pub readiness: String,
pub generation: u64,
pub attempt: u64,
pub restart_count: u64,
pub last_failure: Option<String>,
pub last_policy_decision: Option<String>,
pub shutdown_state: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct EventRecord {
pub target_id: String,
pub sequence: u64,
pub correlation_id: String,
pub event_type: String,
pub severity: String,
pub target_path: String,
pub child_id: Option<String>,
pub occurred_at_unix_nanos: u128,
pub config_version: String,
pub payload: Value,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct LogRecord {
pub target_id: String,
pub sequence: Option<u64>,
pub correlation_id: Option<String>,
pub severity: String,
pub message: String,
pub fields: BTreeMap<String, String>,
pub occurred_at_unix_nanos: u128,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ControlCommandKind {
RestartChild,
PauseChild,
ResumeChild,
QuarantineChild,
RemoveChild,
AddChild,
ShutdownTree,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct ControlCommandTarget {
pub child_path: Option<String>,
pub child_manifest: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct ControlCommandRequest {
pub command_id: String,
pub target_id: String,
pub command: ControlCommandKind,
pub target: ControlCommandTarget,
pub reason: String,
pub requested_by: String,
pub confirmed: bool,
pub requested_at_unix_nanos: u128,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ControlCommandResult {
pub command_id: String,
pub target_id: String,
pub accepted: bool,
pub status: String,
pub error: Option<crate::dashboard::error::DashboardError>,
pub state_delta: Option<Value>,
pub completed_at_unix_nanos: Option<u128>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct AuditEvent {
pub audit_id: String,
pub identity: String,
pub target_id: String,
pub command_id: String,
pub command: ControlCommandKind,
pub target: ControlCommandTarget,
pub reason: String,
pub result: String,
pub occurred_at_unix_nanos: u128,
}