diff options
| author | Tommy D. Rossi <[email protected]> | 2025-12-14 02:56:26 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-12-13 19:56:26 -0600 |
| commit | aedb5550a87d79550ce08080ac93910a2f31b243 (patch) | |
| tree | c7d69c7355859d6c6836d4567f48e38565326546 | |
| parent | 1638ffde69e5a50e8dae77dcb52269de0c0e5d98 (diff) | |
| download | opencode-aedb5550a87d79550ce08080ac93910a2f31b243.tar.gz opencode-aedb5550a87d79550ce08080ac93910a2f31b243.zip | |
fix: limit LSP diagnostics to prevent context window waste (#5480)
Co-authored-by: Aiden Cline <[email protected]>
| -rw-r--r-- | packages/opencode/src/tool/edit.ts | 11 | ||||
| -rw-r--r-- | packages/opencode/src/tool/write.ts | 14 |
2 files changed, 19 insertions, 6 deletions
diff --git a/packages/opencode/src/tool/edit.ts b/packages/opencode/src/tool/edit.ts index a5d34c949..62814dbf9 100644 --- a/packages/opencode/src/tool/edit.ts +++ b/packages/opencode/src/tool/edit.ts @@ -18,6 +18,8 @@ import { Instance } from "../project/instance" import { Agent } from "../agent/agent" import { Snapshot } from "@/snapshot" +const MAX_DIAGNOSTICS_PER_FILE = 20 + function normalizeLineEndings(text: string): string { return text.replaceAll("\r\n", "\n") } @@ -141,10 +143,11 @@ export const EditTool = Tool.define("edit", { for (const [file, issues] of Object.entries(diagnostics)) { if (issues.length === 0) continue if (file === filePath) { - output += `\nThis file has errors, please fix\n<file_diagnostics>\n${issues - .filter((item) => item.severity === 1) - .map(LSP.Diagnostic.pretty) - .join("\n")}\n</file_diagnostics>\n` + const errors = issues.filter((item) => item.severity === 1) + const limited = errors.slice(0, MAX_DIAGNOSTICS_PER_FILE) + const suffix = + errors.length > MAX_DIAGNOSTICS_PER_FILE ? `\n... and ${errors.length - MAX_DIAGNOSTICS_PER_FILE} more` : "" + output += `\nThis file has errors, please fix\n<file_diagnostics>\n${limited.map(LSP.Diagnostic.pretty).join("\n")}${suffix}\n</file_diagnostics>\n` continue } } diff --git a/packages/opencode/src/tool/write.ts b/packages/opencode/src/tool/write.ts index 7b109261e..03f2ba891 100644 --- a/packages/opencode/src/tool/write.ts +++ b/packages/opencode/src/tool/write.ts @@ -11,6 +11,9 @@ import { Filesystem } from "../util/filesystem" import { Instance } from "../project/instance" import { Agent } from "../agent/agent" +const MAX_DIAGNOSTICS_PER_FILE = 20 +const MAX_PROJECT_DIAGNOSTICS_FILES = 5 + export const WriteTool = Tool.define("write", { description: DESCRIPTION, parameters: z.object({ @@ -77,13 +80,20 @@ export const WriteTool = Tool.define("write", { let output = "" await LSP.touchFile(filepath, true) const diagnostics = await LSP.diagnostics() + let projectDiagnosticsCount = 0 for (const [file, issues] of Object.entries(diagnostics)) { if (issues.length === 0) continue + const sorted = issues.toSorted((a, b) => (a.severity ?? 4) - (b.severity ?? 4)) + const limited = sorted.slice(0, MAX_DIAGNOSTICS_PER_FILE) + const suffix = + issues.length > MAX_DIAGNOSTICS_PER_FILE ? `\n... and ${issues.length - MAX_DIAGNOSTICS_PER_FILE} more` : "" if (file === filepath) { - output += `\nThis file has errors, please fix\n<file_diagnostics>\n${issues.map(LSP.Diagnostic.pretty).join("\n")}\n</file_diagnostics>\n` + output += `\nThis file has errors, please fix\n<file_diagnostics>\n${limited.map(LSP.Diagnostic.pretty).join("\n")}${suffix}\n</file_diagnostics>\n` continue } - output += `\n<project_diagnostics>\n${file}\n${issues.map(LSP.Diagnostic.pretty).join("\n")}\n</project_diagnostics>\n` + if (projectDiagnosticsCount >= MAX_PROJECT_DIAGNOSTICS_FILES) continue + projectDiagnosticsCount++ + output += `\n<project_diagnostics>\n${file}\n${limited.map(LSP.Diagnostic.pretty).join("\n")}${suffix}\n</project_diagnostics>\n` } return { |
