Discard archived session checkpoints
This commit is contained in:
@@ -613,7 +613,13 @@ impl App {
|
||||
}
|
||||
}
|
||||
};
|
||||
let Some(service) = &self.generation_service else {
|
||||
let archived_session = self
|
||||
.projects
|
||||
.iter()
|
||||
.flat_map(|project| &project.sessions)
|
||||
.find(|session| session.id == session_id)
|
||||
.is_some_and(|session| session.state() == SessionState::Archived);
|
||||
let Some(service) = self.generation_service.clone() else {
|
||||
self.error = Some("The model runtime is unavailable.".into());
|
||||
return;
|
||||
};
|
||||
@@ -633,6 +639,13 @@ impl App {
|
||||
return;
|
||||
}
|
||||
};
|
||||
if archived_session {
|
||||
self.reload_projects();
|
||||
self.context_notice = Some(
|
||||
"Rebuilding context: the session was archived and its checkpoint was discarded."
|
||||
.into(),
|
||||
);
|
||||
}
|
||||
let user_id = saved[saved.len() - 2].id;
|
||||
self.active_turn
|
||||
.get_or_insert_with(TurnSummary::new)
|
||||
@@ -1643,6 +1656,12 @@ impl App {
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let archived_session = self
|
||||
.projects
|
||||
.iter()
|
||||
.flat_map(|project| &project.sessions)
|
||||
.find(|session| session.id == session_id)
|
||||
.is_some_and(|session| session.state() == SessionState::Archived);
|
||||
let tail_start = message_ids.get(compacted.tail_start).copied();
|
||||
let messages = self
|
||||
.database
|
||||
@@ -1659,7 +1678,9 @@ impl App {
|
||||
.map_err(|error| format!("Could not save compacted conversation: {error}"))?;
|
||||
self.conversation
|
||||
.extend(messages.into_iter().map(ChatMessage::from));
|
||||
if let Some(session) = self
|
||||
if archived_session {
|
||||
self.reload_projects();
|
||||
} else if let Some(session) = self
|
||||
.projects
|
||||
.iter_mut()
|
||||
.flat_map(|project| &mut project.sessions)
|
||||
|
||||
@@ -515,6 +515,25 @@ mod tests {
|
||||
std::fs::remove_dir_all(directory).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn discarding_a_session_removes_every_checkpoint_stage() {
|
||||
let directory =
|
||||
std::env::temp_dir().join(format!("ds4-server-discard-{}", std::process::id()));
|
||||
std::fs::create_dir_all(&directory).unwrap();
|
||||
for name in ["4.bin", "4.tmp", "4.compacting", "5.bin"] {
|
||||
std::fs::write(directory.join(name), b"payload").unwrap();
|
||||
}
|
||||
|
||||
assert!(super::super::discard_session_checkpoint_files(&directory, 4).unwrap());
|
||||
assert!(!directory.join("4.bin").exists());
|
||||
assert!(!directory.join("4.tmp").exists());
|
||||
assert!(!directory.join("4.compacting").exists());
|
||||
assert!(directory.join("5.bin").exists());
|
||||
assert!(!super::super::discard_session_checkpoint_files(&directory, 4).unwrap());
|
||||
|
||||
std::fs::remove_dir_all(directory).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn git_state_lists_and_switches_local_branches() {
|
||||
let nonce = SystemTime::now()
|
||||
|
||||
Reference in New Issue
Block a user