use systemprompt_identifiers::{McpServerId, McpToolName, TraceId};
use super::{Result, TraceRepository};
use crate::trace::models::{ToolExecutionFilter, ToolExecutionItem};
impl TraceRepository {
pub async fn list_tool_executions(
&self,
filter: &ToolExecutionFilter,
) -> Result<Vec<ToolExecutionItem>> {
let rows = sqlx::query!(
r#"
SELECT
started_at as "timestamp!",
trace_id as "trace_id!: TraceId",
tool_name as "tool_name!",
server_name,
status as "status!",
execution_time_ms
FROM mcp_tool_executions
WHERE ($1::timestamptz IS NULL OR started_at >= $1)
AND ($2::text IS NULL OR tool_name ILIKE $2)
AND ($3::text IS NULL OR server_name ILIKE $3)
AND ($4::text IS NULL OR status = $4)
ORDER BY started_at DESC
LIMIT $5
"#,
filter.since,
filter.name.as_deref(),
filter.server.as_deref(),
filter.status.as_deref(),
filter.limit
)
.fetch_all(&*self.pool)
.await?;
Ok(rows
.into_iter()
.map(|r| ToolExecutionItem {
timestamp: r.timestamp,
trace_id: r.trace_id,
tool_name: McpToolName::new(r.tool_name),
server_name: Some(McpServerId::new(r.server_name)),
status: r.status,
execution_time_ms: r.execution_time_ms,
})
.collect())
}
}