Keep family pre/post text on shot queues and wrap the mid prompt at Comfy time.

Later shots were starting a new job without those wrappers, so only the first clip got them.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Towsty
2026-09-03 07:17:00 -05:00
co-authored by Cursor
parent f05f8f3597
commit 1206afe8fd
9 changed files with 86 additions and 32 deletions
+15 -7
View File
@@ -53,16 +53,16 @@
</template>
<template v-else>
<label v-if="draft.promptPre" class="block text-sm">
<span class="mb-1 block font-medium text-zinc-300">Prompt pre</span>
<label class="block text-sm">
<span class="mb-1 block font-medium text-zinc-300">Pre-text</span>
<textarea v-model="draft.promptPre" rows="2" class="max-h-28 w-full overflow-y-auto rounded-xl border border-white/10 bg-zinc-950 px-3 py-2 text-sm outline-none ring-amber-300/40 [overflow-wrap:anywhere] focus:ring-2 disabled:opacity-70" :disabled="!editable" />
</label>
<label class="block text-sm">
<span class="mb-1 block font-medium text-zinc-300">{{ shots.length > 1 ? (job.kind === 'edit' ? 'Pass 1' : 'Shot 1') : 'Prompt' }}</span>
<textarea v-model="draft.prompt" rows="5" class="max-h-48 w-full overflow-y-auto rounded-xl border border-white/10 bg-zinc-950 px-3 py-2 text-sm outline-none ring-amber-300/40 [overflow-wrap:anywhere] focus:ring-2 disabled:opacity-70" :disabled="!editable" />
</label>
<label v-if="draft.promptPost" class="block text-sm">
<span class="mb-1 block font-medium text-zinc-300">Prompt post</span>
<label class="block text-sm">
<span class="mb-1 block font-medium text-zinc-300">Post-text</span>
<textarea v-model="draft.promptPost" rows="2" class="max-h-28 w-full overflow-y-auto rounded-xl border border-white/10 bg-zinc-950 px-3 py-2 text-sm outline-none ring-amber-300/40 [overflow-wrap:anywhere] focus:ring-2 disabled:opacity-70" :disabled="!editable" />
</label>
<label v-if="job.kind === 'edit'" class="block text-sm">
@@ -164,6 +164,7 @@ import {
type QueuedInspectPayload,
type QueuedShotDraft
} from '~/utils/queuedJob'
import { restorePromptParts } from '~/utils/promptParts'
import { loraMatchesUse, loraStackLabel, persistLoraFields, readLoraStack, type LoraStackItem } from '~/utils/loras'
const props = defineProps<{
@@ -243,6 +244,7 @@ function currentPayload(): QueuedInspectPayload {
const base = { ...(job.value?.payload || {}) }
base.name = draft.name
base.prompt = draft.prompt
base.promptMid = draft.prompt
base.promptPre = draft.promptPre
base.promptPost = draft.promptPost
base.negative = draft.negative
@@ -271,9 +273,14 @@ function hydrate(next: QueuedInspectJob) {
job.value = next
const payload = next.payload || {}
draft.name = payload.name || next.name || ''
draft.prompt = payload.prompt || next.prompt || ''
draft.promptPre = payload.promptPre || ''
draft.promptPost = payload.promptPost || ''
const parts = restorePromptParts(payload.promptMid || payload.prompt || next.prompt || '', {
pre: payload.promptPre,
prompt: payload.promptMid || payload.prompt || next.prompt || '',
post: payload.promptPost
})
draft.prompt = parts.prompt
draft.promptPre = parts.pre
draft.promptPost = parts.post
draft.negative = payload.negative || ''
draft.tags = payload.tags || (next.kind === 'music' ? (payload.prompt || next.prompt) : '') || ''
draft.lyrics = payload.lyrics || ''
@@ -363,6 +370,7 @@ async function saveChanges() {
body: {
name: payload.name,
prompt: job.value.kind === 'music' ? payload.tags : payload.prompt,
promptMid: job.value.kind === 'music' ? undefined : payload.prompt,
tags: payload.tags,
lyrics: payload.lyrics,
instrumental: payload.instrumental,