1use serde::{Deserialize, Serialize};
4
5use crate::contracts::{ContainerPath, VaultPath};
6
7use super::input::InspectCheck;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(rename_all = "kebab-case")]
12pub enum SyncStatus {
13 Ok,
15 Partial,
17 Failed,
19 Busy,
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
25#[serde(rename_all = "camelCase")]
26#[allow(clippy::struct_excessive_bools)]
27pub struct SyncResponse {
28 pub completed: bool,
30 pub status: SyncStatus,
32 pub fast: bool,
34 pub force: bool,
36 pub rebuild: bool,
38 pub path_count: u32,
40 pub indexed: u32,
42 pub skipped: u32,
44 pub deleted: u32,
46 pub embedded: u32,
48 pub embed_failed: u32,
50 pub dimension_mismatch: bool,
53 #[serde(skip_serializing_if = "Option::is_none")]
57 pub embed_remediation: Option<String>,
58 #[serde(default, skip_serializing_if = "Vec::is_empty")]
60 pub embed_diagnostics: Vec<String>,
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub graph: Option<crate::graph::GraphBuildStats>,
64 pub duration_ms: u64,
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
70#[serde(rename_all = "kebab-case")]
71pub enum StatusState {
72 Disabled,
74 ConfigError,
76 Ready,
78}
79
80#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
82#[serde(rename_all = "camelCase")]
83pub struct IndexStats {
84 pub active_notes: u32,
86 pub chunk_count: u32,
88 pub failed_embeddings: u32,
90 pub vector_dimensions: Option<u16>,
92}
93
94#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
96#[serde(rename_all = "camelCase")]
97pub struct ScopeReport {
98 pub total_scopes: u32,
100 pub default_scopes: Vec<String>,
102 pub unscoped_count: u32,
104}
105
106#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
108#[serde(rename_all = "camelCase")]
109pub struct StatusResponse {
110 pub state: StatusState,
112 pub enabled: bool,
114 #[serde(skip_serializing_if = "Option::is_none")]
116 pub reason: Option<String>,
117 pub container_mount: ContainerPath,
119 pub index_version: String,
121 pub index: IndexStats,
123 #[serde(skip_serializing_if = "Option::is_none")]
125 pub scopes: Option<ScopeReport>,
126 #[serde(skip_serializing_if = "Option::is_none")]
128 pub vault_path: Option<String>,
129 #[serde(skip_serializing_if = "Option::is_none")]
131 pub config_path: Option<String>,
132 #[serde(skip_serializing_if = "Option::is_none")]
134 pub db_path: Option<String>,
135}
136
137#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
139#[serde(rename_all = "camelCase")]
140pub struct InspectFinding {
141 pub check: InspectCheck,
143 pub path: VaultPath,
145 pub message: String,
147 #[serde(skip_serializing_if = "Option::is_none")]
149 pub line: Option<u32>,
150}
151
152#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
154#[serde(rename_all = "camelCase")]
155pub struct InspectResponse {
156 #[serde(skip_serializing_if = "Option::is_none")]
158 pub vault: Option<ContainerPath>,
159 pub check: InspectCheck,
161 pub findings: Vec<InspectFinding>,
163}