From 57a314233053f78a1175ea842ac17219da3eb3cb Mon Sep 17 00:00:00 2001 From: ComputelessComputer Date: Mon, 23 Mar 2026 20:45:33 -0700 Subject: [PATCH 1/5] fix: hide the context bar when no context is attached - Return early from the context bar when there are no context chips - Keep the add button available only once context is already present --- apps/desktop/src/chat/components/context-bar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/src/chat/components/context-bar.tsx b/apps/desktop/src/chat/components/context-bar.tsx index 73f5439a0d..d90e1784be 100644 --- a/apps/desktop/src/chat/components/context-bar.tsx +++ b/apps/desktop/src/chat/components/context-bar.tsx @@ -281,7 +281,7 @@ export function ContextBar({ [entities], ); - if (chips.length === 0 && !onAddEntity) { + if (chips.length === 0) { return null; } From e9178fd5c0b7626d643cc189af51c90c3f38cebc Mon Sep 17 00:00:00 2001 From: ComputelessComputer Date: Mon, 23 Mar 2026 20:45:48 -0700 Subject: [PATCH 2/5] fix: restore rounded chat composer corners when context is empty - Hide the context bar entirely when there are no context chips - Render the composer with full rounded corners when it is no longer attached to a context bar --- apps/desktop/src/chat/components/input/index.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/desktop/src/chat/components/input/index.tsx b/apps/desktop/src/chat/components/input/index.tsx index 3ea3caa255..4569510c15 100644 --- a/apps/desktop/src/chat/components/input/index.tsx +++ b/apps/desktop/src/chat/components/input/index.tsx @@ -148,8 +148,12 @@ function Container({
{children} From 2bc64c02a8387fe9939a332197bc9d0f5579eaff Mon Sep 17 00:00:00 2001 From: ComputelessComputer Date: Tue, 24 Mar 2026 22:06:12 -0700 Subject: [PATCH 3/5] fix: adjust chat input border radius for right panel --- apps/desktop/src/chat/components/input/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/chat/components/input/index.tsx b/apps/desktop/src/chat/components/input/index.tsx index 4569510c15..547263ece7 100644 --- a/apps/desktop/src/chat/components/input/index.tsx +++ b/apps/desktop/src/chat/components/input/index.tsx @@ -149,7 +149,9 @@ function Container({ className={cn([ "flex max-h-full flex-col border border-neutral-200 bg-white", isRightPanel - ? "rounded-t-xl rounded-b-none" + ? hasContextBar + ? "rounded-t-none rounded-b-none" + : "rounded-t-xl rounded-b-none" : hasContextBar ? "rounded-t-none rounded-b-xl" : "rounded-xl", From 1bbb0301bc8c3ae8a6f7a74ef6f046b605de9fb7 Mon Sep 17 00:00:00 2001 From: ComputelessComputer Date: Tue, 24 Mar 2026 22:07:27 -0700 Subject: [PATCH 4/5] fix: handle empty reasoning text in message component --- apps/desktop/src/chat/components/message/normal.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/chat/components/message/normal.tsx b/apps/desktop/src/chat/components/message/normal.tsx index 3a4695281a..a4bc42988c 100644 --- a/apps/desktop/src/chat/components/message/normal.tsx +++ b/apps/desktop/src/chat/components/message/normal.tsx @@ -113,7 +113,13 @@ function Part({ part }: { part: Part }) { } function Reasoning({ part }: { part: Extract }) { - const cleaned = part.text + const raw = part.text.trim(); + + if (!raw) { + return null; + } + + const cleaned = raw .replace(/[\n`*#"]/g, " ") .replace(/\s+/g, " ") .trim(); @@ -121,6 +127,10 @@ function Reasoning({ part }: { part: Extract }) { const streaming = part.state !== "done"; const title = streaming ? cleaned.slice(-150) : cleaned; + if (!title) { + return null; + } + return ( } From fa8d84103bfc36c47721b2d42863b27939dc82a2 Mon Sep 17 00:00:00 2001 From: ComputelessComputer Date: Wed, 25 Mar 2026 17:27:53 -0700 Subject: [PATCH 5/5] fix: suppress blank reasoning-only chat rows --- .../src/chat/components/shared.test.ts | 25 +++++++++++++++++++ apps/desktop/src/chat/components/shared.ts | 12 ++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 apps/desktop/src/chat/components/shared.test.ts diff --git a/apps/desktop/src/chat/components/shared.test.ts b/apps/desktop/src/chat/components/shared.test.ts new file mode 100644 index 0000000000..e955e2b1d6 --- /dev/null +++ b/apps/desktop/src/chat/components/shared.test.ts @@ -0,0 +1,25 @@ +import { describe, expect, test } from "vitest"; + +import { hasRenderableContent } from "./shared"; + +describe("hasRenderableContent", () => { + test("returns false for blank reasoning-only messages", () => { + expect( + hasRenderableContent({ + id: "message-1", + role: "assistant", + parts: [{ type: "reasoning", text: " ", state: "done" }], + }), + ).toBe(false); + }); + + test("returns true for non-empty reasoning messages", () => { + expect( + hasRenderableContent({ + id: "message-2", + role: "assistant", + parts: [{ type: "reasoning", text: "Thinking", state: "done" }], + }), + ).toBe(true); + }); +}); diff --git a/apps/desktop/src/chat/components/shared.ts b/apps/desktop/src/chat/components/shared.ts index 274c1dffbf..9eac22ff04 100644 --- a/apps/desktop/src/chat/components/shared.ts +++ b/apps/desktop/src/chat/components/shared.ts @@ -1,5 +1,15 @@ import type { HyprUIMessage } from "~/chat/types"; export function hasRenderableContent(message: HyprUIMessage): boolean { - return message.parts.some((part) => part.type !== "step-start"); + return message.parts.some((part) => { + if (part.type === "step-start") { + return false; + } + + if (part.type === "reasoning") { + return part.text.trim().length > 0; + } + + return true; + }); }