返回 DeepSeek-Reasonix
session.ts
根目录 / desktop / frontend / src / lib / session.ts
1 import type { HistorySearchHit, ProjectNode, SessionMeta } from "./types";
2
3 export function sessionActivityTime(session: SessionMeta): number {
4 return session.lastActivityAt ?? session.modTime;
5 }
6
7 export function historySessionDisplayTitle(session: Pick<SessionMeta, "preview" | "title" | "topicTitle">, fallback: string): string {
8 return session.topicTitle?.trim() || session.title?.trim() || session.preview?.trim() || fallback;
9 }
10
11 export function historySearchHitDisplayTitle(
12 hit: Pick<HistorySearchHit, "sessionPath" | "sessionTitle" | "topicTitle">,
13 ): string {
14 return hit.topicTitle?.trim() || hit.sessionTitle?.trim() || hit.sessionPath;
15 }
16
17 export function paletteSessionDisplayTitle(session: Pick<SessionMeta, "preview" | "title" | "topicTitle">, fallback: string): string {
18 return session.topicTitle?.trim() || session.title?.trim() || session.preview?.trim() || fallback;
19 }
20
21 export function paletteSessionHint(
22 session: Pick<SessionMeta, "preview" | "title" | "topicTitle" | "topicId" | "workspaceRoot">,
23 ): string | undefined {
24 const primary = paletteSessionDisplayTitle(session, "");
25 const title = session.title?.trim();
26 const preview = session.preview?.trim();
27 const workspace = session.workspaceRoot?.trim();
28 const secondary = session.topicId
29 ? preview && preview !== primary ? preview : ""
30 : title && title !== primary ? title : preview && preview !== primary ? preview : "";
31 const hint = [secondary, workspace].filter(Boolean).join(" · ");
32 return hint || undefined;
33 }
34
35 export function paletteSessionKeywords(session: Pick<SessionMeta, "preview" | "title" | "topicId">): string[] {
36 return [session.topicId ? undefined : session.title?.trim(), session.preview?.trim()].filter((value): value is string => Boolean(value));
37 }
38
39 // topicActivityTime returns the last-activity timestamp for a sidebar topic
40 // node. Falls back to the topic's creation time so blank topics (no session
41 // files yet) are still visible under time-based filters.
42 export function topicActivityTime(node: ProjectNode): number {
43 return node.lastActivityAt || node.createdAt || 0;
44 }
45
45 lines TYPESCRIPT