use anyhow::Result;
use rusqlite::{params, Connection};
use crate::memory::poisoning::scan_generated_surfaces;
#[allow(clippy::too_many_arguments)]
pub fn finalize_summarize(
conn: &mut Connection,
memory_session_id: &str,
project: &str,
message_hash: &str,
request: Option<&str>,
completed: Option<&str>,
decisions: Option<&str>,
learned: Option<&str>,
next_steps: Option<&str>,
preferences: Option<&str>,
prompt_number: Option<i64>,
discovery_tokens: i64,
) -> Result<usize> {
let now = chrono::Utc::now();
let created_at = now.to_rfc3339();
let created_at_epoch = now.timestamp();
let verdict = scan_generated_surfaces(&[
("request", request),
("completed", completed),
("decisions", decisions),
("learned", learned),
("next_steps", next_steps),
("preferences", preferences),
]);
if let Some(surface_match) = &verdict {
crate::log::error(
"summarize",
&format!(
"quarantining finalized summary for session {memory_session_id}: field={} pattern={}@v{}",
surface_match.field,
surface_match.pattern.pattern_id,
surface_match.pattern.pattern_set_version,
),
);
}
let tx = conn.transaction()?;
let deleted = tx.execute(
"DELETE FROM session_summaries WHERE memory_session_id = ?1 AND project = ?2",
params![memory_session_id, project],
)?;
tx.execute(
"INSERT INTO session_summaries \
(memory_session_id, project, request, completed, decisions, learned, \
next_steps, preferences, prompt_number, created_at, created_at_epoch, \
discovery_tokens, poisoning_status, quarantine_stage, quarantine_field, \
quarantine_pattern_id, quarantine_pattern_version) \
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17)",
params![
memory_session_id,
project,
request,
completed,
decisions,
learned,
next_steps,
preferences,
prompt_number,
created_at,
created_at_epoch,
discovery_tokens,
if verdict.is_some() {
"quarantined"
} else {
"safe"
},
verdict.as_ref().map(|matched| matched.stage.as_str()),
verdict.as_ref().map(|matched| matched.field.as_str()),
verdict.as_ref().map(|matched| matched.pattern.pattern_id),
verdict
.as_ref()
.map(|matched| matched.pattern.pattern_set_version),
],
)?;
tx.execute(
"INSERT INTO summarize_cooldown (project, last_summarize_epoch, last_message_hash)
VALUES (?1, ?2, ?3)
ON CONFLICT(project) DO UPDATE SET
last_summarize_epoch = ?2,
last_message_hash = ?3",
params![project, created_at_epoch, message_hash],
)?;
tx.commit()?;
Ok(deleted)
}