// src/api/search.rs // // 跨会话全文搜索 API(P3 特性)。 // 使用 FTS5 BM25 排序搜索 agent_sessions 和 agent_messages。 use axum::{ extract::{Query, State}, Json, }; use serde::Deserialize; use std::sync::Arc; use super::error::{ApiResult, AppError}; use super::AppState; pub use crate::services::search::SearchResult; #[derive(Debug, Deserialize)] pub struct SearchParams { /// 搜索关键词(支持 FTS5 查询语法) pub q: String, /// 搜索范围:sessions, messages, all(默认 all) #[serde(default = "default_scope")] pub scope: String, /// 最大结果数(默认 20,最大 100) #[serde(default = "default_limit")] pub limit: i64, /// 可选:限定到特定会话 pub session_id: Option, } fn default_scope() -> String { "all".into() } fn default_limit() -> i64 { 20 } /// GET /api/search pub async fn search( State(state): State>, Query(params): Query, ) -> ApiResult>> { let limit = params.limit.min(100); let results = crate::services::search::search_agent_history( &state.db, ¶ms.q, ¶ms.scope, limit, params.session_id.as_deref(), ) .await .map_err(|e| AppError::internal(format!("全文检索失败: {}", e)))?; Ok(Json(results)) }