@@ -5,9 +5,9 @@ import com.intellij.openapi.ui.ComboBox
55import com.intellij.openapi.ui.DialogWrapper
66import com.intellij.openapi.ui.Messages
77import com.intellij.ui.components.JBList
8+ import com.intellij.ui.components.JBScrollPane
89import com.intellij.ui.components.JBTextField
910import com.intellij.ui.dsl.builder.Align
10- import com.intellij.ui.dsl.builder.panel
1111import com.simiacryptus.cognotik.chat.model.ChatModel
1212import com.simiacryptus.cognotik.config.AppSettingsState
1313import com.simiacryptus.cognotik.models.AIModel
@@ -97,7 +97,7 @@ class PlanConfigDialog(
9797 settings.defaultModel?.model?.modelName ? : AppSettingsState .instance.smartModel?.model?.modelName
9898 toolTipText = " Default AI model for all tasks"
9999 }
100- private val parsingModelCombo =
100+ private val parsingModelCombo =
101101 ComboBox (visibleModelsCache.distinctBy { it.modelName }.map { it.modelName }.toTypedArray()).apply {
102102 maximumSize = Dimension (CONFIG_COMBO_WIDTH , CONFIG_COMBO_HEIGHT )
103103 selectedItem =
@@ -130,10 +130,11 @@ private val parsingModelCombo =
130130
131131 // Task configuration list
132132 private val taskConfigListModel = DefaultListModel <TaskConfigEntry >()
133- private val taskConfigList = JBList (taskConfigListModel).apply {
133+ private val taskConfigList = JBList (taskConfigListModel).apply {
134134 cellRenderer = TaskConfigListCellRenderer ()
135135 selectionMode = ListSelectionModel .MULTIPLE_INTERVAL_SELECTION
136136 toolTipText = " Configured tasks - double-click to edit"
137+ visibleRowCount = 2
137138 }
138139
139140
@@ -222,7 +223,7 @@ private val taskConfigList = JBList(taskConfigListModel).apply {
222223 if (dialog.showAndGet()) {
223224 val selectedTaskTypes = dialog.getSelectedTaskTypes()
224225 if (selectedTaskTypes.isEmpty()) return
225-
226+
226227 // If multiple tasks selected, use default configuration without opening edit dialog
227228 if (selectedTaskTypes.size > 1 ) {
228229 selectedTaskTypes.forEach { taskType ->
@@ -464,7 +465,7 @@ private val taskConfigList = JBList(taskConfigListModel).apply {
464465 settings.temperature = config.temperature.coerceIn(0.0 , 1.0 )
465466 settings.autoFix = config.autoFix
466467 settings.maxTaskHistoryChars = config.maxTaskHistoryChars
467- settings.maxTasksPerIteration = config.maxTasksPerIteration
468+ settings.maxTasksPerIteration = config.maxTasksPerIteration
468469 settings.maxIterations = config.maxIterations
469470 settings.defaultModel = config.defaultModel
470471 settings.parsingModel = config.parsingModel
@@ -502,7 +503,7 @@ settings.maxTasksPerIteration = config.maxTasksPerIteration
502503 }
503504 }
504505
505- config.parsingModel?.model?.modelName?.let { modelName ->
506+ config.parsingModel?.model?.modelName?.let { modelName ->
506507 visibleModelsCache.find { it.modelName == modelName }?.let { model ->
507508 settings.parsingModel = model.toApiChatModel()
508509 parsingModelCombo.selectedItem = modelName
@@ -523,7 +524,8 @@ config.parsingModel?.model?.modelName?.let { modelName ->
523524 }
524525 }
525526
526- override fun createCenterPanel (): JComponent = panel {
527+
528+ override fun createCenterPanel (): JComponent = JBScrollPane (com.intellij.ui.dsl.builder.panel {
527529 group {
528530 row(" Saved Configs:" ) {
529531 cell(savedConfigsCombo).align(Align .FILL )
@@ -562,7 +564,6 @@ config.parsingModel?.model?.modelName?.let { modelName ->
562564 button(" Copy" ) { exportTaskConfigs() }
563565 button(" Paste" ) { importTaskConfigs() }
564566 }
565-
566567 group(" Planning Settings" ) {
567568 row(" Cognitive Mode:" ) {
568569 cell(cognitiveModeCombo).align(Align .FILL ).comment(" Select the cognitive strategy for planning" )
@@ -571,12 +572,10 @@ config.parsingModel?.model?.modelName?.let { modelName ->
571572 cell(autoPlanPanel).align(Align .FILL )
572573 }
573574 }
574-
575575 row {
576576 cell(autoFixCheckbox).align(Align .FILL )
577577 .comment(" Automatically apply suggested fixes without confirmation" )
578578 }
579-
580579 row(" Temperature:" ) {
581580 cell(temperatureSlider).align(Align .FILL )
582581 .comment(" Adjust AI response creativity (higher = more creative)" )
@@ -586,23 +585,22 @@ config.parsingModel?.model?.modelName?.let { modelName ->
586585 cell(globalModelCombo).align(Align .FILL )
587586 .comment(" Default AI model for all tasks" )
588587 }
589- row(" Parsing Model:" ) {
588+ row(" Parsing Model:" ) {
590589 cell(parsingModelCombo).align(Align .FILL )
591590 .comment(" AI model for parsing and understanding tasks" )
592591 }
593592 row(" Image Chat Model:" ) {
594593 cell(imageChatModelCombo).align(Align .FILL )
595594 .comment(" Multimodal AI model for image-related tasks" )
596595 }
597-
598596 group(" Task Configurations" ) {
599597 row {
600598 scrollCell(taskConfigList)
601599 .align(Align .FILL )
602600 .comment(" Double-click to edit a task configuration" )
603601 .resizableColumn()
604602 }.resizableRow()
605- row {
603+ row {
606604 button(" Add Task Config" ) {
607605 addTaskConfig()
608606 }
@@ -630,13 +628,23 @@ row {
630628 }
631629 }
632630 }
633-
634631 }
632+ }).apply {
633+ border = null
634+ viewport.border = null
635+ horizontalScrollBarPolicy = ScrollPaneConstants .HORIZONTAL_SCROLLBAR_NEVER
635636 }
636637
637638
638639 override fun doOKAction () {
639640 updateSettings() ? : return
641+ try {
642+ val configs = AppSettingsState .instance.savedPlanConfigs ? : mutableMapOf ()
643+ configs[" Last" ] = toJson(settings)
644+ AppSettingsState .instance.savedPlanConfigs = configs
645+ } catch (e: Exception ) {
646+ log.warn(" Failed to save 'Last' configuration" , e)
647+ }
640648 super .doOKAction()
641649 }
642650
@@ -665,7 +673,7 @@ row {
665673 val model = visibleModelsCache.find { it.modelName == selectedGlobalModel }
666674 settings.defaultModel = model?.toApiChatModel()
667675 }
668- val selectedParsingModel = parsingModelCombo.selectedItem as ? String
676+ val selectedParsingModel = parsingModelCombo.selectedItem as ? String
669677 if (selectedParsingModel != null ) {
670678 val model = visibleModelsCache.find { it.modelName == selectedParsingModel }
671679 settings.parsingModel = model?.toApiChatModel()
@@ -707,7 +715,7 @@ val selectedParsingModel = parsingModelCombo.selectedItem as? String
707715 // Validation patterns
708716 private val CONFIG_NAME_PATTERN = Regex (" ^[a-zA-Z0-9_ -]+$" )
709717
710- fun isVisible (chatModel : AIModel ) =
718+ fun isVisible (chatModel : AIModel ) =
711719 ApplicationServices .fileApplicationServices().userSettingsManager.getUserSettings().apis.filter { it.key != null }
712720 .any { it.provider == chatModel.provider }
713721 }
0 commit comments