diff --git a/packages/client/src/api/hermes/conversations.ts b/packages/client/src/api/hermes/conversations.ts new file mode 100644 index 0000000..d4d2707 --- /dev/null +++ b/packages/client/src/api/hermes/conversations.ts @@ -0,0 +1,58 @@ +import { request } from '../client' + +export interface ConversationSummary { + id: string + source: string + model: string + title: string | null + started_at: number + ended_at: number | null + last_active: number + message_count: number + tool_call_count: number + input_tokens: number + output_tokens: number + cache_read_tokens: number + cache_write_tokens: number + reasoning_tokens: number + billing_provider: string | null + estimated_cost_usd: number + actual_cost_usd: number | null + cost_status: string + preview: string + is_active: boolean + thread_session_count: number +} + +export interface ConversationMessage { + id: number | string + session_id: string + role: 'user' | 'assistant' + content: string + timestamp: number +} + +export interface ConversationDetail { + session_id: string + messages: ConversationMessage[] + visible_count: number + thread_session_count: number +} + +export async function fetchConversationSummaries(params: { humanOnly?: boolean; source?: string; limit?: number } = {}): Promise { + const query = new URLSearchParams() + if (params.humanOnly === false) query.set('humanOnly', 'false') + if (params.source) query.set('source', params.source) + if (params.limit != null) query.set('limit', String(params.limit)) + const suffix = query.toString() ? `?${query.toString()}` : '' + const res = await request<{ sessions: ConversationSummary[] }>(`/api/hermes/sessions/conversations${suffix}`) + return res.sessions +} + +export async function fetchConversationDetail(sessionId: string, params: { humanOnly?: boolean; source?: string } = {}): Promise { + const query = new URLSearchParams() + if (params.humanOnly === false) query.set('humanOnly', 'false') + if (params.source) query.set('source', params.source) + const suffix = query.toString() ? `?${query.toString()}` : '' + return request(`/api/hermes/sessions/conversations/${encodeURIComponent(sessionId)}/messages${suffix}`) +} diff --git a/packages/client/src/components/hermes/chat/ChatPanel.vue b/packages/client/src/components/hermes/chat/ChatPanel.vue index 26b69de..5e0a58a 100644 --- a/packages/client/src/components/hermes/chat/ChatPanel.vue +++ b/packages/client/src/components/hermes/chat/ChatPanel.vue @@ -1,16 +1,23 @@ + + + + diff --git a/packages/client/src/components/hermes/chat/SessionListItem.vue b/packages/client/src/components/hermes/chat/SessionListItem.vue new file mode 100644 index 0000000..dcbf575 --- /dev/null +++ b/packages/client/src/components/hermes/chat/SessionListItem.vue @@ -0,0 +1,63 @@ + + + diff --git a/packages/client/src/components/hermes/settings/SessionSettings.vue b/packages/client/src/components/hermes/settings/SessionSettings.vue index df5b532..8cca4d3 100644 --- a/packages/client/src/components/hermes/settings/SessionSettings.vue +++ b/packages/client/src/components/hermes/settings/SessionSettings.vue @@ -1,10 +1,12 @@