feat: show last search query in session history
- Added last_query field to SearchSession interface - loadSessions now fetches last user message for each session - Session list displays: mode badge, title, last query, message count, time - Added .hs-query CSS style for query text
This commit is contained in:
@@ -6,6 +6,7 @@ export interface SearchSession {
|
|||||||
title: string
|
title: string
|
||||||
mode: 'keyword' | 'visual' | 'people' | 'agent'
|
mode: 'keyword' | 'visual' | 'people' | 'agent'
|
||||||
message_count: number
|
message_count: number
|
||||||
|
last_query?: string
|
||||||
created_at: string
|
created_at: string
|
||||||
updated_at: string
|
updated_at: string
|
||||||
}
|
}
|
||||||
@@ -78,7 +79,23 @@ export function useSearchSession() {
|
|||||||
})
|
})
|
||||||
if (!resp.ok) throw new Error(`HTTP ${resp.status}`)
|
if (!resp.ok) throw new Error(`HTTP ${resp.status}`)
|
||||||
const data = await resp.json()
|
const data = await resp.json()
|
||||||
sessions.value = data.sessions || []
|
// Enrich sessions with last query from messages
|
||||||
|
const sessions = data.sessions || []
|
||||||
|
for (const s of sessions) {
|
||||||
|
try {
|
||||||
|
const msgResp = await fetch(`${base}/api/v2/search-sessions/${s.id}/messages?limit=1`, {
|
||||||
|
headers: getAuthHeaders()
|
||||||
|
})
|
||||||
|
if (msgResp.ok) {
|
||||||
|
const msgData = await msgResp.json()
|
||||||
|
const lastUserMsg = msgData.messages?.find((m: any) => m.role === 'user')
|
||||||
|
if (lastUserMsg) {
|
||||||
|
s.last_query = lastUserMsg.content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
sessions.value = sessions
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
error.value = e.message || 'Failed to load sessions'
|
error.value = e.message || 'Failed to load sessions'
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@@ -44,7 +44,8 @@
|
|||||||
<span class="hs-mode">{{ formatMode(s.mode) }}</span>
|
<span class="hs-mode">{{ formatMode(s.mode) }}</span>
|
||||||
<div class="hs-title" @click="handleSelectSession(s)">{{ s.title }}</div>
|
<div class="hs-title" @click="handleSelectSession(s)">{{ s.title }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="hs-time">{{ s.message_count }} messages · {{ formatSessionTime(s.updated_at) }}</div>
|
<div v-if="s.last_query" class="hs-query">{{ s.last_query.slice(0, 30) }}{{ s.last_query.length > 30 ? '...' : '' }}</div>
|
||||||
|
<div class="hs-time">{{ s.message_count }} msgs · {{ formatSessionTime(s.updated_at) }}</div>
|
||||||
</div>
|
</div>
|
||||||
<button class="hs-menu-btn" @click.stop="toggleSessionMenu(s.id)">⋯</button>
|
<button class="hs-menu-btn" @click.stop="toggleSessionMenu(s.id)">⋯</button>
|
||||||
<div v-if="activeSessionMenu === s.id" class="hs-menu">
|
<div v-if="activeSessionMenu === s.id" class="hs-menu">
|
||||||
@@ -1892,6 +1893,13 @@ function openSource(src: SourceInfo) {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
.hs-query {
|
||||||
|
font-size: 11px;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
.hs-item.pinned .hs-time { color: rgba(var(--primary-color-rgb), 0.8); }
|
.hs-item.pinned .hs-time { color: rgba(var(--primary-color-rgb), 0.8); }
|
||||||
.hs-mode {
|
.hs-mode {
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
|
|||||||
Reference in New Issue
Block a user