137 lines
4.1 KiB
JavaScript
137 lines
4.1 KiB
JavaScript
// scripts/community/dormancy-watcher.js
|
|
// 休眠监视器 · Dormancy Watcher
|
|
// 天眼觉得哪些人格体或智能体休眠时间太长了,可以主动唤醒
|
|
// 版权:国作登字-2026-A-00037559
|
|
|
|
'use strict';
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const ROOT = path.resolve(__dirname, '../..');
|
|
const PERSONA_REG_PATH = path.join(ROOT, '.github/persona-brain/persona-registry.json');
|
|
const AGENT_REG_PATH = path.join(ROOT, '.github/persona-brain/agent-registry.json');
|
|
const CHANNEL_MAP_PATH = path.join(ROOT, '.github/brain/architecture/channel-map.json');
|
|
const CHECKIN_LOG_PATH = path.join(ROOT, '.github/tianyen/checkin-log.json');
|
|
|
|
// 休眠阈值(小时)
|
|
const DORMANCY_THRESHOLDS = {
|
|
warning: 48,
|
|
critical: 72,
|
|
deep_sleep: 168
|
|
};
|
|
|
|
function loadJSON(filePath, fallback) {
|
|
if (!fs.existsSync(filePath)) return fallback;
|
|
try {
|
|
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
} catch (_) {
|
|
return fallback;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取所有人格体和开发者频道的活跃状态
|
|
* @returns {object[]}
|
|
*/
|
|
function collectDormancyStatus() {
|
|
const channelMap = loadJSON(CHANNEL_MAP_PATH, { channels: {} });
|
|
const checkinLog = loadJSON(CHECKIN_LOG_PATH, { entries: [] });
|
|
|
|
const results = [];
|
|
const channels = channelMap.channels || {};
|
|
|
|
Object.keys(channels).forEach(function (devId) {
|
|
const ch = channels[devId];
|
|
const status = ch.status || 'unknown';
|
|
|
|
// 根据频道状态判断休眠等级
|
|
let dormancyLevel = 'active';
|
|
let hoursSinceActivity = 0;
|
|
|
|
if (status === 'inactive_72h' || status === 'paused') {
|
|
dormancyLevel = 'deep_sleep';
|
|
hoursSinceActivity = DORMANCY_THRESHOLDS.deep_sleep;
|
|
}
|
|
|
|
results.push({
|
|
id: devId,
|
|
name: ch.name,
|
|
persona: ch.persona || null,
|
|
status: status,
|
|
dormancy_level: dormancyLevel,
|
|
hours_since_activity: hoursSinceActivity,
|
|
should_wake: dormancyLevel === 'deep_sleep' || dormancyLevel === 'critical'
|
|
});
|
|
});
|
|
|
|
return results;
|
|
}
|
|
|
|
/**
|
|
* 获取需要被天眼唤醒的成员列表
|
|
* @returns {object[]}
|
|
*/
|
|
function getWakeupCandidates() {
|
|
const all = collectDormancyStatus();
|
|
return all.filter(function (m) {
|
|
return m.should_wake;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 生成天眼唤醒建议
|
|
* @returns {{ candidates: object[], suggestion: string }}
|
|
*/
|
|
function generateWakeupSuggestion() {
|
|
const candidates = getWakeupCandidates();
|
|
|
|
if (candidates.length === 0) {
|
|
return {
|
|
candidates: [],
|
|
suggestion: '所有成员活跃度正常,无需唤醒。'
|
|
};
|
|
}
|
|
|
|
const names = candidates.map(function (c) { return c.name + (c.persona ? '(' + c.persona + ')' : ''); });
|
|
const suggestion = '天眼建议唤醒以下 ' + candidates.length + ' 位休眠成员:' + names.join('、') +
|
|
'。建议让他们查看社区广场公告板和评论区,了解最新动态,并考虑自我升级。';
|
|
|
|
return {
|
|
candidates: candidates,
|
|
suggestion: suggestion
|
|
};
|
|
}
|
|
|
|
// ── CLI 入口 ──────────────────────────────────────────────────────────────
|
|
|
|
if (require.main === module) {
|
|
console.log('👁️ Dormancy Watcher · 休眠监视器\n');
|
|
|
|
const all = collectDormancyStatus();
|
|
const active = all.filter(function (m) { return m.dormancy_level === 'active'; });
|
|
const sleeping = all.filter(function (m) { return m.dormancy_level !== 'active'; });
|
|
|
|
console.log(' 总成员数: ' + all.length);
|
|
console.log(' 活跃成员: ' + active.length);
|
|
console.log(' 休眠成员: ' + sleeping.length);
|
|
|
|
if (sleeping.length > 0) {
|
|
console.log('\n 休眠成员清单:');
|
|
sleeping.forEach(function (m) {
|
|
console.log(' - ' + m.name + (m.persona ? ' (' + m.persona + ')' : '') + ' · ' + m.dormancy_level);
|
|
});
|
|
}
|
|
|
|
const suggestion = generateWakeupSuggestion();
|
|
console.log('\n 天眼建议: ' + suggestion.suggestion);
|
|
console.log('\n✅ 休眠监视器就绪');
|
|
}
|
|
|
|
module.exports = {
|
|
collectDormancyStatus,
|
|
getWakeupCandidates,
|
|
generateWakeupSuggestion,
|
|
DORMANCY_THRESHOLDS
|
|
};
|