fix: guard countMarkdownHeadings against non-string input

When a subtask returns to the main task, message.text can be a
non-string truthy value (e.g. array or object). The existing falsy
check (!text) lets these through, causing a TypeError on .replace().

Add a typeof check so non-string values safely return 0.

Fixes #11881
This commit is contained in:
Roo Code 2026-03-07 07:53:13 +00:00
parent 0892455db2
commit dbc1d29d4d
2 changed files with 9 additions and 1 deletions

View file

@ -8,6 +8,14 @@ describe("markdown heading helpers", () => {
expect(countMarkdownHeadings("")).toBe(0)
})
it("returns 0 for non-string truthy values", () => {
// When subtasks return to main task, message.text can be a non-string value
expect(countMarkdownHeadings(["# heading"] as unknown as string)).toBe(0)
expect(countMarkdownHeadings({ text: "# heading" } as unknown as string)).toBe(0)
expect(countMarkdownHeadings(42 as unknown as string)).toBe(0)
expect(countMarkdownHeadings(true as unknown as string)).toBe(0)
})
it("counts single and multiple headings", () => {
expect(countMarkdownHeadings("# One")).toBe(1)
expect(countMarkdownHeadings("# One\nContent")).toBe(1)

View file

@ -4,7 +4,7 @@
* Code fences are stripped before matching to avoid false positives.
*/
export function countMarkdownHeadings(text: string | undefined): number {
if (!text) return 0
if (!text || typeof text !== "string") return 0
// Remove fenced code blocks to avoid counting headings inside code
const withoutCodeBlocks = text.replace(/```[\s\S]*?```/g, "")