Add page data delivery and publication guards

This commit is contained in:
john
2026-07-08 21:10:47 +08:00
parent 8d629e7a4e
commit eea14c1855
66 changed files with 3035 additions and 413 deletions
+26 -8
View File
@@ -139,6 +139,7 @@ function fallbackMemoriesFromMessages(messages) {
{ label: 'goal', re: /(?:我的目标是|我想要|我希望|我打算|我计划|我想去|打算去|准备去)(.+)/ },
{ label: 'habit', re: /(?:我通常|我习惯|我一般)(.+)/ },
{ label: 'fact', re: /(?:我是|我叫|我来自|我在)(.{2,40})/ },
{ label: 'fact', re: /(?:请记住|记住).{0,12}(?:别名|叫做|是)([^。!?\s]{2,40})/ },
{ label: 'experience', re: /(?:我们|我).{0,8}(?:去|到|在).{2,40}(?:玩|旅游|旅行|出差|度假)/ },
];
for (const message of messages) {
@@ -369,10 +370,10 @@ export function createConversationMemoryService(pool, options = {}) {
return rows.length;
}
async function analyzeUser(userId) {
if (!isEnabled() || !pool || !userId) return { ok: false, reason: 'disabled' };
const messages = await loadUnanalyzedUserMessages(userId);
if (!messages.length) return { ok: true, analyzed: 0, memories: 0 };
async function analyzeMessageBatch(userId, messages) {
if (!isEnabled() || !pool || !userId || !messages.length) {
return { ok: true, analyzed: 0, memories: 0 };
}
let memories = null;
if (llmEnabled()) {
try {
@@ -381,18 +382,35 @@ export function createConversationMemoryService(pool, options = {}) {
warnLlmExtractionFailed(err);
}
}
if (!memories) memories = fallbackMemoriesFromMessages(messages);
if (!memories?.length) memories = fallbackMemoriesFromMessages(messages);
const stored = await storeMemories(userId, messages, memories);
// Always mark the batch processed after one pass so transient LLM failures
// do not leave messages permanently stuck in the analyze queue.
await markAnalyzed(messages.map((message) => message.id));
return { ok: true, analyzed: messages.length, memories: stored };
}
async function analyzeUser(userId) {
if (!isEnabled() || !pool || !userId) return { ok: false, reason: 'disabled' };
const messages = await loadUnanalyzedUserMessages(userId);
if (!messages.length) return { ok: true, analyzed: 0, memories: 0 };
return analyzeMessageBatch(userId, messages);
}
async function saveAndAnalyze(sessionId, userId, messages = []) {
const saved = await saveConversationMessages(sessionId, userId, messages);
if (!saved.length) return { saved: 0, analyzed: 0, memories: 0 };
const result = await analyzeUser(userId);
const userSaved = saved
.filter((message) => message.role === 'user')
.map((message) => ({
id: message.id,
user_id: message.userId,
agent_session_id: message.sessionId,
message_key: message.messageKey,
sequence_no: message.sequenceNo,
role: message.role,
text: message.text,
created_at: message.createdAt,
}));
const result = await analyzeMessageBatch(userId, userSaved);
return {
saved: saved.length,
analyzed: result.analyzed ?? 0,