assistant2: Deploy inline assistant in PromptEditor (#25094)

Agus Zubiaga and Danilo Leal created

Release Notes:

- N/A

Co-authored-by: Danilo Leal <daniloleal09@gmail.com>

Change summary

crates/assistant2/src/assistant_panel.rs  |  4 ++++
crates/assistant2/src/inline_assistant.rs | 24 +++++++++++++++++++++---
2 files changed, 25 insertions(+), 3 deletions(-)

Detailed changes

crates/assistant2/src/assistant_panel.rs 🔗

@@ -478,6 +478,10 @@ impl AssistantPanel {
             .update(cx, |this, cx| this.delete_thread(thread_id, cx))
             .detach_and_log_err(cx);
     }
+
+    pub(crate) fn active_context_editor(&self) -> Option<Entity<ContextEditor>> {
+        self.context_editor.clone()
+    }
 }
 
 impl Focusable for AssistantPanel {

crates/assistant2/src/inline_assistant.rs 🔗

@@ -228,8 +228,12 @@ impl InlineAssistant {
             return;
         }
 
-        let Some(inline_assist_target) = Self::resolve_inline_assist_target(workspace, window, cx)
-        else {
+        let Some(inline_assist_target) = Self::resolve_inline_assist_target(
+            workspace,
+            workspace.panel::<AssistantPanel>(cx),
+            window,
+            cx,
+        ) else {
             return;
         };
 
@@ -1383,6 +1387,7 @@ impl InlineAssistant {
 
     fn resolve_inline_assist_target(
         workspace: &mut Workspace,
+        assistant_panel: Option<Entity<AssistantPanel>>,
         window: &mut Window,
         cx: &mut App,
     ) -> Option<InlineAssistTarget> {
@@ -1402,7 +1407,20 @@ impl InlineAssistant {
             }
         }
 
-        if let Some(workspace_editor) = workspace
+        let context_editor = assistant_panel
+            .and_then(|panel| panel.read(cx).active_context_editor())
+            .and_then(|editor| {
+                let editor = &editor.read(cx).editor().clone();
+                if editor.read(cx).is_focused(window) {
+                    Some(editor.clone())
+                } else {
+                    None
+                }
+            });
+
+        if let Some(context_editor) = context_editor {
+            Some(InlineAssistTarget::Editor(context_editor))
+        } else if let Some(workspace_editor) = workspace
             .active_item(cx)
             .and_then(|item| item.act_as::<Editor>(cx))
         {