Add User Model Service and Temporal Recall for MeMind V0.1.

Introduce UMS ingest/snapshot pipeline, Context Planner with multi-source recall, runtime context injection, canonical user mapping, and session snapshot loading on auth/me.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-09-03 23:25:18 +08:00
parent bf66fdf493
commit 212ff3ff80
47 changed files with 4534 additions and 6 deletions
+16 -2
View File
@@ -1,4 +1,4 @@
import crypto from 'node:crypto';
import { resolveRuntimeContext } from './temporal-recall-service/runtime-context.mjs';
import { MEMORY_INTERVENTION_LIMIT } from './memory-intervention.mjs';
import { resolveMemoriesWithLegacyFallback } from './memory-legacy-fallback.mjs';
import { isMemoryRecallQuestion } from './chat-intent-router.mjs';
@@ -135,10 +135,11 @@ function buildMemorySystemBlock({ memories, routingMemoryContent } = {}) {
return renderMemoryLines(memories);
}
function buildModelMessages({ previousMessages, userMessage, memories, routingMemoryContent }) {
function buildModelMessages({ previousMessages, userMessage, memories, routingMemoryContent, runtimeContextText = '' }) {
const system = [
'你是 TKMind H5 聊天助手。',
'优先直接回答用户问题;不要调用工具。涉及需要执行代码、改文件、生成页面或操作外部系统的任务时,说明当前只能文字讨论,并提示用户开启「深度推理」或用更明确的任务描述。',
runtimeContextText,
buildMemorySystemBlock({ memories, routingMemoryContent }),
].filter(Boolean).join('\n\n');
@@ -268,6 +269,8 @@ export function createDirectChatService({
memoryV2 = null,
conversationMemoryService = null,
episodicMemoryService = null,
pool = null,
getUmsPool = null,
logger = console,
enabled = envFlag(process.env.MEMIND_DIRECT_CHAT_ENABLED, true),
} = {}) {
@@ -388,12 +391,23 @@ export function createDirectChatService({
const memories = routedMemoryContent
? []
: await resolveMemories(userId, activeSessionId, messageText(userMessage));
const runtimeContext = await resolveRuntimeContext({
pool,
getUmsPool,
userId,
query: messageText(userMessage),
sessionId: activeSessionId,
}).catch((err) => {
logger?.warn?.(`[direct-chat] runtime context skipped: ${err instanceof Error ? err.message : err}`);
return { injectionText: '' };
});
const completion = await llmProviderService.createChatCompletion({
messages: buildModelMessages({
previousMessages,
userMessage,
memories,
routingMemoryContent: routedMemoryContent,
runtimeContextText: runtimeContext.injectionText ?? '',
}),
});
if (!completion?.ok) {