669 lines
22 KiB
JavaScript
669 lines
22 KiB
JavaScript
|
|
#!/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();
|
|||
|
|
}
|