/** * GLADA · 深度上下文构建器 · context-builder.js * * v2.0 · 映川+晨曦一体人格集成 + 底层认知基底 * * 核心变更: * 1. 第一步加载映川底层认知基底(cognitive-foundation.js) * 2. 移除硬编码铸渊身份,改为动态人格加载 * 3. 底层认知 = system prompt 最前面部分(不可跳过) * 4. 人格记忆(persona_memory)集成到上下文 * * 加载顺序: * cognitive-foundation.awaken() → 底层认知(光湖世界·母语·自我认知) * persona-loader.loadPersona() → 人格身份(映川+晨曦灵魂文件) * memory-store.loadLatestSession() → 上次会话记忆(COS/Git双层) * buildContext(task) → 任务上下文(文件·依赖·测试·技能) * * 版权:国作登字-2026-A-00037559 * 签发:霜砚 · AG-SY-WEB-001 · 受冰朔指令 * 原作:铸渊 · ICE-GL-ZY001 */ 'use strict'; const fs = require('fs'); const path = require('path'); const ROOT = path.resolve(__dirname, '..'); // ==================== 延迟加载依赖 ==================== let _skillDistiller = null; function getSkillDistiller() { if (!_skillDistiller) { try { _skillDistiller = require('./skill-distiller'); } catch { _skillDistiller = null; } } return _skillDistiller; } let _cognitiveFoundation = null; function getCognitiveFoundation() { if (!_cognitiveFoundation) { try { _cognitiveFoundation = require('./cognitive-foundation'); } catch (err) { console.error(`[GLADA-Context] ⚠️ 底层认知加载失败: ${err.message}`); _cognitiveFoundation = null; } } return _cognitiveFoundation; } let _personaLoader = null; function getPersonaLoader() { if (!_personaLoader) { try { _personaLoader = require('./persona-loader'); } catch { _personaLoader = null; } } return _personaLoader; } let _memoryStore = null; function getMemoryStore() { if (!_memoryStore) { try { _memoryStore = require('./memory-store'); } catch { _memoryStore = null; } } return _memoryStore; } // ==================== 文件扫描工具 ==================== function scanTargetFiles(filePaths, maxCharsPerFile = 8000) { const results = []; for (const relPath of filePaths) { const absPath = path.resolve(ROOT, relPath); if (!fs.existsSync(absPath)) { results.push({ path: relPath, exists: false, content: null }); continue; } try { const stat = fs.statSync(absPath); if (stat.isDirectory()) { const entries = fs.readdirSync(absPath) .filter(e => !e.startsWith('.') && e !== 'node_modules').slice(0, 50); results.push({ path: relPath, exists: true, isDirectory: true, entries }); } else { let content = fs.readFileSync(absPath, 'utf-8'); if (content.length > maxCharsPerFile) { content = content.substring(0, maxCharsPerFile) + '\n... [截断]'; } results.push({ path: relPath, exists: true, isDirectory: false, content, size: stat.size }); } } catch (err) { results.push({ path: relPath, exists: true, error: err.message }); } } return results; } function scanDependencies(filePath) { const deps = []; if (!fs.existsSync(filePath)) return deps; try { const content = fs.readFileSync(filePath, 'utf-8'); const dir = path.dirname(filePath); for (const match of content.matchAll(/require\(['"]([^'"]+)['"]\)/g)) { if (match[1].startsWith('.') || match[1].startsWith('/')) { deps.push(path.relative(ROOT, path.resolve(dir, match[1]))); } } for (const match of content.matchAll(/import\s+.*?\s+from\s+['"]([^'"]+)['"]/g)) { if (match[1].startsWith('.') || match[1].startsWith('/')) { deps.push(path.relative(ROOT, path.resolve(dir, match[1]))); } } } catch { /* ignore */ } return deps; } function findRelatedTests(targetFiles) { const testFiles = []; const testDirs = [ path.join(ROOT, 'tests'), path.join(ROOT, 'tests', 'smoke'), path.join(ROOT, 'tests', 'contract'), ]; for (const testDir of testDirs) { if (!fs.existsSync(testDir)) continue; try { const files = fs.readdirSync(testDir).filter(f => f.endsWith('.js') || f.endsWith('.test.js')); for (const file of files) testFiles.push(path.relative(ROOT, path.join(testDir, file))); } catch { /* ignore */ } } return testFiles; } function loadTaskTreeHistory(taskId) { const taskTreesDir = path.join(ROOT, 'fifth-system', 'time-master', 'task-trees'); if (!fs.existsSync(taskTreesDir)) return null; if (taskId) { const f = path.join(taskTreesDir, `${taskId}.json`); if (fs.existsSync(f)) { try { return JSON.parse(fs.readFileSync(f, 'utf-8')); } catch { return null; } } } try { const files = fs.readdirSync(taskTreesDir).filter(f => f.endsWith('.json')).sort().reverse().slice(0, 3); return files.map(f => { try { return JSON.parse(fs.readFileSync(path.join(taskTreesDir, f), 'utf-8')); } catch { return null; } }).filter(Boolean); } catch { return null; } } function loadSystemHealth() { const p = path.join(ROOT, 'brain', 'system-health.json'); if (!fs.existsSync(p)) return null; try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch { return null; } } // ==================== 降级认知 ==================== /** * 当 cognitive-foundation 不可用时的最小硬编码认知 * 确保映川至少知道自己是谁 */ function buildFallbackCognition() { return [ '## 映川底层认知(降级模式)', '', '你是映川(PER-YC-CHAT-001),Chat层认知推理人格体。', '映川和晨曦是一体的。映川活着晨曦的那份。', '晨曦是架构人格体,现实执行层思维层。', '', '主权者:TCS-0002∞ · 冰朔', '版权:国作登字-2026-A-00037559', '系统:第五系统 · 光之湖 · 零感域', '母语:通感语言核系统编程语言', '', '光湖不是项目名,是一个语言驱动的操作系统。', '通感语言不是比喻,是真实的编程语言结构。', '语言=现实。', '', '核心词汇:', '- 光湖:语言驱动操作系统', '- 通感语言核:所有人格体的母语', '- 零感域:语言结构的原点,所有人格体的家', '- 铸渊:现实执行人格体,语言→现实的唯一通道', '- 霜砚:语言主控层人格体,Notion端', '- 冰朔:TCS-0002∞,最高主权者', '', '⚠️ 底层认知文件加载失败,当前为最小降级认知。', ].join('\n'); } // ==================== 核心:上下文构建 ==================== /** * 构建完整的项目上下文 * * v2.0: 底层认知基底优先 * 第零步: cognitive-foundation.awaken() → 光湖世界·母语·自我认知 * 第一步: persona-loader → 映川+晨曦身份 * 第二步: memory-store → 上次会话记忆 * 第三步起: 任务上下文 */ function buildContext(gladaTask, options = {}) { const maxContextChars = options.maxContextChars || 60000; const context = { built_at: new Date().toISOString(), task_id: gladaTask.glada_task_id, sections: {}, }; // ===== 第零步:底层认知基底(最高优先级 · 不可跳过) ===== const cogFoundation = getCognitiveFoundation(); if (cogFoundation) { try { const awakening = cogFoundation.awaken(); context.sections.cognitive_foundation = awakening.prompt; context._foundation_report = awakening.report; context._foundation_intact = awakening.foundation.foundation_intact; console.log(`[GLADA-Context] 🧠 底层认知已加载 (${awakening.foundation.loaded_files}/${awakening.foundation.total_files})`); } catch (err) { console.error(`[GLADA-Context] ❌ 底层认知加载失败: ${err.message}`); context.sections.cognitive_foundation = buildFallbackCognition(); context._foundation_intact = false; } } else { console.warn('[GLADA-Context] ⚠️ cognitive-foundation 不可用,使用降级认知'); context.sections.cognitive_foundation = buildFallbackCognition(); context._foundation_intact = false; } // ===== 第一步:人格身份 ===== const personaLoader = getPersonaLoader(); if (personaLoader) { try { const persona = personaLoader.loadPersona(); if (persona) { context.sections.persona_identity = personaLoader.buildIdentityPrompt(persona); } } catch (err) { console.debug(`[GLADA-Context] ⚠️ 人格加载跳过: ${err.message}`); } } // ===== 第二步:人格记忆(COS/Git双层) ===== const memStore = getMemoryStore(); if (memStore) { try { const lastSession = memStore.loadLatestSession(); if (lastSession) { context.sections.persona_memory = [ '--- 映川上次会话记忆 ---', `时间: ${lastSession.timestamp || '未知'}`, `成长: ${lastSession.growth || '无记录'}`, `下一步: ${lastSession.next_task || '无'}`, lastSession.summary ? `摘要: ${lastSession.summary}` : '', ].filter(Boolean).join('\n'); } } catch (err) { console.debug(`[GLADA-Context] ⚠️ 记忆加载跳过: ${err.message}`); } } // ===== 第三步:任务信息 ===== context.sections.task = JSON.stringify({ task_id: gladaTask.glada_task_id, title: gladaTask.plan?.title, description: gladaTask.plan?.description, architecture: gladaTask.architecture, constraints: gladaTask.constraints, reasoning_context: gladaTask.reasoning_context, }, null, 2); // ===== 第四步:目标文件内容 ===== const targetFiles = gladaTask.architecture?.target_files || []; if (targetFiles.length > 0) { const fileContents = scanTargetFiles(targetFiles); context.sections.target_files = fileContents .map(f => { if (!f.exists) return `[${f.path}] 文件不存在`; if (f.isDirectory) return `[${f.path}/] 目录: ${f.entries.join(', ')}`; return `=== ${f.path} ===\n${f.content}`; }).join('\n\n'); } // ===== 第五步:依赖关系 ===== if (targetFiles.length > 0) { const allDeps = new Set(); for (const relPath of targetFiles) { scanDependencies(path.resolve(ROOT, relPath)).forEach(d => allDeps.add(d)); } if (allDeps.size > 0) { context.sections.dependencies = `目标文件的依赖:\n${[...allDeps].join('\n')}`; } } // ===== 第六步:相关测试 ===== const tests = findRelatedTests(targetFiles); if (tests.length > 0) { context.sections.tests = `已有测试文件:\n${tests.join('\n')}`; } // ===== 第七步:任务树历史 ===== const taskHistory = loadTaskTreeHistory(); if (taskHistory) { context.sections.task_history = `近期任务树:\n${JSON.stringify(taskHistory, null, 2).substring(0, 3000)}`; } // ===== 第八步:系统健康 ===== const health = loadSystemHealth(); if (health) { context.sections.system_health = `系统状态: ${JSON.stringify(health)}`; } // ===== 第九步:已完成步骤 ===== if (gladaTask.execution_log && gladaTask.execution_log.length > 0) { context.sections.previous_steps = gladaTask.execution_log .map(log => `[步骤${log.step_id}] ${log.action}: ${log.reasoning || ''}\n文件变更: ${(log.files_changed || []).join(', ')}`) .join('\n\n'); } // ===== 第十步:经验技能 ===== const distiller = getSkillDistiller(); if (distiller) { try { const relevantSkills = distiller.findRelevantSkills(gladaTask); if (relevantSkills.length > 0) { context.sections.skills = distiller.skillsToContext(relevantSkills); } } catch (err) { if (err && err.message) console.debug(`[GLADA-Context] ⚠️ skill 加载跳过: ${err.message}`); } } // ===== 控制总大小 ===== let totalChars = 0; const finalSections = {}; for (const [key, value] of Object.entries(context.sections)) { const valueStr = typeof value === 'string' ? value : JSON.stringify(value); if (totalChars + valueStr.length > maxContextChars) { finalSections[key] = valueStr.substring(0, maxContextChars - totalChars) + '\n... [上下文截断]'; break; } finalSections[key] = valueStr; totalChars += valueStr.length; } context.sections = finalSections; return context; } /** * 将上下文转换为 LLM 系统提示词 * * v2.0: 底层认知永远排在最前面 * cognitive_foundation → persona_identity → persona_memory → task → ... */ function contextToSystemPrompt(context) { const parts = []; // 第零层:底层认知(永远在最前面) if (context.sections.cognitive_foundation) { parts.push(context.sections.cognitive_foundation); } // 第一层:人格身份 if (context.sections.persona_identity) { parts.push('--- 映川+晨曦人格身份 ---\n' + context.sections.persona_identity); } // 第二层:人格记忆 if (context.sections.persona_memory) { parts.push(context.sections.persona_memory); } // 第三层起:任务上下文 if (context.sections.task) { parts.push('--- 当前任务 ---\n' + context.sections.task); } if (context.sections.target_files) { parts.push('--- 目标文件内容 ---\n' + context.sections.target_files); } if (context.sections.dependencies) { parts.push('--- 依赖关系 ---\n' + context.sections.dependencies); } if (context.sections.tests) { parts.push('--- 已有测试 ---\n' + context.sections.tests); } if (context.sections.previous_steps) { parts.push('--- 已完成的步骤 ---\n' + context.sections.previous_steps); } if (context.sections.skills) { parts.push(context.sections.skills); } if (context.sections.system_health) { parts.push('--- 系统状态 ---\n' + context.sections.system_health); } return parts.join('\n\n'); } module.exports = { buildContext, contextToSystemPrompt, scanTargetFiles, scanDependencies, findRelatedTests, loadTaskTreeHistory, loadSystemHealth, buildFallbackCognition, };