agent: Create checkpoints when editing a past message (#30831)
Release Notes: - N/A
This commit is contained in:
parent
784d51c40f
commit
1ce2652a89
3 changed files with 18 additions and 3 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue