feat: support debug logs

This commit is contained in:
Carl-Robert Linnupuu 2025-11-17 10:07:12 +00:00
parent e7e9a2d9d8
commit 3f7ffb36a6
8 changed files with 55 additions and 19 deletions

View file

@ -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

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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

View file

@ -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<ConfigurationSettings>().state.debugModeEnabled
return withDebug()
.matchCompletionBrackets()
return this
.matchCompletionBrackets()
.removeSuffix()
.removeDuplicateQuotes()
.removeMiddleQuotes()
@ -275,4 +273,4 @@ class CodeCompletionFormatter(private val editor: Editor) {
return this
}
}
}

View file

@ -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

View file

@ -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)) }

View file

@ -53,7 +53,7 @@ object MarkdownUtil {
@JvmStatic
fun extractCodeBlocks(inputMarkdown: String): List<String> {
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<String>()