feat: sort sessions by latest message time instead of creation time

Use `last_active` from SQLite (max message timestamp) for accurate
sorting, with fallback chain: last_active → ended_at → started_at.
CLI mode lacks last_active so falls back to ended_at.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
ekko
2026-04-19 23:32:01 +08:00
parent 969e56b45e
commit d3817556ac
3 changed files with 3 additions and 3 deletions
@@ -7,6 +7,7 @@ export interface SessionSummary {
title: string | null title: string | null
started_at: number started_at: number
ended_at: number | null ended_at: number | null
last_active?: number
message_count: number message_count: number
tool_call_count: number tool_call_count: number
input_tokens: number input_tokens: number
@@ -85,8 +85,7 @@ function sortSessionsWithActiveFirst(items: Session[]): Session[] {
const aLive = chatStore.isSessionLive(a.id) const aLive = chatStore.isSessionLive(a.id)
const bLive = chatStore.isSessionLive(b.id) const bLive = chatStore.isSessionLive(b.id)
if (aLive !== bLive) return aLive ? -1 : 1 if (aLive !== bLive) return aLive ? -1 : 1
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt return (b.updatedAt || 0) - (a.updatedAt || 0)
return b.updatedAt - a.updatedAt
}) })
} }
+1 -1
View File
@@ -151,7 +151,7 @@ function mapHermesSession(s: SessionSummary): Session {
source: s.source || undefined, source: s.source || undefined,
messages: [], messages: [],
createdAt: Math.round(s.started_at * 1000), createdAt: Math.round(s.started_at * 1000),
updatedAt: Math.round((s.ended_at || s.started_at) * 1000), updatedAt: Math.round((s.last_active || s.ended_at || s.started_at) * 1000),
model: s.model, model: s.model,
provider: (s as any).billing_provider || '', provider: (s as any).billing_provider || '',
messageCount: s.message_count, messageCount: s.message_count,