diff --git a/README.md b/README.md index 306a8ac7..0a71a610 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ git submodule update **Tailing logs** ```shell -tail -f build/idea-sandbox/IC-2024.1.2/log/idea.log +tail -f build/idea-sandbox/IC-2025.1.1/log/idea.log ``` ## Privacy diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionClientProvider.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionClientProvider.java index aacbebba..b8c12d2f 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionClientProvider.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/CompletionClientProvider.java @@ -22,8 +22,11 @@ import java.net.InetSocketAddress; import java.net.Proxy; import java.util.concurrent.TimeUnit; import javax.net.ssl.X509TrustManager; +import com.intellij.openapi.diagnostic.Logger; import okhttp3.Credentials; import okhttp3.OkHttpClient; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; +import okhttp3.logging.HttpLoggingInterceptor; public class CompletionClientProvider { @@ -106,6 +109,16 @@ public class CompletionClientProvider { } } + if (ConfigurationSettings.getState().getDebugModeEnabled()) { + var ideLogger = Logger.getInstance(CompletionClientProvider.class); + var httpLogger = new HttpLoggingInterceptor(message -> ideLogger.info("[HTTP] " + message)); + httpLogger.setLevel(HttpLoggingInterceptor.Level.BODY); + httpLogger.redactHeader("Authorization"); + httpLogger.redactHeader("X-API-Key"); + httpLogger.redactHeader("Api-Key"); + builder.addInterceptor(httpLogger); + } + return builder .connectTimeout(advancedSettings.getConnectTimeout(), TimeUnit.SECONDS) .readTimeout(advancedSettings.getReadTimeout(), TimeUnit.SECONDS); diff --git a/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsComponent.java b/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsComponent.java index 42397497..1b060f45 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsComponent.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsComponent.java @@ -9,7 +9,9 @@ import com.intellij.ui.components.JBTextField; import com.intellij.util.ui.FormBuilder; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UI; +import com.intellij.util.ui.components.BorderLayoutPanel; import ee.carlrobert.codegpt.CodeGPTBundle; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.ui.UIUtil; import java.awt.event.ItemEvent; import java.net.Proxy; @@ -28,6 +30,7 @@ public class AdvancedSettingsComponent { private final JBPasswordField proxyAuthPassword; private final PortField connectionTimeoutField; private final PortField readTimeoutField; + private final JBCheckBox debugModeCheckBox; public AdvancedSettingsComponent(AdvancedSettingsState advancedSettings) { proxyTypeComboBox = new ComboBox<>(new Proxy.Type[]{ @@ -52,6 +55,11 @@ public class AdvancedSettingsComponent { connectionTimeoutField = new PortField(advancedSettings.getConnectTimeout()); readTimeoutField = new PortField(advancedSettings.getReadTimeout()); + debugModeCheckBox = new JBCheckBox( + "Enable debug mode", + ConfigurationSettings.getState().getDebugModeEnabled() + ); + mainPanel = FormBuilder.createFormBuilder() .addComponent(new TitledSeparator(CodeGPTBundle.get( "advancedSettingsConfigurable.proxy.title"))) @@ -60,6 +68,11 @@ public class AdvancedSettingsComponent { .addComponent(new TitledSeparator( CodeGPTBundle.get("advancedSettingsConfigurable.connectionSettings.title"))) .addComponent(createConnectionSettingsForm()) + .addVerticalGap(4) + .addComponent(new TitledSeparator("Debug")) + .addComponent(new BorderLayoutPanel() + .addToLeft(debugModeCheckBox) + .withBorder(JBUI.Borders.emptyLeft(16))) .addComponentFillVertically(new JPanel(), 0) .getPanel(); } @@ -151,5 +164,14 @@ public class AdvancedSettingsComponent { proxyAuthPassword.setText(advancedSettings.getProxyPassword()); connectionTimeoutField.setNumber(advancedSettings.getConnectTimeout()); readTimeoutField.setNumber(advancedSettings.getReadTimeout()); + debugModeCheckBox.setSelected(ConfigurationSettings.getState().getDebugModeEnabled()); + } + + public boolean isDebugModeEnabled() { + return debugModeCheckBox.isSelected(); + } + + public void setDebugModeEnabled(boolean enabled) { + debugModeCheckBox.setSelected(enabled); } } diff --git a/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsConfigurable.java b/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsConfigurable.java index 1a15d98a..f87af1c4 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsConfigurable.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsConfigurable.java @@ -2,6 +2,7 @@ package ee.carlrobert.codegpt.settings.advanced; import com.intellij.openapi.options.Configurable; import ee.carlrobert.codegpt.CodeGPTBundle; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import javax.swing.JComponent; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.Nullable; @@ -24,17 +25,22 @@ public class AdvancedSettingsConfigurable implements Configurable { @Override public boolean isModified() { - return !component.getCurrentFormState().equals(AdvancedSettings.getCurrentState()); + boolean advChanged = !component.getCurrentFormState().equals(AdvancedSettings.getCurrentState()); + boolean debugChanged = component.isDebugModeEnabled() != + ConfigurationSettings.getState().getDebugModeEnabled(); + return advChanged || debugChanged; } @Override public void apply() { AdvancedSettings.getInstance().loadState(component.getCurrentFormState()); + ConfigurationSettings.getState().setDebugModeEnabled(component.isDebugModeEnabled()); } @Override public void reset() { component.resetForm(); + component.setDebugModeEnabled(ConfigurationSettings.getState().getDebugModeEnabled()); } @Override diff --git a/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/CodeCompletionFormatter.kt b/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/CodeCompletionFormatter.kt index 8edc37ab..65191d1b 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/CodeCompletionFormatter.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/CodeCompletionFormatter.kt @@ -1,9 +1,11 @@ package ee.carlrobert.codegpt.codecompletions import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.components.service import com.intellij.openapi.diagnostic.thisLogger import com.intellij.openapi.editor.Editor import com.intellij.openapi.util.TextRange +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings import org.apache.commons.text.similarity.LevenshteinDistance import kotlin.math.min @@ -37,18 +39,14 @@ class CodeCompletionFormatter(private val editor: Editor) { private var originalCompletion = "" private var isDebugEnabled = false - fun withDebug(): CodeCompletionFormatter { - isDebugEnabled = true - return this - } - fun format(completion: String): String { this.completion = "" this.normalizedCompletion = completion.trim() this.originalCompletion = completion + this.isDebugEnabled = service().state.debugModeEnabled - return withDebug() - .matchCompletionBrackets() + return this + .matchCompletionBrackets() .removeSuffix() .removeDuplicateQuotes() .removeMiddleQuotes() @@ -275,4 +273,4 @@ class CodeCompletionFormatter(private val editor: Editor) { return this } -} \ No newline at end of file +} diff --git a/src/main/kotlin/ee/carlrobert/codegpt/inlineedit/InlineEditSearchReplaceListener.kt b/src/main/kotlin/ee/carlrobert/codegpt/inlineedit/InlineEditSearchReplaceListener.kt index d4bb3e10..db819aac 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/inlineedit/InlineEditSearchReplaceListener.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/inlineedit/InlineEditSearchReplaceListener.kt @@ -4,10 +4,10 @@ import com.intellij.diff.DiffManager import com.intellij.icons.AllIcons import com.intellij.ide.BrowserUtil import com.intellij.notification.NotificationAction -import com.intellij.openapi.components.service import com.intellij.notification.NotificationType import com.intellij.openapi.application.runInEdt import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.components.service import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.ScrollType import com.intellij.openapi.editor.ex.EditorEx @@ -25,20 +25,16 @@ import ee.carlrobert.codegpt.CodeGPTBundle import ee.carlrobert.codegpt.CodeGPTKeys import ee.carlrobert.codegpt.codecompletions.CompletionProgressNotifier import ee.carlrobert.codegpt.conversations.Conversation +import ee.carlrobert.codegpt.conversations.ConversationService +import ee.carlrobert.codegpt.conversations.message.Message +import ee.carlrobert.codegpt.toolwindow.chat.ChatToolWindowContentManager import ee.carlrobert.codegpt.toolwindow.chat.parser.ReplaceWaiting import ee.carlrobert.codegpt.toolwindow.chat.parser.SearchReplace import ee.carlrobert.codegpt.toolwindow.chat.parser.SearchWaiting import ee.carlrobert.codegpt.toolwindow.chat.parser.SseMessageParser -import ee.carlrobert.codegpt.toolwindow.chat.parser.Text -import ee.carlrobert.codegpt.toolwindow.chat.parser.CodeHeader -import ee.carlrobert.codegpt.toolwindow.chat.parser.Code -import ee.carlrobert.codegpt.toolwindow.chat.parser.CodeEnd import ee.carlrobert.codegpt.ui.OverlayUtil import ee.carlrobert.codegpt.ui.components.InlineEditChips import ee.carlrobert.codegpt.util.EditorDiffUtil -import ee.carlrobert.codegpt.toolwindow.chat.ChatToolWindowContentManager -import ee.carlrobert.codegpt.conversations.ConversationService -import ee.carlrobert.codegpt.conversations.message.Message import ee.carlrobert.llm.client.openai.completion.ErrorDetails import ee.carlrobert.llm.completion.CompletionEventListener import okhttp3.sse.EventSource diff --git a/src/main/kotlin/ee/carlrobert/codegpt/settings/configuration/ConfigurationSettings.kt b/src/main/kotlin/ee/carlrobert/codegpt/settings/configuration/ConfigurationSettings.kt index 14c195d5..4ade456f 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/settings/configuration/ConfigurationSettings.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/settings/configuration/ConfigurationSettings.kt @@ -22,6 +22,7 @@ class ConfigurationSettings : } class ConfigurationSettingsState : BaseState() { + var debugModeEnabled by property(false) var commitMessagePrompt by string(CoreActionsState.DEFAULT_GENERATE_COMMIT_MESSAGE_PROMPT) var maxTokens by property(8192) var temperature by property(0.1f) { max(0f, min(1f, it)) } diff --git a/src/main/kotlin/ee/carlrobert/codegpt/util/MarkdownUtil.kt b/src/main/kotlin/ee/carlrobert/codegpt/util/MarkdownUtil.kt index 6592b548..7e3a3be8 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/util/MarkdownUtil.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/util/MarkdownUtil.kt @@ -53,7 +53,7 @@ object MarkdownUtil { @JvmStatic fun extractCodeBlocks(inputMarkdown: String): List { val pattern = Pattern.compile( - "(?ms)```([a-zA-Z0-9_+\-]*)\s*\r?\n([\s\S]*?)\r?\n```" + "(?ms)```([a-zA-Z0-9_+\\-]*)\\s*\r?\n([\\s\\S]*?)\r?\n```" ) val matcher = pattern.matcher(inputMarkdown) val results = mutableListOf()