Skip to main content

origin_types/
requests.rs

1// SPDX-License-Identifier: Apache-2.0
2//! API request types for all HTTP endpoints.
3
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7// ===== Memory CRUD =====
8
9#[derive(Debug, Serialize, Deserialize)]
10pub struct StoreMemoryRequest {
11    pub content: String,
12    #[serde(default)]
13    pub memory_type: Option<String>,
14    #[serde(default)]
15    pub domain: Option<String>,
16    #[serde(default)]
17    pub source_agent: Option<String>,
18    #[serde(default)]
19    pub title: Option<String>,
20    #[serde(default)]
21    pub confidence: Option<f32>,
22    #[serde(default)]
23    pub supersedes: Option<String>,
24    /// Entity name for resolution (e.g. "Alice", "PostgreSQL")
25    #[serde(default)]
26    pub entity: Option<String>,
27    /// Direct entity ID (bypasses name resolution)
28    #[serde(default)]
29    pub entity_id: Option<String>,
30    #[serde(default)]
31    pub structured_fields: Option<serde_json::Value>,
32    #[serde(default)]
33    pub retrieval_cue: Option<String>,
34}
35
36#[derive(Debug, Serialize, Deserialize)]
37pub struct SearchMemoryRequest {
38    pub query: String,
39    #[serde(default = "default_limit")]
40    pub limit: usize,
41    #[serde(default)]
42    pub memory_type: Option<String>,
43    #[serde(default)]
44    pub domain: Option<String>,
45    #[serde(default)]
46    pub source_agent: Option<String>,
47}
48
49#[derive(Debug, Serialize, Deserialize)]
50pub struct ListMemoriesRequest {
51    #[serde(default)]
52    pub memory_type: Option<String>,
53    #[serde(default)]
54    pub domain: Option<String>,
55    #[serde(default = "default_list_limit")]
56    pub limit: usize,
57}
58
59#[derive(Debug, Serialize, Deserialize)]
60pub struct ConfirmRequest {
61    #[serde(default = "default_confirmed")]
62    pub confirmed: bool,
63}
64
65#[derive(Debug, Serialize, Deserialize)]
66pub struct ReclassifyMemoryRequest {
67    pub memory_type: String,
68}
69
70#[derive(Debug, Serialize, Deserialize)]
71pub struct ImportMemoriesRequest {
72    pub source: String,
73    pub content: String,
74    #[serde(default)]
75    pub label: Option<String>,
76}
77
78// ===== General search/context =====
79
80#[derive(Debug, Serialize, Deserialize)]
81pub struct SearchRequest {
82    pub query: String,
83    #[serde(default = "default_limit")]
84    pub limit: usize,
85    pub source_filter: Option<String>,
86    #[serde(default)]
87    pub domain: Option<String>,
88}
89
90#[doc(hidden)]
91#[derive(Debug, Serialize, Deserialize)]
92pub struct ContextRequest {
93    pub current_file: String,
94    pub cursor_prefix: String,
95    #[serde(default = "default_limit")]
96    pub limit: usize,
97}
98
99#[derive(Debug, Serialize, Deserialize)]
100pub struct ChatContextRequest {
101    #[serde(default)]
102    pub query: Option<String>,
103    #[serde(default)]
104    pub conversation_id: Option<String>,
105    #[serde(default = "default_max_chunks")]
106    pub max_chunks: usize,
107    #[serde(default)]
108    pub relevance_threshold: Option<f64>,
109    #[serde(default = "default_true")]
110    pub include_goals: bool,
111    #[serde(default)]
112    pub domain: Option<String>,
113}
114
115// ===== Knowledge graph =====
116
117#[derive(Debug, Serialize, Deserialize)]
118pub struct CreateEntityRequest {
119    pub name: String,
120    pub entity_type: String,
121    #[serde(default)]
122    pub domain: Option<String>,
123    #[serde(default)]
124    pub source_agent: Option<String>,
125    #[serde(default)]
126    pub confidence: Option<f32>,
127}
128
129#[doc(hidden)]
130#[derive(Debug, Serialize, Deserialize)]
131pub struct CreateRelationRequest {
132    pub from_entity: String,
133    pub to_entity: String,
134    pub relation_type: String,
135    #[serde(default)]
136    pub source_agent: Option<String>,
137}
138
139#[derive(Debug, Serialize, Deserialize)]
140pub struct AddObservationRequest {
141    pub entity_id: String,
142    pub content: String,
143    #[serde(default)]
144    pub source_agent: Option<String>,
145    #[serde(default)]
146    pub confidence: Option<f32>,
147}
148
149#[doc(hidden)]
150#[derive(Debug, Serialize, Deserialize)]
151pub struct LinkEntityRequest {
152    pub source_id: String,
153    pub entity_id: String,
154}
155
156#[derive(Debug, Serialize, Deserialize)]
157pub struct ListEntitiesRequest {
158    #[serde(default)]
159    pub entity_type: Option<String>,
160    #[serde(default)]
161    pub domain: Option<String>,
162}
163
164#[derive(Debug, Serialize, Deserialize)]
165pub struct SearchEntitiesRequest {
166    pub query: String,
167    #[serde(default = "default_entity_search_limit")]
168    pub limit: usize,
169}
170
171// ===== Profile & Agents =====
172
173#[derive(Debug, Serialize, Deserialize)]
174pub struct UpdateProfileRequest {
175    #[serde(default)]
176    pub name: Option<String>,
177    #[serde(default)]
178    pub display_name: Option<String>,
179    #[serde(default)]
180    pub email: Option<String>,
181    #[serde(default)]
182    pub bio: Option<String>,
183    #[serde(default)]
184    pub avatar_path: Option<String>,
185}
186
187#[derive(Debug, Serialize, Deserialize)]
188pub struct UpdateAgentRequest {
189    #[serde(default)]
190    pub agent_type: Option<String>,
191    #[serde(default)]
192    pub description: Option<String>,
193    #[serde(default)]
194    pub enabled: Option<bool>,
195    #[serde(default)]
196    pub trust_level: Option<String>,
197    /// Empty string clears the field; None leaves it unchanged.
198    #[serde(default)]
199    pub display_name: Option<String>,
200}
201
202// ===== Spaces =====
203
204#[derive(Debug, Serialize, Deserialize)]
205pub struct CreateSpaceRequest {
206    pub name: String,
207    pub description: Option<String>,
208}
209
210#[derive(Debug, Serialize, Deserialize)]
211pub struct UpdateSpaceRequest {
212    pub new_name: Option<String>,
213    pub description: Option<String>,
214}
215
216// ===== Concepts =====
217
218#[doc(hidden)]
219#[derive(Debug, Serialize, Deserialize)]
220pub struct CreateConceptRequest {
221    pub title: String,
222    pub content: String,
223    #[serde(default)]
224    pub summary: Option<String>,
225    #[serde(default)]
226    pub entity_id: Option<String>,
227    #[serde(default)]
228    pub domain: Option<String>,
229    #[serde(default)]
230    pub source_memory_ids: Vec<String>,
231}
232
233#[derive(Debug, Serialize, Deserialize)]
234pub struct SearchConceptsRequest {
235    pub query: String,
236    #[serde(default)]
237    pub limit: Option<usize>,
238}
239
240// ===== Ingest =====
241
242#[derive(Debug, Serialize, Deserialize)]
243pub struct IngestTextRequest {
244    pub source: String,
245    pub source_id: String,
246    pub title: String,
247    pub content: String,
248    pub url: Option<String>,
249    pub metadata: Option<HashMap<String, String>>,
250}
251
252#[doc(hidden)]
253#[derive(Debug, Serialize, Deserialize)]
254pub struct IngestWebpageRequest {
255    pub url: String,
256    pub title: String,
257    pub content: String,
258    pub metadata: Option<HashMap<String, String>>,
259}
260
261#[derive(Debug, Serialize, Deserialize)]
262pub struct IngestMemoryRequest {
263    pub source: String,
264    pub source_id: String,
265    pub title: String,
266    pub content: String,
267    pub url: Option<String>,
268    pub tags: Option<Vec<String>>,
269    pub metadata: Option<HashMap<String, String>>,
270}
271
272// ===== Sources =====
273
274#[doc(hidden)]
275#[derive(Debug, Serialize, Deserialize)]
276pub struct AddSourceRequest {
277    pub source_type: String,
278    /// Filesystem path as a string. Kept as `String` (not `PathBuf`) because
279    /// this is an HTTP wire format — the handler converts it to `PathBuf`.
280    pub path: String,
281}
282
283// ===== Config =====
284
285#[derive(Debug, Serialize, Deserialize)]
286pub struct UpdateConfigRequest {
287    #[serde(default)]
288    pub skip_apps: Option<Vec<String>>,
289    #[serde(default)]
290    pub skip_title_patterns: Option<Vec<String>>,
291    #[serde(default)]
292    pub private_browsing_detection: Option<bool>,
293    #[serde(default)]
294    pub setup_completed: Option<bool>,
295    #[serde(default)]
296    pub clipboard_enabled: Option<bool>,
297    #[serde(default)]
298    pub screen_capture_enabled: Option<bool>,
299    #[serde(default)]
300    pub selection_capture_enabled: Option<bool>,
301    #[serde(default)]
302    pub remote_access_enabled: Option<bool>,
303}
304
305// ===== Chunks / indexed files =====
306
307#[derive(Debug, Serialize, Deserialize)]
308pub struct DeleteByTimeRangeRequest {
309    pub start: i64,
310    pub end: i64,
311}
312
313#[derive(Debug, Serialize, Deserialize)]
314pub struct BulkDeleteItem {
315    pub source: String,
316    pub source_id: String,
317}
318
319#[derive(Debug, Serialize, Deserialize)]
320pub struct BulkDeleteRequest {
321    pub items: Vec<BulkDeleteItem>,
322}
323
324#[derive(Debug, Serialize, Deserialize)]
325pub struct UpdateChunkRequest {
326    pub content: String,
327}
328
329// ===== Entity / Observation CRUD =====
330
331#[derive(Debug, Serialize, Deserialize)]
332pub struct ConfirmEntityRequest {
333    #[serde(default = "default_confirmed")]
334    pub confirmed: bool,
335}
336
337#[derive(Debug, Serialize, Deserialize)]
338pub struct AddEntityObservationRequest {
339    pub content: String,
340    #[serde(default)]
341    pub source_agent: Option<String>,
342    #[serde(default)]
343    pub confidence: Option<f32>,
344}
345
346#[derive(Debug, Serialize, Deserialize)]
347pub struct UpdateObservationRequest {
348    pub content: String,
349}
350
351#[derive(Debug, Serialize, Deserialize)]
352pub struct ConfirmObservationRequest {
353    #[serde(default = "default_confirmed")]
354    pub confirmed: bool,
355}
356
357// ===== Spaces extended =====
358
359#[derive(Debug, Serialize, Deserialize)]
360pub struct ReorderSpaceRequest {
361    pub name: String,
362    pub new_order: i64,
363}
364
365#[derive(Debug, Serialize, Deserialize)]
366pub struct SetDocumentSpaceRequest {
367    pub space_name: String,
368}
369
370// ===== Tags =====
371
372#[derive(Debug, Serialize, Deserialize)]
373pub struct SetDocumentTagsRequest {
374    pub tags: Vec<String>,
375}
376
377// ===== Memory update =====
378
379#[derive(Debug, Serialize, Deserialize)]
380pub struct UpdateMemoryRequest {
381    #[serde(default)]
382    pub content: Option<String>,
383    #[serde(default)]
384    pub domain: Option<String>,
385    #[serde(default)]
386    pub confirmed: Option<bool>,
387    #[serde(default)]
388    pub memory_type: Option<String>,
389}
390
391#[derive(Debug, Serialize, Deserialize)]
392pub struct SetStabilityRequest {
393    pub stability: String,
394}
395
396#[derive(Debug, Serialize, Deserialize)]
397pub struct CorrectMemoryRequest {
398    pub correction_prompt: String,
399}
400
401// ===== Concepts update =====
402
403#[derive(Debug, Serialize, Deserialize)]
404pub struct UpdateConceptRequest {
405    pub content: String,
406}
407
408// ===== Concept Export =====
409
410#[derive(Debug, Deserialize, Serialize)]
411pub struct ExportConceptRequest {
412    pub vault_path: String,
413}
414
415// ===== Default value functions =====
416
417fn default_limit() -> usize {
418    10
419}
420
421fn default_list_limit() -> usize {
422    100
423}
424
425fn default_confirmed() -> bool {
426    true
427}
428
429fn default_max_chunks() -> usize {
430    5
431}
432
433fn default_true() -> bool {
434    true
435}
436
437fn default_entity_search_limit() -> usize {
438    20
439}