diff --git a/event-binding.js b/event-binding.js index e8c3743..af6525d 100644 --- a/event-binding.js +++ b/event-binding.js @@ -261,6 +261,10 @@ export function onMessageSentController(runtime, messageId) { resolvedMessageId, message.mes || "", ); + // GENERATION_AFTER_COMMANDS 在 sendMessageAsUser 之前触发,此时新用户消息 + // 尚未进入 chat,recall 记录会被写到上一条 user 上。这里用户消息刚入场, + // transaction 仍在桥接窗口内,立即把记录重新绑定到正确的楼层。 + runtime.rebindRecallRecordToNewUserMessage?.(resolvedMessageId); runtime.refreshPersistedRecallMessageUi?.(); } diff --git a/index.js b/index.js index b1a29a0..75c73e6 100644 --- a/index.js +++ b/index.js @@ -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,