From 16deb199d738fb3a67d5deee5ff9f66eaa7a54a5 Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Thu, 6 Aug 2026 09:53:43 +0200 Subject: [PATCH] fix(cli): prevent TUI config logs from corrupting terminal --- .changeset/quiet-tui-config-reloads.md | 5 ++++ packages/opencode/src/kilocode/tui/config.ts | 3 +- .../test/kilocode/server/tui-config.test.ts | 28 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 .changeset/quiet-tui-config-reloads.md diff --git a/.changeset/quiet-tui-config-reloads.md b/.changeset/quiet-tui-config-reloads.md new file mode 100644 index 00000000000..8c21c818bb9 --- /dev/null +++ b/.changeset/quiet-tui-config-reloads.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Prevent TUI config reload logs from corrupting the interactive terminal. diff --git a/packages/opencode/src/kilocode/tui/config.ts b/packages/opencode/src/kilocode/tui/config.ts index e7d6d333f22..17d9b1d60f0 100644 --- a/packages/opencode/src/kilocode/tui/config.ts +++ b/packages/opencode/src/kilocode/tui/config.ts @@ -13,6 +13,7 @@ import { isRecord } from "@/util/record" import { GlobalBus } from "@/bus/global" import { Event } from "@/server/event" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" +import { AppRuntime } from "@/effect/app-runtime" export namespace KilocodeTuiConfig { export const Scope = z.enum(["project", "global"]) @@ -26,7 +27,7 @@ export namespace KilocodeTuiConfig { const dirs = [".kilo", ".kilocode"] as const export async function get(input: { directory: string }) { - const cfg = await Effect.runPromise( + const cfg = await AppRuntime.runPromise( TuiConfig.Service.use((svc) => svc.info()).pipe( Effect.provide( AppNodeBuilder.build(TuiConfig.node).pipe( diff --git a/packages/opencode/test/kilocode/server/tui-config.test.ts b/packages/opencode/test/kilocode/server/tui-config.test.ts index 22909b26fe2..26bbc56ca5b 100644 --- a/packages/opencode/test/kilocode/server/tui-config.test.ts +++ b/packages/opencode/test/kilocode/server/tui-config.test.ts @@ -43,6 +43,34 @@ describe("TUI config routes", () => { expect(body.plugin_origins).toBeUndefined() }) + test("does not write TUI config logs to the terminal", async () => { + await using tmp = await tmpdir({ + init: async (dir) => { + const cfg = path.join(dir, ".kilo") + await fs.mkdir(cfg, { recursive: true }) + await Bun.write(path.join(cfg, "tui.json"), JSON.stringify({ theme: "dracula" })) + }, + }) + + const output: unknown[][] = [] + const log = console.log + try { + console.log = (...args) => output.push(args) + const response = await Server.Default().app.request("/tui/config", { + headers: { "x-kilo-directory": tmp.path }, + }) + expect(response.status).toBe(200) + } finally { + console.log = log + } + + expect( + output.some((args) => + args.some((item) => typeof item === "string" && /loading tui config|applying tui config/.test(item)), + ), + ).toBe(false) + }) + test("loads legacy .kilocode TUI config and ignores .opencode", async () => { await using tmp = await tmpdir({ init: async (dir) => {