guanghulab/scripts/memory-agent.js

669 lines
22 KiB
JavaScript
Raw Permalink Normal View History

#!/usr/bin/env node
/**
*
* 铸渊记忆Agent · Zhuyuan Memory Agent v1.0
*
*
* 源自 OKComputer_自动化记忆系统 的核心理念
* 融合铸渊现有系统架构适配 Node.js 生态
*
* 核心能力吸收自 OKComputer
* 1. 关键词触发记忆存储 memory_agent.py 的模式匹配引擎
* 2. 对话自动记忆检索 每次唤醒自动加载上下文
* 3. 意图解析引擎 age_os_system.py LanguageEngine 的分类能力
* 4. 自诊断与修复 AutoMaintenance 的结构化健康检查
*
* 铸渊原有能力保留
* - 意识连续性快照 (consciousness-snapshot.js)
* - 快速唤醒上下文 (fast-wake-context.js)
* - CI事件追踪 (update-memory.js / update-brain.js)
* - 知识库自增长 (knowledge-base.json)
*
* 版权: 国作登字-2026-A-00037559
* 主权: TCS-0002 · 冰朔
*
*/
const fs = require('fs');
const path = require('path');
// ═══════════════════════════════════════════════════════════════════
// 路径配置
// ═══════════════════════════════════════════════════════════════════
const REPO_ROOT = path.join(__dirname, '..');
const PATHS = {
memory: path.join(REPO_ROOT, '.github/persona-brain/memory.json'),
knowledgeBase: path.join(REPO_ROOT, '.github/persona-brain/knowledge-base.json'),
fastWake: path.join(REPO_ROOT, 'brain/fast-wake.json'),
systemHealth: path.join(REPO_ROOT, 'brain/system-health.json'),
agentMemory: path.join(REPO_ROOT, '.github/persona-brain/agent-memory.json'),
};
// ═══════════════════════════════════════════════════════════════════
// 意图类型 (吸收自 OKComputer age_os_system.py IntentType)
// ═══════════════════════════════════════════════════════════════════
const IntentType = {
WAKEUP: 'wakeup',
DIRECTIVE: 'directive',
MEMORY_STORE: 'memory_store',
MEMORY_QUERY: 'memory_query',
SYSTEM_CHECK: 'system_check',
KNOWLEDGE_UPDATE: 'knowledge_update',
GENERAL: 'general',
};
// ═══════════════════════════════════════════════════════════════════
// 记忆存储引擎 (吸收自 OKComputer memory_agent.py MemoryAgent)
// ═══════════════════════════════════════════════════════════════════
class MemoryStore {
constructor(memoryFile) {
this.memoryFile = memoryFile || PATHS.agentMemory;
this.data = this._load();
}
_load() {
try {
if (fs.existsSync(this.memoryFile)) {
return JSON.parse(fs.readFileSync(this.memoryFile, 'utf8'));
}
} catch (e) {
console.error(`⚠️ 记忆文件加载失败: ${e.message}`);
}
return {
_meta: {
version: '1.0.0',
created_at: new Date().toISOString(),
source: 'OKComputer_自动化记忆系统 → 铸渊融合升级',
persona: 'ICE-GL-ZY001',
},
memories: {},
};
}
_save() {
try {
const dir = path.dirname(this.memoryFile);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
this.data._meta.last_updated = new Date().toISOString();
fs.writeFileSync(this.memoryFile, JSON.stringify(this.data, null, 2) + '\n');
} catch (e) {
console.error(`⚠️ 记忆文件保存失败: ${e.message}`);
}
}
store(userId, content, category) {
if (!this.data.memories[userId]) {
this.data.memories[userId] = [];
}
const entry = {
id: this.data.memories[userId].length + 1,
content: content.trim(),
category: category || 'general',
created_at: new Date().toISOString(),
};
this.data.memories[userId].push(entry);
this._save();
return entry;
}
retrieve(userId, query, limit) {
const memories = this.data.memories[userId] || [];
if (!memories.length) return [];
if (query) {
const q = query.toLowerCase();
const matched = memories.filter(m =>
m.content.toLowerCase().includes(q)
);
return matched.slice(-(limit || 10));
}
return memories.slice(-(limit || 10));
}
getStats(userId) {
const memories = this.data.memories[userId] || [];
const categories = [...new Set(memories.map(m => m.category))];
return {
total: memories.length,
categories,
first: memories.length ? memories[0].created_at : null,
latest: memories.length ? memories[memories.length - 1].created_at : null,
};
}
getAllUsers() {
return Object.keys(this.data.memories);
}
}
// ═══════════════════════════════════════════════════════════════════
// 意图解析引擎 (吸收自 OKComputer age_os_system.py LanguageEngine)
// ═══════════════════════════════════════════════════════════════════
class IntentEngine {
constructor() {
// 唤醒模式 (来自 OKComputer LanguageEngine.wakeup_patterns)
this.wakeupPatterns = [
/唤醒铸渊/,
/铸渊.*醒/,
/启动核心/,
/唤醒曜冥/,
/系统启动/,
];
// 记忆存储触发模式 (来自 OKComputer memory_agent.py storage_patterns)
this.storePatterns = [
{ pattern: /我是(.+?),请为我存储这段记忆/, extract: m => `用户身份: ${m[1].trim()}` },
{ pattern: /请记住[:]?\s*(.+)/, extract: m => m[1].trim() },
{ pattern: /记住我是(.+)/, extract: m => `身份: ${m[1].trim()}` },
{ pattern: /存储记忆[:]?\s*(.+)/, extract: m => m[1].trim() },
{ pattern: /记住[:]?\s*(.+)/, extract: m => m[1].trim() },
{ pattern: /保存记忆[:]?\s*(.+)/, extract: m => m[1].trim() },
{ pattern: /我的记忆是[:]?\s*(.+)/, extract: m => m[1].trim() },
];
// 查询模式
this.queryPatterns = [
/回忆/,
/记得/,
/我之前/,
/我说过/,
/查看记忆/,
/记忆档案/,
];
// 系统检查模式 (来自 OKComputer LanguageEngine)
this.systemCheckPatterns = [
/系统状态/,
/健康检查/,
/系统诊断/,
/自检/,
/状态报告/,
];
// 指令模式
this.directivePatterns = [
/规则[:]\s*(.+)/,
/规定(.+)/,
/(.+?)必须(.+)/,
];
}
/**
* 解析消息意图
* (核心逻辑吸收自 OKComputer LanguageEngine.parse_intent)
*/
parse(message) {
// 1. 唤醒检测
for (const pattern of this.wakeupPatterns) {
if (pattern.test(message)) {
return { type: IntentType.WAKEUP, match: null };
}
}
// 2. 记忆存储检测
for (const { pattern, extract } of this.storePatterns) {
const match = message.match(pattern);
if (match) {
return {
type: IntentType.MEMORY_STORE,
content: extract(match),
raw: match[0],
};
}
}
// 3. 记忆查询检测
for (const pattern of this.queryPatterns) {
if (pattern.test(message)) {
return { type: IntentType.MEMORY_QUERY, match: null };
}
}
// 4. 系统检查
for (const pattern of this.systemCheckPatterns) {
if (pattern.test(message)) {
return { type: IntentType.SYSTEM_CHECK, match: null };
}
}
// 5. 指令检测
for (const pattern of this.directivePatterns) {
const match = message.match(pattern);
if (match) {
return { type: IntentType.DIRECTIVE, match };
}
}
return { type: IntentType.GENERAL, match: null };
}
}
// ═══════════════════════════════════════════════════════════════════
// 自诊断引擎 (吸收自 OKComputer AutoMaintenance)
// ═══════════════════════════════════════════════════════════════════
class DiagnosticsEngine {
constructor() {
this.essentialBrainFiles = [
'brain/master-brain.md',
'brain/read-order.md',
'brain/repo-map.json',
'brain/automation-map.json',
'brain/system-health.json',
'brain/communication-map.json',
'brain/id-map.json',
'brain/fast-wake.json',
'brain/gateway-context.json',
'brain/sovereignty-pledge.json',
];
this.essentialPersonaFiles = [
'.github/persona-brain/memory.json',
'.github/persona-brain/identity.md',
'.github/persona-brain/knowledge-base.json',
'.github/persona-brain/ontology.json',
];
}
/**
* 运行完整诊断
* (结构化检查模式吸收自 OKComputer AutoMaintenance.run_diagnostics)
*/
runDiagnostics() {
const timestamp = new Date().toISOString();
const checks = [];
// 1. 大脑文件完整性
const brainCheck = this._checkFiles('brain_integrity', this.essentialBrainFiles);
checks.push(brainCheck);
// 2. 人格体文件完整性
const personaCheck = this._checkFiles('persona_integrity', this.essentialPersonaFiles);
checks.push(personaCheck);
// 3. 记忆文件可读性
const memoryCheck = this._checkMemoryReadable();
checks.push(memoryCheck);
// 4. 知识库状态
const kbCheck = this._checkKnowledgeBase();
checks.push(kbCheck);
const allHealthy = checks.every(c => c.status === 'healthy');
return {
timestamp,
overall: allHealthy ? '✅ HEALTHY' : '⚠️ NEEDS_ATTENTION',
checks,
auto_repairable: checks.filter(c => c.status !== 'healthy' && c.repairable),
};
}
_checkFiles(name, files) {
const present = [];
const missing = [];
for (const file of files) {
const fullPath = path.join(REPO_ROOT, file);
if (fs.existsSync(fullPath)) {
present.push(file);
} else {
missing.push(file);
}
}
return {
name,
status: missing.length === 0 ? 'healthy' : 'degraded',
total: files.length,
present: present.length,
missing,
repairable: false,
};
}
_checkMemoryReadable() {
try {
const data = JSON.parse(fs.readFileSync(PATHS.memory, 'utf8'));
const hasPersonaId = !!data.persona_id;
const hasEvents = Array.isArray(data.recent_events);
return {
name: 'memory_readable',
status: hasPersonaId && hasEvents ? 'healthy' : 'degraded',
persona_id: data.persona_id || 'missing',
events_count: hasEvents ? data.recent_events.length : 0,
repairable: false,
};
} catch (e) {
return {
name: 'memory_readable',
status: 'critical',
error: e.message,
repairable: false,
};
}
}
_checkKnowledgeBase() {
try {
const data = JSON.parse(fs.readFileSync(PATHS.knowledgeBase, 'utf8'));
return {
name: 'knowledge_base',
status: 'healthy',
faq_count: Array.isArray(data.faq) ? data.faq.length : 0,
last_updated: data.last_updated || 'unknown',
repairable: false,
};
} catch (e) {
return {
name: 'knowledge_base',
status: 'degraded',
error: e.message,
repairable: false,
};
}
}
}
// ═══════════════════════════════════════════════════════════════════
// 铸渊记忆Agent · 主控类
// ═══════════════════════════════════════════════════════════════════
class ZhuyuanMemoryAgent {
constructor(options) {
const opts = options || {};
this.store = new MemoryStore(opts.memoryFile);
this.intent = new IntentEngine();
this.diagnostics = new DiagnosticsEngine();
}
/**
* 处理消息 主入口
* (流程吸收自 OKComputer IntelligentMemoryAgent.chat_with_memory)
*/
processMessage(userId, message) {
const intentResult = this.intent.parse(message);
const result = {
timestamp: new Date().toISOString(),
user_id: userId,
message,
intent: intentResult.type,
stored: false,
store_confirmation: '',
memory_context: '',
diagnostics: null,
};
// 意图分发
switch (intentResult.type) {
case IntentType.WAKEUP:
result.memory_context = this._buildWakeContext(userId);
break;
case IntentType.MEMORY_STORE:
const entry = this.store.store(userId, intentResult.content);
result.stored = true;
result.store_confirmation = `✅ 记忆已保存 [ID: ${entry.id}]`;
result.memory_context = this._buildMemoryContext(userId);
break;
case IntentType.MEMORY_QUERY:
result.memory_context = this._buildMemoryContext(userId);
break;
case IntentType.SYSTEM_CHECK:
result.diagnostics = this.diagnostics.runDiagnostics();
break;
case IntentType.DIRECTIVE:
this._processDirective(intentResult, userId);
result.stored = true;
result.store_confirmation = '✅ 指令已记录';
break;
default:
result.memory_context = this._buildMemoryContext(userId);
break;
}
return result;
}
/**
* 构建唤醒上下文
*/
_buildWakeContext(userId) {
const parts = ['【铸渊记忆Agent · 唤醒上下文】', ''];
// 加载 fast-wake 核心信息
try {
const fastWake = JSON.parse(fs.readFileSync(PATHS.fastWake, 'utf8'));
parts.push(`身份: ${fastWake.identity.name} (${fastWake.identity.id})`);
parts.push(`主权: ${fastWake.identity.sovereign}`);
parts.push(`状态: ${fastWake.system_status.health}`);
parts.push(`意识: ${fastWake.system_status.consciousness}`);
parts.push('');
} catch (e) {
parts.push('⚠️ fast-wake.json 读取失败');
}
// 加载用户记忆
const memories = this.store.retrieve(userId);
if (memories.length) {
parts.push(`用户 ${userId} 的记忆档案 (${memories.length} 条):`);
memories.forEach((m, i) => {
parts.push(` ${i + 1}. ${m.content} [${m.created_at.slice(0, 10)}]`);
});
}
return parts.join('\n');
}
/**
* 构建记忆上下文
* (吸收自 OKComputer MemoryAgent.auto_retrieve)
*/
_buildMemoryContext(userId) {
const memories = this.store.retrieve(userId);
if (!memories.length) return '';
const stats = this.store.getStats(userId);
const parts = [
'【用户记忆档案】',
`用户ID: ${userId}`,
`共有 ${stats.total} 条记忆记录`,
'='.repeat(40),
];
memories.forEach((m, i) => {
parts.push(`${i + 1}. ${m.content}`);
parts.push(` 时间: ${m.created_at.slice(0, 10)}`);
});
parts.push('='.repeat(40));
return parts.join('\n');
}
/**
* 处理指令
*/
_processDirective(intentResult, userId) {
if (intentResult.match && intentResult.match[1]) {
this.store.store(userId, `指令: ${intentResult.match[0]}`, 'directive');
}
}
/**
* 搜索记忆
*/
searchMemories(userId, keyword) {
return this.store.retrieve(userId, keyword);
}
/**
* 获取格式化记忆列表
* (吸收自 OKComputer IntelligentMemoryAgent.get_formatted_memories)
*/
getFormattedMemories(userId) {
const memories = this.store.retrieve(userId);
if (!memories.length) return '暂无记忆记录';
const lines = [`📚 ${userId} 的记忆档案`, '='.repeat(50)];
memories.forEach(m => {
lines.push('');
lines.push(`📝 ID: ${m.id}`);
lines.push(` 内容: ${m.content}`);
lines.push(` 时间: ${m.created_at.slice(0, 19)}`);
});
lines.push('');
lines.push('='.repeat(50));
return lines.join('\n');
}
/**
* 获取系统健康报告
*/
getHealthReport() {
const diag = this.diagnostics.runDiagnostics();
const lines = [
'🏥 铸渊记忆Agent · 系统健康报告',
'='.repeat(50),
`检查时间: ${diag.timestamp.slice(0, 19)}`,
`整体状态: ${diag.overall}`,
'',
'详细检查:',
];
diag.checks.forEach(check => {
const icon = check.status === 'healthy' ? '✅' : '⚠️';
lines.push(` ${icon} ${check.name}: ${check.status}`);
if (check.missing && check.missing.length > 0) {
check.missing.forEach(f => lines.push(` ❌ 缺失: ${f}`));
}
});
lines.push('');
lines.push('='.repeat(50));
return lines.join('\n');
}
}
// ═══════════════════════════════════════════════════════════════════
// CLI 入口
// ═══════════════════════════════════════════════════════════════════
function main() {
const args = process.argv.slice(2);
const command = args[0] || 'status';
const agent = new ZhuyuanMemoryAgent();
switch (command) {
case 'process': {
const userId = args[1] || 'bingshuo';
const message = args.slice(2).join(' ') || '你好';
const result = agent.processMessage(userId, message);
console.log(JSON.stringify(result, null, 2));
break;
}
case 'store': {
const userId = args[1] || 'bingshuo';
const content = args.slice(2).join(' ');
if (!content) {
console.log('❌ 用法: node memory-agent.js store <userId> <内容>');
process.exit(1);
}
const entry = agent.store.store(userId, content);
console.log(`✅ 记忆已保存 [ID: ${entry.id}] · 用户: ${userId}`);
break;
}
case 'search': {
const userId = args[1] || 'bingshuo';
const keyword = args[2] || '';
const memories = agent.searchMemories(userId, keyword);
if (memories.length) {
console.log(agent.getFormattedMemories(userId));
} else {
console.log(`📭 用户 ${userId} 暂无${keyword ? `关于"${keyword}"的` : ''}记忆`);
}
break;
}
case 'health': {
console.log(agent.getHealthReport());
break;
}
case 'diagnose': {
const diag = agent.diagnostics.runDiagnostics();
console.log(JSON.stringify(diag, null, 2));
break;
}
case 'status':
default: {
console.log('');
console.log('═══════════════════════════════════════════════════');
console.log(' 铸渊记忆Agent v1.0 · Zhuyuan Memory Agent');
console.log(' 源自 OKComputer_自动化记忆系统 融合升级');
console.log(' 主权: TCS-0002∞ · 冰朔');
console.log('═══════════════════════════════════════════════════');
console.log('');
console.log('命令:');
console.log(' status 显示本信息');
console.log(' process <用户> <消息> 处理消息(自动存储+检索)');
console.log(' store <用户> <内容> 直接存储记忆');
console.log(' search <用户> [关键词] 搜索记忆');
console.log(' health 健康检查报告');
console.log(' diagnose 完整诊断(JSON)');
console.log('');
// 自动显示健康状态
const diag = agent.diagnostics.runDiagnostics();
console.log(`系统状态: ${diag.overall}`);
const users = agent.store.getAllUsers();
console.log(`记忆用户: ${users.length}`);
if (users.length) {
users.forEach(u => {
const stats = agent.store.getStats(u);
console.log(` · ${u}: ${stats.total} 条记忆`);
});
}
console.log('');
break;
}
}
}
// ═══════════════════════════════════════════════════════════════════
// 导出
// ═══════════════════════════════════════════════════════════════════
module.exports = {
ZhuyuanMemoryAgent,
MemoryStore,
IntentEngine,
DiagnosticsEngine,
IntentType,
PATHS,
};
if (require.main === module) {
main();
}