Skip to main content

locus_mcp/tools/
create_monthly_rollup.rs

1use 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}