Make compaction transitions recoverable
This commit is contained in:
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user