use super::builder::AgentService;
use uuid::Uuid;
pub(crate) fn enrich_metadata(
tool_name: &str,
error_snippet: Option<&str>,
tool_input: Option<&serde_json::Value>,
) -> Option<String> {
let snippet = error_snippet.unwrap_or("");
let cmd_suffix = if tool_name == "bash"
&& let Some(input) = tool_input
&& let Some(cmd) = input.get("command").and_then(|v| v.as_str())
&& !cmd.is_empty()
{
let cmd_short: String = cmd.chars().take(300).collect();
Some(format!(" | cmd={cmd_short}"))
} else {
None
};
match (snippet.is_empty(), cmd_suffix) {
(true, None) => None,
(true, Some(suffix)) => Some(suffix.strip_prefix(" | ").unwrap_or(&suffix).to_string()),
(false, None) => Some(snippet.to_string()),
(false, Some(suffix)) => Some(format!("{snippet}{suffix}")),
}
}
impl AgentService {
pub(super) fn record_tool_feedback(
&self,
session_id: Uuid,
tool_name: &str,
tool_input: Option<&serde_json::Value>,
success: bool,
error_snippet: Option<&str>,
) {
let pool = self.context.pool();
let sid = session_id.to_string();
let tname = tool_name.to_string();
let enriched = enrich_metadata(tool_name, error_snippet, tool_input);
let meta = enriched.map(|s| s.chars().take(500).collect::<String>());
tokio::spawn(async move {
let repo = crate::db::repository::FeedbackLedgerRepository::new(pool);
let event = if success {
"tool_success"
} else {
"tool_failure"
};
let val = if success { 1.0 } else { 0.0 };
if let Err(e) = repo.record(&sid, event, &tname, val, meta.as_deref()).await {
tracing::debug!("feedback ledger write failed: {e}");
}
});
}
pub(super) fn record_provider_feedback(
&self,
session_id: Uuid,
event_type: &str,
dimension: &str,
metadata: Option<&str>,
) {
let pool = self.context.pool();
let sid = session_id.to_string();
let et = event_type.to_string();
let dim = dimension.to_string();
let meta = metadata.map(|s| s.chars().take(500).collect::<String>());
tokio::spawn(async move {
let repo = crate::db::repository::FeedbackLedgerRepository::new(pool);
if let Err(e) = repo.record(&sid, &et, &dim, 0.0, meta.as_deref()).await {
tracing::debug!("feedback ledger write failed: {e}");
}
});
}
}