No longer instantiate recently opened agent threads on startup (#32285)
This was causing a lot of work on startup, particularly due to instantiating edit tool cards. The minor downside is that now these threads don't open quite as fast. Includes a few other improvements: * On text thread rename, now immediately updates the metadata for display in the UI instead of waiting for reload. * On text thread rename, first renames the file before writing. Before if the file removal failed you'd end up with a duplicate. * Now only stores text thread file names instead of full paths. This is more concise and allows for the app data dir changing location. * Renames `ThreadStore::unordered_threads` to `ThreadStore::reverse_chronological_threads` (and removes the old one that sorted), since the recent change to use a SQL database queries them in that order. * Removes `ContextStore::reverse_chronological_contexts` since it was only used in one location where it does sorting anyway - no need to sort twice. * `SavedContextMetadata::title` is now `SharedString` instead of `String`. Release Notes: - Fixed regression in startup performance by not deserializing and instantiating recently opened agent threads.
This commit is contained in:
parent
1552198b55
commit
cabd22f36b
8 changed files with 299 additions and 261 deletions
|
@ -11,7 +11,7 @@ use assistant_slash_commands::FileCommandMetadata;
|
|||
use client::{self, proto, telemetry::Telemetry};
|
||||
use clock::ReplicaId;
|
||||
use collections::{HashMap, HashSet};
|
||||
use fs::{Fs, RemoveOptions};
|
||||
use fs::{Fs, RenameOptions};
|
||||
use futures::{FutureExt, StreamExt, future::Shared};
|
||||
use gpui::{
|
||||
App, AppContext as _, Context, Entity, EventEmitter, RenderImage, SharedString, Subscription,
|
||||
|
@ -452,6 +452,10 @@ pub enum ContextEvent {
|
|||
MessagesEdited,
|
||||
SummaryChanged,
|
||||
SummaryGenerated,
|
||||
PathChanged {
|
||||
old_path: Option<Arc<Path>>,
|
||||
new_path: Arc<Path>,
|
||||
},
|
||||
StreamedCompletion,
|
||||
StartedThoughtProcess(Range<language::Anchor>),
|
||||
EndedThoughtProcess(language::Anchor),
|
||||
|
@ -2894,22 +2898,34 @@ impl AssistantContext {
|
|||
}
|
||||
|
||||
fs.create_dir(contexts_dir().as_ref()).await?;
|
||||
fs.atomic_write(new_path.clone(), serde_json::to_string(&context).unwrap())
|
||||
.await?;
|
||||
if let Some(old_path) = old_path {
|
||||
|
||||
// rename before write ensures that only one file exists
|
||||
if let Some(old_path) = old_path.as_ref() {
|
||||
if new_path.as_path() != old_path.as_ref() {
|
||||
fs.remove_file(
|
||||
fs.rename(
|
||||
&old_path,
|
||||
RemoveOptions {
|
||||
recursive: false,
|
||||
ignore_if_not_exists: true,
|
||||
&new_path,
|
||||
RenameOptions {
|
||||
overwrite: true,
|
||||
ignore_if_exists: true,
|
||||
},
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
}
|
||||
|
||||
this.update(cx, |this, _| this.path = Some(new_path.into()))?;
|
||||
// update path before write in case it fails
|
||||
this.update(cx, {
|
||||
let new_path: Arc<Path> = new_path.clone().into();
|
||||
move |this, cx| {
|
||||
this.path = Some(new_path.clone());
|
||||
cx.emit(ContextEvent::PathChanged { old_path, new_path });
|
||||
}
|
||||
})
|
||||
.ok();
|
||||
|
||||
fs.atomic_write(new_path, serde_json::to_string(&context).unwrap())
|
||||
.await?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
@ -3277,7 +3293,7 @@ impl SavedContextV0_1_0 {
|
|||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct SavedContextMetadata {
|
||||
pub title: String,
|
||||
pub title: SharedString,
|
||||
pub path: Arc<Path>,
|
||||
pub mtime: chrono::DateTime<chrono::Local>,
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue