diff --git a/server/src/routes/sessions.ts b/server/src/routes/sessions.ts index 264c236b..96ca8d2a 100644 --- a/server/src/routes/sessions.ts +++ b/server/src/routes/sessions.ts @@ -32,3 +32,20 @@ sessionRoutes.delete('/api/sessions/:id', async (ctx) => { } ctx.body = { ok: true } }) + +// Rename session +sessionRoutes.post('/api/sessions/:id/rename', async (ctx) => { + const { title } = ctx.request.body as { title?: string } + if (!title || typeof title !== 'string') { + ctx.status = 400 + ctx.body = { error: 'title is required' } + return + } + const ok = await hermesCli.renameSession(ctx.params.id, title.trim()) + if (!ok) { + ctx.status = 500 + ctx.body = { error: 'Failed to rename session' } + return + } + ctx.body = { ok: true } +}) diff --git a/server/src/services/hermes-cli.ts b/server/src/services/hermes-cli.ts index 12d6063c..68310b27 100644 --- a/server/src/services/hermes-cli.ts +++ b/server/src/services/hermes-cli.ts @@ -140,6 +140,21 @@ export async function deleteSession(id: string): Promise { } } +/** + * Rename a session title via Hermes CLI + */ +export async function renameSession(id: string, title: string): Promise { + try { + await execFileAsync('hermes', ['sessions', 'rename', id, title], { + timeout: 10000, + }) + return true + } catch (err: any) { + console.error('[Hermes CLI] session rename failed:', err.message) + return false + } +} + export interface LogFileInfo { name: string size: string diff --git a/src/api/sessions.ts b/src/api/sessions.ts index 68498702..2051aea7 100644 --- a/src/api/sessions.ts +++ b/src/api/sessions.ts @@ -59,3 +59,15 @@ export async function deleteSession(id: string): Promise { return false } } + +export async function renameSession(id: string, title: string): Promise { + try { + await request(`/api/sessions/${id}/rename`, { + method: 'POST', + body: JSON.stringify({ title }), + }) + return true + } catch { + return false + } +} diff --git a/src/components/chat/ChatPanel.vue b/src/components/chat/ChatPanel.vue index d421cefd..9d3fbe91 100644 --- a/src/components/chat/ChatPanel.vue +++ b/src/components/chat/ChatPanel.vue @@ -1,36 +1,70 @@ - {{ activeSessionLabel }} + {{ activeSessionTitle }} + {{ getSourceLabel(activeSessionSource) }}
{{ sessionModelLabel }} @@ -110,7 +231,7 @@ function formatTime(ts: number) {