From fd7071b75d29194ce9a169052885ed64505603cf Mon Sep 17 00:00:00 2001 From: ekko Date: Sat, 18 Apr 2026 08:53:45 +0800 Subject: [PATCH] fix: fallback title from preview when session has no explicit title SQLite path was returning null title for sessions without an explicit title, while the CLI path derives it from the first user message. Now uses the preview (first user message content) as title fallback, matching the original CLI behavior. Co-Authored-By: Claude Opus 4.6 --- packages/server/src/services/hermes/sessions-db.ts | 6 +++++- tests/server/sessions-db.test.ts | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/server/src/services/hermes/sessions-db.ts b/packages/server/src/services/hermes/sessions-db.ts index 1b2adac..0367fcc 100644 --- a/packages/server/src/services/hermes/sessions-db.ts +++ b/packages/server/src/services/hermes/sessions-db.ts @@ -48,12 +48,16 @@ function normalizeNullableString(value: unknown): string | null { function mapRow(row: Record): HermesSessionRow { const startedAt = normalizeNumber(row.started_at) + const rawTitle = normalizeNullableString(row.title) + const preview = String(row.preview || '') + // Fallback: when no explicit title, use first user message as title (same as CLI path) + const title = rawTitle || (preview ? (preview.length > 40 ? preview.slice(0, 40) + '...' : preview) : null) return { id: String(row.id || ''), source: String(row.source || ''), user_id: normalizeNullableString(row.user_id), model: String(row.model || ''), - title: normalizeNullableString(row.title), + title, started_at: startedAt, ended_at: normalizeNullableNumber(row.ended_at), end_reason: normalizeNullableString(row.end_reason), diff --git a/tests/server/sessions-db.test.ts b/tests/server/sessions-db.test.ts index 79da8d8..22efa3a 100644 --- a/tests/server/sessions-db.test.ts +++ b/tests/server/sessions-db.test.ts @@ -120,6 +120,6 @@ describe('session DB summaries', () => { expect(allMock).toHaveBeenCalledWith('telegram', 2) expect(rows[0].last_active).toBe(1710000100) expect(rows[0].source).toBe('telegram') - expect(rows[0].title).toBeNull() + expect(rows[0].title).toBe('preview text') }) })