diff --git a/packages/opencode/src/cli/cmd/tui/util/collapse.ts b/packages/opencode/src/cli/cmd/tui/util/collapse.ts index c7c84c3a4..c4430b7b4 100644 --- a/packages/opencode/src/cli/cmd/tui/util/collapse.ts +++ b/packages/opencode/src/cli/cmd/tui/util/collapse.ts @@ -8,8 +8,8 @@ // therefore an approximate ceiling, not a hard bound — see the follow-up note in // docs/compose/spec/exec-tool-view.md. -export function lines(content: string) { - if (!content) return [] +export function lines(content: unknown) { + if (typeof content !== "string" || content === "") return [] return content.replace(/\n$/, "").split("\n") } diff --git a/packages/opencode/test/cli/tui/collapse.test.ts b/packages/opencode/test/cli/tui/collapse.test.ts index 58fa03f1d..e47cdcf4e 100644 --- a/packages/opencode/test/cli/tui/collapse.test.ts +++ b/packages/opencode/test/cli/tui/collapse.test.ts @@ -1,6 +1,24 @@ import { describe, expect, test } from "bun:test" import * as Collapse from "../../../src/cli/cmd/tui/util/collapse" +describe("collapse.lines", () => { + test("returns [] for non-string truthy values", () => { + expect(Collapse.lines(42 as any)).toEqual([]) + expect(Collapse.lines({} as any)).toEqual([]) + }) + + test("returns [] for undefined / null / empty string", () => { + expect(Collapse.lines(undefined as any)).toEqual([]) + expect(Collapse.lines(null as any)).toEqual([]) + expect(Collapse.lines("")).toEqual([]) + }) + + test("still splits strings", () => { + expect(Collapse.lines("a\nb\n")).toEqual(["a", "b"]) + expect(Collapse.lines("x")).toEqual(["x"]) + }) +}) + describe("collapse.rows", () => { test("counts wrapped height, not source lines", () => { expect(Collapse.rows("a".repeat(250), 100)).toBe(3)