diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/CoreMessengerManager.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/CoreMessengerManager.kt index e20173830a..c8be99f5b3 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/CoreMessengerManager.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/CoreMessengerManager.kt @@ -1,6 +1,7 @@ package com.github.continuedev.continueintellijextension.`continue` import com.github.continuedev.continueintellijextension.services.TelemetryService +import com.github.continuedev.continueintellijextension.utils.castNestedOrNull import com.github.continuedev.continueintellijextension.utils.getMachineUniqueID import com.intellij.ide.plugins.PluginManager import com.intellij.openapi.components.service @@ -59,18 +60,14 @@ class CoreMessengerManager( try { coreMessenger = CoreMessenger(project, continueCorePath, ideProtocolClient, coroutineScope) - coreMessenger?.request("config/getSerializedProfileInfo", null, null) { response -> - val responseObject = response as Map<*, *> - val responseContent = responseObject["content"] as Map<*, *> - val result = responseContent["result"] as Map<*, *> - val config = result["config"] as Map + coreMessenger?.request("config/getSerializedProfileInfo", null, null) { response -> + val allowAnonymousTelemetry = response.castNestedOrNull("content", "result", "config", "allowAnonymousTelemetry") - val allowAnonymousTelemetry = config?.get("allowAnonymousTelemetry") as? Boolean - val telemetryService = service() - if (allowAnonymousTelemetry == true || allowAnonymousTelemetry == null) { - telemetryService.setup(getMachineUniqueID()) - } + val telemetryService = service() + if (allowAnonymousTelemetry == true || allowAnonymousTelemetry == null) { + telemetryService.setup(getMachineUniqueID()) } + } // On exit, use exponential backoff to create another CoreMessenger coreMessenger?.onDidExit { diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/IdeProtocolClient.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/IdeProtocolClient.kt index 0317835976..44fc7d7426 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/IdeProtocolClient.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/IdeProtocolClient.kt @@ -518,18 +518,10 @@ class IdeProtocolClient( null ) { response -> try { - val responseObject = response as Map<*, *> - val responseContent = responseObject["content"] as Map<*, *> - val result = responseContent["result"] as Map<*, *> - val config = result["config"] as Map<*, *> - - val selectedModels = config["selectedModelByRole"] as? Map<*, *> - var applyCodeBlockModel = selectedModels?.get("apply") as? Map<*, *> + val selectedModels = response.castNestedOrNull>("content", "result", "config", "selectedModelByRole") // If "apply" role model is not found, try "chat" role - if (applyCodeBlockModel == null) { - applyCodeBlockModel = selectedModels?.get("chat") as? Map<*, *> - } + val applyCodeBlockModel = selectedModels?.get("apply") ?: selectedModels?.get("chat") if (applyCodeBlockModel != null) { continuation.resume(applyCodeBlockModel) diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt index 9565b3d1be..2766c24871 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt @@ -3,6 +3,7 @@ package com.github.continuedev.continueintellijextension.editor import com.github.continuedev.continueintellijextension.`continue`.GetTheme import com.github.continuedev.continueintellijextension.services.ContinueExtensionSettings import com.github.continuedev.continueintellijextension.services.ContinuePluginService +import com.github.continuedev.continueintellijextension.utils.castNestedOrNull import com.github.continuedev.continueintellijextension.utils.getMetaKeyLabel import com.github.continuedev.continueintellijextension.utils.getShiftKeyLabel import com.intellij.openapi.Disposable @@ -130,12 +131,11 @@ fun openInlineEdit(project: Project?, editor: Editor) { val modelTitles = mutableListOf() continuePluginService.coreMessenger?.request("config/getSerializedProfileInfo", null, null) { response -> - val content = (response as Map)["content"] as Map - val result = content["result"] as Map - val config = result["config"] as Map - val models = config["modelsByRole"] as Map - val editModels = models["edit"] as List> - modelTitles.addAll(editModels.map { it["title"] as String }) + val modelsByRole = response.castNestedOrNull>("content", "result", "config", "modelsByRole") ?: return@request + val role = if (modelsByRole.containsKey("edit")) "edit" else "chat" + modelsByRole.castNestedOrNull>(role) + ?.mapNotNull { it.castNestedOrNull("title") } + ?.let(modelTitles::addAll) } // This is a hacky way to not complicate getting model titles with coroutines diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/VerticalDiffBlock.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/VerticalDiffBlock.kt index 035c52db8a..20e8624ac0 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/VerticalDiffBlock.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/VerticalDiffBlock.kt @@ -73,8 +73,7 @@ class VerticalDiffBlock( deletedLines.add(deletedText.trimEnd()) - // Unable to ensure that text length has not changed, so we need to get it again - editor.document.deleteString(startOffset, min(endOffset, editor.document.textLength)) + editor.document.deleteString(startOffset, endOffset) } diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/utils/Utils.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/utils/Utils.kt index 7e90ba99e9..a26695b4e3 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/utils/Utils.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/utils/Utils.kt @@ -80,4 +80,16 @@ fun uuid(): String { return UUID.randomUUID().toString() } -fun VirtualFile.toUriOrNull(): String? = fileSystem.getNioPath(this)?.toUri()?.toString()?.removeSuffix("/") \ No newline at end of file +fun VirtualFile.toUriOrNull(): String? = fileSystem.getNioPath(this)?.toUri()?.toString()?.removeSuffix("/") + +inline fun Any?.castNestedOrNull(vararg keys: String): T? { + return getNestedOrNull(*keys) as? T +} + +fun Any?.getNestedOrNull(vararg keys: String): Any? { + var result = this + for (key in keys) { + result = (result as? Map<*, *>)?.get(key) ?: return null + } + return result +} \ No newline at end of file