add devtools agent tools, fix search field mapping
7 gitea tools: list_repos, get_repo, list_issues, get_issue, create_issue, list_pulls, get_file. all operate as the requesting user via PAT impersonation. tool registry conditionally includes gitea tools when configured. dispatch uses prefix matching (gitea_*) for clean extension. fixed search bug: room_name and sender_name filters used .keyword subfield which doesn't exist on keyword-typed fields — queries silently returned zero results for all room/sender-filtered searches.
This commit is contained in:
@@ -38,10 +38,10 @@ pub fn build_search_query(args: &SearchArgs) -> serde_json::Value {
|
||||
})];
|
||||
|
||||
if let Some(ref room) = args.room {
|
||||
filter.push(json!({ "term": { "room_name.keyword": room } }));
|
||||
filter.push(json!({ "term": { "room_name": room } }));
|
||||
}
|
||||
if let Some(ref sender) = args.sender {
|
||||
filter.push(json!({ "term": { "sender_name.keyword": sender } }));
|
||||
filter.push(json!({ "term": { "sender_name": sender } }));
|
||||
}
|
||||
|
||||
let mut range = serde_json::Map::new();
|
||||
@@ -189,7 +189,7 @@ mod tests {
|
||||
|
||||
let filters = q["query"]["bool"]["filter"].as_array().unwrap();
|
||||
assert_eq!(filters.len(), 2);
|
||||
assert_eq!(filters[1]["term"]["room_name.keyword"], "design");
|
||||
assert_eq!(filters[1]["term"]["room_name"], "design");
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -199,7 +199,7 @@ mod tests {
|
||||
|
||||
let filters = q["query"]["bool"]["filter"].as_array().unwrap();
|
||||
assert_eq!(filters.len(), 2);
|
||||
assert_eq!(filters[1]["term"]["sender_name.keyword"], "Bob");
|
||||
assert_eq!(filters[1]["term"]["sender_name"], "Bob");
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -209,8 +209,8 @@ mod tests {
|
||||
|
||||
let filters = q["query"]["bool"]["filter"].as_array().unwrap();
|
||||
assert_eq!(filters.len(), 3);
|
||||
assert_eq!(filters[1]["term"]["room_name.keyword"], "dev");
|
||||
assert_eq!(filters[2]["term"]["sender_name.keyword"], "Carol");
|
||||
assert_eq!(filters[1]["term"]["room_name"], "dev");
|
||||
assert_eq!(filters[2]["term"]["sender_name"], "Carol");
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -274,6 +274,30 @@ mod tests {
|
||||
assert_eq!(filters.len(), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_wildcard_query_uses_match_all() {
|
||||
let args = parse_args(r#"{"query": "*"}"#);
|
||||
let q = build_search_query(&args);
|
||||
assert!(q["query"]["bool"]["must"][0]["match_all"].is_object());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_empty_query_uses_match_all() {
|
||||
let args = parse_args(r#"{"query": ""}"#);
|
||||
let q = build_search_query(&args);
|
||||
assert!(q["query"]["bool"]["must"][0]["match_all"].is_object());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_room_filter_uses_keyword_field() {
|
||||
// room_name is mapped as "keyword" in OpenSearch — no .keyword subfield
|
||||
let args = parse_args(r#"{"query": "test", "room": "general"}"#);
|
||||
let q = build_search_query(&args);
|
||||
let filters = q["query"]["bool"]["filter"].as_array().unwrap();
|
||||
// Should be room_name, NOT room_name.keyword
|
||||
assert_eq!(filters[1]["term"]["room_name"], "general");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_source_fields() {
|
||||
let args = parse_args(r#"{"query": "test"}"#);
|
||||
|
||||
Reference in New Issue
Block a user