Ship MiniMax v2 identity refs and Qwen sidecar edits.

Keep v1 as the default video graph, relay image edits to the Qwen Lightning box, and keep /api/health up if one Comfy host is unset.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Towsty
2026-08-26 14:29:15 -05:00
co-authored by Cursor
parent 551c29a62a
commit c55a48a57e
22 changed files with 2061 additions and 75 deletions
+11 -4
View File
@@ -38,6 +38,7 @@ export interface LibraryClip {
familyId?: string
parentClipId?: string
chainIndex?: number
workflow?: 'v1' | 'v2'
}
export interface LibraryStill {
@@ -89,6 +90,7 @@ export interface RetryDraft {
samplerName?: string
scheduler?: string
extensions?: QueuedExtension[]
workflow?: 'v1' | 'v2'
}
interface Catalog {
@@ -715,6 +717,7 @@ export async function saveRetryDraft(params: {
samplerName?: string
scheduler?: string
extensions?: QueuedExtension[]
workflow?: 'v1' | 'v2'
}) {
return mutate(params.ownerKey, (catalog) => {
const existing = params.id ? catalog.drafts.find(item => item.id === params.id) : undefined
@@ -740,7 +743,8 @@ export async function saveRetryDraft(params: {
fps: params.fps,
samplerName: params.samplerName,
scheduler: params.scheduler,
extensions: params.extensions?.length ? params.extensions : undefined
extensions: params.extensions?.length ? params.extensions : undefined,
workflow: params.workflow
}
catalog.drafts = [draft, ...catalog.drafts.filter(item => item.id !== draft.id)].slice(0, 20)
return draft
@@ -809,6 +813,7 @@ export async function saveClip(params: {
familyId?: string
parentClipId?: string
chainIndex?: number
workflow?: 'v1' | 'v2'
}) {
const catalog = readCatalog(params.ownerKey)
const folder = catalog.folders.find(item => item.id === params.folderId) || catalog.folders[0]
@@ -833,7 +838,8 @@ export async function saveClip(params: {
scheduler: params.scheduler,
familyId: params.familyId,
parentClipId: params.parentClipId,
chainIndex: params.chainIndex
chainIndex: params.chainIndex,
workflow: params.workflow
}
mkdirSync(clipDir(params.ownerKey, clip.id), { recursive: true })
const videoPath = clipVideoPath(params.ownerKey, clip.id)
@@ -852,12 +858,13 @@ export async function saveClip(params: {
} else {
await extractVideoThumb(clipVideoPath(params.ownerKey, clip.id), join(clipDir(params.ownerKey, clip.id), 'thumb.jpg'))
}
if (params.thumb?.length) {
const saveInputStill = Boolean(params.thumb?.length) && !params.parentClipId && !(params.chainIndex || 0)
if (saveInputStill) {
await saveStill({
ownerKey: params.ownerKey,
folderId: folder.id,
filename: `${clip.id}.png`,
data: params.thumb,
data: params.thumb!,
width: params.width,
height: params.height,
hideInput: params.hideInput