diff --git a/client/src/components/Chat/Messages/Content/ContentParts.tsx b/client/src/components/Chat/Messages/Content/ContentParts.tsx index 84e8ce3db8..00569c11f5 100644 --- a/client/src/components/Chat/Messages/Content/ContentParts.tsx +++ b/client/src/components/Chat/Messages/Content/ContentParts.tsx @@ -6,14 +6,14 @@ import type { TAttachment, Agents, } from 'librechat-data-provider'; +import type { ToolCallGroupExpansionState } from './ToolCallGroup'; import { ParallelContentRenderer, type PartWithIndex } from './ParallelContent'; import { mapAttachments, groupSequentialToolCalls } from '~/utils'; import { MessageContext, SearchContext } from '~/Providers'; -import { EditTextPart, EmptyText } from './Parts'; import PendingSkillCall from './Parts/PendingSkillCall'; +import { EditTextPart, EmptyText } from './Parts'; import MemoryArtifacts from './MemoryArtifacts'; import ToolCallGroup from './ToolCallGroup'; -import type { ToolCallGroupExpansionState } from './ToolCallGroup'; import Container from './Container'; import Part from './Part'; @@ -105,6 +105,8 @@ type ContentPartsProps = { * the full message object) so `React.memo` stays shallow-happy. */ manualSkills?: string[]; + /** ISO timestamp of the parent message, surfaced in parallel column headers. */ + createdAt?: string | null; conversationId?: string | null; attachments?: TAttachment[]; searchResults?: { [key: string]: SearchResultData }; @@ -142,6 +144,7 @@ const ContentParts = memo(function ContentParts({ conversationId, isCreatedByUser, isLatestMessage, + createdAt, }: ContentPartsProps) { const attachmentMap = useMemo(() => mapAttachments(attachments ?? []), [attachments]); const effectiveIsSubmitting = isLatestMessage ? isSubmitting : false; @@ -375,6 +378,7 @@ const ContentParts = memo(function ContentParts({ @@ -193,6 +196,7 @@ export const ParallelColumns = memo(function ParallelColumns({ type ParallelContentRendererProps = { content?: Array; messageId: string; + createdAt?: string | null; conversationId?: string | null; attachments?: TAttachment[]; searchResults?: { [key: string]: SearchResultData }; @@ -207,6 +211,7 @@ type ParallelContentRendererProps = { export const ParallelContentRenderer = memo(function ParallelContentRenderer({ content, messageId, + createdAt, conversationId, attachments, searchResults, @@ -253,6 +258,7 @@ export const ParallelContentRenderer = memo(function ParallelContentRenderer({ columns={columns} groupId={groupId} messageId={messageId} + createdAt={createdAt} renderPart={renderPart} isSubmitting={isSubmitting} conversationId={conversationId} diff --git a/client/src/components/Chat/Messages/Content/SiblingHeader.tsx b/client/src/components/Chat/Messages/Content/SiblingHeader.tsx index 080974ed2b..160966fb13 100644 --- a/client/src/components/Chat/Messages/Content/SiblingHeader.tsx +++ b/client/src/components/Chat/Messages/Content/SiblingHeader.tsx @@ -3,6 +3,7 @@ import { GitBranchPlus } from 'lucide-react'; import { useToastContext } from '@librechat/client'; import { EModelEndpoint, parseEphemeralAgentId, stripAgentIdSuffix } from 'librechat-data-provider'; import type { TMessage, Agent } from 'librechat-data-provider'; +import MessageTimestamp from '~/components/Chat/Messages/ui/MessageTimestamp'; import { useBranchMessageMutation } from '~/data-provider/Messages'; import MessageIcon from '~/components/Share/MessageIcon'; import { useAgentsMapContext } from '~/Providers'; @@ -14,6 +15,8 @@ type SiblingHeaderProps = { agentId?: string; /** The messageId of the parent message */ messageId?: string; + /** ISO timestamp of the parent message */ + createdAt?: string | null; /** The conversationId */ conversationId?: string | null; /** Whether a submission is in progress */ @@ -27,6 +30,7 @@ type SiblingHeaderProps = { export default function SiblingHeader({ agentId, messageId, + createdAt, conversationId, isSubmitting, }: SiblingHeaderProps) { @@ -117,6 +121,7 @@ export default function SiblingHeader({ /> {displayName} +