agent: Allow adding/removing context when editing existing messages (#29698)
Release Notes: - agent: Support adding/removing context when editing existing message --------- Co-authored-by: Cole Miller <m@cole-miller.net> Co-authored-by: Cole Miller <cole@zed.dev>
This commit is contained in:
parent
f046d70625
commit
1bf9e15f26
5 changed files with 418 additions and 189 deletions
|
@ -879,6 +879,7 @@ impl Thread {
|
|||
id: MessageId,
|
||||
new_role: Role,
|
||||
new_segments: Vec<MessageSegment>,
|
||||
loaded_context: Option<LoadedContext>,
|
||||
cx: &mut Context<Self>,
|
||||
) -> bool {
|
||||
let Some(message) = self.messages.iter_mut().find(|message| message.id == id) else {
|
||||
|
@ -886,6 +887,9 @@ impl Thread {
|
|||
};
|
||||
message.role = new_role;
|
||||
message.segments = new_segments;
|
||||
if let Some(context) = loaded_context {
|
||||
message.loaded_context = context;
|
||||
}
|
||||
self.touch_updated_at();
|
||||
cx.emit(ThreadEvent::MessageEdited(id));
|
||||
true
|
||||
|
@ -2546,6 +2550,7 @@ fn main() {{
|
|||
"file1.rs": "fn function1() {}\n",
|
||||
"file2.rs": "fn function2() {}\n",
|
||||
"file3.rs": "fn function3() {}\n",
|
||||
"file4.rs": "fn function4() {}\n",
|
||||
}),
|
||||
)
|
||||
.await;
|
||||
|
@ -2558,7 +2563,7 @@ fn main() {{
|
|||
.await
|
||||
.unwrap();
|
||||
let new_contexts = context_store.update(cx, |store, cx| {
|
||||
store.new_context_for_thread(thread.read(cx))
|
||||
store.new_context_for_thread(thread.read(cx), None)
|
||||
});
|
||||
assert_eq!(new_contexts.len(), 1);
|
||||
let loaded_context = cx
|
||||
|
@ -2573,7 +2578,7 @@ fn main() {{
|
|||
.await
|
||||
.unwrap();
|
||||
let new_contexts = context_store.update(cx, |store, cx| {
|
||||
store.new_context_for_thread(thread.read(cx))
|
||||
store.new_context_for_thread(thread.read(cx), None)
|
||||
});
|
||||
assert_eq!(new_contexts.len(), 1);
|
||||
let loaded_context = cx
|
||||
|
@ -2589,7 +2594,7 @@ fn main() {{
|
|||
.await
|
||||
.unwrap();
|
||||
let new_contexts = context_store.update(cx, |store, cx| {
|
||||
store.new_context_for_thread(thread.read(cx))
|
||||
store.new_context_for_thread(thread.read(cx), None)
|
||||
});
|
||||
assert_eq!(new_contexts.len(), 1);
|
||||
let loaded_context = cx
|
||||
|
@ -2640,6 +2645,55 @@ fn main() {{
|
|||
assert!(!request.messages[3].string_contents().contains("file1.rs"));
|
||||
assert!(!request.messages[3].string_contents().contains("file2.rs"));
|
||||
assert!(request.messages[3].string_contents().contains("file3.rs"));
|
||||
|
||||
add_file_to_context(&project, &context_store, "test/file4.rs", cx)
|
||||
.await
|
||||
.unwrap();
|
||||
let new_contexts = context_store.update(cx, |store, cx| {
|
||||
store.new_context_for_thread(thread.read(cx), Some(message2_id))
|
||||
});
|
||||
assert_eq!(new_contexts.len(), 3);
|
||||
let loaded_context = cx
|
||||
.update(|cx| load_context(new_contexts, &project, &None, cx))
|
||||
.await
|
||||
.loaded_context;
|
||||
|
||||
assert!(!loaded_context.text.contains("file1.rs"));
|
||||
assert!(loaded_context.text.contains("file2.rs"));
|
||||
assert!(loaded_context.text.contains("file3.rs"));
|
||||
assert!(loaded_context.text.contains("file4.rs"));
|
||||
|
||||
let new_contexts = context_store.update(cx, |store, cx| {
|
||||
// Remove file4.rs
|
||||
store.remove_context(&loaded_context.contexts[2].handle(), cx);
|
||||
store.new_context_for_thread(thread.read(cx), Some(message2_id))
|
||||
});
|
||||
assert_eq!(new_contexts.len(), 2);
|
||||
let loaded_context = cx
|
||||
.update(|cx| load_context(new_contexts, &project, &None, cx))
|
||||
.await
|
||||
.loaded_context;
|
||||
|
||||
assert!(!loaded_context.text.contains("file1.rs"));
|
||||
assert!(loaded_context.text.contains("file2.rs"));
|
||||
assert!(loaded_context.text.contains("file3.rs"));
|
||||
assert!(!loaded_context.text.contains("file4.rs"));
|
||||
|
||||
let new_contexts = context_store.update(cx, |store, cx| {
|
||||
// Remove file3.rs
|
||||
store.remove_context(&loaded_context.contexts[1].handle(), cx);
|
||||
store.new_context_for_thread(thread.read(cx), Some(message2_id))
|
||||
});
|
||||
assert_eq!(new_contexts.len(), 1);
|
||||
let loaded_context = cx
|
||||
.update(|cx| load_context(new_contexts, &project, &None, cx))
|
||||
.await
|
||||
.loaded_context;
|
||||
|
||||
assert!(!loaded_context.text.contains("file1.rs"));
|
||||
assert!(loaded_context.text.contains("file2.rs"));
|
||||
assert!(!loaded_context.text.contains("file3.rs"));
|
||||
assert!(!loaded_context.text.contains("file4.rs"));
|
||||
}
|
||||
|
||||
#[gpui::test]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue