From 17a667c9477bb0145264673ed8dba5ca2fc89a99 Mon Sep 17 00:00:00 2001 From: cuiliang Date: Sun, 12 Apr 2026 23:59:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(sessions):=20=E6=B7=BB=E5=8A=A0=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E9=87=8D=E5=91=BD=E5=90=8D=E5=8A=9F=E8=83=BD=E5=92=8C?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E8=B0=83=E7=94=A8=E8=AF=A6=E6=83=85=E5=B1=95?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现了后端 API 接口 /api/sessions/:id/rename 用于重命名会话 - 添加了 Hermes CLI renameSession 方法来处理会话重命名逻辑 - 在前端添加了会话右键菜单,支持复制会话ID和重命名操作 - 新增重命名模态框组件供用户输入新标题 - 增强了消息项组件,支持展开查看工具调用的参数和结果详情 - 改进了工具消息的UI展示,包括运行状态指示器和错误标记 - 更新了会话列表显示源标识(如 Telegram、API 等) - 优化了工具调用数据的映射逻辑,正确关联参数和执行结果 --- server/src/routes/sessions.ts | 17 +++ server/src/services/hermes-cli.ts | 15 +++ src/api/sessions.ts | 12 ++ src/components/chat/ChatPanel.vue | 167 ++++++++++++++++++++++++++-- src/components/chat/MessageItem.vue | 132 ++++++++++++++++++++-- src/stores/chat.ts | 32 ++++-- 6 files changed, 349 insertions(+), 26 deletions(-) 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) {