Skip to content

Commit b1a6656

Browse files
authored
2.0.33 (#40)
* wip * wip * wip * wip
1 parent a3d541e commit b1a6656

File tree

18 files changed

+210
-83
lines changed

18 files changed

+210
-83
lines changed

core/src/main/kotlin/com/simiacryptus/cognotik/diff/FuzzyPatchMatcher.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,7 @@ open class FuzzyPatchMatcher(
650650
for (sourceLine in sourceLines) {
651651
val patchLine = sourceLine.matchingLine ?: continue
652652
// Skip if we've already processed this line
653-
if (patchLine.type == DELETE || patchLine.type == ADD) continue
653+
if (patchLine.type == ADD) continue
654654
val pairKey = Pair(sourceLine.index, patchLine.index)
655655
if (!processedPairs.add(pairKey)) continue
656656

core/src/test/kotlin/com/simiacryptus/diff/FuzzyPatchMatcherTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class FuzzyPatchMatcherTest {
2121
"/patch_add_2_lines_variant_3.json",
2222
"/patch_inner_block.json",
2323
"/patch_append_to_empty_file.json",
24+
"/patch_wrap_panel.json"
2425
)
2526
}
2627

core/src/test/kotlin/com/simiacryptus/diff/PatchTestCase.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ data class PatchTestCase(
99
val originalCode: String,
1010
val diff: String,
1111
val newCode: String,
12-
val isValid: Boolean,
12+
val isValid: Boolean?,
1313
val errors: String?
1414
) {
1515
companion object {
@@ -18,7 +18,7 @@ data class PatchTestCase(
1818
val stream = patcher.javaClass.getResourceAsStream(resourceName)
1919
?: throw IllegalArgumentException("Resource not found: $resourceName")
2020
val testCase: PatchTestCase = JsonUtil.fromJson(String(stream.readAllBytes()), PatchTestCase::class.java)
21-
if (!testCase.isValid) return
21+
if (false == testCase.isValid) return
2222
val result = patcher.applyPatch(testCase.originalCode, testCase.diff)
2323
Assertions.assertEquals(normalize(testCase.newCode), normalize(result))
2424
}

core/src/test/kotlin/com/simiacryptus/diff/PythonPatchUtilTest.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@ class PythonPatchUtilTest {
1212
fun patchTestCases() = listOf(
1313
"/patch_exact_match.json",
1414
"/patch_add_line.json",
15+
"/patch_append_line.json",
16+
"/patch_prepend_line.json",
1517
"/patch_modify_line.json",
18+
// "/yaml_min_repro.json",
1619
"/patch_remove_line.json",
1720
// "/patch_add_2_lines_variant_2.json",
1821
// "/patch_add_2_lines_variant_3.json",
19-
// "/patch_from_data_1.json",
20-
// "/patch_from_data_2.json"
22+
"/patch_inner_block.json",
23+
"/patch_append_to_empty_file.json",
24+
// "/patch_wrap_panel.json"
2125
)
2226
}
2327

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.simiacryptus.diff
2+
3+
import com.simiacryptus.cognotik.diff.FuzzyPatchMatcher
4+
import com.simiacryptus.cognotik.diff.ThermodynamicPatchMatcher
5+
import com.simiacryptus.diff.PatchTestCase.Companion.test
6+
import org.junit.jupiter.params.ParameterizedTest
7+
import org.junit.jupiter.params.provider.MethodSource
8+
9+
class ThermodynamicPatchMatcherTest {
10+
11+
companion object {
12+
@JvmStatic
13+
fun testCases() = listOf(
14+
"/patch_exact_match.json",
15+
"/patch_add_line.json",
16+
"/patch_append_line.json",
17+
"/patch_prepend_line.json",
18+
"/patch_modify_line.json",
19+
"/yaml_min_repro.json",
20+
"/patch_remove_line.json",
21+
// "/patch_add_2_lines_variant_2.json",
22+
// "/patch_add_2_lines_variant_3.json",
23+
// "/patch_inner_block.json",
24+
// "/patch_append_to_empty_file.json",
25+
// "/patch_wrap_panel.json"
26+
)
27+
}
28+
29+
@ParameterizedTest
30+
@MethodSource("testCases")
31+
fun testPatchApplication(resourceName: String) {
32+
test(resourceName, ThermodynamicPatchMatcher())
33+
}
34+
35+
}
36+

core/src/test/resources/patch_wrap_panel.json

Lines changed: 7 additions & 0 deletions
Large diffs are not rendered by default.

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
pluginName=Cognotik - Open Source Agentic Power Tools
22
pluginRepositoryUrl=https://github.com/SimiaCryptus/Cognotik
33
libraryGroup=com.simiacryptus
4-
libraryVersion=2.0.32
4+
libraryVersion=2.0.33
55
# Maven Central Publishing
66
cognotikGroup=com.cognotik
7-
cognotikVersion=2.0.32
7+
cognotikVersion=2.0.33
88
# Signing (set these in ~/.gradle/gradle.properties or as environment variables)
99
# signing.keyId=<last 8 chars of key>
1010
# signing.password=<key password>

intellij/src/main/kotlin/cognotik/actions/plan/PlanConfigDialog.kt

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import com.intellij.openapi.ui.ComboBox
55
import com.intellij.openapi.ui.DialogWrapper
66
import com.intellij.openapi.ui.Messages
77
import com.intellij.ui.components.JBList
8+
import com.intellij.ui.components.JBScrollPane
89
import com.intellij.ui.components.JBTextField
910
import com.intellij.ui.dsl.builder.Align
10-
import com.intellij.ui.dsl.builder.panel
1111
import com.simiacryptus.cognotik.chat.model.ChatModel
1212
import com.simiacryptus.cognotik.config.AppSettingsState
1313
import 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
}

intellij/src/main/kotlin/cognotik/actions/plan/TaskConfigEditDialog.kt

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.intellij.openapi.ui.ComboBox
55
import com.intellij.openapi.ui.DialogWrapper
66
import com.intellij.openapi.ui.Messages
77
import com.intellij.ui.components.JBList
8+
import com.intellij.ui.components.JBScrollPane
89
import com.intellij.ui.components.JBTextArea
910
import com.intellij.ui.components.JBTextField
1011
import com.intellij.ui.dsl.builder.Align
@@ -52,37 +53,48 @@ class TaskConfigEditDialog(
5253

5354
// For SubPlanning task settings
5455
private val subTaskConfigListModel = DefaultListModel<SubTaskConfigEntry>()
55-
private val subTaskConfigList = JBList(subTaskConfigListModel)
56+
private val subTaskConfigList = JBList(subTaskConfigListModel).apply {
57+
this.visibleRowCount = 2
58+
}
5659

5760
init {
5861
init()
5962
title = "Edit ${taskType.name} Configuration"
63+
isResizable = true
6064
}
65+
override fun getDimensionServiceKey(): String = "TaskConfigEditDialog"
6166

62-
override fun createCenterPanel(): JComponent = panel {
63-
group("Task Configuration") {
64-
row("Configuration Name:") {
65-
cell(configNameField)
66-
.align(Align.FILL)
67-
.comment("Enter a unique name for this configuration")
67+
68+
override fun createCenterPanel(): JComponent {
69+
val dialogPanel = panel {
70+
group("Task Configuration") {
71+
row("Configuration Name:") {
72+
cell(configNameField)
73+
.align(Align.FILL)
74+
.comment("Enter a unique name for this configuration")
75+
}
76+
77+
row("AI Model:") {
78+
cell(modelCombo)
79+
.align(Align.FILL)
80+
.comment("Select the AI model to use for this task type")
81+
}
6882
}
83+
// Add task-specific configuration fields
84+
createTaskSpecificFields()
6985

70-
row("AI Model:") {
71-
cell(modelCombo)
72-
.align(Align.FILL)
73-
.comment("Select the AI model to use for this task type")
86+
group("Task Type Information") {
87+
row {
88+
text(taskType.description ?: "No description available")
89+
}
7490
}
7591
}
76-
// Add task-specific configuration fields
77-
createTaskSpecificFields()
7892

79-
group("Task Type Information") {
80-
row {
81-
text(taskType.description ?: "No description available")
82-
}
93+
return JBScrollPane(dialogPanel).apply {
94+
preferredSize = Dimension(900, 700)
95+
border = BorderFactory.createEmptyBorder()
96+
horizontalScrollBarPolicy = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED
8397
}
84-
}.apply {
85-
preferredSize = Dimension(600, 500)
8698
}
8799

88100
private fun com.intellij.ui.dsl.builder.Panel.createTaskSpecificFields() {
@@ -286,13 +298,17 @@ class TaskConfigEditDialog(
286298
)
287299
return
288300
}
289-
val configDialog = TaskConfigEditDialog(null, taskType, newConfig, availableModels)
290-
if (configDialog.showAndGet()) {
291-
val config = configDialog.getConfig()
292-
val key = if (config.name != null) "${taskType.name}_${config.name}" else taskType.name
293-
parentConfig.taskSettings[key] = config
294-
subTaskConfigListModel.addElement(SubTaskConfigEntry(taskType, config, key))
301+
302+
val config = if (dialog.isQuickSelect) {
303+
newConfig
304+
} else {
305+
val configDialog = TaskConfigEditDialog(null, taskType, newConfig, availableModels)
306+
if (configDialog.showAndGet()) configDialog.getConfig() else return
295307
}
308+
309+
val key = if (config.name != null) "${taskType.name}_${config.name}" else taskType.name
310+
parentConfig.taskSettings[key] = config
311+
subTaskConfigListModel.addElement(SubTaskConfigEntry(taskType, config, key))
296312
}
297313
}
298314

0 commit comments

Comments
 (0)