feat: add Hermes gateway controls

This commit is contained in:
Simos Mikelatos
2026-07-01 15:29:53 +00:00
parent dcd7044258
commit c3a4ab8a45
11 changed files with 780 additions and 2 deletions

View File

@@ -2,6 +2,7 @@ import express, { type Request, type Response } from 'express';
import { providerAuthService } from '@/modules/providers/services/provider-auth.service.js';
import { providerCapabilitiesService } from '@/modules/providers/services/provider-capabilities.service.js';
import { hermesGatewayService } from '@/modules/providers/services/hermes-gateway.service.js';
import { providerMcpService } from '@/modules/providers/services/mcp.service.js';
import { providerModelsService } from '@/modules/providers/services/provider-models.service.js';
import { providerSkillsService } from '@/modules/providers/services/skills.service.js';
@@ -340,6 +341,18 @@ const parseProvider = (value: unknown): LLMProvider => {
});
};
const parseHermesProvider = (value: unknown): 'hermes' => {
const provider = parseProvider(value);
if (provider !== 'hermes') {
throw new AppError('Gateway controls are only available for Hermes.', {
code: 'HERMES_GATEWAY_UNSUPPORTED_PROVIDER',
statusCode: 404,
});
}
return provider;
};
const parseSessionRenameSummary = (payload: unknown): string => {
if (!payload || typeof payload !== 'object') {
throw new AppError('Request body must be an object.', {
@@ -637,6 +650,51 @@ router.get(
}),
);
// ----------------- Hermes gateway routes -----------------
router.get(
'/:provider/gateway/status',
asyncHandler(async (req: Request, res: Response) => {
parseHermesProvider(req.params.provider);
const status = await hermesGatewayService.getStatus();
res.json(createApiSuccessResponse(status));
}),
);
router.get(
'/:provider/gateway/logs',
asyncHandler(async (req: Request, res: Response) => {
parseHermesProvider(req.params.provider);
res.json(createApiSuccessResponse({ logs: hermesGatewayService.getLogs() }));
}),
);
router.post(
'/:provider/gateway/start',
asyncHandler(async (req: Request, res: Response) => {
parseHermesProvider(req.params.provider);
const status = await hermesGatewayService.start();
res.json(createApiSuccessResponse(status));
}),
);
router.post(
'/:provider/gateway/stop',
asyncHandler(async (req: Request, res: Response) => {
parseHermesProvider(req.params.provider);
const status = await hermesGatewayService.stop();
res.json(createApiSuccessResponse(status));
}),
);
router.post(
'/:provider/gateway/restart',
asyncHandler(async (req: Request, res: Response) => {
parseHermesProvider(req.params.provider);
const status = await hermesGatewayService.restart();
res.json(createApiSuccessResponse(status));
}),
);
// ----------------- Session routes -----------------
/**
* Session gateway entry point: allocates the stable app-facing session id for