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 {