From 45acfe1de8cfe1344227bf95ef342d6fb2807375 Mon Sep 17 00:00:00 2001 From: kirillk Date: Tue, 23 Jun 2026 11:50:55 -0400 Subject: [PATCH] fix(jetbrains): submit typed file mentions --- .../ui/prompt/KiloPromptCompletionProvider.kt | 12 +++++++++++- .../kilocode/client/session/ui/prompt/PromptPanel.kt | 2 +- .../ui/prompt/KiloPromptCompletionProviderTest.kt | 10 ++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/KiloPromptCompletionProvider.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/KiloPromptCompletionProvider.kt index aea56f6f55..137add4417 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/KiloPromptCompletionProvider.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/KiloPromptCompletionProvider.kt @@ -48,7 +48,17 @@ class KiloPromptCompletionProvider( /** A file mention token at a caret/mouse offset, with whether it resolves to a real file. */ data class MentionHit(val start: Int, val end: Int, val value: String, val resolved: Boolean) - fun mentionPaths(): Set = paths.toSet() + fun mentionPaths(text: String? = null): Set { + val known = paths.toSet() + if (text == null) return known + return mentionSpans(text).mapNotNullTo(known.toMutableSet()) { span -> + when { + span.value in mentionNames() -> null + span.value in known || exists[span.value] == true -> span.value + else -> null + } + } + } /** * The file mention spanning [offset], or null when the offset is outside a mention, diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt index e002db5603..b6253267ca 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt @@ -521,7 +521,7 @@ class PromptPanel( ApplicationManager.getApplication().executeOnPooledThread { try { val files = items.map { it.part() } - val mentioned = onMentions(txt, completion?.mentionPaths().orEmpty()) + val mentioned = onMentions(txt, completion?.mentionPaths(txt).orEmpty()) ApplicationManager.getApplication().invokeLater { submitting = false if (project.isDisposed) return@invokeLater diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/prompt/KiloPromptCompletionProviderTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/prompt/KiloPromptCompletionProviderTest.kt index 42ff93e64d..578da45652 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/prompt/KiloPromptCompletionProviderTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/prompt/KiloPromptCompletionProviderTest.kt @@ -308,6 +308,16 @@ class KiloPromptCompletionProviderTest : BasePlatformTestCase() { ) } + fun `test mentionPaths includes existing hand typed mentions from text`() { + var done = false + rpc.fileResolver = { path -> if (path == "src/x.kt") listOf(file(path)) else emptyList() } + + provider.validate("see @src/x.kt and ${MentionAction.GIT_CHANGES.token}", -1) { done = true } + waitFor { done } + + assertEquals(setOf("src/x.kt"), provider.mentionPaths("see @src/x.kt and ${MentionAction.GIT_CHANGES.token}")) + } + fun `test mention under caret is not flagged`() { assertTrue(provider.highlights("@nope", caret = 5).isEmpty()) }