2026-05-10 13:12:44 +08:00

87 lines
2.6 KiB
JavaScript

/**
* /api/chat/context — 组装 system prompt 路由
*
* 聚合所有数据源,返回增强版 system prompt 片段。
* 版权:国作登字-2026-A-00037559
*/
'use strict';
var express = require('express');
var router = express.Router();
var notionService = require('../services/notion');
var dbConfig = require('../config/databases');
router.post('/chat/context', async function(req, res) {
var devId = req.body.dev_id;
if (!devId || !/^DEV-\d{3}$/.test(devId)) {
return res.status(400).json({
error: true,
code: 'INVALID_DEV_ID',
message: '需要有效的 dev_id 参数'
});
}
var context = {
dev_id: devId,
profile: null,
agents_count: 0,
syslogs_count: 0,
tickets_count: 0,
_source: 'realtime',
timestamp: new Date().toISOString()
};
// 获取开发者画像
try {
if (dbConfig.controlPanel) {
var controlPanel = await notionService.queryDB(dbConfig.controlPanel, {
property: 'DEV编号',
rich_text: { equals: devId }
}, null, 1);
if (controlPanel.results && controlPanel.results.length > 0) {
var props = controlPanel.results[0].properties || {};
context.profile = {
broadcast_id: notionService.extractRichText(props['广播编号']) || '',
broadcast_title: notionService.extractRichText(props['广播标题']) || notionService.extractTitle(props) || '',
current_ring: notionService.extractNumber(props['当前环节']) || 0,
status: notionService.extractRichText(props['状态']) || notionService.extractSelect(props['状态']) || ''
};
}
}
} catch (_) {}
// 获取 Agent 注册表计数
try {
if (dbConfig.agentRegistry) {
var agents = await notionService.queryDB(dbConfig.agentRegistry, null, null, 100);
context.agents_count = agents.results ? agents.results.length : 0;
}
} catch (_) {}
// 获取 SYSLOG 计数
try {
if (dbConfig.syslogInbox) {
var syslogs = await notionService.queryDB(dbConfig.syslogInbox, {
property: 'DEV编号',
rich_text: { equals: devId }
}, null, 100);
context.syslogs_count = syslogs.results ? syslogs.results.length : 0;
}
} catch (_) {}
// 获取活跃工单计数
try {
if (dbConfig.ticketBook) {
var tickets = await notionService.queryDB(dbConfig.ticketBook,
{ property: '状态', select: { does_not_equal: '已完成' } }, null, 100);
context.tickets_count = tickets.results ? tickets.results.length : 0;
}
} catch (_) {}
res.json(context);
});
module.exports = router;