use serde::{Deserialize, Serialize};
use crate::contracts::{ContainerPath, VaultPath};
use super::input::InspectCheck;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum SyncStatus {
Ok,
Partial,
Failed,
Busy,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[allow(clippy::struct_excessive_bools)]
pub struct SyncResponse {
pub completed: bool,
pub status: SyncStatus,
pub fast: bool,
pub force: bool,
pub rebuild: bool,
pub path_count: u32,
pub indexed: u32,
pub skipped: u32,
pub deleted: u32,
pub embedded: u32,
pub embed_failed: u32,
pub dimension_mismatch: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub embed_remediation: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub embed_diagnostics: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub graph: Option<crate::graph::GraphBuildStats>,
pub duration_ms: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum StatusState {
Disabled,
ConfigError,
Ready,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct IndexStats {
pub active_notes: u32,
pub chunk_count: u32,
pub failed_embeddings: u32,
pub vector_dimensions: Option<u16>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ScopeReport {
pub total_scopes: u32,
pub default_scopes: Vec<String>,
pub unscoped_count: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct StatusResponse {
pub state: StatusState,
pub enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
pub container_mount: ContainerPath,
pub index_version: String,
pub index: IndexStats,
#[serde(skip_serializing_if = "Option::is_none")]
pub scopes: Option<ScopeReport>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vault_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub config_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub db_path: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InspectFinding {
pub check: InspectCheck,
pub path: VaultPath,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub line: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InspectResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub vault: Option<ContainerPath>,
pub check: InspectCheck,
pub findings: Vec<InspectFinding>,
}