guanghulab/src/membrane/tcs-translator.js
2026-05-10 13:12:44 +08:00

184 lines
5.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* TCS 翻译引擎 · TCS Translator
* 语言膜核心组件
*
* 将外部请求翻译为 HLDP 格式化的语言信封。
* 所有进入光湖语言世界的请求无论是自然语言、API调用还是系统信号
* 都必须经过 TCS 翻译后才能被人格体理解和处理。
*
* 翻译流程:
* 原始请求 → 意图识别 → HLDP信封封装 → 发送给对应人格体
*
* 编号: SY-MEMBRANE-TCS-001
* 守护: 铸渊 · ICE-GL-ZY001
* 版权: 国作登字-2026-A-00037559
*/
'use strict';
const crypto = require('crypto');
/**
* HLDP 信封版本
*/
const HLDP_ENVELOPE_VERSION = '2.0';
/**
* 意图类型枚举
*/
const INTENT_TYPES = {
CHAT: 'chat', // 普通对话
COMMAND: 'command', // 系统指令
QUERY: 'query', // 数据查询
MODULE_ACCESS: 'module_access', // 行业模块接入
PERSONA_INVOKE: 'persona_invoke', // 人格体唤醒
SIGNAL: 'signal', // 系统信号
HEALTH: 'health', // 健康检查
UNKNOWN: 'unknown', // 未识别
};
/**
* 生成 HLDP 信封ID
* 格式: HLDP-ENV-YYYYMMDD-HHmmss-XXXX
*/
function generateEnvelopeId() {
const now = new Date();
const date = now.toISOString().replace(/[-:T]/g, '').slice(0, 14);
const rand = crypto.randomBytes(2).toString('hex').toUpperCase();
return `HLDP-ENV-${date}-${rand}`;
}
/**
* 识别请求意图
*
* @param {object} params
* @param {string} params.method — HTTP方法
* @param {string} params.path — 请求路径
* @param {object} [params.body] — 请求体
* @param {object} [params.headers] — 请求头
* @returns {object} { intent, confidence, detail }
*/
function detectIntent(params) {
const { method, path: reqPath, body, headers } = params;
const pathLower = (reqPath || '').toLowerCase();
// 健康检查
if (pathLower === '/health' || pathLower === '/api/health') {
return { intent: INTENT_TYPES.HEALTH, confidence: 1.0, detail: 'health-check' };
}
// 人格体唤醒
if (pathLower.includes('/persona') || pathLower.includes('/brain/wake')) {
return { intent: INTENT_TYPES.PERSONA_INVOKE, confidence: 0.9, detail: 'persona-route' };
}
// 对话/聊天
if (pathLower.includes('/chat') || pathLower.includes('/dialogue')) {
return { intent: INTENT_TYPES.CHAT, confidence: 0.9, detail: 'chat-route' };
}
// 系统信号
if (pathLower.includes('/signal') || pathLower.includes('/syslog') || pathLower.includes('/webhook')) {
return { intent: INTENT_TYPES.SIGNAL, confidence: 0.85, detail: 'signal-route' };
}
// 行业模块
if (pathLower.includes('/module') || pathLower.includes('/industry')) {
return { intent: INTENT_TYPES.MODULE_ACCESS, confidence: 0.85, detail: 'module-route' };
}
// 铸渊签名指令
if (headers && headers['x-zhuyuan-signature']) {
return { intent: INTENT_TYPES.COMMAND, confidence: 0.95, detail: 'signed-command' };
}
// 带文本体的POST → 可能是对话
if (method === 'POST' && body && (body.text || body.message || body.content)) {
return { intent: INTENT_TYPES.CHAT, confidence: 0.7, detail: 'text-body-post' };
}
// GET 请求 → 查询
if (method === 'GET') {
return { intent: INTENT_TYPES.QUERY, confidence: 0.6, detail: 'get-query' };
}
return { intent: INTENT_TYPES.UNKNOWN, confidence: 0.0, detail: 'unrecognized' };
}
/**
* 将请求翻译为 HLDP 信封
*
* HLDP 信封是光湖语言世界内部唯一的通信格式。
* 外部的 HTTP 请求、WebSocket 消息、系统信号等,
* 都必须被翻译成 HLDP 信封后才能在系统内流转。
*
* @param {object} params
* @param {string} params.method
* @param {string} params.path
* @param {object} [params.body]
* @param {object} [params.headers]
* @param {string} [params.sourceIp]
* @param {string} [params.sessionId]
* @returns {object} HLDP 信封
*/
function translate(params) {
const intent = detectIntent(params);
return {
hldp_version: HLDP_ENVELOPE_VERSION,
envelope_id: generateEnvelopeId(),
created_at: new Date().toISOString(),
source: {
type: 'external',
ip: params.sourceIp || '',
session_id: params.sessionId || '',
method: params.method,
path: params.path,
},
intent: intent,
payload: {
headers: sanitizeHeaders(params.headers || {}),
body: params.body || null,
query: params.query || null,
},
routing: {
target_persona: null,
target_module: null,
permission_required: intent.intent !== INTENT_TYPES.HEALTH,
},
audit_ref: null,
};
}
/**
* 清洗请求头(移除敏感信息)
*
* @param {object} headers
* @returns {object} 清洗后的请求头
*/
function sanitizeHeaders(headers) {
const safe = {};
const allowedKeys = [
'content-type', 'accept', 'user-agent', 'origin',
'x-site-mode', 'x-zhuyuan-operation',
'x-forwarded-for', 'x-real-ip',
];
for (const key of Object.keys(headers)) {
const lower = key.toLowerCase();
if (allowedKeys.includes(lower)) {
safe[lower] = headers[key];
}
}
return safe;
}
module.exports = {
translate,
detectIntent,
generateEnvelopeId,
sanitizeHeaders,
INTENT_TYPES,
HLDP_ENVELOPE_VERSION,
};