Skip to main content

edgequake_sdk/types/
operations.rs

1//! Operations types — tasks, pipeline, costs, lineage, chunks, provenance, models.
2
3use serde::Deserialize;
4
5// --- Task types ---
6
7/// Task info.
8#[derive(Debug, Clone, Deserialize)]
9pub struct TaskInfo {
10    pub track_id: String,
11    pub status: String,
12    #[serde(default)]
13    pub progress: Option<TaskProgress>,
14    #[serde(default)]
15    pub message: Option<String>,
16    #[serde(default)]
17    pub document_id: Option<String>,
18    #[serde(default)]
19    pub task_type: Option<String>,
20    #[serde(default)]
21    pub created_at: Option<String>,
22    #[serde(default)]
23    pub error: Option<String>,
24}
25
26/// Task progress detail.
27#[derive(Debug, Clone, Deserialize)]
28pub struct TaskProgress {
29    #[serde(default)]
30    pub current_step: Option<String>,
31    #[serde(default)]
32    pub percent_complete: Option<f64>,
33    #[serde(default)]
34    pub total_steps: Option<u32>,
35}
36
37/// Task list response.
38#[derive(Debug, Clone, Deserialize)]
39pub struct TaskListResponse {
40    #[serde(default)]
41    pub tasks: Vec<TaskInfo>,
42    #[serde(default)]
43    pub total: u32,
44}
45
46// --- Pipeline types ---
47
48/// Pipeline status.
49#[derive(Debug, Clone, Deserialize)]
50pub struct PipelineStatus {
51    #[serde(default)]
52    pub is_busy: bool,
53    #[serde(default)]
54    pub total_documents: u32,
55    #[serde(default)]
56    pub processed_documents: u32,
57    #[serde(default)]
58    pub current_batch: u32,
59    #[serde(default)]
60    pub total_batches: u32,
61    #[serde(default)]
62    pub cancellation_requested: bool,
63    #[serde(default)]
64    pub pending_tasks: u32,
65    #[serde(default)]
66    pub processing_tasks: u32,
67    #[serde(default)]
68    pub completed_tasks: u32,
69    #[serde(default)]
70    pub failed_tasks: u32,
71}
72
73/// Queue metrics.
74#[derive(Debug, Clone, Deserialize)]
75pub struct QueueMetrics {
76    #[serde(default)]
77    pub queue_depth: u32,
78    #[serde(default)]
79    pub processing: u32,
80    #[serde(default)]
81    pub completed_last_hour: u32,
82    #[serde(default)]
83    pub failed_last_hour: u32,
84    #[serde(default)]
85    pub avg_processing_time_ms: Option<f64>,
86}
87
88// --- Cost types ---
89
90/// Cost summary.
91#[derive(Debug, Clone, Deserialize)]
92pub struct CostSummary {
93    #[serde(default)]
94    pub total_cost_usd: f64,
95    #[serde(default)]
96    pub total_tokens: u64,
97    #[serde(default)]
98    pub total_input_tokens: u64,
99    #[serde(default)]
100    pub total_output_tokens: u64,
101    #[serde(default)]
102    pub document_count: u32,
103    #[serde(default)]
104    pub query_count: u32,
105}
106
107/// Cost history entry.
108#[derive(Debug, Clone, Deserialize)]
109pub struct CostEntry {
110    pub date: String,
111    #[serde(default)]
112    pub cost_usd: f64,
113    #[serde(default)]
114    pub tokens: u64,
115    #[serde(default)]
116    pub requests: u32,
117}
118
119/// Budget info.
120#[derive(Debug, Clone, Deserialize)]
121pub struct BudgetInfo {
122    #[serde(default)]
123    pub monthly_budget_usd: Option<f64>,
124    #[serde(default)]
125    pub current_spend_usd: f64,
126    #[serde(default)]
127    pub remaining_usd: Option<f64>,
128}
129
130// --- Lineage types ---
131
132/// Lineage node.
133#[derive(Debug, Clone, Deserialize)]
134pub struct LineageNode {
135    pub id: String,
136    #[serde(default)]
137    pub name: Option<String>,
138    #[serde(default)]
139    pub node_type: Option<String>,
140}
141
142/// Lineage edge.
143#[derive(Debug, Clone, Deserialize)]
144pub struct LineageEdge {
145    pub source: String,
146    pub target: String,
147    #[serde(default)]
148    pub relationship: Option<String>,
149}
150
151/// Lineage graph.
152#[derive(Debug, Clone, Deserialize)]
153pub struct LineageGraph {
154    #[serde(default)]
155    pub nodes: Vec<LineageNode>,
156    #[serde(default)]
157    pub edges: Vec<LineageEdge>,
158    #[serde(default)]
159    pub root_id: Option<String>,
160}
161
162// --- Document Lineage (OODA-14) ---
163
164/// Complete document lineage response from `GET /documents/:id/lineage`.
165///
166/// WHY: Returns persisted DocumentLineage + document metadata in a single call.
167/// @implements F5 — Single API call retrieves complete lineage tree.
168#[derive(Debug, Clone, Deserialize)]
169pub struct DocumentFullLineage {
170    pub document_id: String,
171    #[serde(default)]
172    pub metadata: Option<serde_json::Value>,
173    #[serde(default)]
174    pub lineage: Option<serde_json::Value>,
175}
176
177/// Chunk lineage response from `GET /chunks/:id/lineage`.
178///
179/// WHY: Lightweight chunk lineage with parent document refs and position info.
180/// @implements F3 — Every chunk contains parent_document_id and position info.
181#[derive(Debug, Clone, Deserialize)]
182pub struct ChunkLineageInfo {
183    pub chunk_id: String,
184    #[serde(default)]
185    pub document_id: Option<String>,
186    #[serde(default)]
187    pub document_name: Option<String>,
188    #[serde(default)]
189    pub document_type: Option<String>,
190    #[serde(default)]
191    pub index: Option<u32>,
192    #[serde(default)]
193    pub start_line: Option<u32>,
194    #[serde(default)]
195    pub end_line: Option<u32>,
196    #[serde(default)]
197    pub start_offset: Option<u64>,
198    #[serde(default)]
199    pub end_offset: Option<u64>,
200    #[serde(default)]
201    pub token_count: Option<u32>,
202    #[serde(default)]
203    pub content_preview: Option<String>,
204    #[serde(default)]
205    pub entity_count: Option<u32>,
206    #[serde(default)]
207    pub relationship_count: Option<u32>,
208    #[serde(default)]
209    pub entity_names: Vec<String>,
210    #[serde(default)]
211    pub document_metadata: Option<serde_json::Value>,
212}
213
214// --- Chunk types ---
215
216/// Chunk detail.
217#[derive(Debug, Clone, Deserialize)]
218pub struct ChunkDetail {
219    pub id: String,
220    #[serde(default)]
221    pub document_id: Option<String>,
222    #[serde(default)]
223    pub content: Option<String>,
224    #[serde(default)]
225    pub chunk_index: Option<u32>,
226    #[serde(default)]
227    pub token_count: Option<u32>,
228}
229
230// --- Provenance ---
231
232/// Provenance record.
233#[derive(Debug, Clone, Deserialize)]
234pub struct ProvenanceRecord {
235    #[serde(default)]
236    pub entity_id: Option<String>,
237    #[serde(default)]
238    pub entity_name: Option<String>,
239    #[serde(default)]
240    pub document_id: Option<String>,
241    #[serde(default)]
242    pub chunk_id: Option<String>,
243    #[serde(default)]
244    pub extraction_method: Option<String>,
245    #[serde(default)]
246    pub confidence: Option<f64>,
247}
248
249// --- Settings ---
250
251/// Provider status.
252#[derive(Debug, Clone, Deserialize)]
253pub struct ProviderStatus {
254    #[serde(default)]
255    pub current_provider: Option<String>,
256    #[serde(default)]
257    pub current_model: Option<String>,
258    #[serde(default)]
259    pub status: Option<String>,
260}
261
262// --- Models ---
263
264/// Model info.
265#[derive(Debug, Clone, Deserialize)]
266pub struct ModelInfo {
267    pub name: String,
268    #[serde(default)]
269    pub provider: Option<String>,
270    #[serde(default)]
271    pub model_type: Option<String>,
272    #[serde(default)]
273    pub is_available: bool,
274    #[serde(default)]
275    pub display_name: Option<String>,
276    #[serde(default)]
277    pub description: Option<String>,
278    #[serde(default)]
279    pub deprecated: Option<bool>,
280}
281
282/// Provider info with models (returned by GET /api/v1/models).
283#[derive(Debug, Clone, Deserialize)]
284pub struct ProviderInfo {
285    pub name: String,
286    #[serde(default)]
287    pub display_name: Option<String>,
288    #[serde(default)]
289    pub models: Vec<ModelInfo>,
290}
291
292/// Provider catalog response from GET /api/v1/models.
293#[derive(Debug, Clone, Deserialize)]
294pub struct ProviderCatalog {
295    #[serde(default)]
296    pub providers: Vec<ProviderInfo>,
297}
298
299/// Providers health (bare array from GET /api/v1/models/health).
300/// The response is `Vec<ProviderHealthInfo>`.
301/// Health info for a provider.
302#[derive(Debug, Clone, Deserialize)]
303pub struct ProviderHealthInfo {
304    pub name: String,
305    #[serde(default)]
306    pub display_name: Option<String>,
307    #[serde(default)]
308    pub provider_type: Option<String>,
309    #[serde(default)]
310    pub enabled: bool,
311    #[serde(default)]
312    pub priority: Option<u32>,
313    #[serde(default)]
314    pub description: Option<String>,
315    #[serde(default)]
316    pub models: Vec<ModelInfo>,
317    #[serde(default)]
318    pub error: Option<String>,
319}