




















@@ -49,6 +49,53 @@ type AssistantAttachmentAvailability =
4949const assistantAttachmentAvailabilityCache = new Map<string, AssistantAttachmentAvailability>();
5050const ASSISTANT_ATTACHMENT_UNAVAILABLE_RETRY_MS = 5_000;
515152+export type ChatTimestampDisplay = {
53+label: string;
54+title: string;
55+dateTime: string;
56+};
57+58+export function formatChatTimestampForDisplay(timestamp: number): ChatTimestampDisplay {
59+const date = new Date(timestamp);
60+if (!Number.isFinite(date.getTime())) {
61+return {
62+label: "Unknown date",
63+title: "Unknown date",
64+dateTime: "",
65+};
66+}
67+68+return {
69+label: date.toLocaleString([], {
70+month: "short",
71+day: "numeric",
72+year: "numeric",
73+hour: "numeric",
74+minute: "2-digit",
75+}),
76+title: date.toLocaleString([], {
77+weekday: "long",
78+month: "long",
79+day: "numeric",
80+year: "numeric",
81+hour: "numeric",
82+minute: "2-digit",
83+second: "2-digit",
84+timeZoneName: "short",
85+}),
86+dateTime: date.toISOString(),
87+};
88+}
89+90+function renderChatTimestamp(timestamp: number) {
91+const display = formatChatTimestampForDisplay(timestamp);
92+return html`
93+ <time class="chat-group-timestamp" datetime=${display.dateTime} title=${display.title}>
94+ ${display.label}
95+ </time>
96+ `;
97+}
98+5299export function resetAssistantAttachmentAvailabilityCacheForTest() {
53100assistantAttachmentAvailabilityCache.clear();
54101for (const blobUrl of managedImageBlobUrlResolvedCache.values()) {
@@ -238,10 +285,6 @@ export function renderStreamingGroup(
238285basePath?: string,
239286authToken?: string | null,
240287) {
241-const timestamp = new Date(startedAt).toLocaleTimeString([], {
242-hour: "numeric",
243-minute: "2-digit",
244-});
245288const name = assistant?.name ?? "Assistant";
246289247290return html`
@@ -260,7 +303,7 @@ export function renderStreamingGroup(
260303 )}
261304 <div class="chat-group-footer">
262305 <span class="chat-sender-name">${name}</span>
263- <span class="chat-group-timestamp">${timestamp}</span>
306+ ${renderChatTimestamp(startedAt)}
264307 </div>
265308 </div>
266309 </div>
@@ -316,10 +359,6 @@ export function renderMessageGroup(
316359 : normalizedRole === "tool"
317360 ? "tool"
318361 : "other";
319-const timestamp = new Date(group.timestamp).toLocaleTimeString([], {
320-hour: "numeric",
321-minute: "2-digit",
322-});
323362324363// Aggregate usage/cost/model across all messages in the group
325364const meta = extractGroupMeta(group, opts.contextWindow ?? null);
@@ -365,8 +404,7 @@ export function renderMessageGroup(
365404 )}
366405 <div class="chat-group-footer">
367406 <span class="chat-sender-name">${who}</span>
368- <span class="chat-group-timestamp">${timestamp}</span>
369- ${renderMessageMeta(meta)}
407+ ${renderChatTimestamp(group.timestamp)} ${renderMessageMeta(meta)}
370408 ${normalizedRole === "assistant" && isTtsSupported() ? renderTtsButton(group) : nothing}
371409 ${opts.onDelete
372410 ? renderDeleteButton(opts.onDelete, normalizedRole === "user" ? "left" : "right")
@@ -495,7 +533,15 @@ function renderMessageMeta(meta: GroupMeta | null) {
495533return nothing;
496534}
497535498-return html`<span class="msg-meta">${parts}</span>`;
536+return html`
537+ <details class="msg-meta">
538+ <summary class="msg-meta__summary" title="Show message context details">
539+ <span class="msg-meta__summary-icon" aria-hidden="true">${icons.chevronRight}</span>
540+ <span>Context</span>
541+ </summary>
542+ <span class="msg-meta__details">${parts}</span>
543+ </details>
544+ `;
499545}
500546501547function extractGroupText(group: MessageGroup): string {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。