mirror of
https://github.com/samvallad33/vestige.git
synced 2026-06-20 21:18:08 +02:00
fix: make windows release build and add manual rerun path
This commit is contained in:
parent
ef2073d4a4
commit
22d0d192eb
9 changed files with 396 additions and 95 deletions
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue