algocline_app/service/
status.rs1use algocline_engine::PendingFilter;
2
3use super::AppService;
4
5impl AppService {
6 pub async fn status(
23 &self,
24 session_id: Option<&str>,
25 pending_filter: Option<serde_json::Value>,
26 include_history: bool,
27 ) -> Result<String, String> {
28 let filter = self.resolve_pending_filter(pending_filter)?;
29 let snapshots = self
30 .registry
31 .list_snapshots(filter.as_ref(), include_history)
32 .await;
33
34 if let Some(sid) = session_id {
36 return match snapshots.get(sid) {
37 Some(snapshot) => {
38 let mut result = snapshot.clone();
39 if let Ok(strategies) = self.session_strategies.lock() {
41 if let Some(name) = strategies.get(sid) {
42 result["strategy"] = serde_json::json!(name);
43 }
44 }
45 result["session_id"] = serde_json::json!(sid);
46 serde_json::to_string_pretty(&result).map_err(|e| e.to_string())
47 }
48 None => Err(format!("session '{sid}' not found (may have completed)")),
49 };
50 }
51
52 if snapshots.is_empty() {
54 return Ok(serde_json::json!({
55 "active_sessions": 0,
56 "sessions": [],
57 })
58 .to_string());
59 }
60
61 let strategies = self.session_strategies.lock().ok();
62 let sessions: Vec<serde_json::Value> = snapshots
63 .into_iter()
64 .map(|(id, mut snapshot)| {
65 if let Some(ref strats) = strategies {
66 if let Some(name) = strats.get(&id) {
67 snapshot["strategy"] = serde_json::json!(name);
68 }
69 }
70 snapshot["session_id"] = serde_json::json!(id);
71 snapshot
72 })
73 .collect();
74
75 let result = serde_json::json!({
76 "active_sessions": sessions.len(),
77 "sessions": sessions,
78 });
79
80 serde_json::to_string_pretty(&result).map_err(|e| e.to_string())
81 }
82
83 fn resolve_pending_filter(
88 &self,
89 raw: Option<serde_json::Value>,
90 ) -> Result<Option<PendingFilter>, String> {
91 let Some(value) = raw else {
92 return Ok(None);
93 };
94 match value {
95 serde_json::Value::String(name) => PendingFilter::from_preset_with(
96 &name,
97 self.log_config.prompt_preview_chars,
98 )
99 .map(Some)
100 .ok_or_else(|| {
101 format!(
102 "unknown pending_filter preset '{name}' (valid: \"meta\" | \"preview\" | \"full\")"
103 )
104 }),
105 serde_json::Value::Object(_) => serde_json::from_value::<PendingFilter>(value)
106 .map(Some)
107 .map_err(|e| format!("invalid pending_filter object: {e}")),
108 other => Err(format!(
109 "pending_filter must be a preset name (string) or filter object, got {}",
110 match other {
111 serde_json::Value::Null => "null",
112 serde_json::Value::Bool(_) => "bool",
113 serde_json::Value::Number(_) => "number",
114 serde_json::Value::Array(_) => "array",
115 _ => "unknown",
116 }
117 )),
118 }
119 }
120}