locus_mcp/tools/
create_monthly_rollup.rs1use locus_core_rs::MonthlyRollupRequest;
2use serde_json::json;
3
4use crate::{
5 CreateMonthlyRollupRequest, SttpMcpServer, avec_to_json, parse_utc_required, to_json_string,
6 tool_error,
7};
8
9pub(crate) async fn execute(
10 server: &SttpMcpServer,
11 request: CreateMonthlyRollupRequest,
12) -> String {
13 let start_utc = match parse_utc_required(&request.start_date_utc, "start_date_utc") {
14 Ok(value) => value,
15 Err(message) => return tool_error("InvalidDate", &message),
16 };
17 let end_utc = match parse_utc_required(&request.end_date_utc, "end_date_utc") {
18 Ok(value) => value,
19 Err(message) => return tool_error("InvalidDate", &message),
20 };
21
22 let mut rollup_request = MonthlyRollupRequest::new(request.session_id, start_utc, end_utc);
23 rollup_request.source_session_id = request.source_session_id;
24 rollup_request.parent_node_id = request.parent_node_id;
25 rollup_request.persist = request.persist;
26
27 let result = server.monthly_rollup.create_async(rollup_request).await;
28 if !result.success {
29 let message = result
30 .error
31 .as_deref()
32 .unwrap_or("Monthly rollup creation failed.");
33 let code = if message.starts_with("InvalidRange") {
34 "InvalidRange"
35 } else {
36 "MonthlyRollupFailure"
37 };
38
39 return tool_error(code, message);
40 }
41
42 to_json_string(json!({
43 "success": result.success,
44 "node_id": result.node_id,
45 "raw_node": result.raw_node,
46 "error": result.error,
47 "source_nodes": result.source_nodes,
48 "parent_reference": result.parent_reference,
49 "user_average": avec_to_json(result.user_average),
50 "model_average": avec_to_json(result.model_average),
51 "compression_average": avec_to_json(result.compression_average),
52 "rho_range": {
53 "min": result.rho_range.min,
54 "max": result.rho_range.max,
55 "average": result.rho_range.average,
56 },
57 "kappa_range": {
58 "min": result.kappa_range.min,
59 "max": result.kappa_range.max,
60 "average": result.kappa_range.average,
61 },
62 "psi_range": {
63 "min": result.psi_range.min,
64 "max": result.psi_range.max,
65 "average": result.psi_range.average,
66 },
67 "rho_bands": {
68 "low": result.rho_bands.low,
69 "medium": result.rho_bands.medium,
70 "high": result.rho_bands.high,
71 },
72 "kappa_bands": {
73 "low": result.kappa_bands.low,
74 "medium": result.kappa_bands.medium,
75 "high": result.kappa_bands.high,
76 },
77 }))
78}