fix(wechat): restore session routing exports after merge
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+32
-1
@@ -21,6 +21,7 @@ import {
|
|||||||
} from './wechat/handlers/sync-replies.mjs';
|
} from './wechat/handlers/sync-replies.mjs';
|
||||||
import { classifyWechatIntent } from './wechat/intent/classifier.mjs';
|
import { classifyWechatIntent } from './wechat/intent/classifier.mjs';
|
||||||
import { isPageGenerateText, isTopicResetText } from './wechat/intent/patterns.mjs';
|
import { isPageGenerateText, isTopicResetText } from './wechat/intent/patterns.mjs';
|
||||||
|
import { isPageDataIntent } from './chat-skills.mjs';
|
||||||
import { resolvePageGenerateOutcome } from './wechat/handlers/page-generate.mjs';
|
import { resolvePageGenerateOutcome } from './wechat/handlers/page-generate.mjs';
|
||||||
import { buildWechatAgentPrompt } from './wechat/prompts/chat-general.mjs';
|
import { buildWechatAgentPrompt } from './wechat/prompts/chat-general.mjs';
|
||||||
import {
|
import {
|
||||||
@@ -973,6 +974,14 @@ function isTopicResetIntent(text) {
|
|||||||
return isTopicResetText(text);
|
return isTopicResetText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function shouldForceNewWechatAgentSession(wechatIntent, resetCandidate) {
|
||||||
|
return (
|
||||||
|
wechatIntent?.kind === 'session.reset' ||
|
||||||
|
isTopicResetIntent(resetCandidate) ||
|
||||||
|
isPageDataIntent(resetCandidate)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export function isRecoverableWechatAgentSessionError(message) {
|
export function isRecoverableWechatAgentSessionError(message) {
|
||||||
const normalized = String(message ?? '').trim();
|
const normalized = String(message ?? '').trim();
|
||||||
if (!normalized) return false;
|
if (!normalized) return false;
|
||||||
@@ -1907,7 +1916,11 @@ export function createWechatMpService({
|
|||||||
const wechatIntent = classifyWechatIntent(intent);
|
const wechatIntent = classifyWechatIntent(intent);
|
||||||
const resetCandidate =
|
const resetCandidate =
|
||||||
intent.msgType === 'text' || intent.msgType === 'voice' ? intent.agentText : '';
|
intent.msgType === 'text' || intent.msgType === 'voice' ? intent.agentText : '';
|
||||||
const forceNew = wechatIntent.kind === 'session.reset' || isTopicResetIntent(resetCandidate);
|
// Page Data delivery owns persistent files, datasets and two publication
|
||||||
|
// policies. Reusing a conversational route here can make a new request
|
||||||
|
// inspect/retry unrelated historical pages from that session.
|
||||||
|
const isPageDataRequest = isPageDataIntent(resetCandidate);
|
||||||
|
const forceNew = shouldForceNewWechatAgentSession(wechatIntent, resetCandidate);
|
||||||
let route = await ensureWechatAgentSession({
|
let route = await ensureWechatAgentSession({
|
||||||
userId: user.userId,
|
userId: user.userId,
|
||||||
openid: inbound.fromUserName,
|
openid: inbound.fromUserName,
|
||||||
@@ -2066,6 +2079,24 @@ export function createWechatMpService({
|
|||||||
return { sessionId };
|
return { sessionId };
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
const message = err instanceof Error ? err.message : String(err);
|
const message = err instanceof Error ? err.message : String(err);
|
||||||
|
// A Page Data request must fail closed. Retrying a poisoned completion in
|
||||||
|
// another session while the finish guard is also active can turn one
|
||||||
|
// request into repairs against historical pages. Drop only this user's
|
||||||
|
// route so the next explicit request starts cleanly.
|
||||||
|
if (isPageDataRequest) {
|
||||||
|
await userAuth.clearWechatAgentRoute(config.appId, inbound.fromUserName).catch((clearErr) => {
|
||||||
|
logger.warn?.('WeChat MP page data route clear failed:', clearErr);
|
||||||
|
});
|
||||||
|
if (!err?.wechatUserNotified) {
|
||||||
|
const text = buildPageDataCollectFailureText();
|
||||||
|
try {
|
||||||
|
await sendCustomerServiceText(inbound.fromUserName, text, user);
|
||||||
|
} catch (sendErr) {
|
||||||
|
logger.error?.('WeChat MP page data failure notice failed:', sendErr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw markWechatUserNotified(err instanceof Error ? err : new Error(message));
|
||||||
|
}
|
||||||
const mayBeStaleSession = sessionId && isRecoverableWechatAgentSessionError(message);
|
const mayBeStaleSession = sessionId && isRecoverableWechatAgentSessionError(message);
|
||||||
if (mayBeStaleSession) {
|
if (mayBeStaleSession) {
|
||||||
route = await ensureWechatAgentSession({
|
route = await ensureWechatAgentSession({
|
||||||
|
|||||||
Reference in New Issue
Block a user