/** @jsxImportSource @opentui/solid */ /** * Reproducer for #26560 — TUI crashes with * `TypeError: undefined is not an object (evaluating 'f.data.map')` * when entering a session whose messages endpoint returns a non-2xx. * The failure path is `sync.tsx#sync.session.sync` reading * `messages.data!` while the SDK leaves `data` undefined on error. */ import { describe, expect, test } from "bun:test" import { Global } from "@opencode-ai/core/global" import { tmpdir } from "../../../fixture/fixture" import { directory, json, mount } from "./sync-fixture" const sessionID = "ses_undef" describe("tui sync (#26560)", () => { test("entering a session whose messages endpoint errors does not crash sync", async () => { const previous = Global.Path.state await using tmp = await tmpdir() Global.Path.state = tmp.path await Bun.write(`${tmp.path}/kv.json`, "{}") const sessionPayload = { id: sessionID, title: "broken", time: { created: 0, updated: 0 }, version: "1.14.42", directory, project_id: "proj_test", } const { app, sync } = await mount((url) => { if (url.pathname === `/session/${sessionID}`) return json(sessionPayload) if (url.pathname === `/session/${sessionID}/messages`) return json({}, { status: 500 }) if (url.pathname === `/session/${sessionID}/todo`) return json([]) if (url.pathname === `/session/${sessionID}/diff`) return json([]) if (url.pathname === "/session") return json([sessionPayload]) return undefined }) try { await expect(sync.session.sync(sessionID)).resolves.toBeUndefined() } finally { app.renderer.destroy() Global.Path.state = previous } }) })