use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Serialize, Deserialize)]
pub struct StoreMemoryRequest {
pub content: String,
#[serde(default)]
pub memory_type: Option<String>,
#[serde(default, alias = "domain")]
pub space: Option<String>,
#[serde(default)]
pub source_agent: Option<String>,
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub confidence: Option<f32>,
#[serde(default)]
pub supersedes: Option<String>,
#[serde(default)]
pub entity: Option<String>,
#[serde(default)]
pub entity_id: Option<String>,
#[serde(default)]
pub structured_fields: Option<serde_json::Value>,
#[serde(default)]
pub retrieval_cue: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SearchMemoryRequest {
pub query: String,
#[serde(default = "default_limit")]
pub limit: usize,
#[serde(default)]
pub memory_type: Option<String>,
#[serde(default, alias = "domain")]
pub space: Option<String>,
#[serde(default)]
pub source_agent: Option<String>,
#[serde(default)]
pub rerank: bool,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ListMemoriesRequest {
#[serde(default)]
pub memory_type: Option<String>,
#[serde(default, alias = "domain")]
pub space: Option<String>,
#[serde(default = "default_list_limit")]
pub limit: usize,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub confirmed: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ConfirmRequest {
#[serde(default = "default_confirmed")]
pub confirmed: bool,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ReclassifyMemoryRequest {
pub memory_type: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ImportMemoriesRequest {
pub source: String,
pub content: String,
#[serde(default)]
pub label: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SearchRequest {
pub query: String,
#[serde(default = "default_limit")]
pub limit: usize,
pub source_filter: Option<String>,
#[serde(default, alias = "domain")]
pub space: Option<String>,
}
#[doc(hidden)]
#[derive(Debug, Serialize, Deserialize)]
pub struct ContextRequest {
pub current_file: String,
pub cursor_prefix: String,
#[serde(default = "default_limit")]
pub limit: usize,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ChatContextRequest {
#[serde(default)]
pub query: Option<String>,
#[serde(default)]
pub conversation_id: Option<String>,
#[serde(default = "default_max_chunks")]
pub max_chunks: usize,
#[serde(default)]
pub relevance_threshold: Option<f64>,
#[deprecated(
since = "0.3.2",
note = "Goal taxonomy folded into Identity by migration 45 (Phase 0). \
Daemon ignores this field. Will be removed in 0.4."
)]
#[serde(default = "default_true")]
pub include_goals: bool,
#[serde(default, alias = "domain")]
pub space: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CreateEntityRequest {
pub name: String,
pub entity_type: String,
#[serde(default, alias = "domain")]
pub space: Option<String>,
#[serde(default)]
pub source_agent: Option<String>,
#[serde(default)]
pub confidence: Option<f32>,
}
#[doc(hidden)]
#[derive(Debug, Serialize, Deserialize)]
pub struct CreateRelationRequest {
pub from_entity: String,
pub to_entity: String,
pub relation_type: String,
#[serde(default)]
pub source_agent: Option<String>,
#[serde(default)]
pub confidence: Option<f64>,
#[serde(default)]
pub explanation: Option<String>,
#[serde(default)]
pub source_memory_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct AddObservationRequest {
pub entity_id: String,
pub content: String,
#[serde(default)]
pub source_agent: Option<String>,
#[serde(default)]
pub confidence: Option<f32>,
}
#[doc(hidden)]
#[derive(Debug, Serialize, Deserialize)]
pub struct LinkEntityRequest {
pub source_id: String,
pub entity_id: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ListEntitiesRequest {
#[serde(default)]
pub entity_type: Option<String>,
#[serde(default, alias = "domain")]
pub space: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SearchEntitiesRequest {
pub query: String,
#[serde(default = "default_entity_search_limit")]
pub limit: usize,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UpdateProfileRequest {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub display_name: Option<String>,
#[serde(default)]
pub email: Option<String>,
#[serde(default)]
pub bio: Option<String>,
#[serde(default)]
pub avatar_path: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UpdateAgentRequest {
#[serde(default)]
pub agent_type: Option<String>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub enabled: Option<bool>,
#[serde(default)]
pub trust_level: Option<String>,
#[serde(default)]
pub display_name: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CreateSpaceRequest {
pub name: String,
pub description: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UpdateSpaceRequest {
pub new_name: Option<String>,
pub description: Option<String>,
}
#[doc(hidden)]
#[derive(Debug, Serialize, Deserialize)]
pub struct CreateConceptRequest {
pub title: String,
pub content: String,
#[serde(default)]
pub summary: Option<String>,
#[serde(default)]
pub entity_id: Option<String>,
#[serde(default, alias = "domain")]
pub space: Option<String>,
#[serde(default)]
pub source_memory_ids: Vec<String>,
#[serde(default)]
pub creation_kind: Option<String>,
#[serde(default)]
pub workspace: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SearchPagesRequest {
pub query: String,
#[serde(default)]
pub limit: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page_type: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct IngestTextRequest {
pub source: String,
pub source_id: String,
pub title: String,
pub content: String,
pub url: Option<String>,
pub metadata: Option<HashMap<String, String>>,
}
#[doc(hidden)]
#[derive(Debug, Serialize, Deserialize)]
pub struct IngestWebpageRequest {
pub url: String,
pub title: String,
pub content: String,
pub metadata: Option<HashMap<String, String>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct IngestMemoryRequest {
pub source: String,
pub source_id: String,
pub title: String,
pub content: String,
pub url: Option<String>,
pub tags: Option<Vec<String>>,
pub metadata: Option<HashMap<String, String>>,
}
#[doc(hidden)]
#[derive(Debug, Serialize, Deserialize)]
pub struct AddSourceRequest {
pub source_type: String,
pub path: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UpdateConfigRequest {
#[serde(default)]
pub skip_apps: Option<Vec<String>>,
#[serde(default)]
pub skip_title_patterns: Option<Vec<String>>,
#[serde(default)]
pub private_browsing_detection: Option<bool>,
#[serde(default)]
pub setup_completed: Option<bool>,
#[serde(default)]
pub clipboard_enabled: Option<bool>,
#[serde(default)]
pub screen_capture_enabled: Option<bool>,
#[serde(default)]
pub remote_access_enabled: Option<bool>,
#[serde(default)]
pub routine_model: Option<String>,
#[serde(default)]
pub synthesis_model: Option<String>,
#[serde(default)]
pub external_llm_endpoint: Option<String>,
#[serde(default)]
pub external_llm_model: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DeleteByTimeRangeRequest {
pub start: i64,
pub end: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct BulkDeleteItem {
pub source: String,
pub source_id: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct BulkDeleteRequest {
pub items: Vec<BulkDeleteItem>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UpdateChunkRequest {
pub content: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ConfirmEntityRequest {
#[serde(default = "default_confirmed")]
pub confirmed: bool,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct AddEntityObservationRequest {
pub content: String,
#[serde(default)]
pub source_agent: Option<String>,
#[serde(default)]
pub confidence: Option<f32>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UpdateObservationRequest {
pub content: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ConfirmObservationRequest {
#[serde(default = "default_confirmed")]
pub confirmed: bool,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ReorderSpaceRequest {
pub name: String,
pub new_order: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SetDocumentSpaceRequest {
pub space_name: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SetDocumentTagsRequest {
pub tags: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UpdateMemoryRequest {
#[serde(default)]
pub content: Option<String>,
#[serde(default, alias = "domain")]
pub space: Option<String>,
#[serde(default)]
pub confirmed: Option<bool>,
#[serde(default)]
pub memory_type: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SetStabilityRequest {
pub stability: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CorrectMemoryRequest {
pub correction_prompt: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UpdatePageRequest {
pub content: String,
#[serde(default)]
pub source_memory_ids: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct RefreshPageRequest {
pub content: String,
pub source_memory_ids: Vec<String>,
#[serde(default)]
pub summary: Option<String>,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct ExportPagesRequest {
pub vault_path: Option<String>,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct ExportPageRequest {
pub vault_path: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TestLlmRequest {
pub endpoint: String,
pub model: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompt: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TestLlmResponse {
pub response: String,
}
fn default_limit() -> usize {
10
}
fn default_list_limit() -> usize {
100
}
fn default_confirmed() -> bool {
true
}
fn default_max_chunks() -> usize {
5
}
fn default_true() -> bool {
true
}
fn default_entity_search_limit() -> usize {
20
}
#[cfg(test)]
mod search_pages_page_type_test {
use super::*;
#[test]
fn search_pages_request_accepts_page_type() {
let json = r#"{"query":"foo","limit":10,"page_type":"recap"}"#;
let parsed: SearchPagesRequest = serde_json::from_str(json).unwrap();
assert_eq!(parsed.page_type.as_deref(), Some("recap"));
}
#[test]
fn search_pages_request_page_type_optional() {
let json = r#"{"query":"foo","limit":10}"#;
let parsed: SearchPagesRequest = serde_json::from_str(json).unwrap();
assert!(parsed.page_type.is_none());
}
}
#[cfg(test)]
mod list_memories_confirmed_test {
use super::*;
#[test]
fn confirmed_false_serializes_to_json() {
let req = ListMemoriesRequest {
memory_type: None,
space: None,
limit: 20,
confirmed: Some(false),
};
let s = serde_json::to_string(&req).unwrap();
assert!(s.contains("\"confirmed\":false"), "got: {s}");
}
#[test]
fn confirmed_none_skips_serialization() {
let req = ListMemoriesRequest {
memory_type: None,
space: None,
limit: 20,
confirmed: None,
};
let s = serde_json::to_string(&req).unwrap();
assert!(!s.contains("confirmed"), "got: {s}");
}
}