fix: make windows release build and add manual rerun path

This commit is contained in:
Sam Valladares 2026-06-18 23:39:38 -05:00
parent ef2073d4a4
commit 22d0d192eb
9 changed files with 396 additions and 95 deletions

View file

@ -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

View file

@ -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]

View file

@ -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<i32>, 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));
}

View file

@ -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");

View file

@ -143,8 +143,7 @@ pub async fn execute_system_status(
) -> Result<Value, String> {
// 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);

View file

@ -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<Storage>, tool: &str, args: Option<Value>) -> Result<Value, String> {
pub async fn execute(
storage: &Arc<Storage>,
tool: &str,
args: Option<Value>,
) -> Result<Value, String> {
match tool {
"merge_candidates" => merge_candidates(storage, args),
"plan_merge" => plan_merge(storage, args),
@ -304,7 +308,8 @@ fn plan_supersede(storage: &Arc<Storage>, args: Option<Value>) -> Result<Value,
#[cfg(all(feature = "embeddings", feature = "vector-search"))]
fn plan_to_json(plan: &vestige_core::MergePlan, policy: &vestige_core::MergePolicy) -> 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<Storage>, args: Option<Value>) -> Result<Value, Stri
}
None => {
// 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<Value> = ops
.iter()
.map(|op| {
@ -478,7 +485,9 @@ fn merge_policy(storage: &Arc<Storage>, args: Option<Value>) -> Result<Value, St
.and_then(|v| v.as_bool())
.unwrap_or(current.auto_apply);
let policy = vestige_core::MergePolicy::new(match_t, possible_t, auto);
storage.set_merge_policy(policy).map_err(|e| e.to_string())?;
storage
.set_merge_policy(policy)
.map_err(|e| e.to_string())?;
Ok(json!({
"updated": true,
"matchThreshold": policy.match_threshold,
@ -521,10 +530,12 @@ mod tests {
#[test]
fn plan_merge_requires_two_ids() {
assert!(plan_merge_schema()["required"]
.as_array()
.unwrap()
.iter()
.any(|v| v == "member_ids"));
assert!(
plan_merge_schema()["required"]
.as_array()
.unwrap()
.iter()
.any(|v| v == "member_ids")
);
}
}

View file

@ -158,8 +158,7 @@ pub async fn execute(
// Validate detail_level. Precedence: explicit MCP param > 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<Storage>,
content: &str,
tags: Vec<&str>,
) -> String {
async fn ingest_with_tags(storage: &Arc<Storage>, 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()) {

View file

@ -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

View file

@ -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"