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\n${issues - .filter((item) => item.severity === 1) - .map(LSP.Diagnostic.pretty) - .join("\n")}\n\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\n${limited.map(LSP.Diagnostic.pretty).join("\n")}${suffix}\n\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\n${issues.map(LSP.Diagnostic.pretty).join("\n")}\n\n` + output += `\nThis file has errors, please fix\n\n${limited.map(LSP.Diagnostic.pretty).join("\n")}${suffix}\n\n` continue } - output += `\n\n${file}\n${issues.map(LSP.Diagnostic.pretty).join("\n")}\n\n` + if (projectDiagnosticsCount >= MAX_PROJECT_DIAGNOSTICS_FILES) continue + projectDiagnosticsCount++ + output += `\n\n${file}\n${limited.map(LSP.Diagnostic.pretty).join("\n")}${suffix}\n\n` } return {