From c32414f72017770a89ee68fc8267b99da436e5d0 Mon Sep 17 00:00:00 2001 From: Youzini-afk <13153778771cx@gmail.com> Date: Tue, 7 Apr 2026 00:05:21 +0800 Subject: [PATCH] Fix world info custom filter payload sanitization --- prompt-builder.js | 36 +++++++++++++++++++++++++++++++++--- tests/task-worldinfo.mjs | 12 ++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/prompt-builder.js b/prompt-builder.js index ef011fa..647363f 100644 --- a/prompt-builder.js +++ b/prompt-builder.js @@ -238,6 +238,9 @@ function blockUsesWorldInfoContent(block = {}) { } function messageUsesWorldInfoContent(message = {}) { + if (message?.derivedFromWorldInfo === true) { + return true; + } if (usesWorldInfoSourceKey(message?.sourceKey)) { return true; } @@ -618,6 +621,9 @@ function sanitizePromptMessages( injectionMode: String( sanitized.value?.injectionMode || message?.injectionMode || "", ), + derivedFromWorldInfo: + sanitized.value?.derivedFromWorldInfo === true || + message?.derivedFromWorldInfo === true, }, ); return executionMessage; @@ -1157,6 +1163,7 @@ export async function buildTaskPrompt(settings = {}, taskType, context = {}) { if (!block || block.enabled === false) continue; const role = normalizeRole(block.role); + const blockDerivedFromWorldInfo = blockUsesWorldInfoContent(block); let content = ""; if (block.type === "legacyPrompt") { @@ -1182,7 +1189,7 @@ export async function buildTaskPrompt(settings = {}, taskType, context = {}) { ); } - const blockApplyMvu = !(isCustomFilter && blockUsesWorldInfoContent(block)); + const blockApplyMvu = !(isCustomFilter && blockDerivedFromWorldInfo); const sanitizedBlockContent = sanitizeTaskPromptText( settings, taskType, @@ -1229,6 +1236,7 @@ export async function buildTaskPrompt(settings = {}, taskType, context = {}) { order: Number.isFinite(Number(block.order)) ? Number(block.order) : block._orderIndex, + derivedFromWorldInfo: blockDerivedFromWorldInfo, injectionMode: mode, delivery: resolveBlockDelivery(block), effectiveDelivery: resolveBlockDelivery(block), @@ -1242,6 +1250,7 @@ export async function buildTaskPrompt(settings = {}, taskType, context = {}) { blockType: String(block.type || "custom"), sourceKey: String(block.sourceKey || ""), injectionMode: mode, + derivedFromWorldInfo: blockDerivedFromWorldInfo, }); if (executionMessage) { executionMessages.push(executionMessage); @@ -1265,9 +1274,29 @@ export async function buildTaskPrompt(settings = {}, taskType, context = {}) { assistantRoleBlockCount += 1; } if (mode === "prepend") { - customMessages.unshift({ role, content }); + customMessages.unshift({ + role, + content, + source: "profile-block", + blockId: String(block.id || ""), + blockName: String(block.name || ""), + blockType: String(block.type || "custom"), + sourceKey: String(block.sourceKey || ""), + injectionMode: mode, + derivedFromWorldInfo: blockDerivedFromWorldInfo, + }); } else { - customMessages.push({ role, content }); + customMessages.push({ + role, + content, + source: "profile-block", + blockId: String(block.id || ""), + blockName: String(block.name || ""), + blockType: String(block.type || "custom"), + sourceKey: String(block.sourceKey || ""), + injectionMode: mode, + derivedFromWorldInfo: blockDerivedFromWorldInfo, + }); } } @@ -1436,6 +1465,7 @@ export function buildTaskLlmPayload(promptBuild = null, fallbackUserPrompt = "") blockType: String(message.blockType || ""), sourceKey: String(message.sourceKey || ""), injectionMode: String(message.injectionMode || ""), + derivedFromWorldInfo: message.derivedFromWorldInfo === true, }), ) .filter(Boolean) diff --git a/tests/task-worldinfo.mjs b/tests/task-worldinfo.mjs index ed115dc..0800490 100644 --- a/tests/task-worldinfo.mjs +++ b/tests/task-worldinfo.mjs @@ -670,6 +670,18 @@ try { customInterpolatedPromptBuild.systemPrompt, /secret=true<\/status_current_variable>/, ); + const customInterpolatedPayload = buildTaskLlmPayload( + customInterpolatedPromptBuild, + "unused fallback", + ); + assert.equal( + customInterpolatedPayload.promptMessages.some((message) => + /secret=true<\/status_current_variable>/.test( + message.content, + ), + ), + true, + ); const noWorldInfoBlockSettings = { taskProfiles: {