diff --git a/src/core/assistant-message/NativeToolCallParser.ts b/src/core/assistant-message/NativeToolCallParser.ts index a33822be28..4d3e4e55fd 100644 --- a/src/core/assistant-message/NativeToolCallParser.ts +++ b/src/core/assistant-message/NativeToolCallParser.ts @@ -328,45 +328,40 @@ export class NativeToolCallParser { entry.mode = file.mode } - // Map indentation configuration (accepts both camelCase and snake_case) + // Map indentation configuration if (file.indentation && typeof file.indentation === "object") { const indent = file.indentation const indentConfig: FileEntry["indentation"] = {} - // anchorLine (camelCase) or anchor_line (snake_case) - const anchorLineValue = indent.anchorLine ?? indent.anchor_line - if (anchorLineValue !== undefined) { - const anchorLine = Number(anchorLineValue) + // anchorLine + if (indent.anchorLine !== undefined) { + const anchorLine = Number(indent.anchorLine) if (!isNaN(anchorLine) && anchorLine > 0) { indentConfig.anchorLine = anchorLine } } - // maxLevels (camelCase) or max_levels (snake_case) - const maxLevelsValue = indent.maxLevels ?? indent.max_levels - if (maxLevelsValue !== undefined) { - const maxLevels = Number(maxLevelsValue) + // maxLevels + if (indent.maxLevels !== undefined) { + const maxLevels = Number(indent.maxLevels) if (!isNaN(maxLevels) && maxLevels >= 0) { indentConfig.maxLevels = maxLevels } } - // includeSiblings (camelCase) or include_siblings (snake_case) - const includeSiblingsValue = indent.includeSiblings ?? indent.include_siblings - if (includeSiblingsValue !== undefined) { - indentConfig.includeSiblings = Boolean(includeSiblingsValue) + // includeSiblings + if (indent.includeSiblings !== undefined) { + indentConfig.includeSiblings = Boolean(indent.includeSiblings) } - // includeHeader (camelCase) or include_header (snake_case) - const includeHeaderValue = indent.includeHeader ?? indent.include_header - if (includeHeaderValue !== undefined) { - indentConfig.includeHeader = Boolean(includeHeaderValue) + // includeHeader + if (indent.includeHeader !== undefined) { + indentConfig.includeHeader = Boolean(indent.includeHeader) } - // maxLines (camelCase) or max_lines (snake_case) - const maxLinesValue = indent.maxLines ?? indent.max_lines - if (maxLinesValue !== undefined) { - const maxLines = Number(maxLinesValue) + // maxLines + if (indent.maxLines !== undefined) { + const maxLines = Number(indent.maxLines) if (!isNaN(maxLines) && maxLines > 0) { indentConfig.maxLines = maxLines } diff --git a/src/core/assistant-message/__tests__/NativeToolCallParser.spec.ts b/src/core/assistant-message/__tests__/NativeToolCallParser.spec.ts index c7e99b604e..28ae53d2ab 100644 --- a/src/core/assistant-message/__tests__/NativeToolCallParser.spec.ts +++ b/src/core/assistant-message/__tests__/NativeToolCallParser.spec.ts @@ -50,9 +50,9 @@ describe("NativeToolCallParser", () => { offset: 50, mode: "indentation", indentation: { - anchor_line: 55, - max_levels: 2, - include_siblings: true, + anchorLine: 55, + maxLevels: 2, + includeSiblings: true, }, }, ], @@ -126,7 +126,7 @@ describe("NativeToolCallParser", () => { path: "file2.ts", offset: 100, mode: "indentation", - indentation: { max_levels: 1 }, + indentation: { maxLevels: 1 }, }, { path: "file3.ts", @@ -237,7 +237,7 @@ describe("NativeToolCallParser", () => { path: "finalized.ts", offset: 500, mode: "indentation", - indentation: { anchor_line: 520 }, + indentation: { anchorLine: 520 }, }, ], }), diff --git a/src/integrations/misc/__tests__/read-file-content.spec.ts b/src/integrations/misc/__tests__/read-file-content.spec.ts index 7507a7bbbe..bfa6fa6456 100644 --- a/src/integrations/misc/__tests__/read-file-content.spec.ts +++ b/src/integrations/misc/__tests__/read-file-content.spec.ts @@ -109,6 +109,15 @@ describe("read-file-content", () => { expect(result.content).not.toContain("\r") }) }) + + it("should only mark truncatedByLimit when more lines exist after endLine", async () => { + const content = "Line 1\nLine 2\nLine 3" + await withTempFile("slice-truncated-metadata-test.txt", content, async (filepath) => { + const result = await readSlice(filepath, 1, 3) + expect(result.metadata.hasMoreAfter).toBe(false) + expect(result.metadata.truncatedByLimit).toBe(false) + }) + }) }) describe("readIndentationBlock", () => { diff --git a/src/integrations/misc/read-file-content.ts b/src/integrations/misc/read-file-content.ts index 39879c06c1..48bfae29e1 100644 --- a/src/integrations/misc/read-file-content.ts +++ b/src/integrations/misc/read-file-content.ts @@ -226,7 +226,7 @@ export async function readSlice( let buffer = "" let startLine = 0 let endLine = 0 - let truncatedByLimit = false + let hitLimit = false const input = createReadStream(filePath) @@ -248,7 +248,7 @@ export async function readSlice( lineNumber++ // Only collect content if we haven't hit the limit yet - if (!truncatedByLimit && lineNumber >= offset && collected.length < limit) { + if (!hitLimit && lineNumber >= offset && collected.length < limit) { // Track first line collected if (startLine === 0) { startLine = lineNumber @@ -265,7 +265,7 @@ export async function readSlice( // Check if we've hit the limit if (collected.length >= limit) { - truncatedByLimit = true + hitLimit = true // Continue counting lines instead of destroying stream } } @@ -281,7 +281,7 @@ export async function readSlice( // Process any remaining data (last line without newline) if (buffer.length > 0) { lineNumber++ - if (!truncatedByLimit && lineNumber >= offset && collected.length < limit) { + if (!hitLimit && lineNumber >= offset && collected.length < limit) { if (startLine === 0) { startLine = lineNumber } @@ -321,7 +321,9 @@ export async function readSlice( } const linesReturned = collected.length + const hasMoreAfter = endLine > 0 && endLine < totalLines const linesAfterEnd = endLine > 0 ? totalLines - endLine : 0 + const truncatedByLimit = hitLimit && hasMoreAfter resolve({ content: collected.join("\n"), @@ -334,7 +336,7 @@ export async function readSlice( startLine: startLine || offset, endLine: endLine || offset, hasMoreBefore: (startLine || offset) > 1, - hasMoreAfter: linesAfterEnd > 0, + hasMoreAfter, linesBeforeStart: (startLine || offset) - 1, linesAfterEnd, truncatedByLimit,