From e36e954276307357e314bae3542125502dfbca22 Mon Sep 17 00:00:00 2001 From: Carl-Robert Linnupuu Date: Mon, 19 Aug 2024 12:39:55 +0300 Subject: [PATCH] fix: use personas only within current chat session context --- .../ee/carlrobert/codegpt/CodeGPTKeys.java | 3 +++ .../CompletionRequestProvider.java | 11 +++++++++-- .../conversations/message/Message.java | 10 ++++++++++ .../chat/ChatToolWindowTabPanel.java | 13 ++++++++++++- .../codegpt/ui/textarea/PromptTextField.kt | 6 +----- .../suggestion/SuggestionsPopupManager.kt | 2 -- .../suggestion/item/SuggestionActionItems.kt | 19 +++++++------------ 7 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java b/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java index e45f80e8..43c139f3 100644 --- a/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java +++ b/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java @@ -1,6 +1,7 @@ package ee.carlrobert.codegpt; import com.intellij.openapi.util.Key; +import ee.carlrobert.codegpt.settings.persona.PersonaDetails; import ee.carlrobert.codegpt.ui.DocumentationDetails; import ee.carlrobert.llm.client.codegpt.CodeGPTUserDetails; import java.util.List; @@ -17,4 +18,6 @@ public class CodeGPTKeys { Key.create("codegpt.userDetails"); public static final Key ADDED_DOCUMENTATION = Key.create("codegpt.addedDocumentation"); + public static final Key ADDED_PERSONA = + Key.create("codegpt.addedPersona"); } diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java index 7d5b1f71..e1d21b66 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java @@ -410,8 +410,15 @@ public class CompletionRequestProvider { var message = callParameters.getMessage(); var messages = new ArrayList(); if (callParameters.getConversationType() == ConversationType.DEFAULT) { - messages.add( - new OpenAIChatCompletionStandardMessage("system", PersonaSettings.getSystemPrompt())); + var sessionPersonaDetails = callParameters.getMessage().getPersonaDetails(); + if (callParameters.getMessage().getPersonaDetails() == null) { + messages.add( + new OpenAIChatCompletionStandardMessage("system", PersonaSettings.getSystemPrompt())); + } else { + messages.add(new OpenAIChatCompletionStandardMessage( + "system", + sessionPersonaDetails.instructions())); + } } if (callParameters.getConversationType() == ConversationType.FIX_COMPILE_ERRORS) { messages.add( diff --git a/src/main/java/ee/carlrobert/codegpt/conversations/message/Message.java b/src/main/java/ee/carlrobert/codegpt/conversations/message/Message.java index c9a405cf..473101b3 100644 --- a/src/main/java/ee/carlrobert/codegpt/conversations/message/Message.java +++ b/src/main/java/ee/carlrobert/codegpt/conversations/message/Message.java @@ -2,6 +2,7 @@ package ee.carlrobert.codegpt.conversations.message; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import ee.carlrobert.codegpt.settings.persona.PersonaDetails; import ee.carlrobert.codegpt.ui.DocumentationDetails; import ee.carlrobert.llm.client.you.completion.YouSerpResult; import java.util.List; @@ -20,6 +21,7 @@ public class Message { private @Nullable String imageFilePath; private boolean webSearchIncluded; private DocumentationDetails documentationDetails; + private PersonaDetails personaDetails; public Message(String prompt, String response) { this(prompt); @@ -100,6 +102,14 @@ public class Message { this.documentationDetails = documentationDetails; } + public PersonaDetails getPersonaDetails() { + return personaDetails; + } + + public void setPersonaDetails(PersonaDetails personaDetails) { + this.personaDetails = personaDetails; + } + @Override public boolean equals(Object obj) { if (obj == this) { diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java index 8bbf8d92..6f3e6966 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java @@ -31,6 +31,8 @@ import ee.carlrobert.codegpt.toolwindow.ui.ChatToolWindowLandingPanel; import ee.carlrobert.codegpt.ui.OverlayUtil; import ee.carlrobert.codegpt.ui.textarea.AppliedActionInlay; import ee.carlrobert.codegpt.ui.textarea.UserInputPanel; +import ee.carlrobert.codegpt.ui.textarea.suggestion.item.DocumentationActionItem; +import ee.carlrobert.codegpt.ui.textarea.suggestion.item.PersonaActionItem; import ee.carlrobert.codegpt.ui.textarea.suggestion.item.WebSearchActionItem; import ee.carlrobert.codegpt.util.EditorUtil; import ee.carlrobert.codegpt.util.file.FileUtil; @@ -260,10 +262,19 @@ public class ChatToolWindowTabPanel implements Disposable { .anyMatch(it -> it.getSuggestion() instanceof WebSearchActionItem)); var addedDocumentation = CodeGPTKeys.ADDED_DOCUMENTATION.get(project); - if (addedDocumentation != null) { + var appliedInlayExists = appliedInlayActions.stream() + .anyMatch(it -> it.getSuggestion() instanceof DocumentationActionItem); + if (addedDocumentation != null && appliedInlayExists) { message.setDocumentationDetails(addedDocumentation); } + var addedPersona = CodeGPTKeys.ADDED_PERSONA.get(project); + var personaInlayExists = appliedInlayActions.stream() + .anyMatch(it -> it.getSuggestion() instanceof PersonaActionItem); + if (addedPersona != null && personaInlayExists) { + message.setPersonaDetails(addedPersona); + } + sendMessage(message, ConversationType.DEFAULT); return Unit.INSTANCE; } diff --git a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/PromptTextField.kt b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/PromptTextField.kt index 36bcedd1..3957e8a5 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/PromptTextField.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/PromptTextField.kt @@ -4,7 +4,6 @@ import com.intellij.ide.IdeEventQueue import com.intellij.openapi.Disposable import com.intellij.openapi.application.runInEdt import com.intellij.openapi.application.runUndoTransparentWriteAction -import com.intellij.openapi.components.service import com.intellij.openapi.editor.Inlay import com.intellij.openapi.editor.event.DocumentEvent import com.intellij.openapi.editor.event.DocumentListener @@ -15,7 +14,6 @@ import com.intellij.ui.ComponentUtil.findParentByCondition import com.intellij.ui.EditorTextField import com.intellij.util.ui.JBUI import ee.carlrobert.codegpt.CodeGPTBundle -import ee.carlrobert.codegpt.CodeGPTKeys import ee.carlrobert.codegpt.ui.textarea.suggestion.SuggestionsPopupManager import ee.carlrobert.codegpt.ui.textarea.suggestion.item.SuggestionActionItem import ee.carlrobert.codegpt.ui.textarea.suggestion.item.SuggestionItem @@ -59,7 +57,7 @@ class PromptTextField( ) } - fun addInlineText(actionPrefix: String, text: String?, actionItem: SuggestionActionItem) { + fun addInlayElement(actionPrefix: String, text: String?, actionItem: SuggestionActionItem) { editor?.let { val startOffset = it.caretModel.offset - 1 @@ -114,8 +112,6 @@ class PromptTextField( onTextChanged(event.document.text) if (event.document.text.isEmpty()) { - project.service().removeFilesFromSession() - project.putUserData(CodeGPTKeys.ADDED_DOCUMENTATION, null) suggestionsPopupManager.hidePopup() clearInlays() return diff --git a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/SuggestionsPopupManager.kt b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/SuggestionsPopupManager.kt index 46b33c29..61b9784d 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/SuggestionsPopupManager.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/SuggestionsPopupManager.kt @@ -91,8 +91,6 @@ class SuggestionsPopupManager( listModel.clear() } listModel.addAll(defaultActions) - popup?.content?.revalidate() - popup?.content?.repaint() } private fun handleSuggestionItemSelection(item: SuggestionItem) { diff --git a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/item/SuggestionActionItems.kt b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/item/SuggestionActionItems.kt index 46e3fb22..01ee4645 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/item/SuggestionActionItems.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/item/SuggestionActionItems.kt @@ -11,7 +11,6 @@ import ee.carlrobert.codegpt.settings.GeneralSettings import ee.carlrobert.codegpt.settings.documentation.DocumentationSettings import ee.carlrobert.codegpt.settings.documentation.DocumentationsConfigurable import ee.carlrobert.codegpt.settings.persona.PersonaDetails -import ee.carlrobert.codegpt.settings.persona.PersonaSettings import ee.carlrobert.codegpt.settings.persona.PersonasConfigurable import ee.carlrobert.codegpt.settings.service.ServiceType import ee.carlrobert.codegpt.ui.AddDocumentationDialog @@ -25,7 +24,7 @@ class FileActionItem(val file: VirtualFile) : SuggestionActionItem { override fun execute(project: Project, textPane: PromptTextField) { project.getService(FileSearchService::class.java).addFileToSession(file) - textPane.addInlineText("file", file.name, this) + textPane.addInlayElement("file", file.name, this) } } @@ -38,7 +37,7 @@ class FolderActionItem(val folder: VirtualFile) : SuggestionActionItem { folder.children .filter { !it.isDirectory } .forEach { fileSearchService.addFileToSession(it) } - textPane.addInlineText("folder", folder.path, this) + textPane.addInlayElement("folder", folder.path, this) } } @@ -47,12 +46,8 @@ class PersonaActionItem(val personaDetails: PersonaDetails) : SuggestionActionIt override val icon = AllIcons.General.User override fun execute(project: Project, textPane: PromptTextField) { - service().state.selectedPersona.apply { - id = personaDetails.id - name = personaDetails.name - instructions = personaDetails.instructions - } - textPane.addInlineText("persona", personaDetails.name, this) + CodeGPTKeys.ADDED_PERSONA.set(project, personaDetails) + textPane.addInlayElement("persona", personaDetails.name, this) } } @@ -66,7 +61,7 @@ class DocumentationActionItem( override fun execute(project: Project, textPane: PromptTextField) { CodeGPTKeys.ADDED_DOCUMENTATION.set(project, documentationDetails) service().updateLastUsedDateTime(documentationDetails.url) - textPane.addInlineText("doc", documentationDetails.name, this) + textPane.addInlayElement("doc", documentationDetails.name, this) } } @@ -81,7 +76,7 @@ class CreateDocumentationActionItem : SuggestionActionItem { if (addDocumentationDialog.showAndGet()) { service() .updateLastUsedDateTime(addDocumentationDialog.documentationDetails.url) - textPane.addInlineText( + textPane.addInlayElement( "doc", addDocumentationDialog.documentationDetails.name, this @@ -124,6 +119,6 @@ class WebSearchActionItem : SuggestionActionItem { override val enabled = GeneralSettings.getSelectedService() == ServiceType.CODEGPT override fun execute(project: Project, textPane: PromptTextField) { - textPane.addInlineText("web", null, this) + textPane.addInlayElement("web", null, this) } } \ No newline at end of file