307 lines
7.8 KiB
JavaScript
307 lines
7.8 KiB
JavaScript
// src/routes/hli/brain/index.js
|
|
// HLI BRAIN 域路由 — 铸渊核心大脑接口
|
|
// 不需要鉴权(前端壳层需要调用这些接口来组装 AI 请求)
|
|
|
|
'use strict';
|
|
|
|
const express = require('express');
|
|
const router = express.Router();
|
|
const brain = require('../../../brain');
|
|
|
|
// POST /hli/brain/prompt — 组装系统提示词
|
|
router.post('/prompt', (req, res) => {
|
|
const { userName, ghUser, role, mode, devStatus } = req.body;
|
|
|
|
if (!userName) {
|
|
return res.status(400).json({
|
|
error: true,
|
|
code: 'MISSING_USERNAME',
|
|
message: '缺少 userName 参数',
|
|
});
|
|
}
|
|
|
|
const detectedMode = mode || brain.detectMode(req.body.text || '').mode;
|
|
const prompt = brain.assemblePrompt({
|
|
userName,
|
|
ghUser: ghUser || '',
|
|
role: role || 'guest',
|
|
mode: detectedMode,
|
|
brain: brain.loadLongTermMemory() || brain.FALLBACK_BRAIN,
|
|
devStatus: devStatus || null,
|
|
userMeta: brain.ROLE_MAP[userName] || null,
|
|
});
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-001',
|
|
prompt,
|
|
brain_version: brain.BRAIN_VERSION,
|
|
mode: detectedMode,
|
|
});
|
|
});
|
|
|
|
// POST /hli/brain/route — 任务型模型路由
|
|
router.post('/route', (req, res) => {
|
|
const { text, contextLength, isGuest } = req.body;
|
|
|
|
if (!text) {
|
|
return res.status(400).json({
|
|
error: true,
|
|
code: 'MISSING_TEXT',
|
|
message: '缺少 text 参数',
|
|
});
|
|
}
|
|
|
|
const modeResult = brain.detectMode(text);
|
|
const modelResult = brain.selectModel(modeResult.mode, {
|
|
contextLength: contextLength || 0,
|
|
isGuest: isGuest || false,
|
|
});
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-002',
|
|
mode: modeResult,
|
|
model: modelResult,
|
|
routing_table: brain.getRoutingTable(),
|
|
failure_status: brain.getFailureStatus(),
|
|
});
|
|
});
|
|
|
|
// POST /hli/brain/context — 上下文裁剪
|
|
router.post('/context', (req, res) => {
|
|
const { messages, systemMessages, isGuest, contextBudget } = req.body;
|
|
|
|
if (!messages || !Array.isArray(messages)) {
|
|
return res.status(400).json({
|
|
error: true,
|
|
code: 'MISSING_MESSAGES',
|
|
message: '缺少 messages 参数',
|
|
});
|
|
}
|
|
|
|
const result = brain.trimMessages(
|
|
systemMessages || [],
|
|
messages,
|
|
{ isGuest: isGuest || false, contextBudget: contextBudget || 0 },
|
|
);
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-003',
|
|
messages: result.messages,
|
|
trimmed: result.trimmed,
|
|
totalTokens: result.totalTokens,
|
|
});
|
|
});
|
|
|
|
// POST /hli/brain/memory — 记忆分析与候选生成
|
|
router.post('/memory', (req, res) => {
|
|
const { text, source } = req.body;
|
|
|
|
if (!text) {
|
|
return res.status(400).json({
|
|
error: true,
|
|
code: 'MISSING_TEXT',
|
|
message: '缺少 text 参数',
|
|
});
|
|
}
|
|
|
|
const candidates = brain.generateCandidates(text, source || 'user');
|
|
const memoryStatus = brain.getMemoryStatus();
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-004',
|
|
candidates,
|
|
memory_status: memoryStatus,
|
|
});
|
|
});
|
|
|
|
// GET /hli/brain/status — 大脑状态概览
|
|
router.get('/status', (req, res) => {
|
|
const longTermMemory = brain.loadLongTermMemory();
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-STATUS',
|
|
brain_version: brain.BRAIN_VERSION,
|
|
modes: brain.MODES,
|
|
routing_table: brain.getRoutingTable(),
|
|
failure_status: brain.getFailureStatus(),
|
|
context_config: brain.CONTEXT_CONFIG,
|
|
memory_status: brain.getMemoryStatus(),
|
|
long_term_loaded: !!longTermMemory,
|
|
role_map: Object.keys(brain.ROLE_MAP),
|
|
});
|
|
});
|
|
|
|
// ══════════════════════════════════════════════════════════
|
|
// 冰朔核心大脑桥接口 (Brain Bridge)
|
|
// ══════════════════════════════════════════════════════════
|
|
|
|
// GET /hli/brain/bridge — 冰朔大脑桥状态总览
|
|
router.get('/bridge', (req, res) => {
|
|
const bridge = brain.bridge;
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-010',
|
|
sync_state: bridge.getSyncSnapshot(),
|
|
master_mode: bridge.getMasterMode(),
|
|
runtime_status: bridge.collectRuntimeStatus(),
|
|
developers: bridge.listDevelopers(),
|
|
auto_agents: bridge.listAutoAgents(),
|
|
explanation: bridge.generateExplanationCenter(),
|
|
});
|
|
});
|
|
|
|
// POST /hli/brain/bridge/sync — 接收 Notion → GitHub 同步
|
|
router.post('/bridge/sync', (req, res) => {
|
|
const bridge = brain.bridge;
|
|
const result = bridge.receiveNotionToGitHubPayload(req.body);
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-011',
|
|
...result,
|
|
});
|
|
});
|
|
|
|
// GET /hli/brain/bridge/export — 生成 GitHub → Notion 同步负载
|
|
router.get('/bridge/export', (req, res) => {
|
|
const bridge = brain.bridge;
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-012',
|
|
...bridge.generateGitHubToNotionPayload(),
|
|
});
|
|
});
|
|
|
|
// POST /hli/brain/bridge/consistency — 版本一致性检查
|
|
router.post('/bridge/consistency', (req, res) => {
|
|
const bridge = brain.bridge;
|
|
const notionState = req.body;
|
|
|
|
if (!notionState || typeof notionState !== 'object') {
|
|
return res.status(400).json({
|
|
error: true,
|
|
code: 'MISSING_NOTION_STATE',
|
|
message: '缺少 Notion 侧同步状态',
|
|
});
|
|
}
|
|
|
|
const result = bridge.checkConsistency(notionState);
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-013',
|
|
...result,
|
|
});
|
|
});
|
|
|
|
// POST /hli/brain/bridge/master-mode — 切换主控模式
|
|
router.post('/bridge/master-mode', (req, res) => {
|
|
const bridge = brain.bridge;
|
|
const { mode } = req.body;
|
|
|
|
if (!mode) {
|
|
return res.status(400).json({
|
|
error: true,
|
|
code: 'MISSING_MODE',
|
|
message: '缺少 mode 参数,可选: HUMAN_CONTROL, AUTONOMOUS_MODE',
|
|
});
|
|
}
|
|
|
|
try {
|
|
const result = bridge.setMasterMode(mode);
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-014',
|
|
...result,
|
|
});
|
|
} catch (err) {
|
|
res.status(400).json({
|
|
error: true,
|
|
code: 'INVALID_MODE',
|
|
message: err.message,
|
|
});
|
|
}
|
|
});
|
|
|
|
// GET /hli/brain/bridge/explanation — 主控解释中心
|
|
router.get('/bridge/explanation', (req, res) => {
|
|
const bridge = brain.bridge;
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-015',
|
|
...bridge.generateExplanationCenter(),
|
|
});
|
|
});
|
|
|
|
// GET /hli/brain/bridge/inspection — 巡检报告
|
|
router.get('/bridge/inspection', (req, res) => {
|
|
const bridge = brain.bridge;
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-016',
|
|
...bridge.generateInspectionReport(),
|
|
});
|
|
});
|
|
|
|
// GET /hli/brain/bridge/developers — 人类开发者编号列表
|
|
router.get('/bridge/developers', (req, res) => {
|
|
const bridge = brain.bridge;
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-017',
|
|
developers: bridge.listDevelopers(),
|
|
pending_notifications: bridge.getPendingNotifications(),
|
|
});
|
|
});
|
|
|
|
// GET /hli/brain/bridge/developers/:expId — 查询单个开发者
|
|
router.get('/bridge/developers/:expId', (req, res) => {
|
|
const bridge = brain.bridge;
|
|
const dev = bridge.findDeveloper(req.params.expId);
|
|
|
|
if (!dev) {
|
|
return res.status(404).json({
|
|
error: true,
|
|
code: 'DEVELOPER_NOT_FOUND',
|
|
message: `开发者 ${req.params.expId} 不存在`,
|
|
});
|
|
}
|
|
|
|
const notification = bridge.generateDeveloperNotification(req.params.expId);
|
|
|
|
res.json({
|
|
hli_id: 'HLI-BRAIN-018',
|
|
developer: dev,
|
|
notification: notification.notification,
|
|
});
|
|
});
|
|
|
|
// POST /hli/brain/bridge/developers — 注册新开发者
|
|
router.post('/bridge/developers', (req, res) => {
|
|
const bridge = brain.bridge;
|
|
const { name } = req.body;
|
|
|
|
if (!name) {
|
|
return res.status(400).json({
|
|
error: true,
|
|
code: 'MISSING_NAME',
|
|
message: '缺少 name 参数',
|
|
});
|
|
}
|
|
|
|
const result = bridge.registerDeveloper(req.body);
|
|
|
|
if (result.duplicate) {
|
|
return res.status(409).json({
|
|
error: true,
|
|
code: 'DUPLICATE_DEVELOPER',
|
|
message: `开发者已存在: ${result.existing.exp_id} (${result.existing.name})`,
|
|
existing: result.existing,
|
|
});
|
|
}
|
|
|
|
res.status(201).json({
|
|
hli_id: 'HLI-BRAIN-019',
|
|
...result,
|
|
});
|
|
});
|
|
|
|
module.exports = router;
|