Use a single Text segment + indoc! in active thread preview (#30373)

Release Notes:

- N/A
This commit is contained in:
Michael Sloan 2025-05-09 14:27:05 +02:00 committed by GitHub
parent 25ced2e3c2
commit 8c8357387e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 31 additions and 15 deletions

1
Cargo.lock generated
View file

@ -3196,6 +3196,7 @@ dependencies = [
"db", "db",
"futures 0.3.31", "futures 0.3.31",
"gpui", "gpui",
"indoc",
"languages", "languages",
"log", "log",
"notifications", "notifications",

View file

@ -17,12 +17,14 @@ default = []
[dependencies] [dependencies]
agent.workspace = true agent.workspace = true
anyhow.workspace = true anyhow.workspace = true
assistant_tool.workspace = true
client.workspace = true client.workspace = true
collections.workspace = true collections.workspace = true
component.workspace = true component.workspace = true
db.workspace = true db.workspace = true
futures.workspace = true futures.workspace = true
gpui.workspace = true gpui.workspace = true
indoc.workspace = true
languages.workspace = true languages.workspace = true
log.workspace = true log.workspace = true
notifications.workspace = true notifications.workspace = true
@ -34,4 +36,3 @@ ui_input.workspace = true
util.workspace = true util.workspace = true
workspace-hack.workspace = true workspace-hack.workspace = true
workspace.workspace = true workspace.workspace = true
assistant_tool.workspace = true

View file

@ -1,12 +1,12 @@
use languages::LanguageRegistry;
use project::Project;
use std::sync::Arc;
use agent::{ActiveThread, ContextStore, MessageSegment, TextThreadStore, ThreadStore}; use agent::{ActiveThread, ContextStore, MessageSegment, TextThreadStore, ThreadStore};
use anyhow::{Result, anyhow}; use anyhow::{Result, anyhow};
use assistant_tool::ToolWorkingSet; use assistant_tool::ToolWorkingSet;
use gpui::{AppContext, AsyncApp, Entity, Task, WeakEntity}; use gpui::{AppContext, AsyncApp, Entity, Task, WeakEntity};
use indoc::indoc;
use languages::LanguageRegistry;
use project::Project;
use prompt_store::PromptBuilder; use prompt_store::PromptBuilder;
use std::sync::Arc;
use ui::{App, Window}; use ui::{App, Window};
use workspace::Workspace; use workspace::Workspace;
@ -60,16 +60,30 @@ pub fn static_active_thread(
let thread = thread_store.update(cx, |thread_store, cx| thread_store.create_thread(cx)); let thread = thread_store.update(cx, |thread_store, cx| thread_store.create_thread(cx));
thread.update(cx, |thread, cx| { thread.update(cx, |thread, cx| {
thread.insert_assistant_message(vec![ thread.insert_assistant_message(vec![
MessageSegment::Text("I'll help you fix the lifetime error in your `cx.spawn` call. When working with async operations in GPUI, there are specific patterns to follow for proper lifetime management.".to_string()), MessageSegment::Text(indoc! {"
MessageSegment::Text("\n\nLet's look at what's happening in your code:".to_string()), I'll help you fix the lifetime error in your `cx.spawn` call. When working with async operations in GPUI, there are specific patterns to follow for proper lifetime management.
MessageSegment::Text("\n\n---\n\nLet's check the current state of the active_thread.rs file to understand what might have changed:".to_string()),
MessageSegment::Text("\n\n---\n\nLooking at the implementation of `load_preview_thread_store` and understanding GPUI's async patterns, here's the issue:".to_string()), Let's look at what's happening in your code:
MessageSegment::Text("\n\n1. `load_preview_thread_store` returns a `Task<anyhow::Result<Entity<ThreadStore>>>`, which means it's already a task".to_string()),
MessageSegment::Text("\n2. When you call this function inside another `spawn` call, you're nesting tasks incorrectly".to_string()), ---
MessageSegment::Text("\n3. The `this` parameter you're trying to use in your closure has the wrong context".to_string()),
MessageSegment::Text("\n\nHere's the correct way to implement this:".to_string()), Let's check the current state of the active_thread.rs file to understand what might have changed:
MessageSegment::Text("\n\n---\n\nThe problem is in how you're setting up the async closure and trying to reference variables like `window` and `language_registry` that aren't accessible in that scope.".to_string()),
MessageSegment::Text("\n\nHere's how to fix it:".to_string()), ---
Looking at the implementation of `load_preview_thread_store` and understanding GPUI's async patterns, here's the issue:
1. `load_preview_thread_store` returns a `Task<anyhow::Result<Entity<ThreadStore>>>`, which means it's already a task.
2. When you call this function inside another `spawn` call, you're nesting tasks incorrectly.
Here's the correct way to implement this:
---
The problem is in how you're setting up the async closure and trying to reference variables like `window` and `language_registry` that aren't accessible in that scope.
Here's how to fix it:
"}.to_string()),
], cx); ], cx);
}); });
cx.new(|cx| { cx.new(|cx| {