Make compaction transitions recoverable

This commit is contained in:
Georg Bauer
2026-07-26 10:56:19 +02:00
parent 6aa45b2cf0
commit 2a14b93335
13 changed files with 329 additions and 26 deletions

View File

@@ -407,13 +407,24 @@ impl Database {
session_id: i32,
summary: &str,
tail: &[MessageDraft],
context_used: u32,
context_limit: u32,
) -> Result<Vec<StoredMessage>, String> {
let context_used = i32::try_from(context_used)
.map_err(|_| "Compacted context is too large to save".to_owned())?;
let context_limit = i32::try_from(context_limit)
.map_err(|_| "Context limit is too large to save".to_owned())?;
self.connection
.transaction(|connection| {
diesel::delete(messages::table.filter(messages::session_id.eq(session_id)))
.execute(connection)?;
diesel::update(sessions::table.find(session_id))
.set(sessions::compacted_summary.eq(Some(summary)))
.set((
sessions::compacted_summary.eq(Some(summary)),
sessions::context_used.eq(context_used),
sessions::context_limit.eq(context_limit),
sessions::last_tokens_per_second.eq(None::<f32>),
))
.execute(connection)?;
let mut stored = Vec::with_capacity(tail.len());
for message in tail {
@@ -561,6 +572,8 @@ mod tests {
reasoning_complete: true,
content: "Recent question".into(),
}],
321,
32_768,
)
.unwrap();
assert_eq!(compacted.len(), 1);
@@ -572,6 +585,10 @@ mod tests {
.as_deref(),
Some("Keep the active task.")
);
assert_eq!(
reopened.load_projects().unwrap()[0].sessions[0].context_used,
321
);
assert_eq!(reopened.load_messages(session.id).unwrap().len(), 1);
reopened.delete_session(session.id).unwrap();
assert!(reopened.load_messages(session.id).unwrap().is_empty());