From 7def4a97fdc57ea982fe0ef85ac4570f7f9a1c4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=86=A0=E8=BE=B0?= Date: Sat, 8 Aug 2026 18:00:40 +0800 Subject: [PATCH] fix(tui): harden collapse.lines against non-string content --- .../opencode/src/cli/cmd/tui/util/collapse.ts | 4 ++-- .../opencode/test/cli/tui/collapse.test.ts | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) 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)