diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a6ae14d0..c80bcbdaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Docs: https://docs.clawd.bot ### Fixes - Doctor: warn when gateway.mode is unset with configure/config guidance. +- UI: refresh debug panel on route-driven tab changes. (#1373) Thanks @yazinsai. ## 2026.1.21 diff --git a/src/cli/update-cli.test.ts b/src/cli/update-cli.test.ts index 395789bdd..25fe5b1d1 100644 --- a/src/cli/update-cli.test.ts +++ b/src/cli/update-cli.test.ts @@ -273,7 +273,7 @@ describe("update-cli", () => { try { await fs.writeFile( path.join(tempDir, "package.json"), - JSON.stringify({ name: "clawdbot", version: "2026.1.18-1" }), + JSON.stringify({ name: "clawdbot", version: "1.0.0" }), "utf-8", ); diff --git a/ui/src/ui/app-settings.test.ts b/ui/src/ui/app-settings.test.ts new file mode 100644 index 000000000..be06d7d8b --- /dev/null +++ b/ui/src/ui/app-settings.test.ts @@ -0,0 +1,91 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import type { Tab } from "./navigation"; + +type SettingsHost = Parameters[0]; + +const createHost = (tab: Tab): SettingsHost => ({ + settings: { + gatewayUrl: "", + token: "", + sessionKey: "main", + lastActiveSessionKey: "main", + theme: "system", + chatFocusMode: false, + chatShowThinking: true, + splitRatio: 0.6, + navCollapsed: false, + navGroupsCollapsed: {}, + }, + theme: "system", + themeResolved: "dark", + applySessionKey: "main", + sessionKey: "main", + tab, + connected: false, + chatHasAutoScrolled: false, + logsAtBottom: false, + eventLog: [], + eventLogBuffer: [], + basePath: "", + themeMedia: null, + themeMediaHandler: null, +}); + +describe("setTabFromRoute", () => { + beforeEach(() => { + vi.resetModules(); + }); + + it("starts and stops log polling based on the tab", async () => { + const startLogsPolling = vi.fn(); + const stopLogsPolling = vi.fn(); + const startDebugPolling = vi.fn(); + const stopDebugPolling = vi.fn(); + + vi.doMock("./app-polling", () => ({ + startLogsPolling, + stopLogsPolling, + startDebugPolling, + stopDebugPolling, + })); + + const { setTabFromRoute } = await import("./app-settings"); + const host = createHost("chat"); + + setTabFromRoute(host, "logs"); + expect(startLogsPolling).toHaveBeenCalledTimes(1); + expect(stopLogsPolling).not.toHaveBeenCalled(); + expect(startDebugPolling).not.toHaveBeenCalled(); + expect(stopDebugPolling).toHaveBeenCalledTimes(1); + + setTabFromRoute(host, "chat"); + expect(stopLogsPolling).toHaveBeenCalledTimes(1); + }); + + it("starts and stops debug polling based on the tab", async () => { + const startLogsPolling = vi.fn(); + const stopLogsPolling = vi.fn(); + const startDebugPolling = vi.fn(); + const stopDebugPolling = vi.fn(); + + vi.doMock("./app-polling", () => ({ + startLogsPolling, + stopLogsPolling, + startDebugPolling, + stopDebugPolling, + })); + + const { setTabFromRoute } = await import("./app-settings"); + const host = createHost("chat"); + + setTabFromRoute(host, "debug"); + expect(startDebugPolling).toHaveBeenCalledTimes(1); + expect(stopDebugPolling).not.toHaveBeenCalled(); + expect(startLogsPolling).not.toHaveBeenCalled(); + expect(stopLogsPolling).toHaveBeenCalledTimes(1); + + setTabFromRoute(host, "chat"); + expect(stopDebugPolling).toHaveBeenCalledTimes(1); + }); +}); diff --git a/ui/src/ui/app-settings.ts b/ui/src/ui/app-settings.ts index f27319d37..0cceff4cb 100644 --- a/ui/src/ui/app-settings.ts +++ b/ui/src/ui/app-settings.ts @@ -264,6 +264,9 @@ export function setTabFromRoute(host: SettingsHost, next: Tab) { if (next === "logs") startLogsPolling(host as unknown as Parameters[0]); else stopLogsPolling(host as unknown as Parameters[0]); + if (next === "debug") + startDebugPolling(host as unknown as Parameters[0]); + else stopDebugPolling(host as unknown as Parameters[0]); if (host.connected) void refreshActiveTab(host); }