From c5f392e1fd1cacc53b11d422eede36525f23229b Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 12 Mar 2026 11:51:04 -0700 Subject: [PATCH 01/11] fix: plain text user bubbles and remove trailing empty paragraph gap Made-with: Cursor --- apps/web/app/components/chat-message.tsx | 4 +--- apps/web/app/globals.css | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/web/app/components/chat-message.tsx b/apps/web/app/components/chat-message.tsx index e5aba40b421..0319ff5be95 100644 --- a/apps/web/app/components/chat-message.tsx +++ b/apps/web/app/components/chat-message.tsx @@ -777,9 +777,7 @@ export const ChatMessage = memo(function ChatMessage({ message, isStreaming, onS const attachmentInfo = parseAttachments(textContent); const richHtml = userHtmlMap?.get(message.id) ?? userHtmlMap?.get(textContent) ?? userHtmlMap?.get(attachmentInfo?.message ?? ""); - const bubbleContent = richHtml - ?
- :

{attachmentInfo?.message ?? textContent}

; + const bubbleContent =

{attachmentInfo?.message ?? textContent}

; if (attachmentInfo) { return ( diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css index 2748e3f7eaa..ca7519caf29 100644 --- a/apps/web/app/globals.css +++ b/apps/web/app/globals.css @@ -224,6 +224,9 @@ body { .chat-user-html-content p:empty { min-height: 1em; } +.chat-user-html-content p:empty:last-child { + display: none; +} .chat-user-html-content strong { font-weight: 700; } From 45db1bcf541a63acd702e619932fad90611faa6d Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 12 Mar 2026 12:03:29 -0700 Subject: [PATCH 02/11] feat: merge file tree and chat history into single left sidebar with tabs Made-with: Cursor --- .../workspace/chat-sessions-sidebar.tsx | 47 +++--- .../workspace/workspace-sidebar.tsx | 138 +++++++++++++--- apps/web/app/workspace/workspace-content.tsx | 152 +++++------------- 3 files changed, 182 insertions(+), 155 deletions(-) diff --git a/apps/web/app/components/workspace/chat-sessions-sidebar.tsx b/apps/web/app/components/workspace/chat-sessions-sidebar.tsx index b3e9e5b7bf4..1edb752928e 100644 --- a/apps/web/app/components/workspace/chat-sessions-sidebar.tsx +++ b/apps/web/app/components/workspace/chat-sessions-sidebar.tsx @@ -9,7 +9,7 @@ import { DropdownMenuTrigger, } from "../ui/dropdown-menu"; -type WebSession = { +export type WebSession = { id: string; title: string; createdAt: number; @@ -55,6 +55,8 @@ type ChatSessionsSidebarProps = { onCollapse?: () => void; /** When true, show a loader instead of empty state (e.g. initial sessions fetch). */ loading?: boolean; + /** When true, renders just the content without the aside wrapper (for embedding in another sidebar). */ + embedded?: boolean; }; /** Format a timestamp into a human-readable relative time string. */ @@ -164,6 +166,7 @@ export function ChatSessionsSidebar({ onClose, width: widthProp, loading = false, + embedded = false, }: ChatSessionsSidebarProps) { const [hoveredId, setHoveredId] = useState(null); const [renamingId, setRenamingId] = useState(null); @@ -229,24 +232,13 @@ export function ChatSessionsSidebar({ const grouped = groupSessions(filteredSessions); const width = mobile ? "280px" : (widthProp ?? 260); - const headerHeight = 40; // px — match padding so list content clears the overlay - const sidebar = ( -