From 7ca362c2d22c306d1d4eae255d317c538a0d6be4 Mon Sep 17 00:00:00 2001 From: "Artem.Bukhonov" Date: Thu, 12 Mar 2026 23:02:16 +0100 Subject: [PATCH] IJPL-239066 Common overload for executing and debugging (cherry picked from commit bf8bc613c16ce12da46bce0068b2190f4df83222) GitOrigin-RevId: a546cdb25dfa79aeb76e4cd97fcea2812396e23d --- .../messages/McpServerBundle.properties | 1 + .../toolsets/general/ExecutionToolset.kt | 37 ++++++++++++++++++- .../intellij/mcpserver/util/execution.util.kt | 9 ++++- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/plugins/mcp-server/resources/messages/McpServerBundle.properties b/plugins/mcp-server/resources/messages/McpServerBundle.properties index ef707c02b4c8..daa4ef19a808 100644 --- a/plugins/mcp-server/resources/messages/McpServerBundle.properties +++ b/plugins/mcp-server/resources/messages/McpServerBundle.properties @@ -79,6 +79,7 @@ tool.activity.getting.symbol.info=Getting symbol info at ''{0}:{1}:{2}'' tool.activity.renaming.symbol=Renaming ''{0}'' to ''{1}'' in ''{2}'' tool.activity.getting.run.configurations=Getting run configurations tool.activity.executing.run.configuration=Executing run configuration ''{0}'' +tool.activity.starting.debug.run.configuration=Starting debug run configuration ''{0}'' tool.activity.collecting.file.problems=Collecting problems in file ''{0}'' tool.activity.listing.modules=Listing modules tool.activity.checking.dependencies=Checking dependencies diff --git a/plugins/mcp-server/src/com/intellij/mcpserver/toolsets/general/ExecutionToolset.kt b/plugins/mcp-server/src/com/intellij/mcpserver/toolsets/general/ExecutionToolset.kt index ffa167f45296..c15ca9439972 100644 --- a/plugins/mcp-server/src/com/intellij/mcpserver/toolsets/general/ExecutionToolset.kt +++ b/plugins/mcp-server/src/com/intellij/mcpserver/toolsets/general/ExecutionToolset.kt @@ -134,9 +134,41 @@ class ExecutionToolset : McpToolset { workingDirectory: String? = null, @McpDescription("Optional environment variable overrides for this launch only. Missing/null keeps existing env unchanged; when provided, values are merged over existing env.") envs: Map? = null, - ): RunConfigurationResult { + ): RunConfigurationResult { + return executeRunConfiguration( + configurationName = configurationName, + filePath = filePath, + line = line, + timeout = timeout, + maxLinesCount = maxLinesCount, + truncateMode = truncateMode, + programArguments = programArguments, + workingDirectory = workingDirectory, + envs = envs, + isDebug = false, + ) + } + + // for start_debug_session + suspend fun executeRunConfiguration( + configurationName: String? = null, + filePath: String? = null, + line: Int? = null, + timeout: Int, + maxLinesCount: Int, + truncateMode: TruncateMode, + programArguments: String?, + workingDirectory: String?, + envs: Map?, + isDebug: Boolean, + ): RunConfigurationResult { val executionTarget = resolveRunConfigurationExecutionTarget(configurationName = configurationName, filePath = filePath, line = line) - currentCoroutineContext().reportToolActivity(McpServerBundle.message("tool.activity.executing.run.configuration", executionTarget.presentableName)) + currentCoroutineContext().reportToolActivity( + McpServerBundle.message( + if (isDebug) "tool.activity.starting.debug.run.configuration" else "tool.activity.executing.run.configuration", + executionTarget.presentableName, + ) + ) val project = currentCoroutineContext().project val resolvedConfiguration = resolveRunConfigurationForExecution( @@ -162,6 +194,7 @@ class ExecutionToolset : McpToolset { timeout = timeout, maxLinesCount = maxLinesCount, truncateMode = truncateMode, + isDebug = isDebug, ) return RunConfigurationResult( exitCode = executionOutput.exitCode, diff --git a/plugins/mcp-server/src/com/intellij/mcpserver/util/execution.util.kt b/plugins/mcp-server/src/com/intellij/mcpserver/util/execution.util.kt index 1248efc74714..ca1ad808b8b8 100644 --- a/plugins/mcp-server/src/com/intellij/mcpserver/util/execution.util.kt +++ b/plugins/mcp-server/src/com/intellij/mcpserver/util/execution.util.kt @@ -7,6 +7,7 @@ import com.intellij.execution.RunnerAndConfigurationSettings import com.intellij.execution.actions.ConfigurationContext import com.intellij.execution.actions.ConfigurationFromContext import com.intellij.execution.configurations.RunConfiguration +import com.intellij.execution.executors.DefaultDebugExecutor import com.intellij.execution.executors.DefaultRunExecutor import com.intellij.execution.lineMarker.RunLineMarkerContributor import com.intellij.execution.lineMarker.RunLineMarkerContributor.Info @@ -259,8 +260,14 @@ internal suspend fun executeResolvedRunConfiguration( timeout: Int, maxLinesCount: Int, truncateMode: TruncateMode, + isDebug: Boolean, ): RunConfigurationExecutionOutput { - val executor = DefaultRunExecutor.getRunExecutorInstance() ?: mcpFail("Execution is not supported in this environment or IDE") + val executor = if (isDebug) { + DefaultDebugExecutor.getDebugExecutorInstance() ?: mcpFail("Debugging is not available in this environment or IDE.") + } + else { + DefaultRunExecutor.getRunExecutorInstance() ?: mcpFail("Execution is not supported in this environment or IDE") + } val exitCodeDeferred = CompletableDeferred() val outputBuilder = StringBuilder()