import { projectWorkNotices } from "@code/primitives/work"; import { Conversation, ConversationContent, } from "@code/ui/components/ai-elements/conversation"; import { MessageSquareText } from "lucide-react"; import { useMemo } from "react"; import { ChatMessage } from "@/components/chat/chat-message"; import { ChatThinkingResponse } from "@/components/chat/chat-thinking-response"; import { buildWorkspaceTimeline } from "@/lib/workspace/presentation"; import type { WorkRecord, WorkspaceState } from "@/lib/workspace/types"; import { WorkCard } from "./work-card"; const ConversationLoading = () => ( Loading conversation… ); const ConversationEmptyState = () => (

What should move forward?

Describe an outcome or problem. Casual conversation stays conversation.

); export const ConversationFeed = ({ highlightedMessageId, onSourceSelect, workspace, }: { readonly highlightedMessageId?: string; readonly onSourceSelect: (rawText: string) => void; readonly workspace: WorkspaceState; }) => { const works = workspace.works ?? []; const workById = new Map( works.map((work) => [String(work._id), work] as const) ); const notices = projectWorkNotices(works); const timeline = useMemo( () => buildWorkspaceTimeline(workspace.agent.messages, notices), [notices, workspace.agent.messages] ); return ( {!workspace.agent.historyReady && timeline.length === 0 ? ( ) : null} {workspace.agent.historyReady && timeline.length === 0 ? ( ) : null} {timeline.map((item) => { if (item.kind === "work") { const work = workById.get(item.notice.workId) as | WorkRecord | undefined; return work ? (

Work proposed from this conversation

Proposed Work
) : null; } return (
); })} {workspace.agent.status === "submitted" ? ( ) : null}
); };