From ec0b6f10ab02808a03df09d5675cf51e18c38771 Mon Sep 17 00:00:00 2001 From: Towsty Date: Fri, 11 Sep 2026 19:06:17 -0500 Subject: [PATCH] Bind the selected output when restoring complete input settings --- components/studio2/Bench.vue | 2 +- shared/studio2/input.mjs | 7 +++++-- tests/studio2-bench.test.mjs | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/components/studio2/Bench.vue b/components/studio2/Bench.vue index 9cc3b68..4e07389 100644 --- a/components/studio2/Bench.vue +++ b/components/studio2/Bench.vue @@ -88,7 +88,7 @@ function chooseTask(task:string){if(task==='extend'){Object.assign(form,extendSe function chooseClip(id:string){if(!id){form.startClipId='';return}const clip=clips.value.find((c:any)=>c.id===id);if(clip)Object.assign(form,bindClip(form,clip,useRuntimeConfig().public.studio==='xaigen'))} function selectOutput(item:any){selected.value=item} function sourceChanged(){Object.assign(form,changeSource(form))} -function restore(item:any){Object.assign(form,restoreAll(form,item));form.guides=form.guides||[];batchText.value=''} +function restore(item:any){Object.assign(form,restoreAll(form,item,xaigen));form.guides=form.guides||[];batchText.value=''} function focusJob(job:any){selectOutput(job.outputs?.at(-1)||null)} async function loadLoras(fresh=false){try{loraNames.value=await $fetch('/api/studio-2/loras'+(fresh?'?fresh=1':''))}catch{error.value='Could not refresh LoRAs. The last loaded list is still available.'}} function pickAsset(asset:any){const key=picker.value;if(key.startsWith('guide:'))form.guides[Number(key.split(':')[1])].stillId=asset?.id||'';else if(key==='startClipId')chooseClip(asset?.id||'');else form[key]=asset?.id||'';picker.value=''} diff --git a/shared/studio2/input.mjs b/shared/studio2/input.mjs index 6694cf6..2f79385 100644 --- a/shared/studio2/input.mjs +++ b/shared/studio2/input.mjs @@ -49,8 +49,11 @@ export function changeSource(form) { export function useAsHero(form, item) { return {...form,identityStillId:item.id} } export function useAsSource(form, item) { return {...form,imageAId:item.id} } -export function restoreAll(form,item) { +export function restoreAll(form,item,xaigen=false) { const restored=restoreInput(item),next={...form,...restored,settings:{...form.settings,...restored.settings,seedMode:'random'}} - next.mode=restored.mode==='iterate'?'edit':restored.mode || (item.kind==='clip'?'video':'edit') + if(item.kind==='clip') return {...bindClip(next,item,xaigen),mode:'extend'} + next.mode=restored.mode==='iterate'?'edit':restored.mode || 'edit' + next.imageAId=item.id + next.startClipId='' return next } diff --git a/tests/studio2-bench.test.mjs b/tests/studio2-bench.test.mjs index e9a1527..73fea15 100644 --- a/tests/studio2-bench.test.mjs +++ b/tests/studio2-bench.test.mjs @@ -27,7 +27,7 @@ test('hidden xAIGen canvas and family render no image or video elements',async() const src=readFileSync(new URL('../components/studio2/Bench.vue',import.meta.url),'utf8') const stage=src.slice(src.indexOf('
line.includes('aria-label="Current family outputs"')) - const render=new Function('Vue',compile('
'+stage+strip+'
',{mode:'function'}).code)(Vue) + const render=new Function('Vue',compile('
'+stage+strip+'
',{mode:'function',prefixIdentifiers:true}).code)(Vue) const state={selected:{id:'a',kind:'still'},hideOutput:true,xaigen:true,family:[{id:'a',kind:'still'}],form:{hideInput:true},previewHidden,stillUrl:id=>'/image/'+id,selectOutput(){}} const hidden=await renderToString(Vue.createSSRApp({render,data:()=>state}));assert.doesNotMatch(hidden,/