From 2753063b6fa6d8efcc4801092b876324ee354ff7 Mon Sep 17 00:00:00 2001 From: WangDL Date: Fri, 22 May 2026 17:31:55 +0800 Subject: [PATCH] feat: pass through approval.request events + approval endpoint --- .../admin-ai-chat/admin-ai-chat.controller.ts | 14 ++++++++++++-- src/modules/admin-ai-chat/admin-ai-chat.service.ts | 7 +++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/modules/admin-ai-chat/admin-ai-chat.controller.ts b/src/modules/admin-ai-chat/admin-ai-chat.controller.ts index 895151c..9e31075 100644 --- a/src/modules/admin-ai-chat/admin-ai-chat.controller.ts +++ b/src/modules/admin-ai-chat/admin-ai-chat.controller.ts @@ -34,8 +34,18 @@ export class AdminAiChatController { @AdminRoles('SUPER_ADMIN' as AdminRole) @ApiBearerAuth() @ApiOperation({ summary: '停止正在运行的 AI 任务' }) - async stopChat(@Body('runId') runId: string) { - return this.aiChatService.stopRun(runId); + async stopChat(@Body() body: { runId: string; action?: string }) { + if (body.action) { + // Approval action: forward to Hermes + try { + await fetch(`http://10.2.0.7:8642/v1/runs/${body.runId}/approval`, { + method: 'POST', + headers: { 'Content-Type': 'application/json', Authorization: 'Bearer zhixi-hermes-key-2026' }, + body: JSON.stringify({ choice: body.action }), + }); + } catch {} + } + return this.aiChatService.stopRun(body.runId); } @Get('dashboard') diff --git a/src/modules/admin-ai-chat/admin-ai-chat.service.ts b/src/modules/admin-ai-chat/admin-ai-chat.service.ts index edb5b90..3b68060 100644 --- a/src/modules/admin-ai-chat/admin-ai-chat.service.ts +++ b/src/modules/admin-ai-chat/admin-ai-chat.service.ts @@ -143,6 +143,13 @@ export class AdminAiChatService { res.write(`data: ${JSON.stringify({ ...event, runId })}\n\n`); // Forward tool events + if (event.event === 'approval.request') { + res.write(`data: ${JSON.stringify({ event: 'approval.request', command: (event as any).command, description: (event as any).description, choices: (event as any).choices, runId: runId })} + +`); + // Wait for approval — frontend calls /stop endpoint which we use for this + break; + } if (event.event === 'tool.started' || event.event === 'tool.completed') { res.write(`data: ${JSON.stringify({ event: event.event, tool: (event as any).tool, preview: (event as any).preview, duration: (event as any).duration, error: (event as any).error })}