guanghulab/src/brain/prompt-assembler.js

165 lines
7.5 KiB
JavaScript
Raw Normal View History

// 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 };