#!/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 <内容>'); 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(); }