Skip to main content

agent_trace/llm/
backend.rs

1use super::trace_insights::TraceDocument;
2
3/// Backend trait for trace insight operations (summarize, synthesize, session recap).
4pub trait TraceInsightsBackend: Send + Sync {
5    fn summarize_change(&self, path: &str, doc_type: &str, diff: &str) -> Result<String, String>;
6
7    fn synthesize_context(
8        &self,
9        documents: &[TraceDocument],
10        updates: &[String],
11    ) -> Result<String, String>;
12
13    fn summarize_session(&self, session_id: &str, events: &[String]) -> Result<String, String>;
14
15    fn summarize_event_history(&self, events: &str) -> Result<String, String>;
16
17    fn update_running_summary(
18        &self,
19        previous_summary: &str,
20        new_events: &str,
21        plan_snippet: &str,
22    ) -> Result<String, String>;
23}
24
25/// Stub backend that always fails — triggers template fallback in callers.
26pub struct NoTraceBackend;
27
28impl TraceInsightsBackend for NoTraceBackend {
29    fn summarize_change(
30        &self,
31        _path: &str,
32        _doc_type: &str,
33        _diff: &str,
34    ) -> Result<String, String> {
35        Err("no trace insights backend available".into())
36    }
37
38    fn synthesize_context(
39        &self,
40        _documents: &[TraceDocument],
41        _updates: &[String],
42    ) -> Result<String, String> {
43        Err("no trace insights backend available".into())
44    }
45
46    fn summarize_session(&self, _session_id: &str, _events: &[String]) -> Result<String, String> {
47        Err("no trace insights backend available".into())
48    }
49
50    fn summarize_event_history(&self, _events: &str) -> Result<String, String> {
51        Err("no trace insights backend available".into())
52    }
53
54    fn update_running_summary(
55        &self,
56        _previous_summary: &str,
57        _new_events: &str,
58        _plan_snippet: &str,
59    ) -> Result<String, String> {
60        Err("no trace insights backend available".into())
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67
68    #[test]
69    fn no_trace_backend_returns_err() {
70        let b = NoTraceBackend;
71        assert!(b.summarize_change("a.md", "plan", "+1").is_err());
72        assert!(b.update_running_summary("", "", "").is_err());
73    }
74}