// Profile 管理 API — 查看、下载 profile 文件(供 Hermes Agent 和管理员使用) const express = require('express'); const { adminAuthMiddleware } = require('../middleware/admin-auth'); const { listProfiles, getProfileMeta, getProfileFile, deleteProfile } = require('../lib/profile-store'); const router = express.Router(); // 获取所有 profile 列表(需管理员认证) router.get('/', adminAuthMiddleware, (req, res) => { try { const profiles = listProfiles(); res.json({ profiles, total: profiles.length }); } catch (err) { console.error('获取 profile 列表失败:', err); res.status(500).json({ error: '服务器错误' }); } }); // 获取 profile 详情(需管理员认证) router.get('/:profileId', adminAuthMiddleware, (req, res) => { try { const meta = getProfileMeta(req.params.profileId); if (!meta) { return res.status(404).json({ error: 'Profile 不存在' }); } res.json({ profile: meta }); } catch (err) { console.error('获取 profile 详情失败:', err); res.status(500).json({ error: '服务器错误' }); } }); // 下载 SOUL.md(供 Hermes Agent 使用,限制本机访问) router.get('/:profileId/SOUL.md', (req, res) => { try { // P2 修复:限制本机访问 const clientIp = (req.socket.remoteAddress || '').replace(/^::ffff:/, ''); if (clientIp !== '127.0.0.1' && clientIp !== '::1' && clientIp !== '') { return res.status(403).json({ error: '仅限本机访问' }); } const content = getProfileFile(req.params.profileId, 'SOUL.md'); if (content === null) { return res.status(404).json({ error: 'Profile 或 SOUL.md 不存在' }); } // P3 修复:使用语义正确的 Content-Type res.type('text/markdown').send(content); } catch (err) { console.error('获取 SOUL.md 失败:', err); res.status(500).json({ error: '服务器错误' }); } }); // 下载 config.yaml(供 Hermes Agent 使用,限制本机访问) router.get('/:profileId/config.yaml', (req, res) => { try { // P2 修复:限制本机访问 const clientIp = (req.socket.remoteAddress || '').replace(/^::ffff:/, ''); if (clientIp !== '127.0.0.1' && clientIp !== '::1' && clientIp !== '') { return res.status(403).json({ error: '仅限本机访问' }); } const content = getProfileFile(req.params.profileId, 'config.yaml'); if (content === null) { return res.status(404).json({ error: 'Profile 或 config.yaml 不存在' }); } // P3 修复:使用语义正确的 Content-Type res.type('text/yaml').send(content); } catch (err) { console.error('获取 config.yaml 失败:', err); res.status(500).json({ error: '服务器错误' }); } }); // 删除 profile(需管理员认证) router.delete('/:profileId', adminAuthMiddleware, (req, res) => { try { const deleted = deleteProfile(req.params.profileId); if (!deleted) { return res.status(404).json({ error: 'Profile 不存在' }); } res.json({ message: 'Profile 已删除' }); } catch (err) { console.error('删除 profile 失败:', err); res.status(500).json({ error: '服务器错误' }); } }); module.exports = router;