From 22d0d192eb5bbcb4932866691885c9b93de32887 Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Thu, 18 Jun 2026 23:39:38 -0500 Subject: [PATCH] fix: make windows release build and add manual rerun path --- .github/workflows/release.yml | 4 +- .../src/advanced/merge_supersede.rs | 5 +- crates/vestige-core/src/config.rs | 20 +- .../vestige-mcp/src/tools/codebase_unified.rs | 92 +++++- crates/vestige-mcp/src/tools/maintenance.rs | 3 +- crates/vestige-mcp/src/tools/merge.rs | 29 +- .../vestige-mcp/src/tools/search_unified.rs | 279 +++++++++++++++--- .../vestige-mcp/src/tools/session_context.rs | 51 +++- crates/vestige-mcp/src/tools/timeline.rs | 8 +- 9 files changed, 396 insertions(+), 95 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 793ce48..d789b12 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,7 +31,7 @@ jobs: - target: x86_64-pc-windows-msvc os: windows-latest archive: zip - cargo_flags: "" + cargo_flags: "--no-default-features --features embeddings,ort-download" needs_onnxruntime: false # Intel Mac uses the ort-dynamic feature to runtime-link against a # system libonnxruntime (Homebrew), sidestepping the missing @@ -51,7 +51,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 with: - ref: ${{ github.event.inputs.tag || github.ref }} + ref: ${{ github.event_name == 'workflow_dispatch' && github.sha || github.event.inputs.tag || github.ref }} - name: Setup pnpm uses: pnpm/action-setup@v4 diff --git a/crates/vestige-core/src/advanced/merge_supersede.rs b/crates/vestige-core/src/advanced/merge_supersede.rs index c10485a..cf206b4 100644 --- a/crates/vestige-core/src/advanced/merge_supersede.rs +++ b/crates/vestige-core/src/advanced/merge_supersede.rs @@ -401,7 +401,10 @@ mod tests { "totally unrelated subject beta", ); assert!(s.combined_score < 0.3); - assert_eq!(MergePolicy::default().classify(s.combined_score), MatchClass::NonMatch); + assert_eq!( + MergePolicy::default().classify(s.combined_score), + MatchClass::NonMatch + ); } #[test] diff --git a/crates/vestige-core/src/config.rs b/crates/vestige-core/src/config.rs index f1bb8d5..c55e19b 100644 --- a/crates/vestige-core/src/config.rs +++ b/crates/vestige-core/src/config.rs @@ -242,9 +242,7 @@ impl OutputConfig { /// tool's own built-in fallback (used only when neither param nor config /// supplies one). pub fn resolve_limit(&self, explicit: Option, builtin_default: i32) -> i32 { - explicit - .or(self.limit) - .unwrap_or(builtin_default) + explicit.or(self.limit).unwrap_or(builtin_default) } } @@ -288,7 +286,10 @@ mod tests { #[test] fn empty_or_missing_file_is_default() { assert_eq!(VestigeConfig::parse(""), VestigeConfig::default()); - assert_eq!(VestigeConfig::parse("\n\n# just a comment\n"), VestigeConfig::default()); + assert_eq!( + VestigeConfig::parse("\n\n# just a comment\n"), + VestigeConfig::default() + ); } #[test] @@ -308,9 +309,7 @@ mod tests { #[test] fn unquoted_and_commented_values() { - let cfg = VestigeConfig::parse( - "[defaults]\nprofile = lean # inline comment\nlimit = 7\n", - ); + let cfg = VestigeConfig::parse("[defaults]\nprofile = lean # inline comment\nlimit = 7\n"); assert_eq!(cfg.defaults.profile, OutputProfile::Lean); assert_eq!(cfg.defaults.limit, Some(7)); } @@ -357,10 +356,9 @@ mod tests { #[test] fn explicit_defaults_override_profile_presets() { // profile=lean would give brief/limit 5, but explicit keys win. - let out = VestigeConfig::parse( - "[defaults]\nprofile=lean\ndetail_level=\"full\"\nlimit=42\n", - ) - .output(); + let out = + VestigeConfig::parse("[defaults]\nprofile=lean\ndetail_level=\"full\"\nlimit=42\n") + .output(); assert_eq!(out.detail_level, "full"); assert_eq!(out.limit, Some(42)); } diff --git a/crates/vestige-mcp/src/tools/codebase_unified.rs b/crates/vestige-mcp/src/tools/codebase_unified.rs index 70d8007..e24021d 100644 --- a/crates/vestige-mcp/src/tools/codebase_unified.rs +++ b/crates/vestige-mcp/src/tools/codebase_unified.rs @@ -428,7 +428,13 @@ mod tests { async fn test_invalid_action_fails() { let (storage, _dir) = test_storage().await; let args = serde_json::json!({ "action": "invalid" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("Invalid action")); } @@ -443,7 +449,13 @@ mod tests { "files": ["src/lib.rs"], "codebase": "vestige" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); assert_eq!(value["action"], "remember_pattern"); @@ -459,7 +471,13 @@ mod tests { "action": "remember_pattern", "description": "Some description" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("'name' is required")); } @@ -471,7 +489,13 @@ mod tests { "action": "remember_pattern", "name": "Test Pattern" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("'description' is required")); } @@ -484,7 +508,13 @@ mod tests { "name": " ", "description": "Some description" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("empty")); } @@ -500,7 +530,13 @@ mod tests { "files": ["src/storage.rs"], "codebase": "vestige" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); assert_eq!(value["action"], "remember_decision"); @@ -515,7 +551,13 @@ mod tests { "action": "remember_decision", "rationale": "Some rationale" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("'decision' is required")); } @@ -527,7 +569,13 @@ mod tests { "action": "remember_decision", "decision": "Use SQLite" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("'rationale' is required")); } @@ -540,7 +588,13 @@ mod tests { "decision": " ", "rationale": "Something" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("empty")); } @@ -552,7 +606,13 @@ mod tests { "action": "get_context", "codebase": "nonexistent" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); assert_eq!(value["action"], "get_context"); @@ -571,7 +631,9 @@ mod tests { "description": "A test pattern", "codebase": "myproject" }); - execute(&storage, &cog, &OutputConfig::default(), Some(save_args)).await.unwrap(); + execute(&storage, &cog, &OutputConfig::default(), Some(save_args)) + .await + .unwrap(); // Now retrieve let get_args = serde_json::json!({ @@ -588,7 +650,13 @@ mod tests { async fn test_get_context_no_codebase() { let (storage, _dir) = test_storage().await; let args = serde_json::json!({ "action": "get_context" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); assert_eq!(value["action"], "get_context"); diff --git a/crates/vestige-mcp/src/tools/maintenance.rs b/crates/vestige-mcp/src/tools/maintenance.rs index 9dfb50e..ef1a927 100644 --- a/crates/vestige-mcp/src/tools/maintenance.rs +++ b/crates/vestige-mcp/src/tools/maintenance.rs @@ -143,8 +143,7 @@ pub async fn execute_system_status( ) -> Result { // Parse arguments (all optional, including the args envelope itself). let parsed: SystemStatusArgs = match args { - Some(v) => serde_json::from_value(v) - .map_err(|e| format!("Invalid arguments: {}", e))?, + Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => SystemStatusArgs::default(), }; let include_schema = parsed.schema_introspection.unwrap_or(false); diff --git a/crates/vestige-mcp/src/tools/merge.rs b/crates/vestige-mcp/src/tools/merge.rs index f836f5f..70a2683 100644 --- a/crates/vestige-mcp/src/tools/merge.rs +++ b/crates/vestige-mcp/src/tools/merge.rs @@ -152,7 +152,11 @@ pub fn merge_policy_schema() -> Value { // ============================================================================ /// Route a merge/supersede tool call by tool name. -pub async fn execute(storage: &Arc, tool: &str, args: Option) -> Result { +pub async fn execute( + storage: &Arc, + tool: &str, + args: Option, +) -> Result { match tool { "merge_candidates" => merge_candidates(storage, args), "plan_merge" => plan_merge(storage, args), @@ -304,7 +308,8 @@ fn plan_supersede(storage: &Arc, args: Option) -> Result Value { - let requires_confirm = plan.classification != vestige_core::MatchClass::Match || !policy.auto_apply; + let requires_confirm = + plan.classification != vestige_core::MatchClass::Match || !policy.auto_apply; json!({ "planId": plan.id, "kind": plan.kind.as_str(), @@ -393,7 +398,9 @@ fn merge_undo(storage: &Arc, args: Option) -> Result { // No id => return the reflog so the caller can pick one. - let ops = storage.list_merge_operations(20).map_err(|e| e.to_string())?; + let ops = storage + .list_merge_operations(20) + .map_err(|e| e.to_string())?; let log: Vec = ops .iter() .map(|op| { @@ -478,7 +485,9 @@ fn merge_policy(storage: &Arc, args: Option) -> Result config file > // built-in default. The explicit arg is validated; the config fallback is // already validated at load time. - let detail_level_owned = - output_config.resolve_detail_level(args.detail_level.as_deref()); + let detail_level_owned = output_config.resolve_detail_level(args.detail_level.as_deref()); let detail_level = match detail_level_owned.as_str() { "brief" => "brief", "full" => "full", @@ -1030,7 +1029,13 @@ mod tests { async fn test_search_empty_query_fails() { let (storage, _dir) = test_storage().await; let args = serde_json::json!({ "query": "" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("empty")); } @@ -1039,7 +1044,13 @@ mod tests { async fn test_search_whitespace_only_query_fails() { let (storage, _dir) = test_storage().await; let args = serde_json::json!({ "query": " \t\n " }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("empty")); } @@ -1056,7 +1067,13 @@ mod tests { async fn test_search_missing_query_field_fails() { let (storage, _dir) = test_storage().await; let args = serde_json::json!({ "limit": 10 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("Invalid arguments")); } @@ -1094,9 +1111,14 @@ mod tests { "query": "OPENAI_API_KEY", "limit": 5 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)) - .await - .unwrap(); + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await + .unwrap(); assert_eq!(result["method"], "concrete"); assert_eq!(result["concrete"], true); @@ -1118,9 +1140,14 @@ mod tests { "query": uuid, "limit": 5 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)) - .await - .unwrap(); + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await + .unwrap(); assert_eq!(result["method"], "concrete"); assert_eq!(result["results"][0]["id"], target); @@ -1144,9 +1171,14 @@ mod tests { "query": "mlx_lm.server", "limit": 5 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)) - .await - .unwrap(); + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await + .unwrap(); assert_eq!(result["method"], "concrete"); assert_eq!(result["results"][0]["id"], target); @@ -1166,7 +1198,13 @@ mod tests { "query": "test", "limit": 0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); } @@ -1180,7 +1218,13 @@ mod tests { "query": "test", "limit": 1000 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); } @@ -1193,7 +1237,13 @@ mod tests { "query": "test", "limit": -5 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); } @@ -1210,7 +1260,13 @@ mod tests { "query": "test", "min_retention": -0.5 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); } @@ -1223,7 +1279,13 @@ mod tests { "query": "test", "min_retention": 1.5 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; // Should succeed but may return no results (retention > 1.0 clamped to 1.0) assert!(result.is_ok()); } @@ -1241,7 +1303,13 @@ mod tests { "query": "test", "min_similarity": -0.5 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); } @@ -1254,7 +1322,13 @@ mod tests { "query": "test", "min_similarity": 1.5 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; // Should succeed but may return no results assert!(result.is_ok()); } @@ -1269,7 +1343,13 @@ mod tests { ingest_test_content(&storage, "The Rust programming language is memory safe.").await; let args = serde_json::json!({ "query": "rust" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1289,7 +1369,13 @@ mod tests { "query": "python", "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1311,7 +1397,13 @@ mod tests { "limit": 2, "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1325,7 +1417,13 @@ mod tests { // Don't ingest anything - database is empty let args = serde_json::json!({ "query": "anything" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1342,7 +1440,13 @@ mod tests { "query": "testing", "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1375,7 +1479,13 @@ mod tests { "query": "item", "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1461,7 +1571,13 @@ mod tests { "detail_level": "brief", "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1490,7 +1606,13 @@ mod tests { "detail_level": "full", "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1517,7 +1639,13 @@ mod tests { "query": "default", "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1546,7 +1674,13 @@ mod tests { "query": "test", "detail_level": "invalid_level" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("Invalid detail_level")); } @@ -1575,7 +1709,13 @@ mod tests { "token_budget": 200, "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1602,7 +1742,13 @@ mod tests { "token_budget": 150, "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1621,7 +1767,13 @@ mod tests { "query": "no budget", "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -1677,11 +1829,7 @@ mod tests { /// Helper that ingests a memory with specific tags. The base /// `ingest_test_content` helper passes `tags: vec![]`, which is fine /// for legacy tests but not for tag_prefix coverage. - async fn ingest_with_tags( - storage: &Arc, - content: &str, - tags: Vec<&str>, - ) -> String { + async fn ingest_with_tags(storage: &Arc, content: &str, tags: Vec<&str>) -> String { let input = IngestInput { content: content.to_string(), node_type: "fact".to_string(), @@ -1725,7 +1873,13 @@ mod tests { "tag_prefix": "meeting:", "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok(), "{:?}", result); let value = result.unwrap(); let results = value["results"].as_array().unwrap(); @@ -1768,7 +1922,13 @@ mod tests { "tag_prefix": "project:", "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); let results = value["results"].as_array().unwrap(); @@ -1799,7 +1959,13 @@ mod tests { "query": "audit", "min_similarity": 0.0 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); let results = value["results"].as_array().unwrap(); @@ -1832,7 +1998,13 @@ mod tests { "concrete": true, "tag_prefix": "meeting:" }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok(), "{:?}", result); let value = result.unwrap(); assert_eq!(value["method"], "concrete"); @@ -1897,8 +2069,14 @@ mod tests { .unwrap(); assert_eq!(value["profile"], "lean"); if let Some(first) = value["results"].as_array().and_then(|a| a.first()) { - assert!(first.get("combinedScore").is_none(), "lean must drop scores"); - assert!(first.get("createdAt").is_none(), "lean must drop timestamps"); + assert!( + first.get("combinedScore").is_none(), + "lean must drop scores" + ); + assert!( + first.get("createdAt").is_none(), + "lean must drop timestamps" + ); } } @@ -1910,9 +2088,14 @@ mod tests { ingest_test_content(&storage, "Default profile preserved content.").await; let args = serde_json::json!({ "query": "default preserved", "min_similarity": 0.0 }); - let value = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)) - .await - .unwrap(); + let value = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await + .unwrap(); assert_eq!(value["detailLevel"], "summary"); assert_eq!(value["profile"], "default"); if let Some(first) = value["results"].as_array().and_then(|a| a.first()) { diff --git a/crates/vestige-mcp/src/tools/session_context.rs b/crates/vestige-mcp/src/tools/session_context.rs index 68e5c6b..97e52ff 100644 --- a/crates/vestige-mcp/src/tools/session_context.rs +++ b/crates/vestige-mcp/src/tools/session_context.rs @@ -568,7 +568,13 @@ mod tests { let args = serde_json::json!({ "queries": ["user preferences", "project context"] }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -596,7 +602,13 @@ mod tests { "queries": ["memory"], "token_budget": 200 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -632,7 +644,13 @@ mod tests { "queries": ["expandable test memory"], "token_budget": 150 }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -663,7 +681,13 @@ mod tests { "include_intentions": false, "include_predictions": false }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -697,7 +721,13 @@ mod tests { "topics": ["performance"] } }); - let result = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)).await; + let result = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); @@ -715,9 +745,14 @@ mod tests { // Default profile -> profile echoed, dates present. let args = serde_json::json!({ "queries": ["profile content"] }); - let value = execute(&storage, &test_cognitive(), &OutputConfig::default(), Some(args)) - .await - .unwrap(); + let value = execute( + &storage, + &test_cognitive(), + &OutputConfig::default(), + Some(args), + ) + .await + .unwrap(); assert_eq!(value["profile"], "default"); // Lean profile -> profile echoed as lean. The memory line must not carry diff --git a/crates/vestige-mcp/src/tools/timeline.rs b/crates/vestige-mcp/src/tools/timeline.rs index 5c73357..7b3dcbf 100644 --- a/crates/vestige-mcp/src/tools/timeline.rs +++ b/crates/vestige-mcp/src/tools/timeline.rs @@ -417,7 +417,9 @@ mod tests { // Limit 5 against 12 total — before the fix, `retain` on `concept` // would operate on the 5 most recent rows (all `fact`) and find 0. let args = serde_json::json!({ "node_type": "concept", "limit": 5 }); - let value = execute(&storage, &OutputConfig::default(), Some(args)).await.unwrap(); + let value = execute(&storage, &OutputConfig::default(), Some(args)) + .await + .unwrap(); assert_eq!( value["totalMemories"], 2, "Both sparse concepts should survive a limit smaller than the dominant set" @@ -455,7 +457,9 @@ mod tests { } let args = serde_json::json!({ "tags": ["rare"], "limit": 5 }); - let value = execute(&storage, &OutputConfig::default(), Some(args)).await.unwrap(); + let value = execute(&storage, &OutputConfig::default(), Some(args)) + .await + .unwrap(); assert_eq!( value["totalMemories"], 2, "Both sparse-tag matches should survive a limit smaller than the dominant set"