diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/UriUtils.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/UriUtils.kt index ca5d0e21b3b..85dd12510e7 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/UriUtils.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/UriUtils.kt @@ -23,10 +23,11 @@ object UriUtils { // Remove query parameters if present val uriStr = uri.substringBefore("?") - // Handle Windows file paths with authority component + // Handle Windows file paths with authority component (e.g. file://C:/path/to/file) + // Use File.toURI() to properly percent-encode special characters like [ ] in paths if (uriStr.startsWith("file://") && !uriStr.startsWith("file:///")) { val path = uriStr.substringAfter("file://") - return URI("file:///$path") + return File(path).toURI() } return try { diff --git a/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt index a718f722bae..3bb53612edc 100644 --- a/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt +++ b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt @@ -60,4 +60,34 @@ class UriUtilsTest : TestCase() { val expectedFile = File("/path/to/file with spaces") assertEquals(expectedFile, result) } + + /** + * Validates that square brackets in file paths are handled correctly. + * This is a regression test for GitHub issue #10978. + * Frameworks like Next.js and FiveM use bracket-named directories + * (e.g. [gamemode]) which caused URI parsing to crash. + */ + fun `test square brackets in path`() { + val uri = "file:///path/to/[gamemode]/file.lua" + val result = UriUtils.uriToFile(uri) + assertEquals(File("/path/to/[gamemode]/file.lua"), result) + } + + /** + * Validates that Windows-style file URIs with square brackets are handled. + * Regression test for GitHub issue #10978 — the original crash occurred + * specifically with Windows two-slash file:// URIs. + */ + fun `test Windows path with square brackets`() { + val uri = "file://C:/Users/user/projects/[gamemode]/file.lua" + val parsed = UriUtils.parseUri(uri) + assertEquals("file", parsed.scheme) + // Brackets must be percent-encoded or absent as raw characters in a valid URI + assertFalse("Raw square brackets should not appear in URI path", + parsed.toString().contains("[") || parsed.toString().contains("]")) + assertTrue("Path should preserve directory structure", + parsed.path.contains("Users/user/projects")) + assertTrue("Path should end with file name", + parsed.path.endsWith("file.lua")) + } }