use serde::{Deserialize, Serialize}; use serde_json::Value; // ────────────────────────────────────────── // Pagination // ────────────────────────────────────────── #[derive(Debug, Clone, Deserialize)] pub struct Page { pub items: Vec, pub total: u64, pub page: u64, pub size: u64, pub pages: u64, } // ────────────────────────────────────────── // Workspace // ────────────────────────────────────────── #[derive(Debug, Clone, Deserialize)] pub struct Workspace { pub id: String, pub metadata: Option, pub configuration: Option, pub created_at: String, } #[derive(Debug, Clone, Serialize, Default)] pub struct WorkspaceCreate { pub id: String, #[serde(skip_serializing_if = "Option::is_none")] pub metadata: Option, #[serde(skip_serializing_if = "Option::is_none")] pub configuration: Option, } #[derive(Debug, Clone, Serialize, Default)] pub struct WorkspaceUpdate { #[serde(skip_serializing_if = "Option::is_none")] pub metadata: Option, #[serde(skip_serializing_if = "Option::is_none")] pub configuration: Option, } /// Filter body for `POST /workspaces/list` #[derive(Debug, Clone, Serialize, Default)] pub struct WorkspaceGet { #[serde(skip_serializing_if = "Option::is_none")] pub filters: Option, } // ────────────────────────────────────────── // Peer // ────────────────────────────────────────── #[derive(Debug, Clone, Deserialize)] pub struct Peer { pub id: String, pub workspace_id: String, pub created_at: String, pub metadata: Option, pub configuration: Option, } #[derive(Debug, Clone, Serialize)] pub struct PeerCreate { pub id: String, #[serde(skip_serializing_if = "Option::is_none")] pub metadata: Option, #[serde(skip_serializing_if = "Option::is_none")] pub configuration: Option, } #[derive(Debug, Clone, Serialize, Default)] pub struct PeerUpdate { #[serde(skip_serializing_if = "Option::is_none")] pub metadata: Option, #[serde(skip_serializing_if = "Option::is_none")] pub configuration: Option, } #[derive(Debug, Clone, Serialize, Default)] pub struct PeerGet { #[serde(skip_serializing_if = "Option::is_none")] pub filters: Option, } // ────────────────────────────────────────── // Session // ────────────────────────────────────────── #[derive(Debug, Clone, Deserialize)] pub struct Session { pub id: String, pub is_active: bool, pub workspace_id: String, pub metadata: Option, pub configuration: Option, pub created_at: String, } #[derive(Debug, Clone, Serialize, Default)] pub struct SessionCreate { #[serde(skip_serializing_if = "Option::is_none")] pub id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub metadata: Option, /// Map of peer_id → SessionPeerConfig #[serde(skip_serializing_if = "Option::is_none")] pub peers: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub configuration: Option, } #[derive(Debug, Clone, Serialize, Default)] pub struct SessionUpdate { #[serde(skip_serializing_if = "Option::is_none")] pub metadata: Option, #[serde(skip_serializing_if = "Option::is_none")] pub configuration: Option, } #[derive(Debug, Clone, Serialize, Default)] pub struct SessionGet { #[serde(skip_serializing_if = "Option::is_none")] pub filters: Option, } #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct SessionPeerConfig { #[serde(skip_serializing_if = "Option::is_none")] pub observe_me: Option, #[serde(skip_serializing_if = "Option::is_none")] pub observe_others: Option, } // ────────────────────────────────────────── // Message // ────────────────────────────────────────── #[derive(Debug, Clone, Deserialize)] pub struct Message { pub id: String, pub content: String, pub peer_id: String, pub session_id: String, pub workspace_id: String, pub metadata: Option, pub created_at: String, pub token_count: i64, } #[derive(Debug, Clone, Serialize)] pub struct MessageCreate { pub content: String, pub peer_id: String, #[serde(skip_serializing_if = "Option::is_none")] pub metadata: Option, #[serde(skip_serializing_if = "Option::is_none")] pub configuration: Option, /// RFC3339 datetime; if None the server assigns now #[serde(skip_serializing_if = "Option::is_none")] pub created_at: Option, } #[derive(Debug, Clone, Serialize)] pub struct MessageBatchCreate { pub messages: Vec, } #[derive(Debug, Clone, Serialize, Default)] pub struct MessageGet { #[serde(skip_serializing_if = "Option::is_none")] pub filters: Option, } #[derive(Debug, Clone, Serialize, Default)] pub struct MessageUpdate { #[serde(skip_serializing_if = "Option::is_none")] pub metadata: Option, } // ────────────────────────────────────────── // Conclusion // ────────────────────────────────────────── #[derive(Debug, Clone, Deserialize)] pub struct Conclusion { pub id: String, pub content: String, pub observer_id: String, pub observed_id: String, pub session_id: Option, pub created_at: String, } #[derive(Debug, Clone, Serialize)] pub struct ConclusionCreate { /// 1–65535 characters pub content: String, pub observer_id: String, pub observed_id: String, #[serde(skip_serializing_if = "Option::is_none")] pub session_id: Option, } #[derive(Debug, Clone, Serialize)] pub struct ConclusionBatchCreate { /// 1–100 conclusions pub conclusions: Vec, } #[derive(Debug, Clone, Serialize, Default)] pub struct ConclusionGet { #[serde(skip_serializing_if = "Option::is_none")] pub filters: Option, } #[derive(Debug, Clone, Serialize)] pub struct ConclusionQuery { pub query: String, #[serde(skip_serializing_if = "Option::is_none")] pub top_k: Option, /// 0.0–1.0 #[serde(skip_serializing_if = "Option::is_none")] pub distance: Option, #[serde(skip_serializing_if = "Option::is_none")] pub filters: Option, } // ────────────────────────────────────────── // Dialectic / Peer context // ────────────────────────────────────────── #[derive(Debug, Clone, Serialize)] pub struct DialecticOptions { /// Natural language query pub query: String, #[serde(skip_serializing_if = "Option::is_none")] pub session_id: Option, /// peer_id to get the representation for (defaults to the caller) #[serde(skip_serializing_if = "Option::is_none")] pub target: Option, #[serde(skip_serializing_if = "Option::is_none")] pub stream: Option, /// minimal | low | medium | high | max #[serde(skip_serializing_if = "Option::is_none")] pub reasoning_level: Option, } #[derive(Debug, Clone, Serialize, Default)] pub struct PeerRepresentationGet { #[serde(skip_serializing_if = "Option::is_none")] pub session_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub target: Option, #[serde(skip_serializing_if = "Option::is_none")] pub search_query: Option, /// 1–100 #[serde(skip_serializing_if = "Option::is_none")] pub search_top_k: Option, /// 0.0–1.0 #[serde(skip_serializing_if = "Option::is_none")] pub search_max_distance: Option, #[serde(skip_serializing_if = "Option::is_none")] pub include_most_frequent: Option, /// 1–100 #[serde(skip_serializing_if = "Option::is_none")] pub max_conclusions: Option, } // ────────────────────────────────────────── // Search // ────────────────────────────────────────── #[derive(Debug, Clone, Serialize)] pub struct MessageSearchOptions { pub query: String, #[serde(skip_serializing_if = "Option::is_none")] pub filters: Option, #[serde(skip_serializing_if = "Option::is_none")] pub limit: Option, } // ────────────────────────────────────────── // Queue // ────────────────────────────────────────── #[derive(Debug, Clone, Deserialize)] pub struct QueueStatus { pub total_work_units: u64, pub completed_work_units: u64, pub in_progress_work_units: u64, pub pending_work_units: u64, pub sessions: Option, } // ────────────────────────────────────────── // List query params (pagination) // ────────────────────────────────────────── #[derive(Debug, Clone, Default)] pub struct PageParams { pub page: Option, pub size: Option, pub reverse: Option, }