From 6c1a1a77b762dbde875f0325ca43903c2c0840b6 Mon Sep 17 00:00:00 2001 From: David Hill Date: Tue, 16 Dec 2025 11:50:23 +0000 Subject: [PATCH] fix: strip parentheses from file paths generated by llm --- .opencode/bun.lock | 6 +++--- .opencode/package.json | 2 +- packages/ui/src/components/markdown.tsx | 8 +++++++- packages/web/src/components/share/content-markdown.tsx | 8 +++++++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.opencode/bun.lock b/.opencode/bun.lock index f152a1646f..53bb80050a 100644 --- a/.opencode/bun.lock +++ b/.opencode/bun.lock @@ -5,7 +5,7 @@ "": { "dependencies": { "@octokit/rest": "^22.0.1", - "@opencode-ai/plugin": "0.0.0-dev-202512160508", + "@opencode-ai/plugin": "1.0.162", }, }, }, @@ -34,9 +34,9 @@ "@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], - "@opencode-ai/plugin": ["@opencode-ai/plugin@0.0.0-dev-202512160508", "", { "dependencies": { "@opencode-ai/sdk": "0.0.0-dev-202512160508", "zod": "4.1.8" } }, "sha512-GLnvMQhEWRHG9E84FyyQKPKi54bGUkytXPfZYjwNy9W6djw8zAW/kpeYPrdIJHPdTHk4OjIHEwoB1SXZzGaLFQ=="], + "@opencode-ai/plugin": ["@opencode-ai/plugin@1.0.162", "", { "dependencies": { "@opencode-ai/sdk": "1.0.162", "zod": "4.1.8" } }, "sha512-tiJw7SCfSlG/3tY2O0J2UT06OLuazOzsv1zYlFbLxLy/EVedtW0pzxYalO20a4e//vInvOXFkhd2jLyB5vNEVA=="], - "@opencode-ai/sdk": ["@opencode-ai/sdk@0.0.0-dev-202512160508", "", {}, "sha512-ICpZ1bX528yQKqYGGyUJQMu3RY0F1pQ6RCoTJ4ESLiYmcXUY1EldgIidiwPA+A/zpEXLu2lPwPZ1LYn/bX6aFA=="], + "@opencode-ai/sdk": ["@opencode-ai/sdk@1.0.162", "", {}, "sha512-+XqRErBUt9eb1m3i/7WkZc/QCKCCjTaGV3MvhLhs/CUwbUn767D/ugzcG/i2ec8j/4nQmjJbjPDRmrQfvF1Qjw=="], "before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], diff --git a/.opencode/package.json b/.opencode/package.json index 88fd8e8911..3b93206b86 100644 --- a/.opencode/package.json +++ b/.opencode/package.json @@ -1,6 +1,6 @@ { "dependencies": { "@octokit/rest": "^22.0.1", - "@opencode-ai/plugin": "0.0.0-dev-202512160508" + "@opencode-ai/plugin": "1.0.162" } } diff --git a/packages/ui/src/components/markdown.tsx b/packages/ui/src/components/markdown.tsx index 071132e80b..7524f89212 100644 --- a/packages/ui/src/components/markdown.tsx +++ b/packages/ui/src/components/markdown.tsx @@ -7,6 +7,12 @@ function strip(text: string): string { return match ? match[2] : text } +function removeParensAroundFileRefs(text: string): string { + // Remove parentheses around inline code that looks like a file reference + // Matches: (`path/to/file.ext`) or (`path/to/file.ext:1-10`) or (`file.ext:42`) + return text.replace(/\(\s*(`[^`]+\.[a-zA-Z0-9]+(?::\d+(?:-\d+)?)?`)\s*\)/g, "$1") +} + export function Markdown( props: ComponentProps<"div"> & { text: string @@ -17,7 +23,7 @@ export function Markdown( const [local, others] = splitProps(props, ["text", "class", "classList"]) const marked = useMarked() const [html] = createResource( - () => strip(local.text), + () => removeParensAroundFileRefs(strip(local.text)), async (markdown) => { return marked.parse(markdown) }, diff --git a/packages/web/src/components/share/content-markdown.tsx b/packages/web/src/components/share/content-markdown.tsx index 69cde82b2c..db3f4a5166 100644 --- a/packages/web/src/components/share/content-markdown.tsx +++ b/packages/web/src/components/share/content-markdown.tsx @@ -29,7 +29,7 @@ interface Props { } export function ContentMarkdown(props: Props) { const [html] = createResource( - () => strip(props.text), + () => removeParensAroundFileRefs(strip(props.text)), async (markdown) => { return markedWithShiki.parse(markdown) }, @@ -65,3 +65,9 @@ function strip(text: string): string { const match = text.match(wrappedRe) return match ? match[2] : text } + +function removeParensAroundFileRefs(text: string): string { + // Remove parentheses around inline code that looks like a file reference + // Matches: (`path/to/file.ext`) or (`path/to/file.ext:1-10`) or (`file.ext:42`) + return text.replace(/\(\s*(`[^`]+\.[a-zA-Z0-9]+(?::\d+(?:-\d+)?)?`)\s*\)/g, "$1") +}