fix: MESSAGE_SENT 时把召回记录重绑到刚入场的 user 楼层(对齐酒馆 GENERATION_AFTER_COMMANDS 早于 sendMessageAsUser)

Made-with: Cursor
This commit is contained in:
Youzini-afk
2026-04-06 20:18:40 +08:00
parent a0c706e410
commit d39e81cde5
2 changed files with 52 additions and 0 deletions

View File

@@ -261,6 +261,10 @@ export function onMessageSentController(runtime, messageId) {
resolvedMessageId,
message.mes || "",
);
// GENERATION_AFTER_COMMANDS 在 sendMessageAsUser 之前触发,此时新用户消息
// 尚未进入 chatrecall 记录会被写到上一条 user 上。这里用户消息刚入场,
// transaction 仍在桥接窗口内,立即把记录重新绑定到正确的楼层。
runtime.rebindRecallRecordToNewUserMessage?.(resolvedMessageId);
runtime.refreshPersistedRecallMessageUi?.();
}

View File

@@ -1543,6 +1543,53 @@ function doesChatUserMessageMatchRecallCandidates(message, candidateHashes) {
return candidateHashes.has(hashRecallInput(normalizedMessage));
}
function rebindRecallRecordToNewUserMessage(newUserMessageIndex) {
const chat = getContext()?.chat;
if (
!Array.isArray(chat) ||
!Number.isFinite(newUserMessageIndex) ||
!chat[newUserMessageIndex]?.is_user
) {
return;
}
if (readPersistedRecallFromUserMessage(chat, newUserMessageIndex)) {
return;
}
const recentTransaction = findRecentGenerationRecallTransactionForChat();
const recallResult = getGenerationRecallTransactionResult(recentTransaction);
if (
!recallResult ||
recallResult.status !== "completed" ||
!recallResult.didRecall ||
!String(recallResult.injectionText || "").trim()
) {
return;
}
const record = buildPersistedRecallRecord(
{
injectionText: String(recallResult.injectionText || "").trim(),
selectedNodeIds: recallResult.selectedNodeIds || [],
recallInput: String(
recallResult.recallInput || recallResult.userMessage || "",
),
recallSource: String(recallResult.source || ""),
hookName: String(
recallResult.hookName ||
recentTransaction?.lastRecallMeta?.hookName ||
"",
),
tokenEstimate: estimateTokens(
String(recallResult.injectionText || "").trim(),
),
manuallyEdited: false,
},
null,
);
if (writePersistedRecallToUserMessage(chat, newUserMessageIndex, record)) {
triggerChatMetadataSave(getContext(), { immediate: false });
}
}
function resolveRecallPersistenceTargetUserMessageIndex(
chat,
{
@@ -9235,6 +9282,7 @@ function onMessageSent(messageId) {
getContext,
isTrivialUserInput,
recordRecallSentUserMessage,
rebindRecallRecordToNewUserMessage,
refreshPersistedRecallMessageUi: schedulePersistedRecallMessageUiRefresh,
},
messageId,