- applications/iknowyou: new Next.js chat application with persona-aware conversations, briefing API, cohort logic, vLLM streaming, and sidebar navigation - tidal M8: add replication control plane (control.rs), tenant migration state machine (migration.rs), tenant/upgrade coordinators, cluster/fault test harnesses - tidal M8 tests: expand m8p2/m8p3/m8p4 test suites; add m8p5_multitenancy and m8_uat - tidal db: split replication_ops out of db/mod.rs (was 647 lines, now 574) - .claude: add kai-park, kaya-osei, mira-vasquez agents; add aeries-design-architect, aeries-fullstack-engineer, aeries-product-visionary skills - docs: update ROADMAP.md Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
37 lines
954 B
TypeScript
37 lines
954 B
TypeScript
"use client";
|
|
|
|
import type { ChatMessage } from "@/lib/types";
|
|
|
|
interface MessageProps {
|
|
message: ChatMessage;
|
|
isStreaming?: boolean;
|
|
isLastInGroup?: boolean;
|
|
}
|
|
|
|
export function Message({ message, isStreaming, isLastInGroup }: MessageProps) {
|
|
const isUser = message.role === "user";
|
|
|
|
return (
|
|
<div
|
|
className={`flex ${isUser ? "justify-end" : "justify-start"} ${
|
|
isLastInGroup ? "mb-4" : "mb-1"
|
|
}`}
|
|
>
|
|
<div
|
|
className={`max-w-[80%] px-4 py-2.5 rounded-2xl text-[15px] leading-relaxed ${
|
|
isUser
|
|
? "bg-bg-elevated text-text rounded-br-md"
|
|
: "text-text rounded-bl-md"
|
|
}`}
|
|
>
|
|
<div className="whitespace-pre-wrap break-words">
|
|
{message.content}
|
|
{isStreaming && (
|
|
<span className="inline-block w-[2px] h-[1.1em] bg-accent ml-0.5 align-text-bottom animate-pulse" />
|
|
)}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|