diff --git a/site/src/pages/AgentsPage/components/ChatConversation/ConversationTimeline.stories.tsx b/site/src/pages/AgentsPage/components/ChatConversation/ConversationTimeline.stories.tsx index f833496dfe..e57d917bb9 100644 --- a/site/src/pages/AgentsPage/components/ChatConversation/ConversationTimeline.stories.tsx +++ b/site/src/pages/AgentsPage/components/ChatConversation/ConversationTimeline.stories.tsx @@ -1139,6 +1139,45 @@ export const UserMessageWithMultipleInlineFileRefs: Story = { }, }; +export const MetadataOnlyUserMessageDoesNotLeaveStickyGap: Story = { + args: { + ...defaultArgs, + parsedMessages: buildMessages([ + { + ...baseMessage, + id: 1, + role: "assistant", + content: [{ type: "text", text: "Before hidden metadata." }], + }, + { + ...baseMessage, + id: 2, + role: "user", + content: [ + { + type: "context-file", + context_file_path: "/home/coder/coder/AGENTS.md", + }, + ], + }, + { + ...baseMessage, + id: 3, + role: "assistant", + content: [{ type: "text", text: "After hidden metadata." }], + }, + ]), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + expect(canvas.getByText("Before hidden metadata.")).toBeVisible(); + expect(canvas.getByText("After hidden metadata.")).toBeVisible(); + expect(canvasElement.querySelectorAll("[data-user-sentinel]")).toHaveLength( + 0, + ); + }, +}; + /** * Verifies the structural requirements for sticky user messages * in the flat (section-less) message list: diff --git a/site/src/pages/AgentsPage/components/ChatConversation/ConversationTimeline.tsx b/site/src/pages/AgentsPage/components/ChatConversation/ConversationTimeline.tsx index 5054e01363..a0742fb364 100644 --- a/site/src/pages/AgentsPage/components/ChatConversation/ConversationTimeline.tsx +++ b/site/src/pages/AgentsPage/components/ChatConversation/ConversationTimeline.tsx @@ -1082,6 +1082,16 @@ export const ConversationTimeline = memo( > {parsedMessages.map(({ message, parsed }, msgIdx) => { if (message.role === "user") { + const { shouldHide } = deriveMessageDisplayState({ + message, + parsed, + hideActions: false, + hasActiveStream: false, + isAwaitingFirstStreamChunk: false, + }); + if (shouldHide) { + return null; + } return (