Skip to main content

envoy/atheneum_bridge/
types.rs

1use serde::{Deserialize, Serialize};
2
3use crate::atheneum_bridge::utils::{
4    default_event_limit, default_search_k, default_tool, default_trigger,
5};
6
7// Request/Response Types
8// ============================================================================
9
10#[derive(Debug, Deserialize)]
11pub struct StoreDiscoveryRequest {
12    pub agent: String,
13    pub discovery_type: String,
14    pub target: String,
15    #[serde(default)]
16    pub project_id: Option<String>,
17    pub metadata: serde_json::Value,
18}
19
20#[derive(Debug, Serialize)]
21pub struct StoreDiscoveryResponse {
22    pub discovery_id: i64,
23    pub agent: String,
24    pub target: String,
25    pub discovery_type: String,
26}
27
28#[derive(Debug, Deserialize)]
29pub struct DiscoveriesQuery {
30    pub target: String,
31    #[serde(default)]
32    pub project: Option<String>,
33}
34
35#[derive(Debug, Serialize)]
36pub struct DiscoveriesResponse {
37    pub target: String,
38    pub discovery_count: usize,
39    pub discoveries: Vec<DiscoveryData>,
40}
41
42#[derive(Debug, Serialize)]
43pub struct DiscoveryData {
44    pub id: i64,
45    pub name: String,
46    pub data: serde_json::Value,
47}
48
49#[derive(Debug, Deserialize)]
50pub struct StoreHandoffRequest {
51    pub from_agent: String,
52    pub to_agent: String,
53    #[serde(default)]
54    pub project_id: Option<String>,
55    pub manifest: serde_json::Value,
56}
57
58#[derive(Debug, Serialize)]
59pub struct StoreHandoffResponse {
60    pub handoff_id: i64,
61    pub from_agent: String,
62    pub to_agent: String,
63    pub created_at: String,
64}
65
66#[derive(Debug, Deserialize)]
67pub struct PendingHandoffQuery {
68    pub agent: String,
69    #[serde(default)]
70    pub project: Option<String>,
71}
72
73#[derive(Debug, Serialize)]
74pub struct PendingHandoffResponse {
75    pub handoff: Option<HandoffData>,
76}
77
78#[derive(Debug, Serialize)]
79pub struct HandoffData {
80    pub id: i64,
81    pub name: String,
82    pub from_agent: String,
83    pub to_agent: String,
84    pub manifest: serde_json::Value,
85    pub created_at: String,
86}
87
88#[derive(Debug, Serialize)]
89pub struct ClaimHandoffResponse {
90    pub claimed: bool,
91    pub handoff_id: i64,
92}
93
94#[derive(Debug, Deserialize)]
95pub struct KnowledgeQuery {
96    pub target: String,
97    #[serde(default)]
98    pub project: Option<String>,
99}
100
101#[derive(Debug, Deserialize)]
102pub struct ProjectContextQuery {
103    pub project: String,
104    #[serde(default = "default_context_limit")]
105    pub limit: i64,
106}
107
108fn default_context_limit() -> i64 {
109    8
110}
111
112#[derive(Debug, Serialize)]
113pub struct ProjectContextItem {
114    pub discovery_type: String,
115    pub target: String,
116    pub why: String,
117    pub agent: String,
118}
119
120#[derive(Debug, Serialize)]
121pub struct ProjectContextResponse {
122    pub project: String,
123    pub items: Vec<ProjectContextItem>,
124}
125
126#[derive(Debug, Deserialize)]
127pub struct SearchQuery {
128    pub q: String,
129    #[serde(default = "default_search_k")]
130    pub k: usize,
131    #[serde(default)]
132    pub project: Option<String>,
133}
134
135// fn default_search_k — moved to utils.rs, imported via `use crate::atheneum_bridge::utils::default_search_k` above
136// Keep this comment to prevent accidental re-addition.
137
138#[derive(Debug, Serialize)]
139pub struct SearchResponse {
140    pub query: String,
141    pub project: Option<String>,
142    pub count: usize,
143    pub results: Vec<SearchResultItem>,
144}
145
146#[derive(Debug, Serialize)]
147pub struct SearchResultItem {
148    pub id: i64,
149    pub name: String,
150    pub kind: String,
151    pub score: f32,
152    pub data: serde_json::Value,
153}
154
155#[derive(Debug, Serialize)]
156pub struct KnowledgeResponse {
157    pub target: String,
158    pub queried_at: String,
159    pub total_entities: i64,
160    pub discovery_count: usize,
161    pub discoveries: Vec<DiscoveryData>,
162    pub handoff_count: usize,
163    pub handoffs: Vec<HandoffData>,
164    pub token_savings: TokenSavings,
165}
166
167#[derive(Debug, Serialize)]
168pub struct TokenSavings {
169    pub unique_agents: i64,
170    pub estimated_file_tokens: i64,
171    pub without_sharing: i64,
172    pub with_sharing: i64,
173    pub saved: i64,
174    pub percentage_reduction: f64,
175}
176
177#[derive(Debug, Deserialize)]
178pub struct ImportMagellanSymbolRequest {
179    pub magellan_db_path: String,
180    pub symbol_name: String,
181    pub agent_name: String,
182    #[serde(default)]
183    pub project_id: Option<String>,
184}
185
186#[derive(Debug, Deserialize)]
187pub struct ImportMagellanBulkRequest {
188    pub magellan_db_path: String,
189    pub agent_name: String,
190    #[serde(default)]
191    pub project_id: Option<String>,
192    #[serde(default)]
193    pub limit: Option<usize>,
194}
195
196#[derive(Debug, Serialize)]
197pub struct ImportMagellanSymbolResponse {
198    pub found: bool,
199    #[serde(skip_serializing_if = "Option::is_none")]
200    pub discovery_id: Option<i64>,
201}
202
203#[derive(Debug, Serialize)]
204pub struct ImportMagellanBulkResponse {
205    pub imported_count: i64,
206}
207
208// ============================================================================
209// HTTP Handlers
210// ============================================================================
211
212#[derive(Debug, Deserialize)]
213pub struct CreateTaskRequest {
214    pub title: String,
215    #[serde(default)]
216    pub description: Option<String>,
217    #[serde(default)]
218    pub project_id: Option<String>,
219}
220
221#[derive(Debug, Serialize)]
222pub struct TaskCreatedResponse {
223    pub task_id: i64,
224    pub status: String,
225}
226
227#[derive(Debug, Deserialize)]
228pub struct ListTasksQuery {
229    #[serde(default)]
230    pub project: Option<String>,
231    #[serde(default)]
232    pub status: Option<String>,
233}
234
235#[derive(Debug, Serialize)]
236pub struct ListTasksResponse {
237    pub tasks: Vec<serde_json::Value>,
238}
239
240#[derive(Debug, Deserialize)]
241pub struct UpdateTaskStatusRequest {
242    pub status: String,
243}
244
245#[derive(Debug, Serialize)]
246pub struct TaskDetailResponse {
247    pub task: serde_json::Value,
248    pub requirements: Vec<serde_json::Value>,
249    pub blockers: Vec<serde_json::Value>,
250}
251
252#[derive(Debug, Deserialize)]
253pub struct CreateRequirementRequest {
254    pub statement: String,
255    #[serde(default)]
256    pub verification_method: Option<String>,
257}
258
259#[derive(Debug, Deserialize)]
260pub struct CreateBlockerRequest {
261    pub description: String,
262    pub blocker_type: String,
263}
264
265#[derive(Debug, Deserialize)]
266pub struct IngestJournalRequest {
267    pub path: String,
268    pub content: String,
269    #[serde(default)]
270    pub project_id: Option<String>,
271}
272
273#[derive(Debug, Serialize)]
274pub struct IngestJournalResponse {
275    pub section_ids: Vec<i64>,
276    pub applied_kanban_updates: Vec<serde_json::Value>,
277}
278
279#[derive(Debug, Deserialize)]
280pub struct ToolCallInput {
281    pub tool_name: String,
282    pub args: serde_json::Value,
283    #[serde(default)]
284    pub modified_targets: Vec<i64>,
285}
286
287#[derive(Debug, Deserialize)]
288pub struct CreateActionRequest {
289    pub agent: String,
290    pub thought: String,
291    #[serde(default)]
292    pub project_id: Option<String>,
293    #[serde(default)]
294    pub tool_calls: Vec<ToolCallInput>,
295}
296
297#[derive(Debug, Serialize)]
298pub struct ActionTraceResponse {
299    pub agent_id: i64,
300    pub reasoning_log_id: i64,
301    pub tool_call_ids: Vec<i64>,
302    pub modified_edge_ids: Vec<i64>,
303}
304
305#[derive(Debug, Deserialize)]
306pub struct GetActionsQuery {
307    pub agent: String,
308    #[serde(default)]
309    pub project: Option<String>,
310}
311
312#[derive(Debug, Serialize)]
313pub struct GetActionsResponse {
314    pub actions: Vec<serde_json::Value>,
315}
316
317#[derive(Debug, Deserialize)]
318pub struct CreateClassRequest {
319    pub name: String,
320    #[serde(default)]
321    pub description: Option<String>,
322}
323
324#[derive(Debug, Serialize)]
325pub struct ClassCreatedResponse {
326    pub class_id: i64,
327}
328
329#[derive(Debug, Serialize)]
330pub struct ListClassesResponse {
331    pub classes: Vec<serde_json::Value>,
332}
333
334#[derive(Debug, Deserialize)]
335pub struct CreatePropertyRequest {
336    pub name: String,
337    pub domain_class: String,
338    pub range_class: String,
339    #[serde(default)]
340    pub description: Option<String>,
341}
342
343#[derive(Debug, Serialize)]
344pub struct PropertyCreatedResponse {
345    pub property_id: i64,
346}
347
348#[derive(Debug, Serialize)]
349pub struct ListPropertiesResponse {
350    pub properties: Vec<serde_json::Value>,
351}
352
353#[derive(Debug, Deserialize)]
354pub struct ValidateEdgeQuery {
355    pub from: String,
356    pub to: String,
357    pub edge: String,
358}
359
360#[derive(Debug, Serialize)]
361pub struct ValidateEdgeResponse {
362    pub allowed: bool,
363}
364
365#[derive(Debug, Serialize)]
366pub struct SeedResponse {
367    pub seeded: i64,
368}
369
370#[derive(Debug, Deserialize)]
371pub struct RecordSessionRequest {
372    pub session_id: String,
373    pub agent: String,
374    pub project: String,
375    #[serde(default = "default_tool")]
376    pub tool: String,
377    #[serde(default = "default_trigger")]
378    pub trigger: String,
379    pub model: Option<String>,
380    pub git_branch: Option<String>,
381    pub git_head: Option<String>,
382    pub parent_session_id: Option<String>,
383}
384
385// default_search_k, default_tool, default_trigger, default_event_limit moved to utils.rs
386
387#[derive(Debug, Serialize)]
388pub struct RecordSessionResponse {
389    pub session_id: String,
390    pub recorded: bool,
391}
392
393#[derive(Debug, Deserialize)]
394pub struct QuerySessionsQuery {
395    #[serde(default)]
396    pub project: Option<String>,
397    #[serde(default = "default_sessions_last")]
398    pub last: i64,
399    pub parent_id: Option<String>,
400}
401
402fn default_sessions_last() -> i64 {
403    5
404}
405
406#[derive(Debug, Deserialize)]
407pub struct SubagentHandoverRequest {
408    pub summary: String,
409    #[serde(default)]
410    pub files_changed: Vec<String>,
411    #[serde(default = "default_outcome")]
412    pub outcome: String,
413}
414
415fn default_outcome() -> String {
416    "complete".to_string()
417}
418
419#[derive(Debug, Deserialize)]
420pub struct EndSessionRequest {
421    pub exit_status: String,
422    #[serde(default)]
423    pub prompt_count: u32,
424    #[serde(default)]
425    pub tool_call_count: u32,
426    #[serde(default)]
427    pub file_write_count: u32,
428    #[serde(default)]
429    pub commit_count: u32,
430    #[serde(default)]
431    pub test_run_count: u32,
432    #[serde(default)]
433    pub total_input_tokens: u64,
434    #[serde(default)]
435    pub total_output_tokens: u64,
436    #[serde(default)]
437    pub total_cost_usd: f64,
438}
439
440#[derive(Debug, Deserialize)]
441pub struct RecordPromptRequest {
442    pub session_id: String,
443    pub role: String,
444    #[serde(default)]
445    pub sequence: u32,
446    pub input_hash: String,
447    pub input_tokens: Option<u64>,
448    pub output_hash: Option<String>,
449    pub output_tokens: Option<u64>,
450    pub latency_ms: Option<u64>,
451    pub model: Option<String>,
452    pub cost_usd: Option<f64>,
453}
454
455#[derive(Debug, Deserialize)]
456pub struct RecordToolCallRequest {
457    pub session_id: String,
458    pub tool_name: String,
459    pub tool_version: Option<String>,
460    pub input_hash: Option<String>,
461    pub input_summary: Option<String>,
462    pub output_hash: Option<String>,
463    pub output_summary: Option<String>,
464    pub exit_status: String,
465    #[serde(default)]
466    pub latency_ms: u64,
467    pub input_tokens_est: Option<u64>,
468    #[serde(default)]
469    pub tool_category: String,
470}
471
472#[derive(Debug, Deserialize)]
473pub struct RecordFileWriteRequest {
474    pub session_id: String,
475    pub file_path: String,
476    pub file_id: Option<String>,
477    pub before_hash: Option<String>,
478    pub after_hash: Option<String>,
479    #[serde(default)]
480    pub lines_added: u32,
481    #[serde(default)]
482    pub lines_deleted: u32,
483    #[serde(default)]
484    pub lines_changed: u32,
485    #[serde(default)]
486    pub write_type: String,
487}
488
489#[derive(Debug, Deserialize)]
490pub struct RecordCommitRequest {
491    pub session_id: String,
492    pub commit_sha: String,
493    pub parent_sha: Option<String>,
494    pub message: String,
495    pub author: String,
496    #[serde(default)]
497    pub files_changed: u32,
498    #[serde(default)]
499    pub lines_inserted: u32,
500    #[serde(default)]
501    pub lines_deleted: u32,
502    pub commit_type: String,
503    pub feature_tag: Option<String>,
504}
505
506#[derive(Debug, Deserialize)]
507pub struct RecordTestRunRequest {
508    pub session_id: String,
509    pub test_name: String,
510    pub test_suite: Option<String>,
511    pub test_command: Option<String>,
512    pub result: String,
513    #[serde(default)]
514    pub duration_ms: u64,
515    pub logs_summary: Option<String>,
516    pub commit_sha: Option<String>,
517}
518
519#[derive(Debug, Deserialize)]
520pub struct RecordFixChainRequest {
521    pub session_id: String,
522    pub bug_commit_sha: String,
523    pub fix_commit_sha: String,
524    pub fix_type: String,
525    pub severity: String,
526    #[serde(default)]
527    pub cycles_to_fix: u32,
528    #[serde(default)]
529    pub time_to_fix_ms: u64,
530}
531
532#[derive(Debug, Deserialize)]
533pub struct RecordBenchRunRequest {
534    pub session_id: String,
535    pub bench_name: String,
536    pub mean_ns: Option<i64>,
537    pub median_ns: Option<i64>,
538    pub p95_ns: Option<i64>,
539    #[serde(default)]
540    pub is_regression: bool,
541}
542
543#[derive(Debug, Deserialize)]
544pub struct QueryEventsQuery {
545    pub session_id: Option<String>,
546    pub event_type: Option<String>,
547    #[serde(default = "default_event_limit")]
548    pub limit: usize,
549}
550
551// default_search_k, default_tool, default_trigger, default_event_limit moved to utils.rs
552
553#[derive(Debug, Deserialize)]
554pub struct RecordEventRequest {
555    pub session_id: String,
556    pub event_type: String,
557    pub entity_id: String,
558    pub payload: serde_json::Value,
559}
560
561#[derive(Debug, Serialize)]
562pub struct QueryEventsResponse {
563    pub events: Vec<serde_json::Value>,
564}
565
566// ============================================================================
567// Graph Navigation Types
568// ============================================================================
569
570#[derive(Debug, Serialize)]
571pub struct GraphEntityResponse {
572    pub id: i64,
573    pub kind: String,
574    pub name: String,
575    pub file_path: Option<String>,
576    pub data: serde_json::Value,
577}
578
579#[derive(Debug, Serialize)]
580pub struct GraphEdgeResponse {
581    pub id: i64,
582    pub from_id: i64,
583    pub to_id: i64,
584    pub edge_type: String,
585    pub data: serde_json::Value,
586}
587
588#[derive(Debug, Serialize)]
589pub struct NeighborsResponse {
590    pub entity_id: i64,
591    pub outgoing: Vec<GraphEdgeResponse>,
592    pub incoming: Vec<GraphEdgeResponse>,
593}
594
595#[derive(Debug, Serialize)]
596pub struct SubgraphViewResponse {
597    pub entry: GraphEntityResponse,
598    pub depth: u32,
599    pub entities: Vec<GraphEntityResponse>,
600    pub edges: Vec<GraphEdgeResponse>,
601}
602
603#[derive(Debug, Serialize)]
604pub struct NavigateResponse {
605    pub query: String,
606    pub subgraphs: Vec<SubgraphViewResponse>,
607}
608
609#[derive(Debug, Serialize)]
610pub struct GraphStatsResponse {
611    pub total_entities: i64,
612    pub total_edges: i64,
613    pub entity_counts: Vec<(String, i64)>,
614    pub edge_counts: Vec<(String, i64)>,
615}
616
617#[derive(Debug, Deserialize)]
618pub struct NavigateQuery {
619    pub q: String,
620    #[serde(default = "default_search_k")]
621    pub k: usize,
622    #[serde(default = "default_navigate_depth")]
623    pub depth: u32,
624    #[serde(default)]
625    pub project: Option<String>,
626}
627
628#[derive(Debug, Deserialize)]
629pub struct CrossSearchQuery {
630    pub q: String,
631    #[serde(default = "default_search_k")]
632    pub k: usize,
633    #[serde(default)]
634    pub language: Option<String>,
635}
636
637#[derive(Debug, Serialize)]
638pub struct CrossSearchResponse {
639    pub query: String,
640    pub language: Option<String>,
641    pub count: usize,
642    pub results: Vec<CrossSearchResultItem>,
643}
644
645#[derive(Debug, Serialize)]
646pub struct CrossSearchResultItem {
647    pub project: String,
648    pub id: i64,
649    pub kind: String,
650    pub name: String,
651    #[serde(skip_serializing_if = "Option::is_none")]
652    pub file_path: Option<String>,
653    pub data: serde_json::Value,
654}
655
656#[derive(Debug, Deserialize)]
657pub struct CrossNavigateQuery {
658    pub q: String,
659    #[serde(default = "default_search_k")]
660    pub k: usize,
661    #[serde(default = "default_navigate_depth")]
662    pub depth: u32,
663    #[serde(default)]
664    pub language: Option<String>,
665}
666
667#[derive(Debug, Serialize)]
668pub struct CrossNavigateResponse {
669    pub query: String,
670    pub language: Option<String>,
671    pub count: usize,
672    pub views: Vec<CrossSubgraphView>,
673}
674
675#[derive(Debug, Serialize)]
676pub struct CrossSubgraphView {
677    pub project: String,
678    pub entry_id: i64,
679    pub entities: Vec<CrossSearchResultItem>,
680    pub edges: Vec<CrossEdgeItem>,
681}
682
683#[derive(Debug, Serialize)]
684pub struct CrossEdgeItem {
685    pub id: i64,
686    pub kind: String,
687    pub from_id: i64,
688    pub to_id: i64,
689    pub data: serde_json::Value,
690}
691
692#[derive(Debug, Deserialize)]
693pub struct NeighborsQuery {
694    pub depth: Option<u32>,
695}
696
697fn default_navigate_depth() -> u32 {
698    2
699}