Skip to content

Commit 9b96f45

Browse files
committed
MCP Fixes
1 parent a388c87 commit 9b96f45

File tree

6 files changed

+37
-18
lines changed

6 files changed

+37
-18
lines changed

src/main/java/com/devoxx/genie/service/analyzer/DevoxxGenieGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public void generate() {
114114
indicator.setText("Scanning project structure...");
115115
indicator.setIndeterminate(true);
116116

117-
// Initialize FileScanner's gitignore parser
117+
// Initialize FileScanner's gitignore parser - runs in read action internally now
118118
fileScanner.initGitignoreParser(project, baseDir);
119119

120120
// Get ProjectFileIndex for file traversal

src/main/java/com/devoxx/genie/service/projectscanner/FileScanner.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
import com.devoxx.genie.model.ScanContentResult;
44
import com.devoxx.genie.service.DevoxxGenieSettingsService;
55
import com.devoxx.genie.ui.settings.DevoxxGenieStateService;
6+
import com.devoxx.genie.ui.util.NotificationUtil;
7+
import com.intellij.openapi.application.ApplicationManager;
68
import com.intellij.openapi.project.Project;
79
import com.intellij.openapi.project.ProjectUtil;
810
import com.intellij.openapi.roots.ProjectFileIndex;
911
import com.intellij.openapi.roots.ProjectRootManager;
12+
import com.intellij.openapi.util.Computable;
1013
import com.intellij.openapi.vfs.VfsUtilCore;
1114
import com.intellij.openapi.vfs.VirtualFile;
1215
import com.intellij.openapi.vfs.VirtualFileVisitor;
@@ -64,7 +67,7 @@ public void initGitignoreParser(Project project, VirtualFile startDirectory) {
6467
if (startDirectory == null) {
6568
// Use project base path when no specific directory is provided
6669
projectBasePath = project.getBasePath();
67-
log.info("Using project base path as startDirectory is null: " + projectBasePath);
70+
log.info("Using project base path as startDirectory is null: {}", projectBasePath);
6871
} else {
6972
projectBasePath = determineCorrectProjectBaseDir(project, startDirectory);
7073
}
@@ -74,20 +77,28 @@ public void initGitignoreParser(Project project, VirtualFile startDirectory) {
7477
return;
7578
}
7679

77-
log.info("Initializing GitIgnore parser with resolved project base directory: " + projectBasePath);
80+
log.info("Initializing GitIgnore parser with resolved project base directory: {}", projectBasePath);
7881
this.gitIgnoreFileSet = new GitIgnoreFileSet(new File(projectBasePath), false);
7982

80-
collectGitignoreFiles(startDirectory);
83+
if (startDirectory == null) {
84+
log.error("The start directory for the file scanner is null");
85+
NotificationUtil.sendNotification(project, "The start directory for the file scanner is null");
86+
} else {
87+
collectGitignoreFiles(startDirectory);
88+
}
8189
}
8290

8391
/**
8492
* Determines the most appropriate base directory, considering project modules (workspaces).
8593
*/
8694
private @Nullable String determineCorrectProjectBaseDir(@NotNull Project project, @NotNull VirtualFile startDirectory) {
8795
// First check if startDirectory belongs to an explicit module's content root
88-
ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
89-
90-
VirtualFile contentRoot = fileIndex.getContentRootForFile(startDirectory);
96+
// Wrap file index access in a read action to prevent threading issues
97+
VirtualFile contentRoot = ApplicationManager.getApplication().runReadAction((Computable<VirtualFile>) () -> {
98+
ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
99+
return fileIndex.getContentRootForFile(startDirectory);
100+
});
101+
91102
if (contentRoot != null) {
92103
log.info("Content root determined from workspace (module): " + contentRoot.getPath());
93104
return contentRoot.getPath();
@@ -180,7 +191,8 @@ public boolean visitFile(@NotNull VirtualFile file) {
180191
}
181192
} else {
182193
log.info("Checking file: " + file.getPath());
183-
boolean isInContent = fileIndex.isInContent(file);
194+
// Wrap file index access in a read action to prevent threading issues
195+
boolean isInContent = ApplicationManager.getApplication().runReadAction((Computable<Boolean>) () -> fileIndex.isInContent(file));
184196
boolean shouldNotExclude = !shouldExcludeFile(file);
185197
boolean shouldInclude = shouldIncludeFile(file);
186198
log.info("File checks: isInContent=" + isInContent + ", shouldNotExclude=" + shouldNotExclude + ", shouldInclude=" + shouldInclude);
@@ -213,7 +225,9 @@ public boolean visitFile(@NotNull VirtualFile file) {
213225
* @return the reason for skipping the file
214226
*/
215227
private String determineSkipReason(VirtualFile file, ProjectFileIndex fileIndex) {
216-
if (!fileIndex.isInContent(file)) {
228+
// Wrap file index access in a read action to prevent threading issues
229+
boolean isInContent = ApplicationManager.getApplication().runReadAction((Computable<Boolean>) () -> fileIndex.isInContent(file));
230+
if (!isInContent) {
217231
return "not in project content";
218232
}
219233

src/main/java/com/devoxx/genie/ui/MCPLogToolWindowFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.devoxx.genie.ui;
22

3+
import com.devoxx.genie.service.mcp.MCPService;
34
import com.devoxx.genie.ui.panel.mcp.MCPLogPanel;
45
import com.intellij.openapi.project.Project;
56
import com.intellij.openapi.wm.ToolWindow;
@@ -31,7 +32,7 @@ public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindo
3132
public boolean shouldBeAvailable(@NotNull Project project) {
3233
// Only show this tool window when MCP is enabled
3334
// When enabled the user can turn on/off MCP logging
34-
return com.devoxx.genie.service.mcp.MCPService.isMCPEnabled();
35+
return MCPService.isMCPEnabled();
3536
}
3637

3738
@Override

src/main/java/com/devoxx/genie/ui/panel/ActionButtonsPanel.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,17 @@
2626
import com.intellij.openapi.ui.popup.JBPopup;
2727
import com.intellij.openapi.ui.popup.JBPopupFactory;
2828
import com.intellij.openapi.vfs.VirtualFile;
29-
import com.intellij.ui.components.JBList;
30-
import com.intellij.ui.components.JBScrollPane;
29+
import com.intellij.openapi.wm.ToolWindow;
30+
import com.intellij.openapi.wm.ToolWindowManager;
3131
import lombok.Getter;
3232
import org.jetbrains.annotations.NotNull;
3333

3434
import javax.swing.*;
35-
import javax.swing.event.MouseInputAdapter;
3635
import java.awt.*;
36+
import com.intellij.ui.components.JBList;
37+
import com.intellij.ui.components.JBScrollPane;
3738
import java.awt.event.ActionEvent;
39+
import javax.swing.event.MouseInputAdapter;
3840
import java.awt.event.MouseEvent;
3941
import java.util.ArrayList;
4042
import java.util.Comparator;
@@ -120,7 +122,7 @@ private void createMCPToolsCounter() {
120122
mcpToolsCountLabel.setIconTextGap(4);
121123
mcpToolsCountLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
122124

123-
// Add click listener for showing the tool list popup
125+
// Add click listener for showing the tool list popup or opening the MCP logs panel
124126
mcpToolsCountLabel.addMouseListener(new MouseInputAdapter() {
125127
@Override
126128
public void mouseClicked(MouseEvent e) {

src/main/java/com/devoxx/genie/ui/settings/mcp/dialog/MCPServerDialog.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public MCPServerDialog(MCPServer existingServer) {
6363
gbc.fill = GridBagConstraints.HORIZONTAL;
6464
gbc.insets = new Insets(5, 5, 5, 5);
6565

66-
// Reset gridwidth for remaining components
66+
// Reset grid width for remaining components
6767
gbc.gridwidth = 1;
6868

6969
// Name field
@@ -197,7 +197,7 @@ private void testConnectionAndFetchTools() {
197197
StdioMcpTransport transport = new StdioMcpTransport.Builder()
198198
.command(mcpCommand)
199199
.environment(env)
200-
.logEvents(true)
200+
.logEvents(false)
201201
.build();
202202

203203
McpClient mcpClient = new DefaultMcpClient.Builder()

src/main/resources/META-INF/plugin.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -609,8 +609,10 @@
609609
<toolWindow id="DevoxxGenieMCPLogs"
610610
anchor="bottom"
611611
icon="/icons/logIcon.svg"
612-
factoryClass="com.devoxx.genie.ui.MCPLogToolWindowFactory"
613-
canCloseContents="true"/>
612+
secondary="true"
613+
doNotActivateOnStart="true"
614+
canCloseContents="true"
615+
factoryClass="com.devoxx.genie.ui.MCPLogToolWindowFactory"/>
614616

615617
<applicationService serviceImplementation="com.devoxx.genie.ui.settings.DevoxxGenieStateService"/>
616618
<applicationService serviceImplementation="com.devoxx.genie.service.conversations.ConversationStorageService"/>

0 commit comments

Comments
 (0)