From dcc40c96bbd505e02558f0026b40c4ab7022691c Mon Sep 17 00:00:00 2001 From: Lionel Date: Wed, 20 May 2026 15:29:19 +0200 Subject: [PATCH] fix(memory): accept time_window_days alias in QueryGlobalRequest The consolidated memory_tree tool schema advertises `time_window_days` (consistent with query_source/query_topic), but QueryGlobalRequest only accepted `window_days`. LLMs following the consolidated schema fail with "missing field window_days" even when a lookback value was supplied as time_window_days. Add #[serde(alias = "time_window_days")] so both field names deserialize correctly. Adds a unit test pinning both paths. Closes #2252 Co-Authored-By: Claude Opus 4.6 (1M context) --- src/openhuman/memory/tree/retrieval/rpc.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/openhuman/memory/tree/retrieval/rpc.rs b/src/openhuman/memory/tree/retrieval/rpc.rs index 31b4dd587a..370f46c8d9 100644 --- a/src/openhuman/memory/tree/retrieval/rpc.rs +++ b/src/openhuman/memory/tree/retrieval/rpc.rs @@ -82,8 +82,14 @@ pub async fn query_source_rpc( // ── query_global ────────────────────────────────────────────────────── /// Request body for `memory_tree_query_global`. +/// +/// The consolidated `memory_tree` tool schema advertises `time_window_days` +/// (consistent with `query_source` / `query_topic`), while the standalone +/// tool uses `window_days`. Accept both via serde alias so callers using +/// either field name succeed. #[derive(Clone, Debug, Serialize, Deserialize)] pub struct QueryGlobalRequest { + #[serde(alias = "time_window_days")] pub window_days: u32, } @@ -421,6 +427,19 @@ mod tests { ); } + #[test] + fn query_global_request_accepts_time_window_days_alias() { + // The consolidated memory_tree tool schema uses "time_window_days" + // while the standalone tool uses "window_days". Both must deserialize. + let from_window_days: QueryGlobalRequest = + serde_json::from_str(r#"{"window_days": 14}"#).unwrap(); + assert_eq!(from_window_days.window_days, 14); + + let from_alias: QueryGlobalRequest = + serde_json::from_str(r#"{"time_window_days": 30}"#).unwrap(); + assert_eq!(from_alias.window_days, 30); + } + // ── query_topic_rpc ─────────────────────────────────────────────── #[tokio::test]