diff --git a/CHANGELOG.md b/CHANGELOG.md index 90128e027..9bf6550f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,6 +68,7 @@ - Sessions: support session `label` in store/list/UI and allow `sessions_send` lookup by label. (#570) โ€” thanks @azade-c - Control UI: show/patch per-session reasoning level and render extracted reasoning in chat. - Control UI: queue outgoing chat messages, add Enter-to-send, and show queued items. (#527) โ€” thanks @YuriNachos +- Control UI: refactor chat layout with tool sidebar, grouped messages, and nav improvements. (#475) โ€” thanks @rahthakor - Control UI: drop explicit `ui:install` step; `ui:build` now auto-installs UI deps (docs + update flow). - Telegram: retry long-polling conflicts with backoff to avoid fatal exits. - Telegram: fix grammY fetch type mismatch when injecting `fetch`. (#512) โ€” thanks @YuriNachos diff --git a/src/agents/bash-tools.test.ts b/src/agents/bash-tools.test.ts index 1b111ab09..6279f2be0 100644 --- a/src/agents/bash-tools.test.ts +++ b/src/agents/bash-tools.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { resetProcessRegistryForTests } from "./bash-process-registry.js"; import { bashTool, @@ -50,6 +50,16 @@ beforeEach(() => { }); describe("bash tool backgrounding", () => { + const originalShell = process.env.SHELL; + + beforeEach(() => { + if (!isWin) process.env.SHELL = "/bin/bash"; + }); + + afterEach(() => { + if (!isWin) process.env.SHELL = originalShell; + }); + it( "backgrounds after yield and can be polled", async () => { @@ -171,9 +181,7 @@ describe("bash tool backgrounding", () => { expect(text).toContain("hi"); }); - // Skip: Fails when user's shell config (.zshenv) sources files that don't exist in test env, - // adding extra lines to stdout and breaking line count assertions. - it.skip("logs line-based slices and defaults to last lines", async () => { + it("logs line-based slices and defaults to last lines", async () => { const result = await bashTool.execute("call1", { command: echoLines(["one", "two", "three"]), background: true, @@ -193,9 +201,7 @@ describe("bash tool backgrounding", () => { expect(status).toBe("completed"); }); - // Skip: Fails when user's shell config (.zshenv) sources files that don't exist in test env, - // adding extra lines to stdout and breaking offset assertions. - it.skip("supports line offsets for log slices", async () => { + it("supports line offsets for log slices", async () => { const result = await bashTool.execute("call1", { command: echoLines(["alpha", "beta", "gamma"]), background: true, diff --git a/ui/index.html b/ui/index.html index 85f102215..910cb59f8 100644 --- a/ui/index.html +++ b/ui/index.html @@ -6,13 +6,9 @@ Clawdbot Control - - - - diff --git a/ui/src/styles/layout.css b/ui/src/styles/layout.css index 259ac196d..75c2f4cd0 100644 --- a/ui/src/styles/layout.css +++ b/ui/src/styles/layout.css @@ -2,7 +2,6 @@ --shell-pad: 16px; --shell-gap: 16px; --shell-nav-width: 220px; - --shell-nav-collapsed-width: 56px; --shell-topbar-height: 56px; --shell-focus-duration: 220ms; --shell-focus-ease: cubic-bezier(0.2, 0.85, 0.25, 1); @@ -19,7 +18,7 @@ } .shell--nav-collapsed { - grid-template-columns: var(--shell-nav-collapsed-width) minmax(0, 1fr); + grid-template-columns: 0px minmax(0, 1fr); } .shell--chat-focus { @@ -298,13 +297,12 @@ flex-direction: column; gap: 20px; min-height: 0; - height: calc(100vh - var(--shell-pad) * 2 - var(--topbar-height, 80px) - var(--shell-gap)); overflow-y: auto; /* Enable vertical scrolling for pages with long content */ overflow-x: hidden; } .shell--chat .content { - height: calc(100vh - var(--shell-pad) * 2 - var(--topbar-height, 80px) - var(--shell-gap)); + /* No-op: keep chat layout consistent with other tabs */ } .docs-link { diff --git a/ui/src/ui/app-render.ts b/ui/src/ui/app-render.ts index 025fa764f..888c6db7d 100644 --- a/ui/src/ui/app-render.ts +++ b/ui/src/ui/app-render.ts @@ -3,7 +3,7 @@ import { html, nothing } from "lit"; import type { GatewayBrowserClient, GatewayHelloOk } from "./gateway"; import { TAB_GROUPS, - iconClassForTab, + iconForTab, pathForTab, subtitleForTab, titleForTab, @@ -608,7 +608,7 @@ function renderTab(state: AppViewState, tab: Tab) { }} title=${titleForTab(tab)} > - + ${titleForTab(tab)} `; @@ -620,8 +620,9 @@ function renderChatControls(state: AppViewState) { const listIcon = html``; // Icon for grouped view const groupIcon = html``; - // Refresh icon (Flaticon style) + // Refresh icon const refreshIcon = html``; + const focusIcon = html``; return html`