+ {/* 元信息行 */}
+
+ {meta.label}
+ {entry.tool ? (
+ {entry.tool}
+ ) : null}
+ {formatTime(entry.timestamp)}
+ {/* 内容 */}
{isCode ? (
-
+
{text}
) : (
-
+
{text}
)}
diff --git a/packages/client/src/components/Sidebar.tsx b/packages/client/src/components/Sidebar.tsx
index 7f7a1b0..7f1f0e6 100644
--- a/packages/client/src/components/Sidebar.tsx
+++ b/packages/client/src/components/Sidebar.tsx
@@ -1,6 +1,6 @@
import { useMemo } from 'react';
import type { Theme, WebSession } from '../types';
-import { entryRole, formatTime, getSessionMode, getSessionTitle } from '../utils';
+import { entryRole, formatTime, getSessionTitle } from '../utils';
interface SidebarProps {
sessions: WebSession[];
@@ -12,9 +12,6 @@ interface SidebarProps {
onThemeChange: (theme: Theme) => void;
}
-const glassPanel =
- 'flex max-h-[46vh] min-h-0 flex-col overflow-hidden rounded-lg border border-black/10 bg-white/70 shadow-[0_18px_50px_rgba(15,23,42,0.12)] backdrop-blur-2xl lg:sticky lg:top-4 lg:h-[calc(100vh-2rem)] lg:max-h-none dark:border-white/10 dark:bg-[#0d1116]/75 dark:shadow-[0_18px_60px_rgba(0,0,0,0.42)]';
-
export function Sidebar({
sessions,
activeId,
@@ -24,112 +21,161 @@ export function Sidebar({
onQueryChange,
onThemeChange,
}: SidebarProps) {
- const stats = useMemo(() => {
- const messages = sessions.reduce((sum, session) => sum + session.entries.length, 0);
- const tools = sessions.reduce(
- (sum, session) =>
- sum + session.entries.filter((entry) => entryRole(entry) === 'tool').length,
- 0,
- );
- return { sessions: sessions.length, messages, tools };
- }, [sessions]);
-
- const statDefs = [
- ['会话', stats.sessions],
- ['消息', stats.messages],
- ['工具', stats.tools],
- ] as const;
+ const count = useMemo(
+ () =>
+ sessions.reduce(
+ (acc, session) => {
+ acc.messages += session.entries.length;
+ acc.tools += session.entries.filter((e) => entryRole(e) === 'tool').length;
+ return acc;
+ },
+ { messages: 0, tools: 0 },
+ ),
+ [sessions],
+ );
return (
-