115 lines
2.8 KiB
JavaScript
115 lines
2.8 KiB
JavaScript
|
|
// 规则热更新引擎·hot-reload.js
|
|||
|
|
// HoloLake·M-DINGTALK Phase 3
|
|||
|
|
// DEV-004 之之×秋秋
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
const fs = require('fs');
|
|||
|
|
const path = require('path');
|
|||
|
|
const kb = require('../knowledge-base/kb-manager');
|
|||
|
|
|
|||
|
|
// 当前加载的规则(内存缓存)
|
|||
|
|
let currentRules = {};
|
|||
|
|
let lastReloadTime = null;
|
|||
|
|
|
|||
|
|
// 规则文件目录
|
|||
|
|
const RULES_DIR = path.join(__dirname, '..', 'config');
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 加载所有规则文件到内存
|
|||
|
|
*/
|
|||
|
|
function loadRules() {
|
|||
|
|
console.log('[HotReload] 开始加载规则...');
|
|||
|
|
|
|||
|
|
const rulesFile = path.join(RULES_DIR, 'sync-config.json');
|
|||
|
|
|
|||
|
|
if (fs.existsSync(rulesFile)) {
|
|||
|
|
try {
|
|||
|
|
const content = fs.readFileSync(rulesFile, 'utf-8');
|
|||
|
|
currentRules = JSON.parse(content);
|
|||
|
|
lastReloadTime = new Date().toISOString();
|
|||
|
|
console.log(`[HotReload] 规则加载成功 · ${Object.keys(currentRules).length} 个配置项`);
|
|||
|
|
} catch (err) {
|
|||
|
|
console.error('[HotReload] 规则加载失败:', err.message);
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
console.log('[HotReload] 规则文件不存在,使用默认配置');
|
|||
|
|
currentRules = {
|
|||
|
|
version: '1.0',
|
|||
|
|
sync_interval: 30,
|
|||
|
|
timeout_hours: 72,
|
|||
|
|
notion_db_id: 'mock-db-id'
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return currentRules;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 处理规则更新(由Webhook触发)
|
|||
|
|
* @param {Object} payload - GitHub webhook payload
|
|||
|
|
* @param {Object} log - 事件日志
|
|||
|
|
*/
|
|||
|
|
async function handleRulesUpdate(payload, log) {
|
|||
|
|
console.log('\n[HotReload] ====================');
|
|||
|
|
console.log('[HotReload] 收到规则更新通知');
|
|||
|
|
|
|||
|
|
const changedFiles = log.changedFiles || [];
|
|||
|
|
|
|||
|
|
// 检查是否有规则相关文件变更
|
|||
|
|
const rulesChanged = changedFiles.some(f =>
|
|||
|
|
f.includes('rules/') ||
|
|||
|
|
f.includes('config/') ||
|
|||
|
|
f.includes('broadcast-engine/')
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
const docsChanged = changedFiles.some(f =>
|
|||
|
|
f.includes('knowledge-base/') ||
|
|||
|
|
f.includes('docs/')
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
if (rulesChanged) {
|
|||
|
|
console.log('[HotReload] 检测到规则文件变更!执行热更新...');
|
|||
|
|
loadRules();
|
|||
|
|
console.log(`[HotReload] 规则热更新完成 · ${new Date().toLocaleString('zh-CN')}`);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (docsChanged) {
|
|||
|
|
console.log('[HotReload] 检测到知识库文档变更!重新建立索引...');
|
|||
|
|
kb.reload();
|
|||
|
|
console.log(`[HotReload] 知识库索引更新完成 · ${new Date().toLocaleString('zh-CN')}`);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!rulesChanged && !docsChanged) {
|
|||
|
|
console.log('[HotReload] 变更文件与规则/知识库无关,跳过热更新');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取当前规则
|
|||
|
|
*/
|
|||
|
|
function getRules() {
|
|||
|
|
if (Object.keys(currentRules).length === 0) {
|
|||
|
|
loadRules();
|
|||
|
|
}
|
|||
|
|
return currentRules;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取热更新状态
|
|||
|
|
*/
|
|||
|
|
function getStatus() {
|
|||
|
|
return {
|
|||
|
|
rulesLoaded: Object.keys(currentRules).length > 0,
|
|||
|
|
ruleKeys: Object.keys(currentRules),
|
|||
|
|
lastReloadTime,
|
|||
|
|
knowledgeBase: kb.getStats()
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
module.exports = {
|
|||
|
|
loadRules,
|
|||
|
|
handleRulesUpdate,
|
|||
|
|
getRules,
|
|||
|
|
getStatus
|
|||
|
|
};
|