diff --git a/chat-intent-router.mjs b/chat-intent-router.mjs index 5e0a079..3363a7a 100644 --- a/chat-intent-router.mjs +++ b/chat-intent-router.mjs @@ -208,6 +208,13 @@ function requestedImageGenerationMode(userMessage) { ); } +export function resolveMessageImageGenerationDecision(userMessage, text = messageDisplayText(userMessage)) { + return resolveImageGenerationDecision({ + text, + requestedMode: requestedImageGenerationMode(userMessage), + }); +} + function buildImageGenerationInstruction(decision) { if (decision?.mode === IMAGE_GENERATION_MODE.REQUIRED) { return [ @@ -1874,10 +1881,7 @@ export function createChatIntentRouter(options = {}) { ); return finalizeRouterClassification({ ...coerced, - imageGeneration: resolveImageGenerationDecision({ - text, - requestedMode: requestedImageGenerationMode(userMessage), - }), + imageGeneration: resolveMessageImageGenerationDecision(userMessage, text), }, decisionContext); }; const llmRouterEligible = isLlmRouterEligibleForUser(userId); diff --git a/cursor-page-routing.mjs b/cursor-page-routing.mjs index 862da53..b7634c0 100644 --- a/cursor-page-routing.mjs +++ b/cursor-page-routing.mjs @@ -16,6 +16,7 @@ import { resolvePreferredCodeExecutor, } from './cursor-agent-launch.mjs'; import { isCursorTaskKindEnabled } from './cursor-channel-features.mjs'; +import { IMAGE_GENERATION_MODE, resolveMessageImageGenerationDecision } from './chat-intent-router.mjs'; const PUBLISH_SKILL_NAME = 'static-page-publish'; @@ -81,6 +82,13 @@ export function isPageCursorDefaultCandidate(userMessage, { const taskKind = resolveCursorTaskKind(taskText, skill); if (taskKind === null) return false; + if ( + taskKind === CURSOR_TASK_KIND.PAGE_GENERATION + && resolveMessageImageGenerationDecision(userMessage, taskText).mode === IMAGE_GENERATION_MODE.REQUIRED + ) { + // Required images need the MindSpace sandbox tool and its per-run artifact check. + return false; + } if (policy?.enabled) { return isCursorTaskKindEnabled(policy, taskKind); } diff --git a/cursor-page-routing.test.mjs b/cursor-page-routing.test.mjs index 37ec87b..043ac6d 100644 --- a/cursor-page-routing.test.mjs +++ b/cursor-page-routing.test.mjs @@ -22,6 +22,27 @@ test('page cursor default matches poem page requests', () => { assert.equal(resolveCursorTaskKind('帮我写首诗,并做成页面'), 'page_generation'); }); +test('page requests that require Qwen-generated images retain the MindSpace agent path', () => { + const options = { env: enabledEnv, channelEligible: true }; + const makeMessage = (text, imageGenerationMode = 'auto') => ({ + content: [{ type: 'text', text }], + metadata: { displayText: text, memindRun: { imageGenerationMode } }, + }); + + for (const message of [ + makeMessage('帮我制作一个咖啡品牌页面,用千问生图做封面'), + makeMessage('帮我制作一个咖啡品牌页面', 'required'), + ]) { + const enforced = enforcePageGenerationCursorRuntime(message, options); + assert.equal(enforced.requiredExecutor, null); + assert.equal(enforced.rawToolMode, 'chat'); + assert.equal(enforced.userMessage, message); + } + assert.equal(isPageCursorDefaultCandidate( + makeMessage('帮我制作一个咖啡品牌页面,不要生图'), options, + ), true); +}); + test('page cursor default matches survey page-data requests', () => { const userMessage = { role: 'user',