agent: Create checkpoints when editing a past message (#30831)

Release Notes:

- N/A
This commit is contained in:
Max Brunsfeld 2025-05-18 18:02:15 +02:00 committed by GitHub
parent 784d51c40f
commit 1ce2652a89
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 18 additions and 3 deletions

View file

@ -1542,11 +1542,15 @@ impl ActiveThread {
let project = self.thread.read(cx).project().clone(); let project = self.thread.read(cx).project().clone();
let prompt_store = self.thread_store.read(cx).prompt_store().clone(); let prompt_store = self.thread_store.read(cx).prompt_store().clone();
let git_store = project.read(cx).git_store().clone();
let checkpoint = git_store.update(cx, |git_store, cx| git_store.checkpoint(cx));
let load_context_task = let load_context_task =
crate::context::load_context(new_context, &project, &prompt_store, cx); crate::context::load_context(new_context, &project, &prompt_store, cx);
self._load_edited_message_context_task = self._load_edited_message_context_task =
Some(cx.spawn_in(window, async move |this, cx| { Some(cx.spawn_in(window, async move |this, cx| {
let context = load_context_task.await; let (context, checkpoint) =
futures::future::join(load_context_task, checkpoint).await;
let _ = this let _ = this
.update_in(cx, |this, window, cx| { .update_in(cx, |this, window, cx| {
this.thread.update(cx, |thread, cx| { this.thread.update(cx, |thread, cx| {
@ -1555,6 +1559,7 @@ impl ActiveThread {
Role::User, Role::User,
vec![MessageSegment::Text(edited_text)], vec![MessageSegment::Text(edited_text)],
Some(context.loaded_context), Some(context.loaded_context),
checkpoint.ok(),
cx, cx,
); );
for message_id in this.messages_after(message_id) { for message_id in this.messages_after(message_id) {

View file

@ -214,7 +214,7 @@ pub struct GitState {
pub diff: Option<String>, pub diff: Option<String>,
} }
#[derive(Clone)] #[derive(Clone, Debug)]
pub struct ThreadCheckpoint { pub struct ThreadCheckpoint {
message_id: MessageId, message_id: MessageId,
git_checkpoint: GitStoreCheckpoint, git_checkpoint: GitStoreCheckpoint,
@ -996,6 +996,7 @@ impl Thread {
new_role: Role, new_role: Role,
new_segments: Vec<MessageSegment>, new_segments: Vec<MessageSegment>,
loaded_context: Option<LoadedContext>, loaded_context: Option<LoadedContext>,
checkpoint: Option<GitStoreCheckpoint>,
cx: &mut Context<Self>, cx: &mut Context<Self>,
) -> bool { ) -> bool {
let Some(message) = self.messages.iter_mut().find(|message| message.id == id) else { let Some(message) = self.messages.iter_mut().find(|message| message.id == id) else {
@ -1006,6 +1007,15 @@ impl Thread {
if let Some(context) = loaded_context { if let Some(context) = loaded_context {
message.loaded_context = context; message.loaded_context = context;
} }
if let Some(git_checkpoint) = checkpoint {
self.checkpoints_by_message.insert(
id,
ThreadCheckpoint {
message_id: id,
git_checkpoint,
},
);
}
self.touch_updated_at(); self.touch_updated_at();
cx.emit(ThreadEvent::MessageEdited(id)); cx.emit(ThreadEvent::MessageEdited(id));
true true

View file

@ -163,7 +163,7 @@ struct LocalDownstreamState {
_task: Task<Result<()>>, _task: Task<Result<()>>,
} }
#[derive(Clone)] #[derive(Clone, Debug)]
pub struct GitStoreCheckpoint { pub struct GitStoreCheckpoint {
checkpoints_by_work_dir_abs_path: HashMap<Arc<Path>, GitRepositoryCheckpoint>, checkpoints_by_work_dir_abs_path: HashMap<Arc<Path>, GitRepositoryCheckpoint>,
} }