diff --git a/packages/client/src/App.vue b/packages/client/src/App.vue index 6fcfcd99..f5d58f0b 100644 --- a/packages/client/src/App.vue +++ b/packages/client/src/App.vue @@ -7,6 +7,7 @@ import { useTheme } from '@/composables/useTheme' import AppSidebar from '@/components/layout/AppSidebar.vue' import { useKeyboard } from '@/composables/useKeyboard' import { useAppStore } from '@/stores/hermes/app' +import SessionSearchModal from '@/components/hermes/chat/SessionSearchModal.vue' const { isDark } = useTheme() const appStore = useAppStore() @@ -58,6 +59,7 @@ useKeyboard() + diff --git a/packages/client/src/api/hermes/sessions.ts b/packages/client/src/api/hermes/sessions.ts index 1201ac12..240477b4 100644 --- a/packages/client/src/api/hermes/sessions.ts +++ b/packages/client/src/api/hermes/sessions.ts @@ -5,6 +5,7 @@ export interface SessionSummary { source: string model: string title: string | null + preview?: string started_at: number ended_at: number | null last_active?: number @@ -25,6 +26,12 @@ export interface SessionDetail extends SessionSummary { messages: HermesMessage[] } +export interface SessionSearchResult extends SessionSummary { + matched_message_id: number | null + snippet: string + rank: number +} + export interface HermesMessage { id: number session_id: string @@ -48,6 +55,16 @@ export async function fetchSessions(source?: string, limit?: number): Promise { + const params = new URLSearchParams() + params.set('q', q) + if (source) params.set('source', source) + if (limit) params.set('limit', String(limit)) + const query = params.toString() + const res = await request<{ results: SessionSearchResult[] }>(`/api/hermes/search/sessions?${query}`) + return res.results +} + export async function fetchSession(id: string): Promise { try { const res = await request<{ session: SessionDetail }>(`/api/hermes/sessions/${id}`) diff --git a/packages/client/src/components/hermes/chat/MessageItem.vue b/packages/client/src/components/hermes/chat/MessageItem.vue index ffd6a19d..b23adcae 100644 --- a/packages/client/src/components/hermes/chat/MessageItem.vue +++ b/packages/client/src/components/hermes/chat/MessageItem.vue @@ -11,7 +11,7 @@ import { const TOOL_PAYLOAD_DISPLAY_LIMIT = 2000; -const props = defineProps<{ message: Message }>(); +const props = defineProps<{ message: Message; highlight?: boolean }>(); const { t } = useI18n(); const isSystem = computed(() => props.message.role === "system"); @@ -126,7 +126,11 @@ const renderedToolResult = computed(() => {