Skip to content

Commit 23a1bff

Browse files
committed
feat(mcp): replace prompt field with markdown editor in config dialog #371
Replace LanguageTextField with EditorEx for system prompt editing to provide better markdown editing experience. Also adjust component sizes in both dialogs for consistency.
1 parent 1f33510 commit 23a1bff

File tree

2 files changed

+32
-13
lines changed

2 files changed

+32
-13
lines changed

core/src/main/kotlin/cc/unitmesh/devti/mcp/ui/McpLlmConfigDialog.kt

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package cc.unitmesh.devti.mcp.ui
22

3+
import cc.unitmesh.devti.AutoDevSnippetFile
4+
import cc.unitmesh.devti.sketch.ui.code.EditorUtil
5+
import cc.unitmesh.devti.sketch.ui.code.findDocument
36
import com.intellij.openapi.project.Project
47
import com.intellij.openapi.ui.DialogWrapper
58
import com.intellij.ui.LanguageTextField
@@ -14,6 +17,11 @@ import io.modelcontextprotocol.kotlin.sdk.Tool
1417
import javax.swing.JComponent
1518
import javax.swing.JSlider
1619
import cc.unitmesh.devti.util.parser.CodeFence
20+
import com.intellij.openapi.editor.Document
21+
import com.intellij.openapi.editor.EditorFactory
22+
import com.intellij.openapi.editor.EditorKind
23+
import com.intellij.openapi.editor.ex.EditorEx
24+
import com.intellij.testFramework.LightVirtualFile
1725

1826
class McpLlmConfigDialog(
1927
private val project: Project,
@@ -22,26 +30,36 @@ class McpLlmConfigDialog(
2230
) : DialogWrapper(project) {
2331
private lateinit var temperatureSlider: JSlider
2432
private val toolCheckboxes = mutableMapOf<String, JBCheckBox>()
25-
private lateinit var promptField: LanguageTextField
33+
private var markdownEditor: EditorEx?
2634

2735
init {
2836
title = "Chatbot Configuration"
2937
allTools.forEach { (serverName, tools) ->
3038
config.enabledTools.addAll(tools)
3139
}
3240

41+
val language = CodeFence.findLanguage("Markdown")
42+
val systemPrompt = config.createSystemPrompt()
43+
val file = LightVirtualFile(AutoDevSnippetFile.naming("md"), language, systemPrompt)
44+
markdownEditor = try {
45+
val document: Document = file.findDocument() ?: throw IllegalStateException("Document not found")
46+
EditorFactory.getInstance().createEditor(document, project, EditorKind.MAIN_EDITOR) as? EditorEx
47+
} catch (e: Throwable) {
48+
throw e
49+
}
50+
51+
if (markdownEditor != null) {
52+
EditorUtil.configEditor(markdownEditor!!, project, file, false)
53+
}
54+
3355
init()
3456
}
3557

3658
/**
3759
* Based on https://github.com/jujumilk3/leaked-system-prompts/blob/main/anthropic-claude-api-tool-use_20250119.md
3860
*/
3961
override fun createCenterPanel(): JComponent {
40-
val systemPrompt = config.createSystemPrompt()
4162
val language = CodeFence.findLanguage("markdown")
42-
promptField = LanguageTextField(language, project, systemPrompt).also {
43-
it.preferredSize = JBUI.size(640, 320)
44-
}
4563

4664
return panel {
4765
row {
@@ -77,13 +95,15 @@ class McpLlmConfigDialog(
7795
}
7896
}
7997
}.topGap(TopGap.MEDIUM)
80-
group("System Prompt") {
98+
if (markdownEditor != null) {
8199
row {
82-
cell(promptField)
83-
.align(FILL)
100+
cell(markdownEditor!!.component)
84101
.resizableColumn()
102+
.applyToComponent {
103+
preferredSize = JBUI.size(500, 320)
104+
}
85105
}
86-
}.topGap(TopGap.MEDIUM)
106+
}
87107
}.withPreferredSize(500, 600)
88108
}
89109

core/src/main/kotlin/cc/unitmesh/devti/mcp/ui/McpToolDetailDialog.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import cc.unitmesh.devti.provider.local.JsonLanguageField
66
import com.intellij.openapi.project.Project
77
import com.intellij.openapi.ui.DialogWrapper
88
import com.intellij.ui.JBColor
9-
import com.intellij.ui.components.JBLabel
109
import com.intellij.ui.components.JBScrollPane
1110
import com.intellij.ui.dsl.builder.panel
1211
import com.intellij.util.ui.JBUI
@@ -19,7 +18,6 @@ import java.awt.BorderLayout
1918
import java.awt.Dimension
2019
import java.awt.FlowLayout
2120
import javax.swing.*
22-
import javax.swing.border.CompoundBorder
2321

2422
class McpToolDetailDialog(
2523
private val project: Project,
@@ -67,6 +65,7 @@ class McpToolDetailDialog(
6765
isEditable = false
6866
background = null
6967
border = null
68+
preferredSize = Dimension(600, preferredSize.height)
7069
}
7170
cell(descLabel).resizableColumn()
7271
}
@@ -89,7 +88,7 @@ class McpToolDetailDialog(
8988
cell(jsonLanguageField!!)
9089
.resizableColumn()
9190
.applyToComponent {
92-
preferredSize = Dimension(550, 200)
91+
preferredSize = Dimension(550, preferredSize.height)
9392
}
9493
}
9594
}
@@ -99,7 +98,7 @@ class McpToolDetailDialog(
9998
cell(resultPanel!!)
10099
.resizableColumn()
101100
.applyToComponent {
102-
preferredSize = Dimension(550, 200)
101+
preferredSize = Dimension(550, preferredSize.height)
103102
}
104103
}
105104
}

0 commit comments

Comments
 (0)