Fix: passive MVU sanitize mode for task input fields

用户原文字段(recentMessages/charDescription/userPersona/candidateNodes 等)
现在使用 passive mode 清洗——只剥离 MVU 容器/宏,不整段 drop。
这修复了含 MVU 状态栏角色卡时提取 LLM 收到空 context 的问题。

- mvu-compat.js: 导出 MVU_SANITIZE_MODES 常量,passive 分支显式注释
- prompt-builder.js: 加 INPUT_CONTEXT_FIELD_MODE 策略表,
  sanitizePromptContextInputs 按字段族查表传 mode;
  关键字段 omit 时 warn(兜底告警)
- 世界书条目路径(sanitizeWorldInfoEntries)保持 aggressive,守卫 6cec031 正收益
- 新增 6 条测试:passive 字段族不被整段 drop + worldInfo 仍 aggressive + warn 路径

Refs: mvu-aggressive-strip-regression-plan.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Hao19911125
2026-04-05 16:26:43 +08:00
parent ca3fc8fc2f
commit 6a773265ff
3 changed files with 343 additions and 3 deletions

View File

@@ -2,6 +2,13 @@
// These rules are intentionally narrow so we strip MVU artifacts without
// disturbing normal prompt or world info content.
export const MVU_SANITIZE_MODES = Object.freeze({
/** 整段 drop likely MVU 内容(用于世界书条目)。 */
AGGRESSIVE: "aggressive",
/** 只剥离 MVU 容器/宏,不整段 drop用于用户原文、角色描述等任务输入字段。 */
PASSIVE: "passive",
});
export const MVU_ENTRY_COMMENT_REGEX = /\[(mvu_update|mvu_plot|initvar)\]/i;
const MVU_UPDATE_BLOCK_REGEX =
@@ -215,7 +222,8 @@ export function sanitizeMvuContent(
let text = blockedResult.text;
let dropped = false;
if (sanitizedMode === "aggressive") {
if (sanitizedMode === MVU_SANITIZE_MODES.AGGRESSIVE) {
// 整段 drop用于世界书条目不用于用户原文字段
if (
isLikelyMvuWorldInfoContent(originalCollapsed) ||
isLikelyMvuWorldInfoContent(text)
@@ -225,6 +233,7 @@ export function sanitizeMvuContent(
reasons.push("likely_mvu_content");
}
}
// MVU_SANITIZE_MODES.PASSIVE只做 artifact 剥离 + blocked 过滤,不整段 drop。
return {
text: collapseWhitespace(text),