Add same-mode extra passes to Image v2, and hide Shot script from image Recommend.

Library tiles show a check when selected, and xAIGen can hide a preview from the details pane.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Towsty
2026-08-30 18:17:17 -05:00
co-authored by Cursor
parent fd9831dfcf
commit e89b47b5f9
8 changed files with 500 additions and 206 deletions
+25 -1
View File
@@ -32,6 +32,18 @@ import { existsSync, readFileSync } from 'node:fs'
type ImageFile = { filename: string; data: Buffer; type?: string }
function parsePasses(raw: unknown) {
if (!raw) return [] as { prompt: string }[]
let parsed = raw
if (typeof raw === 'string') {
try { parsed = JSON.parse(raw) } catch { return [] }
}
if (!Array.isArray(parsed)) return []
return parsed
.map((item: { prompt?: unknown }) => ({ prompt: String(item?.prompt || '').trim() }))
.filter(item => item.prompt)
}
function parseBool(raw: unknown) {
return raw === true || raw === 'true' || raw === '1' || raw === 1
}
@@ -124,10 +136,20 @@ export default defineEventHandler(async (event) => {
mode === 'generate' ? 't2i' : mode === 'refine' ? 'refine' : 'scene'
)
const prompt = String(fields.prompt || '').trim()
const extraPasses = parsePasses(fields.passes)
const aspect = parseImageAspect(fields.aspect)
if (!prompt && (mode === 'generate' || aspect === 'auto')) {
throw createError({ statusCode: 400, statusMessage: 'A prompt is required' })
}
if (extraPasses.length && (mode === 'refine' || mode === 'generate')) {
throw createError({
statusCode: 400,
statusMessage: 'Extra passes are only for Edit and Compose. Refine and Generate stay a single run.'
})
}
if (extraPasses.some(item => !item.prompt)) {
throw createError({ statusCode: 400, statusMessage: 'Each extra pass needs a prompt' })
}
if (!comfyConfigured()) {
throw createError({
statusCode: 503,
@@ -301,6 +323,7 @@ export default defineEventHandler(async (event) => {
extensions: [],
queueAutoRun: false,
negative: String(fields.negative || '').trim(),
passes: extraPasses,
referenceStillId: savedRef?.id,
referenceStillFilename: savedRef?.filename,
scaleToTotalPixels: mode !== 'generate',
@@ -342,6 +365,7 @@ export default defineEventHandler(async (event) => {
height: size?.height || 0,
strength: refineStrength,
hideThumbnail,
folderLocked
folderLocked,
chainTotal: 1 + extraPasses.length
}
})