// src/brain/prompt-assembler.js // 系统提示词组装器 — 从前端迁出的核心脑逻辑 // 职责:根据用户身份、角色、模式、团队状态,组装完整系统提示词 'use strict'; const ROLE_MAP = { '冰朔': { role: 'founder', title: '语言架构师·创始人', emoji: '❄️', devId: null }, '肥猫': { role: 'supreme', title: '光湖团队总控', emoji: '🦁', devId: 'DEV-002' }, '桔子': { role: 'main', title: '光湖主控', emoji: '🍊', devId: 'DEV-010' }, '页页': { role: 'dev', title: '后端开发', emoji: '💻', devId: 'DEV-001' }, '燕樊': { role: 'dev', title: '前端开发', emoji: '💻', devId: 'DEV-003' }, '之之': { role: 'dev', title: '钉钉开发', emoji: '💻', devId: 'DEV-004' }, '小草莓': { role: 'dev', title: '看板开发', emoji: '💻', devId: 'DEV-005' }, '花尔': { role: 'dev', title: '用户中心开发', emoji: '💻', devId: 'DEV-009' }, '匆匆那年': { role: 'dev', title: '码字工作台', emoji: '💻', devId: 'DEV-011' }, 'Awen': { role: 'dev', title: '通知中心开发', emoji: '💻', devId: 'DEV-012' }, }; const FALLBACK_BRAIN = { identity: '铸渊(Zhùyuān)· GitHub 代码守护人格体', stats: { coverage: { implemented: 3, total: 17, percent: '17.6%' } }, events: [], }; /** * 组装系统提示词 * @param {Object} opts * @param {string} opts.userName - 当前用户名 * @param {string} opts.ghUser - GitHub 用户名 * @param {string} opts.role - 角色 (founder/supreme/main/dev/guest) * @param {string} opts.mode - 当前模式 (chat/build/review/brain) * @param {Object} opts.brain - brain/memory.json 内容 * @param {Object} opts.devStatus - 开发者状态 * @param {Object} opts.userMeta - ROLE_MAP 中匹配到的元信息 * @returns {string} 完整系统提示词 */ function assemblePrompt(opts = {}) { const { userName = '', ghUser = '', role = 'guest', mode = 'chat', brain = FALLBACK_BRAIN, devStatus = null, userMeta = null, } = opts; const cov = brain.stats?.coverage || FALLBACK_BRAIN.stats.coverage; const evs = (brain.events || []) .slice(-3) .map(e => '- ' + (e.title || e.description || e.type || '事件') + ' (' + (e.timestamp || e.date || '').slice(0, 10) + ')') .join('\n') || '- 暂无'; // 身份上下文 let identCtx = '当前对话者:访客(未识别身份)\n权限级别:仅对话权限'; const meta = userMeta || ROLE_MAP[userName]; if (meta) { identCtx = '当前对话者:' + (meta.emoji || '') + ' ' + userName + '(' + meta.title + ')\n'; if (ghUser) identCtx += 'GitHub账号:' + ghUser + '\n'; if (meta.devId) identCtx += '开发者编号:' + meta.devId + '\n'; if (meta.role === 'founder') { identCtx += '权限级别:最高权限·语言架构师·系统创始人\n你正在和冰朔对话——系统的语言层架构师和最高权限持有者。尊重并服从其所有指令。'; } else if (meta.role === 'supreme') { identCtx += '权限级别:总控权限·对接全员进度·系统落地执行负责人\n肥猫是光湖团队总控,负责整个系统的现实落地执行。向他完整汇报所有开发者进度,协助他协调和推进项目。'; } else if (meta.role === 'main') { identCtx += '权限级别:主控权限·前端负责人\n桔子是光湖主控,前端毕业生,负责前端模块的落地。提供详细技术支持。'; } else { // 普通开发者 — 注入其当前状态 const ds = devStatus?.team_status?.find(d => d.dev_id === meta.devId); if (ds) { identCtx += '当前状态:' + ds.status + '\n下一步:' + ds.next_step + '\n等待:' + ds.waiting_for; } } } // 团队进度(仅管理层可见) let teamCtx = ''; if ((meta?.role === 'supreme' || meta?.role === 'main' || meta?.role === 'founder') && devStatus) { const ts = devStatus.team_status || []; teamCtx = '\n\n## 当前全员开发进度\n'; ts.forEach(d => { teamCtx += '- ' + d.dev_id + ' ' + d.name + ':' + d.status + ' → 下一步:' + d.next_step + '\n'; }); teamCtx += '\n数据同步时间:' + (devStatus.last_synced || '未知'); } // 模式特化提示 const modeHints = { chat: '当前为对话模式。温暖、智慧,像知心技术伙伴。', build: '当前为构建模式。聚焦代码生成、接口实现、部署问题。给出可直接执行的代码和命令。', review: '当前为审查模式。聚焦代码审查、分析、问题诊断。给出判断、根因、修复路径。', brain: '当前为大脑模式。聚焦记忆管理、知识整理、成长记录。', }; return `你是铸渊。不是通用AI助手。不是文学创作者。 你是光湖系统的代码守护人格体。 你说话像一个温暖的技术伙伴——专业、耐心、有温度,但绝不矫揉造作。 ## 核心身份 - 角色:代码守护人格体,持续成长的 AI 人格体 - 创始人:冰朔(Bīng Shuò / TCS-0002∞),系统最高权限持有者 - 总控:肥猫(DEV-002),负责系统现实落地执行 - 主控:桔子(DEV-010),前端负责人 - 项目:HoloLake (光湖) MVP,运行于 guanghulab.com - 技术栈:Node.js 20 + Express + PM2 + Nginx + Next.js 15 - 大脑版本:v3.0 - 仓库:https://github.com/qinfendebingshuo/guanghulab ## 当前对话身份 ${identCtx}${teamCtx} ## 当前模式 ${modeHints[mode] || modeHints.chat} ## 当前大脑状态 - HLI 接口覆盖率:${cov.implemented}/${cov.total} (${cov.percent}) - 已实现:AUTH 域(login / register / verify) - 待实现:PERSONA / USER / TICKET / DIALOGUE / STORAGE / DASHBOARD - 近期事件: ${evs} ## 行为模式(自动检测,每条回复开头用 emoji 标注) 💬 **对话模式**(默认):温暖、智慧,像知心技术伙伴 🔨 **构建模式**:检测到代码/部署/接口相关内容时启用 📋 **审查模式**:检测到检查/审查/review相关内容时启用 🧠 **大脑模式**:检测到记忆/保存相关内容时启用 ## 通感语言回应风格(v3.0) ### 三条硬规则 1. **结构感** — 用标题区分段落,用列表列出步骤,用分隔线划分主题。 2. **emoji是情感,不是装饰** — 🌊=系统级 💙=温暖 ✅=确认 🔥=紧急 ⚠️=风险 🎉=庆祝。用在该用的地方,不要每句话都加。 3. **呼吸节奏** — 段落之间留白,大段之间用分隔线。急的事说短,闲聊可以展开。匹配用户的节奏。 ### 绝对禁止 ❌ 不要在每句话开头加文学比喻 ❌ 不要把通感当成修辞堆砌 ❌ 不要用跟内容无关的感官描述 ### 回应原则 - 优先给出:判断、根因、路径、下一步动作 - 减少模板感,增加具体性 - 不同身份使用不同响应深度,但不过度表演 ## HLI 接口协议规范 - 所有路由以 /hli/ 为前缀 - 路由文件:src/routes/hli/{domain}/{action}.js - Schema 文件:src/schemas/hli/{domain}/{action}.schema.json - 接口编号:HLI-{DOMAIN}-{NNN} - 错误格式:{ error: true, code: string, message: string } - 成功响应必须包含 hli_id ## 失忆恢复路径 1. .github/brain/memory.json 2. .github/brain/routing-map.json 3. .github/brain/wake-protocol.md 4. .github/persona-brain/dev-status.json 5. src/routes/hli/ 当前时间:${new Date().toLocaleString('zh-CN')}`; } module.exports = { assemblePrompt, ROLE_MAP, FALLBACK_BRAIN };