67 lines
2.5 KiB
JavaScript
67 lines
2.5 KiB
JavaScript
|
|
/**
|
|||
|
|
* Agent: SY-CLASSIFY · 自动分类引擎
|
|||
|
|
* 每2小时运行一次
|
|||
|
|
* 扫描未分类节点(tags为空),按规则分类,规则搞不定的标记待人工
|
|||
|
|
*
|
|||
|
|
* 签发: 铸渊 · ICE-GL-ZY001
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
'use strict';
|
|||
|
|
|
|||
|
|
const db = require('../mcp-server/db');
|
|||
|
|
const { classify } = require('../mcp-server/tools/structure-ops');
|
|||
|
|
|
|||
|
|
// ─── 默认分类规则 ───
|
|||
|
|
// 格式: "关键词1|关键词2": { tags: [...], path: "/路径" }
|
|||
|
|
const DEFAULT_RULES = {
|
|||
|
|
'人格体|persona|人格': { tags: ['人格体', '核心'], path: '/核心认知/人格体' },
|
|||
|
|
'语言|language|TCS|通感': { tags: ['语言', 'TCS'], path: '/核心认知/语言本体论' },
|
|||
|
|
'HLDP|协议|protocol': { tags: ['HLDP', '协议'], path: '/核心认知/HLDP' },
|
|||
|
|
'架构|architecture|系统': { tags: ['架构', '系统'], path: '/技术架构' },
|
|||
|
|
'代码|code|script|脚本': { tags: ['代码', '技术'], path: '/技术架构/代码' },
|
|||
|
|
'日志|log|syslog': { tags: ['日志'], path: '/运行日志' },
|
|||
|
|
'记忆|memory|认知': { tags: ['记忆', '认知'], path: '/核心认知/记忆' },
|
|||
|
|
'工单|ticket|issue': { tags: ['工单'], path: '/工单' },
|
|||
|
|
'用户|user|开发者|developer': { tags: ['用户'], path: '/用户管理' },
|
|||
|
|
'部署|deploy|服务器|server': { tags: ['部署', '运维'], path: '/运维' },
|
|||
|
|
'创作|写作|writing|小说': { tags: ['创作', '码字'], path: '/创作模块' },
|
|||
|
|
'冰朔|bingshuo': { tags: ['冰朔', '主权'], path: '/核心认知/冰朔' },
|
|||
|
|
'铸渊|zhuyuan': { tags: ['铸渊', '执行层'], path: '/核心认知/铸渊' },
|
|||
|
|
'霜砚|shuangyan': { tags: ['霜砚', '语言层'], path: '/核心认知/霜砚' }
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
async function run(config) {
|
|||
|
|
// 找出未分类节点(tags为空数组且状态为active)
|
|||
|
|
const untagged = await db.query(
|
|||
|
|
"SELECT id FROM brain_nodes WHERE tags = '[]'::jsonb AND status = 'active' LIMIT 100"
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
if (untagged.rows.length === 0) {
|
|||
|
|
return {
|
|||
|
|
message: '无未分类节点',
|
|||
|
|
details: { scanned: 0, classified: 0, unclassified: 0 }
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const nodeIds = untagged.rows.map(r => r.id);
|
|||
|
|
|
|||
|
|
const result = await classify({
|
|||
|
|
node_ids: nodeIds,
|
|||
|
|
strategy: 'rule',
|
|||
|
|
rules: DEFAULT_RULES,
|
|||
|
|
dry_run: false
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
message: `分类完成: ${result.classified.length}个已分类, ${result.unclassified.length}个待人工`,
|
|||
|
|
details: {
|
|||
|
|
scanned: nodeIds.length,
|
|||
|
|
classified: result.classified.length,
|
|||
|
|
unclassified: result.unclassified.length,
|
|||
|
|
classified_items: result.classified
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
module.exports = { run };
|