diff --git a/.gitignore b/.gitignore index 8af43f7..471cb27 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ test_data/* iib_output iib.db-shm iib.db-wal +.cursor/ diff --git a/javascript/index.js b/javascript/index.js index 38c9f29..17b5c52 100644 --- a/javascript/index.js +++ b/javascript/index.js @@ -13,8 +13,8 @@ Promise.resolve().then(async () => {
MFrGXJqNrOUPCPqPrQ|]@`+`2h1lBlZnXp*r;rWrkz9{4{B}x-#c-#y-$;-$l-$y-%Q-%n-(i-(x-)i-/!-3*-5B-9V",wan:"#=$0&o.]0F4@5X5b6*628u9p -+b-+(-(_-(.-&h-#%{@wGuWs}s|rJrDlaWTV}V+NAMvKfIgGKFX9a7c,7&]&+%~",bie:"-/A-/;fGe2`#M'M!$!#I",pao:"-/>-+i-'^~o|2w=hA]$[P?.4J4H3d06.M'^%A!S",geng:"-/7-&A{TzHlrh=ZIOlK4IX=X2p&M",shua:"-//-%j",cuo:"-.y-.p-*5wukWkSh!ZKY&WuV4(o$j$'",kei:"-.woU",la:"-.v-%3-$n~L|8[RXFXEWnUEU2R`MOI6DT:T0['o$A",pou:"-.l-'_-&[{]twtO]+]&Z+YGJS/<",tuan:"-.I~!}~}K}HyPy&f7`>[}XIVmGLE;;.:m8t2[,F%v%p",zuan:"-.)XOTt",keng:"-,x-([|t|kvIZCXlVgBF/C",gao:"-,Z-(I-(>wRlpWjNHGxGwGdG>E~E3Dm,)!y!t",lang:"-,V-&J-$~{Jy[r{llgiSeOIOHO;KRHHG4Cp=[3Y,z*%(s",weng:"-,@-#oyxv{kfU!Pd9o'N'&",tao:"-+m-)E-'+-%DwPwMw*r}i/fl`j[oYBWXL,JkGtE?><=) ${C} MFrGXJqNrOUPCPqPrQ|]@`+`2h1lBlZnXp*r;rWrkz9{4{B}x-#c-#y-$;-$l-$y-%Q-%n-(i-(x-)i-/!-3*-5B-9V",wan:"#=$0&o.]0F4@5X5b6*628u9p -+b-+(-(_-(.-&h-#%{@wGuWs}s|rJrDlaWTV}V+NAMvKfIgGKFX9a7c,7&]&+%~",bie:"-/A-/;fGe2`#M'M!$!#I",pao:"-/>-+i-'^~o|2w=hA]$[P?.4J4H3d06.M'^%A!S",geng:"-/7-&A{TzHlrh=ZIOlK4IX=X2p&M",shua:"-//-%j",cuo:"-.y-.p-*5wukWkSh!ZKY&WuV4(o$j$'",kei:"-.woU",la:"-.v-%3-$n~L|8[RXFXEWnUEU2R`MOI6DT:T0['o$A",pou:"-.l-'_-&[{]twtO]+]&Z+YGJS/<",tuan:"-.I~!}~}K}HyPy&f7`>[}XIVmGLE;;.:m8t2[,F%v%p",zuan:"-.)XOTt",keng:"-,x-([|t|kvIZCXlVgBF/C",gao:"-,Z-(I-(>wRlpWjNHGxGwGdG>E~E3Dm,)!y!t",lang:"-,V-&J-$~{Jy[r{llgiSeOIOHO;KRHHG4Cp=[3Y,z*%(s",weng:"-,@-#oyxv{kfU!Pd9o'N'&",tao:"-+m-)E-'+-%DwPwMw*r}i/fl`j[oYBWXL,JkGtE?><=) ${T} ${line}ZYZZ]U_6_9d9fYj6j~lWm)mep)rQrbrctvwkxc{y|U}6~?~C~`~m-!Z-*'-+R-/j-0j-3i-4/-4@-5,-5f-6j-6s-7)-9G-9W-9X",tuo:"%U%V&z0L2J4v?{@$F_H6MUTbT~Y'Yc^QdHdQnVq+r`x1{{|;|<-&d-(.-(z-({-)1-)J-)K-*:-*e-*p-+$-+3-.b-/%-/[-0b-3O-4,-6_-8}-9$-9?",zhe:"#'%+%E'P2f2|
}I-*S-+S-0~-2b-5X-8{",cou:"@ThJiK",chuang:"'_,H,L,q{+{E",piao:"$+).1D7a:;
lMi@i$fDf@b1`Y_4XyW6TMMzJ$I:GOD{=#
{let t=0,n=1;for(let a=e.length;a--;)t+=n*da.indexOf(e.charAt(a)),n*=91;return t},Wt=(e,t)=>{let n,a,s,i,w;for(n in e)if(e.hasOwnProperty(n))for(a=e[n].match(ga),s=0;s
');continue}const Y=X[C];O||(O=Y.includes("("));const le=["tag"];O&&le.push("has-parentheses"),Y.length<32&&le.push("short-tag"),j.push(`${Y}`),O&&(O=!Y.includes(")"))}return j.join(a.showCommaInInfoPanel?",":" ")}$e("load",o=>{const r=o.target;r.className==="ant-image-preview-img"&&(M.value=`${r.naturalWidth} x ${r.naturalHeight}`)},{capture:!0});const ze=ee(()=>{const o=[{name:x("fileSize"),val:n.file.size}];return M.value&&o.push({name:x("resolution"),val:M.value}),o}),d=()=>{const o="Negative prompt:",r=I.value.includes(o)?I.value.split(o)[0]:W.value[0]??"";pe(Ve(r.trim()))},_=()=>document.body.requestFullscreen(),q=o=>{pe(typeof o=="object"?JSON.stringify(o,null,4):o)},D=o=>{o.key.startsWith("Arrow")?(o.stopPropagation(),o.preventDefault(),document.dispatchEvent(new KeyboardEvent("keydown",o))):o.key==="Escape"&&document.fullscreenElement&&document.exitFullscreen()};$e("dblclick",o=>{var r;((r=o.target)==null?void 0:r.className)==="ant-image-preview-img"&&Oe()});const he=ee(()=>F.value||m.value.expanded),_e=ke(Qe+"contextShowFullPath",!1),Pe=ee(()=>_e.value?n.file.fullpath:n.file.name),xe=ke(Qe+"tagA2ZClassify",!1),Ut=ee(()=>{var X;const o=(X=a.conf)==null?void 0:X.all_custom_tags.map(j=>{var C,Y;return{char:((C=j.display_name)==null?void 0:C[0])||((Y=j.name)==null?void 0:Y[0]),...j}}).reduce((j,O)=>{var Y;let C="#";if(/[a-z]/i.test(O.char))C=O.char.toUpperCase();else if(/[\u4e00-\u9fa5]/.test(O.char))try{C=((Y=/^\[?(\w)/.exec(va(O.char)+""))==null?void 0:Y[1])??"#"}catch(le){console.log("err",le)}return C=C.toUpperCase(),j[C]||(j[C]=[]),j[C].push(O),j},{});return Object.entries(o??{}).sort((j,O)=>j[0].charCodeAt(0)-O[0].charCodeAt(0))}),De=()=>{Oe(),t("contextMenuClick",{key:"tiktokView"},n.file,n.idx)},je=ie(!1),qt=async()=>{var o,r;if(!L.value.prompt){Q.warning(x("aiAnalyzeTagsNoPrompt"));return}if(!((r=(o=a.conf)==null?void 0:o.all_custom_tags)!=null&&r.length)){Q.warning(x("aiAnalyzeTagsNoCustomTags"));return}je.value=!0;try{const X=L.value.prompt,O=`You are a professional AI assistant responsible for analyzing Stable Diffusion prompts and categorizing them into appropriate tags.
+*/let Dt=19968,la=(40896-Dt)/2,et="",Se=",",sa=(()=>{let e=[];for(let t=33;t<127;t++)t!=34&&t!=92&&t!=45&&e.push(String.fromCharCode(t));return e.join(et)})(),ut={a:{yi:"!]#R$!$q(3(p)[*2*g+6+d.C.q0[0w1L2<717l8B8E9?:8;V;[;e;{<)<+.>4??@~A`BbC:CGC^CiDMDjDkF!H/H;JaL?M.M2MoNCN|OgO|P$P)PBPyQ~R%R.S.T;TZYZZ]U_6_9d9fYj6j~lWm)mep)rQrbrctvwkxc{y|U}6~?~C~`~m-!Z-*'-+R-/j-0j-3i-4/-4@-5,-5f-6j-6s-7)-9G-9W-9X",tuo:"%U%V&z0L2J4v?{@$F_H6MUTbT~Y'Yc^QdHdQnVq+r`x1{{|;|<-&d-(.-(z-({-)1-)J-)K-*:-*e-*p-+$-+3-.b-/%-/[-0b-3O-4,-6_-8}-9$-9?",zhe:"#'%+%E'P2f2|
}I-*S-+S-0~-2b-5X-8{",cou:"@ThJiK",chuang:"'_,H,L,q{+{E",piao:"$+).1D7a:;
lMi@i$fDf@b1`Y_4XyW6TMMzJ$I:GOD{=#
{let t=0,a=1;for(let n=e.length;n--;)t+=a*sa.indexOf(e.charAt(n)),a*=91;return t},Pt=(e,t)=>{let a,n,s,i,y;for(a in e)if(e.hasOwnProperty(a))for(n=e[a].match(ia),s=0;s
');continue}const Z=Y[T];x||(x=Z.includes("("));const le=["tag"];x&&le.push("has-parentheses"),Z.length<32&&le.push("short-tag"),P.push(`${Z}`),x&&(x=!Z.includes(")"))}return P.join(n.showCommaInInfoPanel?",":" ")}$e("load",o=>{const c=o.target;c.className==="ant-image-preview-img"&&(L.value=`${c.naturalWidth} x ${c.naturalHeight}`)},{capture:!0});const xe=te(()=>{const o=[{name:C("fileSize"),val:a.file.size}];return L.value&&o.push({name:C("resolution"),val:L.value}),o}),h=()=>{const o="Negative prompt:",c=A.value.includes(o)?A.value.split(o)[0]:j.value[0]??"";he(Ne(c.trim()))},_=()=>document.body.requestFullscreen(),U=o=>{he(typeof o=="object"?JSON.stringify(o,null,4):o)},D=o=>{o.key.startsWith("Arrow")?(o.stopPropagation(),o.preventDefault(),document.dispatchEvent(new KeyboardEvent("keydown",o))):o.key==="Escape"&&document.fullscreenElement&&document.exitFullscreen()};$e("dblclick",o=>{var c;((c=o.target)==null?void 0:c.className)==="ant-image-preview-img"&&be()});const pe=te(()=>I.value||g.value.expanded),we=ke(Qe+"contextShowFullPath",!1),De=te(()=>we.value?a.file.fullpath:a.file.name),ze=ke(Qe+"tagA2ZClassify",!1),jt=te(()=>{var Y;const o=(Y=n.conf)==null?void 0:Y.all_custom_tags.map(P=>{var T,Z;return{char:((T=P.display_name)==null?void 0:T[0])||((Z=P.name)==null?void 0:Z[0]),...P}}).reduce((P,x)=>{var Z;let T="#";if(/[a-z]/i.test(x.char))T=x.char.toUpperCase();else if(/[\u4e00-\u9fa5]/.test(x.char))try{T=((Z=/^\[?(\w)/.exec(ga(x.char)+""))==null?void 0:Z[1])??"#"}catch(le){console.log("err",le)}return T=T.toUpperCase(),P[T]||(P[T]=[]),P[T].push(x),P},{});return Object.entries(o??{}).sort((P,x)=>P[0].charCodeAt(0)-x[0].charCodeAt(0))}),Pe=()=>{be(),t("contextMenuClick",{key:"tiktokView"},a.file,a.idx)},je=ie(!1),Wt=async()=>{var o,c;if(!E.value.prompt){R.warning(C("aiAnalyzeTagsNoPrompt"));return}if(!((c=(o=n.conf)==null?void 0:o.all_custom_tags)!=null&&c.length)){R.warning(C("aiAnalyzeTagsNoCustomTags"));return}je.value=!0;try{const Y=E.value.prompt,x=`You are a professional AI assistant responsible for analyzing Stable Diffusion prompts and categorizing them into appropriate tags.
Your task is:
1. Analyze the given prompt
@@ -13,6 +13,6 @@ Your task is:
4. If no tags match, return an empty string
5. Tag matching should be based on semantic similarity and thematic relevance
-Available tags: ${a.conf.all_custom_tags.map(N=>N.name).join(", ")}
+Available tags: ${n.conf.all_custom_tags.map(V=>V.name).join(", ")}
-Please return only tag names, do not include any other content.`,Y=(await vn({messages:[{role:"system",content:O},{role:"user",content:`Please analyze this prompt and return matching tags: ${X}`}],temperature:.3,max_tokens:200})).choices[0].message.content.trim();if(!Y){Q.info(x("aiAnalyzeTagsNoMatchedTags"));return}const le=Y.split(",").map(N=>N.trim()).filter(N=>N),Ce=a.conf.all_custom_tags.filter(N=>le.some(me=>N.name.toLowerCase()===me.toLowerCase()||N.name.toLowerCase().includes(me.toLowerCase())||me.toLowerCase().includes(N.name.toLowerCase()))),Te=new Set(w.value.map(N=>N.id)),fe=Ce.filter(N=>!Te.has(N.id));if(fe.length===0){Ce.length>0?Q.info(x("aiAnalyzeTagsAllTagsAlreadyAdded")):Q.info(x("aiAnalyzeTagsNoValidTags"));return}for(const N of fe)t("contextMenuClick",{key:`toggle-tag-${N.id}`},n.file,n.idx);Q.success(x("aiAnalyzeTagsSuccess",[fe.length.toString(),fe.map(N=>N.name).join(", ")]))}catch(X){console.error("AI分析标签失败:",X),Q.error(x("aiAnalyzeTagsFailed"))}finally{je.value=!1}};return(o,r)=>{var ct,dt,gt;const X=Fn,j=ve,O=yn,C=$n,Y=wn,le=_n,Ce=ve,Te=An,fe=En,N=bn,me=kn,Vt=On;return h(),z("div",{ref_key:"el",ref:i,class:qe(["full-screen-menu",{"unset-size":!c(m).expanded,lr:c(F),"always-on":c($),"mouse-in":J.value}]),onWheelCapture:r[13]||(r[13]=yt(()=>{},["stop"])),onKeydownCapture:D},[c(F)?(h(),z("div",ya)):H("",!0),k("div",$a,[k("div",wa,[c(F)?H("",!0):(h(),z("div",{key:0,ref_key:"dragHandle",ref:E,class:"icon",style:{cursor:"grab"},title:c(x)("dragToMovePanel")},[u(c(Jn))],8,_a)),c(F)?H("",!0):(h(),z("div",{key:1,class:"icon",style:{cursor:"pointer"},onClick:r[0]||(r[0]=g=>c(m).expanded=!c(m).expanded),title:c(x)("clickToToggleMaximizeMinimize")},[he.value?(h(),se(c(fn),{key:0})):(h(),se(c(mn),{key:1}))],8,ba)),k("div",{style:{display:"flex","flex-direction":"column","align-items":"center",cursor:"grab"},class:"icon",title:c(x)("fullscreenview"),onClick:_},[k("img",{src:c(aa),style:{width:"21px",height:"21px","padding-bottom":"2px"},alt:""},null,8,Oa)],8,ka),u(X,{"get-popup-container":G},{overlay:b(()=>[u(Mn,{file:o.file,idx:o.idx,"selected-tag":w.value,onContextMenuClick:r[1]||(r[1]=(g,B,oe)=>t("contextMenuClick",g,B,oe))},null,8,["file","idx","selected-tag"])]),default:b(()=>[c(m).expanded?H("",!0):(h(),z("div",za,[u(c(vt))]))]),_:1}),he.value?(h(),z("div",xa)):H("",!0),he.value?(h(),z("div",Ca,[u(X,{trigger:["hover"],"get-popup-container":G},{overlay:b(()=>[u(le,{onClick:r[2]||(r[2]=g=>t("contextMenuClick",g,o.file,o.idx))},{default:b(()=>{var g;return[((g=c(a).conf)==null?void 0:g.launch_mode)!=="server"?(h(),z(R,{key:0},[u(O,{key:"send2txt2img"},{default:b(()=>[T(v(o.$t("sendToTxt2img")),1)]),_:1}),u(O,{key:"send2img2img"},{default:b(()=>[T(v(o.$t("sendToImg2img")),1)]),_:1}),u(O,{key:"send2inpaint"},{default:b(()=>[T(v(o.$t("sendToInpaint")),1)]),_:1}),u(O,{key:"send2extras"},{default:b(()=>[T(v(o.$t("sendToExtraFeatures")),1)]),_:1}),u(C,{key:"sendToThirdPartyExtension",title:o.$t("sendToThirdPartyExtension")},{default:b(()=>[u(O,{key:"send2controlnet-txt2img"},{default:b(()=>[T("ControlNet - "+v(o.$t("t2i")),1)]),_:1}),u(O,{key:"send2controlnet-img2img"},{default:b(()=>[T("ControlNet - "+v(o.$t("i2i")),1)]),_:1}),u(O,{key:"send2outpaint"},{default:b(()=>[T("openOutpaint")]),_:1})]),_:1},8,["title"])],64)):H("",!0),u(O,{key:"send2BatchDownload"},{default:b(()=>[T(v(o.$t("sendToBatchDownload")),1)]),_:1}),u(C,{key:"copy2target",title:o.$t("copyTo")},{default:b(()=>[(h(!0),z(R,null,ue(c(a).quickMovePaths,B=>(h(),se(O,{key:`copy-to-${B.dir}`},{default:b(()=>[T(v(B.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),u(C,{key:"move2target",title:o.$t("moveTo")},{default:b(()=>[(h(!0),z(R,null,ue(c(a).quickMovePaths,B=>(h(),se(O,{key:`move-to-${B.dir}`},{default:b(()=>[T(v(B.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),u(Y),u(O,{key:"deleteFiles"},{default:b(()=>[T(v(o.$t("deleteSelected")),1)]),_:1}),u(O,{key:"previewInNewWindow"},{default:b(()=>[T(v(o.$t("previewInNewWindow")),1)]),_:1}),u(O,{key:"copyPreviewUrl"},{default:b(()=>[T(v(o.$t("copySourceFilePreviewLink")),1)]),_:1}),u(O,{key:"copyFilePath"},{default:b(()=>[T(v(o.$t("copyFilePath")),1)]),_:1}),u(Y),u(O,{key:"tiktokView",onClick:De},{default:b(()=>[T(v(o.$t("tiktokView")),1)]),_:1})]}),_:1})]),default:b(()=>[u(j,null,{default:b(()=>[T(v(c(x)("openContextMenu")),1)]),_:1})]),_:1}),u(Ce,{onClick:r[3]||(r[3]=g=>t("contextMenuClick",{key:"download"},n.file,n.idx))},{default:b(()=>[T(v(o.$t("download")),1)]),_:1}),I.value?(h(),se(j,{key:0,onClick:r[4]||(r[4]=g=>c(pe)(I.value))},{default:b(()=>[T(v(o.$t("copyPrompt")),1)]),_:1})):H("",!0),I.value?(h(),se(j,{key:1,onClick:d},{default:b(()=>[T(v(o.$t("copyPositivePrompt")),1)]),_:1})):H("",!0),I.value&&((dt=(ct=c(a).conf)==null?void 0:ct.all_custom_tags)!=null&&dt.length)?(h(),se(j,{key:2,onClick:qt,type:"primary",loading:je.value},{default:b(()=>[T(v(o.$t("aiAnalyzeTags")),1)]),_:1},8,["loading"])):H("",!0),u(j,{onClick:De,onTouchstart:yt(De,["prevent"]),type:"default"},{default:b(()=>[T(v(o.$t("tiktokView")),1)]),_:1},8,["onTouchstart"])])):H("",!0)]),he.value?(h(),z("div",Ta,[k("div",Ma,[k("span",La,[k("span",Sa,v(o.$t("fileName")),1),k("span",{class:"value",title:Pe.value,onDblclick:r[5]||(r[5]=g=>c(pe)(Pe.value))},v(Pe.value),41,Ea),k("span",{style:{margin:"0 8px",cursor:"pointer"},title:"Click to expand full path",onClick:r[6]||(r[6]=g=>_e.value=!c(_e))},[u(c(vt))])]),(h(!0),z(R,null,ue(ze.value,g=>(h(),z("span",{class:"info-tag",key:g.name},[k("span",Aa,v(g.name),1),k("span",{class:"value",title:g.val,onDblclick:B=>c(pe)(g.val)},v(g.val),41,Fa)]))),128))]),(gt=c(a).conf)!=null&>.all_custom_tags?(h(),z("div",Ia,[k("div",{class:"sort-tag-switch",onClick:r[7]||(r[7]=g=>xe.value=!c(xe))},[c(xe)?(h(),se(c(jn),{key:1})):(h(),se(c(na),{key:0}))]),k("div",{class:"tag",onClick:r[8]||(r[8]=(...g)=>c(Ge)&&c(Ge)(...g)),style:Ue({"--tag-color":"var(--zp-luminous)"})},"+ "+v(o.$t("add")),5),c(xe)?(h(!0),z(R,{key:0},ue(Ut.value,([g,B])=>(h(),z("div",{key:g,class:"tag-alpha-item"},[k("h4",Pa,v(g)+" : ",1),k("div",null,[(h(!0),z(R,null,ue(B,oe=>(h(),z("div",{class:qe(["tag",{selected:w.value.some(pt=>pt.id===oe.id)}]),onClick:pt=>t("contextMenuClick",{key:`toggle-tag-${oe.id}`},o.file,o.idx),key:oe.id,style:Ue({"--tag-color":c(s).getColor(oe)})},v(oe.name),15,Da))),128))])]))),128)):(h(!0),z(R,{key:1},ue(c(a).conf.all_custom_tags,g=>(h(),z("div",{class:qe(["tag",{selected:w.value.some(B=>B.id===g.id)}]),onClick:B=>t("contextMenuClick",{key:`toggle-tag-${g.id}`},o.file,o.idx),key:g.id,style:Ue({"--tag-color":c(s).getColor(g)})},v(g.name),15,ja))),128))])):H("",!0),k("div",Wa,[k("div",Ua,[T(v(o.$t("experimentalLRLayout"))+": ",1),u(Te,{checked:c(F),"onUpdate:checked":r[9]||(r[9]=g=>Le(F)?F.value=g:null),size:"small"},null,8,["checked"])]),c(F)?(h(),z(R,{key:0},[k("div",qa,[T(v(o.$t("width"))+": ",1),u(fe,{value:c(y),"onUpdate:value":r[10]||(r[10]=g=>Le(y)?y.value=g:null),style:{width:"64px"},step:16,min:128,max:1024},null,8,["value"])]),u(N,{title:o.$t("alwaysOnTooltipInfo")},{default:b(()=>[k("div",Va,[T(v(o.$t("alwaysOn"))+": ",1),u(Te,{checked:c($),"onUpdate:checked":r[11]||(r[11]=g=>Le($)?$.value=g:null),size:"small"},null,8,["checked"])])]),_:1},8,["title"])],64)):H("",!0)]),u(Vt,{activeKey:c(p),"onUpdate:activeKey":r[12]||(r[12]=g=>Le(p)?p.value=g:null)},{default:b(()=>[u(me,{key:"structedData",tab:o.$t("structuredData")},{default:b(()=>[k("div",null,[L.value.prompt?(h(),z(R,{key:0},[Na,Ba,k("code",{innerHTML:ne(L.value.prompt??"")},null,8,Ha)],64)):H("",!0),L.value.negativePrompt?(h(),z(R,{key:1},[Ja,Xa,k("code",{innerHTML:ne(L.value.negativePrompt??"")},null,8,Ya)],64)):H("",!0)]),Object.keys(P.value).length?(h(),z(R,{key:0},[Za,Ga,k("table",null,[(h(!0),z(R,null,ue(P.value,(g,B)=>(h(),z("tr",{key:B,class:"gen-info-frag"},[k("td",Ka,v(B),1),typeof g=="object"?(h(),z("td",{key:0,style:{cursor:"pointer"},onDblclick:oe=>q(g)},[k("code",null,v(g),1)],40,Qa)):(h(),z("td",{key:1,style:{cursor:"pointer"},onDblclick:oe=>q(c(Ve)(g))},v(c(Ve)(g)),41,Ra))]))),128))])],64)):H("",!0),S.value&&Object.keys(S.value).length?(h(),z(R,{key:1},[eo,to,k("table",no,[(h(!0),z(R,null,ue(S.value,(g,B)=>(h(),z("tr",{key:B,class:"gen-info-frag"},[k("td",ao,v(B),1),k("td",{style:{cursor:"pointer"},onDblclick:oe=>q(g)},[k("code",lo,v(typeof g=="string"?g:JSON.stringify(g,null,2)),1)],40,oo)]))),128))])],64)):H("",!0)]),_:1},8,["tab"]),u(me,{key:"sourceText",tab:o.$t("sourceText")},{default:b(()=>[k("code",null,v(I.value),1)]),_:1},8,["tab"])]),_:1},8,["activeKey"])])):H("",!0)]),c(m).expanded&&!c(F)?(h(),z("div",{key:1,class:"mouse-sensor",ref_key:"resizeHandle",ref:f,title:c(x)("dragToResizePanel")},[u(c(Vn))],8,so)):H("",!0)],34)}}});const zo=Dt(io,[["__scopeId","data-v-bb3c8014"]]),uo={key:0,class:"float-panel"},ro={key:0,class:"select-actions"},co={key:1},go=Pt({__name:"MultiSelectKeep",props:{show:{type:Boolean}},emits:["selectAll","reverseSelect","clearAllSelected"],setup(e,{emit:t}){const n=nt(),a=()=>{t("clearAllSelected"),n.keepMultiSelect=!1},s=()=>{n.keepMultiSelect=!0};return(i,w)=>{const M=ve;return i.show?(h(),z("div",uo,[c(n).keepMultiSelect?(h(),z("div",ro,[u(M,{size:"small",onClick:w[0]||(w[0]=A=>t("selectAll"))},{default:b(()=>[T(v(i.$t("select-all")),1)]),_:1}),u(M,{size:"small",onClick:w[1]||(w[1]=A=>t("reverseSelect"))},{default:b(()=>[T(v(i.$t("rerverse-select")),1)]),_:1}),u(M,{size:"small",onClick:w[2]||(w[2]=A=>t("clearAllSelected"))},{default:b(()=>[T(v(i.$t("clear-all-selected")),1)]),_:1}),u(M,{size:"small",onClick:a},{default:b(()=>[T(v(i.$t("exit")),1)]),_:1})])):(h(),z("div",co,[u(M,{size:"small",type:"primary",onClick:s},{default:b(()=>[T(v(i.$t("keep-multi-selected")),1)]),_:1})]))])):H("",!0)}}});const xo=Dt(go,[["__scopeId","data-v-b04c3508"]]);export{wo as L,xo as M,_o as R,ko as a,Oo as b,bo as c,zo as f,sa as o,$e as u};
+Please return only tag names, do not include any other content.`,Z=(await mn({messages:[{role:"system",content:x},{role:"user",content:`Please analyze this prompt and return matching tags: ${Y}`}],temperature:.3,max_tokens:200})).choices[0].message.content.trim();if(!Z){R.info(C("aiAnalyzeTagsNoMatchedTags"));return}const le=Z.split(",").map(V=>V.trim()).filter(V=>V),Ce=n.conf.all_custom_tags.filter(V=>le.some(me=>V.name.toLowerCase()===me.toLowerCase()||V.name.toLowerCase().includes(me.toLowerCase())||me.toLowerCase().includes(V.name.toLowerCase()))),Te=new Set(y.value.map(V=>V.id)),fe=Ce.filter(V=>!Te.has(V.id));if(fe.length===0){Ce.length>0?R.info(C("aiAnalyzeTagsAllTagsAlreadyAdded")):R.info(C("aiAnalyzeTagsNoValidTags"));return}for(const V of fe)t("contextMenuClick",{key:`toggle-tag-${V.id}`},a.file,a.idx);R.success(C("aiAnalyzeTagsSuccess",[fe.length.toString(),fe.map(V=>V.name).join(", ")]))}catch(Y){console.error("AI分析标签失败:",Y),R.error(C("aiAnalyzeTagsFailed"))}finally{je.value=!1}};return(o,c)=>{var rt,ct,dt;const Y=In,P=ve,x=vn,T=yn,Z=$n,le=wn,Ce=ve,Te=Sn,fe=En,V=_n,me=kn,Ut=bn;return f(),z("div",{ref_key:"el",ref:i,class:qe(["full-screen-menu",{"unset-size":!d(g).expanded,lr:d(I),"always-on":d(w),"mouse-in":H.value}]),onWheelCapture:c[13]||(c[13]=vt(()=>{},["stop"])),onKeydownCapture:D},[d(I)?(f(),z("div",ha)):X("",!0),b("div",pa,[b("div",fa,[d(I)?X("",!0):(f(),z("div",{key:0,ref_key:"dragHandle",ref:u,class:"icon",style:{cursor:"grab"},title:d(C)("dragToMovePanel")},[r(d(qn))],8,ma)),d(I)?X("",!0):(f(),z("div",{key:1,class:"icon",style:{cursor:"pointer"},onClick:c[0]||(c[0]=p=>d(g).expanded=!d(g).expanded),title:d(C)("clickToToggleMaximizeMinimize")},[pe.value?(f(),se(d(hn),{key:0})):(f(),se(d(pn),{key:1}))],8,va)),b("div",{style:{display:"flex","flex-direction":"column","align-items":"center",cursor:"grab"},class:"icon",title:d(C)("fullscreenview"),onClick:_},[b("img",{src:d(Qn),style:{width:"21px",height:"21px","padding-bottom":"2px"},alt:""},null,8,$a)],8,ya),r(Y,{"get-popup-container":K},{overlay:k(()=>[r(Tn,{file:o.file,idx:o.idx,"selected-tag":y.value,onContextMenuClick:c[1]||(c[1]=(p,J,oe)=>t("contextMenuClick",p,J,oe))},null,8,["file","idx","selected-tag"])]),default:k(()=>[d(g).expanded?X("",!0):(f(),z("div",wa,[r(d(mt))]))]),_:1}),pe.value?(f(),z("div",_a)):X("",!0),pe.value?(f(),z("div",ka,[r(Y,{trigger:["hover"],"get-popup-container":K},{overlay:k(()=>[r(le,{onClick:c[2]||(c[2]=p=>t("contextMenuClick",p,o.file,o.idx))},{default:k(()=>{var p;return[((p=d(n).conf)==null?void 0:p.launch_mode)!=="server"?(f(),z(ee,{key:0},[r(x,{key:"send2txt2img"},{default:k(()=>[M(m(o.$t("sendToTxt2img")),1)]),_:1}),r(x,{key:"send2img2img"},{default:k(()=>[M(m(o.$t("sendToImg2img")),1)]),_:1}),r(x,{key:"send2inpaint"},{default:k(()=>[M(m(o.$t("sendToInpaint")),1)]),_:1}),r(x,{key:"send2extras"},{default:k(()=>[M(m(o.$t("sendToExtraFeatures")),1)]),_:1}),r(T,{key:"sendToThirdPartyExtension",title:o.$t("sendToThirdPartyExtension")},{default:k(()=>[r(x,{key:"send2controlnet-txt2img"},{default:k(()=>[M("ControlNet - "+m(o.$t("t2i")),1)]),_:1}),r(x,{key:"send2controlnet-img2img"},{default:k(()=>[M("ControlNet - "+m(o.$t("i2i")),1)]),_:1}),r(x,{key:"send2outpaint"},{default:k(()=>[M("openOutpaint")]),_:1})]),_:1},8,["title"])],64)):X("",!0),r(x,{key:"send2BatchDownload"},{default:k(()=>[M(m(o.$t("sendToBatchDownload")),1)]),_:1}),r(T,{key:"copy2target",title:o.$t("copyTo")},{default:k(()=>[(f(!0),z(ee,null,ue(d(n).quickMovePaths,J=>(f(),se(x,{key:`copy-to-${J.dir}`},{default:k(()=>[M(m(J.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),r(T,{key:"move2target",title:o.$t("moveTo")},{default:k(()=>[(f(!0),z(ee,null,ue(d(n).quickMovePaths,J=>(f(),se(x,{key:`move-to-${J.dir}`},{default:k(()=>[M(m(J.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),r(Z),r(x,{key:"deleteFiles"},{default:k(()=>[M(m(o.$t("deleteSelected")),1)]),_:1}),r(x,{key:"previewInNewWindow"},{default:k(()=>[M(m(o.$t("previewInNewWindow")),1)]),_:1}),r(x,{key:"copyPreviewUrl"},{default:k(()=>[M(m(o.$t("copySourceFilePreviewLink")),1)]),_:1}),r(x,{key:"copyFilePath"},{default:k(()=>[M(m(o.$t("copyFilePath")),1)]),_:1}),r(Z),r(x,{key:"tiktokView",onClick:Pe},{default:k(()=>[M(m(o.$t("tiktokView")),1)]),_:1})]}),_:1})]),default:k(()=>[r(P,null,{default:k(()=>[M(m(d(C)("openContextMenu")),1)]),_:1})]),_:1}),r(Ce,{onClick:c[3]||(c[3]=p=>t("contextMenuClick",{key:"download"},a.file,a.idx))},{default:k(()=>[M(m(o.$t("download")),1)]),_:1}),A.value?(f(),se(P,{key:0,onClick:c[4]||(c[4]=p=>d(he)(A.value))},{default:k(()=>[M(m(o.$t("copyPrompt")),1)]),_:1})):X("",!0),A.value?(f(),se(P,{key:1,onClick:h},{default:k(()=>[M(m(o.$t("copyPositivePrompt")),1)]),_:1})):X("",!0),A.value&&((ct=(rt=d(n).conf)==null?void 0:rt.all_custom_tags)!=null&&ct.length)?(f(),se(P,{key:2,onClick:Wt,type:"primary",loading:je.value},{default:k(()=>[M(m(o.$t("aiAnalyzeTags")),1)]),_:1},8,["loading"])):X("",!0),r(P,{onClick:Pe,onTouchstart:vt(Pe,["prevent"]),type:"default"},{default:k(()=>[M(m(o.$t("tiktokView")),1)]),_:1},8,["onTouchstart"])])):X("",!0)]),pe.value?(f(),z("div",ba,[b("div",Oa,[b("span",xa,[b("span",za,m(o.$t("fileName")),1),b("span",{class:"value",title:De.value,onDblclick:c[5]||(c[5]=p=>d(he)(De.value))},m(De.value),41,Ca),b("span",{style:{margin:"0 8px",cursor:"pointer"},title:"Click to expand full path",onClick:c[6]||(c[6]=p=>we.value=!d(we))},[r(d(mt))])]),(f(!0),z(ee,null,ue(xe.value,p=>(f(),z("span",{class:"info-tag",key:p.name},[b("span",Ta,m(p.name),1),b("span",{class:"value",title:p.val,onDblclick:J=>d(he)(p.val)},m(p.val),41,Ma)]))),128))]),(dt=d(n).conf)!=null&&dt.all_custom_tags?(f(),z("div",La,[b("div",{class:"sort-tag-switch",onClick:c[7]||(c[7]=p=>ze.value=!d(ze))},[d(ze)?(f(),se(d(fn),{key:1})):(f(),se(d(Kn),{key:0}))]),b("div",{class:"tag",onClick:c[8]||(c[8]=(...p)=>d(Ge)&&d(Ge)(...p)),style:Ue({"--tag-color":"var(--zp-luminous)"})},"+ "+m(o.$t("add")),5),d(ze)?(f(!0),z(ee,{key:0},ue(jt.value,([p,J])=>(f(),z("div",{key:p,class:"tag-alpha-item"},[b("h4",Ea,m(p)+" : ",1),b("div",null,[(f(!0),z(ee,null,ue(J,oe=>(f(),z("div",{class:qe(["tag",{selected:y.value.some(gt=>gt.id===oe.id)}]),onClick:gt=>t("contextMenuClick",{key:`toggle-tag-${oe.id}`},o.file,o.idx),key:oe.id,style:Ue({"--tag-color":d(s).getColor(oe)})},m(oe.name),15,Sa))),128))])]))),128)):(f(!0),z(ee,{key:1},ue(d(n).conf.all_custom_tags,p=>(f(),z("div",{class:qe(["tag",{selected:y.value.some(J=>J.id===p.id)}]),onClick:J=>t("contextMenuClick",{key:`toggle-tag-${p.id}`},o.file,o.idx),key:p.id,style:Ue({"--tag-color":d(s).getColor(p)})},m(p.name),15,Ia))),128))])):X("",!0),b("div",Aa,[b("div",Fa,[M(m(o.$t("experimentalLRLayout"))+": ",1),r(Te,{checked:d(I),"onUpdate:checked":c[9]||(c[9]=p=>Le(I)?I.value=p:null),size:"small"},null,8,["checked"])]),d(I)?(f(),z(ee,{key:0},[b("div",Da,[M(m(o.$t("width"))+": ",1),r(fe,{value:d($),"onUpdate:value":c[10]||(c[10]=p=>Le($)?$.value=p:null),style:{width:"64px"},step:16,min:128,max:1024},null,8,["value"])]),r(V,{title:o.$t("alwaysOnTooltipInfo")},{default:k(()=>[b("div",Pa,[M(m(o.$t("alwaysOn"))+": ",1),r(Te,{checked:d(w),"onUpdate:checked":c[11]||(c[11]=p=>Le(w)?w.value=p:null),size:"small"},null,8,["checked"])])]),_:1},8,["title"])],64)):X("",!0)]),r(Ut,{activeKey:d(q),"onUpdate:activeKey":c[12]||(c[12]=p=>Le(q)?q.value=p:null)},{default:k(()=>[r(me,{key:"structedData",tab:o.$t("structuredData")},{default:k(()=>[b("div",null,[E.value.prompt?(f(),z(ee,{key:0},[ja,Wa,b("code",{innerHTML:ne(E.value.prompt??"")},null,8,Ua)],64)):X("",!0),E.value.negativePrompt?(f(),z(ee,{key:1},[qa,Na,b("code",{innerHTML:ne(E.value.negativePrompt??"")},null,8,Ba)],64)):X("",!0)]),Object.keys(F.value).length?(f(),z(ee,{key:0},[Va,Ja,b("table",null,[(f(!0),z(ee,null,ue(F.value,(p,J)=>(f(),z("tr",{key:J,class:"gen-info-frag"},[b("td",Xa,m(J),1),typeof p=="object"?(f(),z("td",{key:0,style:{cursor:"pointer"},onDblclick:oe=>U(p)},[b("code",null,m(p),1)],40,Ha)):(f(),z("td",{key:1,style:{cursor:"pointer"},onDblclick:oe=>U(d(Ne)(p))},m(d(Ne)(p)),41,Ya))]))),128))])],64)):X("",!0),B.value&&Object.keys(B.value).length?(f(),z(ee,{key:1},[Za,Ga,b("table",Ka,[(f(!0),z(ee,null,ue(B.value,(p,J)=>(f(),z("tr",{key:J,class:"gen-info-frag"},[b("td",Qa,m(J),1),b("td",{style:{cursor:"pointer"},onDblclick:oe=>U(p)},[b("code",eo,m(typeof p=="string"?p:JSON.stringify(p,null,2)),1)],40,Ra)]))),128))])],64)):X("",!0)]),_:1},8,["tab"]),r(me,{key:"sourceText",tab:o.$t("sourceText")},{default:k(()=>[b("code",null,m(A.value),1)]),_:1},8,["tab"])]),_:1},8,["activeKey"])])):X("",!0)]),d(g).expanded&&!d(I)?(f(),z("div",{key:1,class:"mouse-sensor",ref_key:"resizeHandle",ref:v,title:d(C)("dragToResizePanel")},[r(d(Pn))],8,to)):X("",!0)],34)}}});const wo=Ft(no,[["__scopeId","data-v-c7e0b9b7"]]),ao={key:0,class:"float-panel"},oo={key:0,class:"select-actions"},lo={key:1},so=At({__name:"MultiSelectKeep",props:{show:{type:Boolean}},emits:["selectAll","reverseSelect","clearAllSelected"],setup(e,{emit:t}){const a=nt(),n=()=>{t("clearAllSelected"),a.keepMultiSelect=!1},s=()=>{a.keepMultiSelect=!0};return(i,y)=>{const L=ve;return i.show?(f(),z("div",ao,[d(a).keepMultiSelect?(f(),z("div",oo,[r(L,{size:"small",onClick:y[0]||(y[0]=S=>t("selectAll"))},{default:k(()=>[M(m(i.$t("select-all")),1)]),_:1}),r(L,{size:"small",onClick:y[1]||(y[1]=S=>t("reverseSelect"))},{default:k(()=>[M(m(i.$t("rerverse-select")),1)]),_:1}),r(L,{size:"small",onClick:y[2]||(y[2]=S=>t("clearAllSelected"))},{default:k(()=>[M(m(i.$t("clear-all-selected")),1)]),_:1}),r(L,{size:"small",onClick:n},{default:k(()=>[M(m(i.$t("exit")),1)]),_:1})])):(f(),z("div",lo,[r(L,{size:"small",type:"primary",onClick:s},{default:k(()=>[M(m(i.$t("keep-multi-selected")),1)]),_:1})]))])):X("",!0)}}});const _o=Ft(so,[["__scopeId","data-v-b6f9a67c"]]);export{fo as L,_o as M,mo as R,yo as a,$o as b,vo as c,wo as f,ta as o,$e as u};
diff --git a/vue/dist/assets/MultiSelectKeep-fb8adaea.css b/vue/dist/assets/MultiSelectKeep-fb8adaea.css
new file mode 100644
index 0000000..acff8a0
--- /dev/null
+++ b/vue/dist/assets/MultiSelectKeep-fb8adaea.css
@@ -0,0 +1 @@
+.full-screen-menu[data-v-c7e0b9b7]{position:fixed;z-index:9999;background:var(--zp-primary-background);padding:8px 16px;box-shadow:0 0 4px var(--zp-secondary);border-radius:4px}.full-screen-menu .tags-container[data-v-c7e0b9b7]{margin:4px 0}.full-screen-menu .tags-container .tag[data-v-c7e0b9b7]{margin-right:4px;margin-bottom:4px;padding:2px 16px;border-radius:4px;display:inline-block;cursor:pointer;font-weight:700;transition:.5s all ease;border:2px solid var(--tag-color);color:var(--tag-color);background:var(--zp-primary-background);user-select:none}.full-screen-menu .tags-container .tag.selected[data-v-c7e0b9b7]{background:var(--tag-color);color:#fff}.full-screen-menu .container[data-v-c7e0b9b7]{height:100%;display:flex;overflow:hidden;flex-direction:column}.full-screen-menu .gen-info[data-v-c7e0b9b7]{flex:1;word-break:break-all;white-space:pre-line;overflow:auto;z-index:1;padding-top:4px;position:relative}.full-screen-menu .gen-info code[data-v-c7e0b9b7]{font-size:.9em;display:block;padding:4px;background:var(--zp-primary-background);border-radius:4px;margin-right:20px;white-space:pre-wrap;word-break:break-word;line-height:1.78em}.full-screen-menu .gen-info code[data-v-c7e0b9b7] .natural-text{margin:.5em 0;line-height:1.6em;text-align:justify;color:var(--zp-primary)}.full-screen-menu .gen-info code[data-v-c7e0b9b7] .short-tag{word-break:break-all;white-space:nowrap}.full-screen-menu .gen-info code[data-v-c7e0b9b7] span.tag{background:var(--zp-secondary-variant-background);color:var(--zp-primary);padding:2px 4px;border-radius:6px;margin-right:6px;margin-top:4px;line-height:1.3em;display:inline-block}.full-screen-menu .gen-info code[data-v-c7e0b9b7] .has-parentheses.tag{background:rgba(255,100,100,.14)}.full-screen-menu .gen-info code[data-v-c7e0b9b7] span.tag:hover{background:rgba(120,0,0,.15)}.full-screen-menu .gen-info table[data-v-c7e0b9b7]{font-size:1em;border-radius:4px;border-collapse:separate;margin-bottom:3em}.full-screen-menu .gen-info table tr td[data-v-c7e0b9b7]:first-child{white-space:nowrap;vertical-align:top}.full-screen-menu .gen-info table.extra-meta-table .extra-meta-value[data-v-c7e0b9b7]{display:block;max-height:200px;overflow:auto;white-space:pre-wrap;word-break:break-word;font-size:.85em;background:var(--zp-secondary-variant-background);padding:8px;border-radius:4px}.full-screen-menu .gen-info table td[data-v-c7e0b9b7]{padding-right:14px;padding-left:4px;border-bottom:1px solid var(--zp-secondary);border-collapse:collapse}.full-screen-menu .gen-info .info-tags .info-tag[data-v-c7e0b9b7]{display:inline-block;overflow:hidden;border-radius:4px;margin-right:8px;border:2px solid var(--zp-primary)}.full-screen-menu .gen-info .info-tags .name[data-v-c7e0b9b7]{background-color:var(--zp-primary);color:var(--zp-primary-background);padding:4px;border-bottom-right-radius:4px}.full-screen-menu .gen-info .info-tags .value[data-v-c7e0b9b7]{padding:4px}.full-screen-menu.unset-size[data-v-c7e0b9b7]{width:unset!important;height:unset!important}.full-screen-menu .mouse-sensor[data-v-c7e0b9b7]{position:absolute;bottom:0;right:0;transform:rotate(90deg);cursor:se-resize;z-index:1;background:var(--zp-primary-background);border-radius:2px}.full-screen-menu .mouse-sensor>*[data-v-c7e0b9b7]{font-size:18px;padding:4px}.full-screen-menu .action-bar[data-v-c7e0b9b7]{display:flex;align-items:center;user-select:none;gap:4px}.full-screen-menu .action-bar .icon[data-v-c7e0b9b7]{font-size:1.5em;padding:2px 4px;border-radius:4px}.full-screen-menu .action-bar .icon[data-v-c7e0b9b7]:hover{background:var(--zp-secondary-variant-background)}.full-screen-menu .action-bar>*[data-v-c7e0b9b7]{flex-wrap:wrap}.full-screen-menu.lr[data-v-c7e0b9b7]{top:var(--b7cd59ce)!important;right:0!important;bottom:0!important;left:100vw!important;height:unset!important;width:var(--0e09e1cc)!important;transition:left ease .3s}.full-screen-menu.lr.always-on[data-v-c7e0b9b7],.full-screen-menu.lr.mouse-in[data-v-c7e0b9b7]{left:var(--62228ae0)!important}.tag-alpha-item[data-v-c7e0b9b7]{display:flex;margin-top:4px}.tag-alpha-item h4[data-v-c7e0b9b7]{width:32px;flex-shrink:0}.sort-tag-switch[data-v-c7e0b9b7]{display:inline-block;padding-right:16px;padding-left:8px;cursor:pointer;user-select:none}.sort-tag-switch span[data-v-c7e0b9b7]{transition:all ease .3s;transform:scale(1.2)}.sort-tag-switch:hover span[data-v-c7e0b9b7]{transform:scale(1.3)}.lr-layout-control[data-v-c7e0b9b7]{display:flex;align-items:center;gap:16px;padding:4px 8px;flex-wrap:wrap;border-radius:2px;border-left:3px solid var(--zp-luminous);background-color:var(--zp-secondary-background)}.lr-layout-control .ctrl-item[data-v-c7e0b9b7]{display:flex;align-items:center;gap:4px;flex-wrap:nowrap}.select-actions[data-v-b6f9a67c]>:not(:last-child){margin-right:4px}.float-panel[data-v-b6f9a67c]{position:absolute;bottom:32px;right:32px;background:var(--zp-primary-background);border-radius:4px;z-index:1000;padding:8px;box-shadow:0 0 4px var(--zp-secondary)}
diff --git a/vue/dist/assets/SubstrSearch-5ca89adf.css b/vue/dist/assets/SubstrSearch-5ca89adf.css
deleted file mode 100644
index 04b76cf..0000000
--- a/vue/dist/assets/SubstrSearch-5ca89adf.css
+++ /dev/null
@@ -1 +0,0 @@
-[data-v-e1bd92bd] .float-panel{position:fixed}.regex-icon[data-v-e1bd92bd]{user-select:none;padding:4px;margin:0 4px;cursor:pointer;border:1px solid var(--zp-border);border-radius:4px}.regex-icon img[data-v-e1bd92bd]{height:1.5em}.regex-icon[data-v-e1bd92bd]:hover{background:var(--zp-border)}.regex-icon.selected[data-v-e1bd92bd]{background:var(--primary-color-1);border:1px solid var(--primary-color)}.search-bar[data-v-e1bd92bd]{padding:8px 8px 0;display:flex}.search-bar.last[data-v-e1bd92bd]{padding-bottom:8px}.search-bar .form-name[data-v-e1bd92bd]{flex-shrink:0;padding:4px 8px}.search-bar .actions>*[data-v-e1bd92bd]{margin-right:4px}.container[data-v-e1bd92bd]{background:var(--zp-secondary-background);position:relative}.container .file-list[data-v-e1bd92bd]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}
diff --git a/vue/dist/assets/SubstrSearch-efdcae1f.css b/vue/dist/assets/SubstrSearch-efdcae1f.css
new file mode 100644
index 0000000..30657af
--- /dev/null
+++ b/vue/dist/assets/SubstrSearch-efdcae1f.css
@@ -0,0 +1 @@
+[data-v-2a7f2e56] .float-panel{position:fixed}.regex-icon[data-v-2a7f2e56]{user-select:none;padding:4px;margin:0 4px;cursor:pointer;border:1px solid var(--zp-border);border-radius:4px}.regex-icon img[data-v-2a7f2e56]{height:1.5em}.regex-icon[data-v-2a7f2e56]:hover{background:var(--zp-border)}.regex-icon.selected[data-v-2a7f2e56]{background:var(--primary-color-1);border:1px solid var(--primary-color)}.search-bar[data-v-2a7f2e56]{padding:8px 8px 0;display:flex}.search-bar.last[data-v-2a7f2e56]{padding-bottom:8px}.search-bar .form-name[data-v-2a7f2e56]{flex-shrink:0;padding:4px 8px}.search-bar .actions>*[data-v-2a7f2e56]{margin-right:4px}.container[data-v-2a7f2e56]{background:var(--zp-secondary-background);position:relative}.container .file-list[data-v-2a7f2e56]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}
diff --git a/vue/dist/assets/SubstrSearch-460e9bca.js b/vue/dist/assets/SubstrSearch-f2d8552a.js
similarity index 77%
rename from vue/dist/assets/SubstrSearch-460e9bca.js
rename to vue/dist/assets/SubstrSearch-f2d8552a.js
index be3ce62..c34de1b 100644
--- a/vue/dist/assets/SubstrSearch-460e9bca.js
+++ b/vue/dist/assets/SubstrSearch-f2d8552a.js
@@ -1 +1 @@
-import{c as a,A as Fe,d as Ue,c9 as Be,r as b,o as Ee,cd as te,m as He,C as Pe,az as Ge,z as Ke,B as Le,E as ae,ce as je,a1 as qe,U as f,V as U,a3 as t,a4 as e,W as d,X as o,Y as i,a2 as y,$ as k,a5 as B,cp as Ne,ag as O,a6 as le,L as Je,af as We,Z as Qe,T as se,aj as Xe,cq as Ye,ah as Ze,ak as ne,ci as et,ai as tt,aP as at,aQ as lt,cr as st,ck as nt,a0 as it}from"./index-73e5f2e6.js";import{S as ot}from"./index-f6d68be6.js";/* empty css */import"./index-f6c4ab86.js";import"./index-4ffe992b.js";import{c as rt,d as dt,F as ut}from"./FileItem-981eab1a.js";import{M as ct,o as pt,L as ft,R as vt,f as mt}from"./MultiSelectKeep-d8549084.js";import{c as gt,u as _t}from"./hook-15b2cfb9.js";import{f as M,H as ie,_ as ht,a as yt}from"./searchHistory-998c66c6.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-5795e1ae.js";/* empty css */import"./index-9dce53ec.js";import"./_isIterateeCall-09267955.js";import"./index-81344383.js";import"./index-85d4744c.js";import"./shortcut-261c4c7d.js";import"./Checkbox-e638151f.js";import"./index-6caca125.js";import"./useGenInfoDiff-3889cc19.js";var kt={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M952 474H829.8C812.5 327.6 696.4 211.5 550 194.2V72c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v122.2C327.6 211.5 211.5 327.6 194.2 474H72c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h122.2C211.5 696.4 327.6 812.5 474 829.8V952c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V829.8C696.4 812.5 812.5 696.4 829.8 550H952c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM512 756c-134.8 0-244-109.2-244-244s109.2-244 244-244 244 109.2 244 244-109.2 244-244 244z"}},{tag:"path",attrs:{d:"M512 392c-32.1 0-62.1 12.4-84.8 35.2-22.7 22.7-35.2 52.7-35.2 84.8s12.5 62.1 35.2 84.8C449.9 619.4 480 632 512 632s62.1-12.5 84.8-35.2C619.4 574.1 632 544 632 512s-12.5-62.1-35.2-84.8A118.57 118.57 0 00512 392z"}}]},name:"aim",theme:"outlined"};const bt=kt;function oe(u){for(var c=1;c
BREAK
')
+ continue
+ }
+ const trimmedValue = values[i]
+ if (!parenthesisActive) parenthesisActive = trimmedValue.includes('(')
+ const classList = ['tag']
+ if (parenthesisActive) classList.push('has-parentheses')
+ if (trimmedValue.length < 32) classList.push('short-tag')
+ frags.push(`${trimmedValue}`)
+ if (parenthesisActive) parenthesisActive = !trimmedValue.includes(')')
+ }
+ return frags.join(global.showCommaInInfoPanel ? ',' : ' ')
+}
+
// 切换自动轮播模式
const toggleAutoPlay = () => {
const currentIndex = autoPlayOptions.indexOf(autoPlayMode.value)
@@ -738,6 +830,108 @@ const loadCurrentItemTags = async () => {
}
}
+const loadCurrentItemPrompt = async () => {
+ const currentItem = tiktokStore.currentItem
+ if (!currentItem) {
+ imageGenInfo.value = ''
+ return
+ }
+ const nameOrUrl = currentItem.name || currentItem.url
+ if (isVideoFile(nameOrUrl) || isAudioFile(nameOrUrl)) {
+ imageGenInfo.value = ''
+ return
+ }
+ const fullpath = (currentItem as any)?.fullpath || currentItem.id
+ if (!fullpath) {
+ imageGenInfo.value = ''
+ return
+ }
+
+ const requestId = ++promptRequestId
+ promptLoading.value = true
+ try {
+ const info = await getImageGenerationInfo(fullpath)
+ if (requestId !== promptRequestId) return
+ imageGenInfo.value = info
+ } catch (error) {
+ console.error('Load prompt error:', error)
+ if (requestId !== promptRequestId) return
+ imageGenInfo.value = ''
+ } finally {
+ if (requestId === promptRequestId) {
+ promptLoading.value = false
+ }
+ }
+}
+
+const getCurrentFullpath = () => {
+ return (currentItem.value as any)?.fullpath || currentItem.value?.id || ''
+}
+
+const getCurrentDisplayName = () => {
+ return currentItem.value?.name || getCurrentFullpath().split(/[/\\]/).pop() || ''
+}
+
+const removeCurrentItemFromList = () => {
+ const idx = tiktokStore.currentIndex
+ if (idx < 0 || idx >= tiktokStore.mediaList.length) return
+ tiktokStore.mediaList.splice(idx, 1)
+ if (tiktokStore.mediaList.length === 0) {
+ tiktokStore.closeView()
+ return
+ }
+ if (idx >= tiktokStore.mediaList.length) {
+ tiktokStore.currentIndex = tiktokStore.mediaList.length - 1
+ }
+}
+
+const handleDeleteCurrent = async () => {
+ const fullpath = getCurrentFullpath()
+ if (!fullpath) return
+ await new Promise