comfyui-frontend-package 1.38.5__py3-none-any.whl → 1.38.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- comfyui_frontend_package/static/assets/{AboutPanel-CHse5rOA.js → AboutPanel-lkjGFasi.js} +2 -2
- comfyui_frontend_package/static/assets/{AboutPanel-CHse5rOA.js.map → AboutPanel-lkjGFasi.js.map} +1 -1
- comfyui_frontend_package/static/assets/{AudioPreviewPlayer-CAa8V66L.js → AudioPreviewPlayer-BxCSKPl9.js} +2 -2
- comfyui_frontend_package/static/assets/{AudioPreviewPlayer-CAa8V66L.js.map → AudioPreviewPlayer-BxCSKPl9.js.map} +1 -1
- comfyui_frontend_package/static/assets/AudioPreviewPlayer-CkxKvcVf.js +1 -0
- comfyui_frontend_package/static/assets/{BaseViewTemplate-DA6zfigT.js → BaseViewTemplate-CjODF2hh.js} +2 -2
- comfyui_frontend_package/static/assets/{BaseViewTemplate-DA6zfigT.js.map → BaseViewTemplate-CjODF2hh.js.map} +1 -1
- comfyui_frontend_package/static/assets/{CloudAuthTimeoutView-9OPBS1hE.js → CloudAuthTimeoutView-D-QkjPNh.js} +2 -2
- comfyui_frontend_package/static/assets/{CloudAuthTimeoutView-9OPBS1hE.js.map → CloudAuthTimeoutView-D-QkjPNh.js.map} +1 -1
- comfyui_frontend_package/static/assets/{CloudBadge-BnLiAHDN.js → CloudBadge-B4nmLus2.js} +2 -2
- comfyui_frontend_package/static/assets/{CloudBadge-BnLiAHDN.js.map → CloudBadge-B4nmLus2.js.map} +1 -1
- comfyui_frontend_package/static/assets/{CloudForgotPasswordView-BqDR_C7K.js → CloudForgotPasswordView-DOEV9hGr.js} +2 -2
- comfyui_frontend_package/static/assets/{CloudForgotPasswordView-BqDR_C7K.js.map → CloudForgotPasswordView-DOEV9hGr.js.map} +1 -1
- comfyui_frontend_package/static/assets/{CloudLayoutView-vTrrVUOY.js → CloudLayoutView-ShKH6rRV.js} +2 -2
- comfyui_frontend_package/static/assets/{CloudLayoutView-vTrrVUOY.js.map → CloudLayoutView-ShKH6rRV.js.map} +1 -1
- comfyui_frontend_package/static/assets/{CloudLoginView-T17euJly.js → CloudLoginView-C3Te42U9.js} +2 -2
- comfyui_frontend_package/static/assets/{CloudLoginView-T17euJly.js.map → CloudLoginView-C3Te42U9.js.map} +1 -1
- comfyui_frontend_package/static/assets/CloudRunButtonWrapper-Cub7EB34.js +3 -0
- comfyui_frontend_package/static/assets/{CloudRunButtonWrapper-hQc4BNkX.js.map → CloudRunButtonWrapper-Cub7EB34.js.map} +1 -1
- comfyui_frontend_package/static/assets/{CloudSignupView-vEDby5k3.js → CloudSignupView-X2oiL3ZR.js} +2 -2
- comfyui_frontend_package/static/assets/{CloudSignupView-vEDby5k3.js.map → CloudSignupView-X2oiL3ZR.js.map} +1 -1
- comfyui_frontend_package/static/assets/{CloudSubscriptionRedirectView-DPyO745g.js → CloudSubscriptionRedirectView-UjNv8emo.js} +2 -2
- comfyui_frontend_package/static/assets/{CloudSubscriptionRedirectView-DPyO745g.js.map → CloudSubscriptionRedirectView-UjNv8emo.js.map} +1 -1
- comfyui_frontend_package/static/assets/{CloudSurveyView-CBtTd9Ru.js → CloudSurveyView-IaiucCTP.js} +2 -2
- comfyui_frontend_package/static/assets/{CloudSurveyView-CBtTd9Ru.js.map → CloudSurveyView-IaiucCTP.js.map} +1 -1
- comfyui_frontend_package/static/assets/ComfyQueueButton-BppnHbrl.js +1 -0
- comfyui_frontend_package/static/assets/{ComfyQueueButton-MZrp7wYJ.js → ComfyQueueButton-HjSIKZKO.js} +2 -2
- comfyui_frontend_package/static/assets/{ComfyQueueButton-MZrp7wYJ.js.map → ComfyQueueButton-HjSIKZKO.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ExtensionPanel-CrWVGUtg.js → ExtensionPanel-Bzb9QtKj.js} +2 -2
- comfyui_frontend_package/static/assets/{ExtensionPanel-CrWVGUtg.js.map → ExtensionPanel-Bzb9QtKj.js.map} +1 -1
- comfyui_frontend_package/static/assets/{GlobalToast-BiCmpIvO.js → GlobalToast-BSCvu6Hw.js} +2 -2
- comfyui_frontend_package/static/assets/{GlobalToast-BiCmpIvO.js.map → GlobalToast-BSCvu6Hw.js.map} +1 -1
- comfyui_frontend_package/static/assets/{GraphView-BCkpNGgz.js → GraphView-gYVCtm1V.js} +5 -5
- comfyui_frontend_package/static/assets/GraphView-gYVCtm1V.js.map +1 -0
- comfyui_frontend_package/static/assets/{KeybindingPanel-CAXL5TlV.js → KeybindingPanel-DF-bG4iO.js} +2 -2
- comfyui_frontend_package/static/assets/{KeybindingPanel-CAXL5TlV.js.map → KeybindingPanel-DF-bG4iO.js.map} +1 -1
- comfyui_frontend_package/static/assets/{LegacyCreditsPanel-6vR8koQy.js → LegacyCreditsPanel-D-CboO8k.js} +2 -2
- comfyui_frontend_package/static/assets/{LegacyCreditsPanel-6vR8koQy.js.map → LegacyCreditsPanel-D-CboO8k.js.map} +1 -1
- comfyui_frontend_package/static/assets/Load3D-c9UwgGoI.js +1 -0
- comfyui_frontend_package/static/assets/{Load3D-ei1BUF9O.js → Load3D-vYr8M3jJ.js} +2 -2
- comfyui_frontend_package/static/assets/{Load3D-ei1BUF9O.js.map → Load3D-vYr8M3jJ.js.map} +1 -1
- comfyui_frontend_package/static/assets/{PanelTemplate-BjN5XNg2.js → PanelTemplate-BJda9e5J.js} +2 -2
- comfyui_frontend_package/static/assets/{PanelTemplate-BjN5XNg2.js.map → PanelTemplate-BJda9e5J.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ServerConfigPanel-CxovH9Qk.js → ServerConfigPanel-VsC6xlZJ.js} +2 -2
- comfyui_frontend_package/static/assets/{ServerConfigPanel-CxovH9Qk.js.map → ServerConfigPanel-VsC6xlZJ.js.map} +1 -1
- comfyui_frontend_package/static/assets/{SubscribeButton-CTOQRkfg.js → SubscribeButton-DZBycfCA.js} +2 -2
- comfyui_frontend_package/static/assets/{SubscribeButton-CTOQRkfg.js.map → SubscribeButton-DZBycfCA.js.map} +1 -1
- comfyui_frontend_package/static/assets/{SubscribeToRun-DnXzV8y0.js → SubscribeToRun-4YolxBOL.js} +2 -2
- comfyui_frontend_package/static/assets/{SubscribeToRun-DnXzV8y0.js.map → SubscribeToRun-4YolxBOL.js.map} +1 -1
- comfyui_frontend_package/static/assets/{SubscriptionPanel-D9uv7z8f.js → SubscriptionPanel-B6txX4Vm.js} +2 -2
- comfyui_frontend_package/static/assets/{SubscriptionPanel-D9uv7z8f.js.map → SubscriptionPanel-B6txX4Vm.js.map} +1 -1
- comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent--VmT16oc.js → SubscriptionRequiredDialogContent-COEF2VQ_.js} +2 -2
- comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent--VmT16oc.js.map → SubscriptionRequiredDialogContent-COEF2VQ_.js.map} +1 -1
- comfyui_frontend_package/static/assets/{UserCheckView-spD3LyMu.js → UserCheckView-x-fkcYzc.js} +2 -2
- comfyui_frontend_package/static/assets/{UserCheckView-spD3LyMu.js.map → UserCheckView-x-fkcYzc.js.map} +1 -1
- comfyui_frontend_package/static/assets/{UserPanel-Su6NtJ5q.js → UserPanel-7N9QknQj.js} +2 -2
- comfyui_frontend_package/static/assets/{UserPanel-Su6NtJ5q.js.map → UserPanel-7N9QknQj.js.map} +1 -1
- comfyui_frontend_package/static/assets/{UserSelectView-C5LBOPcv.js → UserSelectView-BYjOkfSa.js} +2 -2
- comfyui_frontend_package/static/assets/{UserSelectView-C5LBOPcv.js.map → UserSelectView-BYjOkfSa.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ValueControlPopover-BdlDzT8l.js → ValueControlPopover-BPAa35QG.js} +2 -2
- comfyui_frontend_package/static/assets/{ValueControlPopover-BdlDzT8l.js.map → ValueControlPopover-BPAa35QG.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetAudioUI-BDZxDx_r.js → WidgetAudioUI-Dw-r3Ews.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetAudioUI-BDZxDx_r.js.map → WidgetAudioUI-Dw-r3Ews.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetImageCrop-CYRW7t2Q.js → WidgetImageCrop-kERy9g5I.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetImageCrop-CYRW7t2Q.js.map → WidgetImageCrop-kERy9g5I.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetInputNumber-BOKO36G3.js → WidgetInputNumber-BaClCNAC.js} +1 -1
- comfyui_frontend_package/static/assets/WidgetInputNumber-DU_D0Fzy.js +3 -0
- comfyui_frontend_package/static/assets/WidgetInputNumber-DU_D0Fzy.js.map +1 -0
- comfyui_frontend_package/static/assets/{WidgetLegacy-Bslv9wZZ.js → WidgetLegacy-B4nipUM9.js} +1 -1
- comfyui_frontend_package/static/assets/{WidgetRecordAudio-Bzy8PIzN.js → WidgetRecordAudio-Nk8dH238.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetRecordAudio-Bzy8PIzN.js.map → WidgetRecordAudio-Nk8dH238.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetSelect-DzZPpO_-.js +1 -0
- comfyui_frontend_package/static/assets/{WidgetSelect-zgrFVzHH.js → WidgetSelect-nSQrk_hd.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetSelect-zgrFVzHH.js.map → WidgetSelect-nSQrk_hd.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetWithControl-Dh2FWOiA.js → WidgetWithControl-Da6zUB5e.js} +3 -3
- comfyui_frontend_package/static/assets/{WidgetWithControl-Dh2FWOiA.js.map → WidgetWithControl-Da6zUB5e.js.map} +1 -1
- comfyui_frontend_package/static/assets/{api-CUAc7rDA.js → api-Dwq2LQIW.js} +4 -4
- comfyui_frontend_package/static/assets/api-Dwq2LQIW.js.map +1 -0
- comfyui_frontend_package/static/assets/{audioService-DvndbCi2.js → audioService-DvVaKhuU.js} +2 -2
- comfyui_frontend_package/static/assets/{audioService-DvndbCi2.js.map → audioService-DvVaKhuU.js.map} +1 -1
- comfyui_frontend_package/static/assets/{audioUtils-DpjpcKbH.js → audioUtils-DD4rUYVZ.js} +2 -2
- comfyui_frontend_package/static/assets/{audioUtils-DpjpcKbH.js.map → audioUtils-DD4rUYVZ.js.map} +1 -1
- comfyui_frontend_package/static/assets/{auth-B8ZZ0KKQ.js → auth-B9axG-yZ.js} +2 -2
- comfyui_frontend_package/static/assets/{auth-B8ZZ0KKQ.js.map → auth-B9axG-yZ.js.map} +1 -1
- comfyui_frontend_package/static/assets/auth-D74DTev8.js +1 -0
- comfyui_frontend_package/static/assets/{cloudBadges-C1a7fBky.js → cloudBadges-D5mGJbRy.js} +2 -2
- comfyui_frontend_package/static/assets/{cloudBadges-C1a7fBky.js.map → cloudBadges-D5mGJbRy.js.map} +1 -1
- comfyui_frontend_package/static/assets/{cloudFeedbackTopbarButton-DR0T8sWG.js → cloudFeedbackTopbarButton-RZUssOmb.js} +2 -2
- comfyui_frontend_package/static/assets/{cloudFeedbackTopbarButton-DR0T8sWG.js.map → cloudFeedbackTopbarButton-RZUssOmb.js.map} +1 -1
- comfyui_frontend_package/static/assets/{cloudRemoteConfig-DhMjC5TB.js → cloudRemoteConfig-F9J0iGyF.js} +2 -2
- comfyui_frontend_package/static/assets/{cloudRemoteConfig-DhMjC5TB.js.map → cloudRemoteConfig-F9J0iGyF.js.map} +1 -1
- comfyui_frontend_package/static/assets/{cloudSessionCookie-Duxk6ux1.js → cloudSessionCookie-MEORlqtg.js} +2 -2
- comfyui_frontend_package/static/assets/{cloudSessionCookie-Duxk6ux1.js.map → cloudSessionCookie-MEORlqtg.js.map} +1 -1
- comfyui_frontend_package/static/assets/{cloudSubscription-B8l6B9Nx.js → cloudSubscription-CuWNXKVx.js} +2 -2
- comfyui_frontend_package/static/assets/{cloudSubscription-B8l6B9Nx.js.map → cloudSubscription-CuWNXKVx.js.map} +1 -1
- comfyui_frontend_package/static/assets/{core-DBfeqMDR.js → core-IYu8XAIx.js} +4 -4
- comfyui_frontend_package/static/assets/{core-DBfeqMDR.js.map → core-IYu8XAIx.js.map} +1 -1
- comfyui_frontend_package/static/assets/{dialogService-BZ1FmjZL.js → dialogService-YG0RH337.js} +9 -9
- comfyui_frontend_package/static/assets/{dialogService-BZ1FmjZL.js.map → dialogService-YG0RH337.js.map} +1 -1
- comfyui_frontend_package/static/assets/firebaseAuthStore-DnNaPbuZ.js +1 -0
- comfyui_frontend_package/static/assets/{graphHasMissingNodes-C79Wi51S.js → graphHasMissingNodes-BhD1N6zI.js} +2 -2
- comfyui_frontend_package/static/assets/{graphHasMissingNodes-C79Wi51S.js.map → graphHasMissingNodes-BhD1N6zI.js.map} +1 -1
- comfyui_frontend_package/static/assets/{index-CGxJFSof.js → index-BMy3twho.js} +3 -3
- comfyui_frontend_package/static/assets/{index-CGxJFSof.js.map → index-BMy3twho.js.map} +1 -1
- comfyui_frontend_package/static/assets/{index-DNpOhRra.css → index-KMO9qFHH.css} +1 -1
- comfyui_frontend_package/static/assets/{keybindingService-B88NjeAU.js → keybindingService-CBLPjYHI.js} +2 -2
- comfyui_frontend_package/static/assets/{keybindingService-B88NjeAU.js.map → keybindingService-CBLPjYHI.js.map} +1 -1
- comfyui_frontend_package/static/assets/{releaseStore-x0vHjxrw.js → releaseStore-DDOxzkVb.js} +2 -2
- comfyui_frontend_package/static/assets/{releaseStore-x0vHjxrw.js.map → releaseStore-DDOxzkVb.js.map} +1 -1
- comfyui_frontend_package/static/assets/releaseStore-iVkqunL8.js +1 -0
- comfyui_frontend_package/static/assets/{subscriptionCheckoutUtil-B_OvUP2T.js → subscriptionCheckoutUtil-DswSOreM.js} +2 -2
- comfyui_frontend_package/static/assets/{subscriptionCheckoutUtil-B_OvUP2T.js.map → subscriptionCheckoutUtil-DswSOreM.js.map} +1 -1
- comfyui_frontend_package/static/assets/{useCurrentUser-BJcn2Vgo.js → useCurrentUser-NdaCJzIK.js} +1 -1
- comfyui_frontend_package/static/assets/{useErrorHandling-CI8_F4yx.js → useErrorHandling-Cfa5N_7c.js} +2 -2
- comfyui_frontend_package/static/assets/{useErrorHandling-CI8_F4yx.js.map → useErrorHandling-Cfa5N_7c.js.map} +1 -1
- comfyui_frontend_package/static/assets/{useSubscriptionDialog-Chxkdny5.js → useSubscriptionDialog-792qfEJ2.js} +3 -3
- comfyui_frontend_package/static/assets/{useSubscriptionDialog-Chxkdny5.js.map → useSubscriptionDialog-792qfEJ2.js.map} +1 -1
- comfyui_frontend_package/static/assets/useSubscriptionDialog-B-eGeK3j.js +1 -0
- comfyui_frontend_package/static/assets/{userStore-BkgQPjq6.js → userStore-BAS9m9W6.js} +2 -2
- comfyui_frontend_package/static/assets/{userStore-BkgQPjq6.js.map → userStore-BAS9m9W6.js.map} +1 -1
- comfyui_frontend_package/static/assets/vendor-three-BFcUNSs9.js.map +1 -1
- comfyui_frontend_package/static/index.html +1 -1
- {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/METADATA +1 -1
- {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/RECORD +126 -126
- comfyui_frontend_package/static/assets/AudioPreviewPlayer-BoEdyGI_.js +0 -1
- comfyui_frontend_package/static/assets/CloudRunButtonWrapper-hQc4BNkX.js +0 -3
- comfyui_frontend_package/static/assets/ComfyQueueButton-BbQnRThI.js +0 -1
- comfyui_frontend_package/static/assets/GraphView-BCkpNGgz.js.map +0 -1
- comfyui_frontend_package/static/assets/Load3D-DHBmC_AU.js +0 -1
- comfyui_frontend_package/static/assets/WidgetInputNumber-DGKypM5j.js +0 -3
- comfyui_frontend_package/static/assets/WidgetInputNumber-DGKypM5j.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetSelect-DsJGH12l.js +0 -1
- comfyui_frontend_package/static/assets/api-CUAc7rDA.js.map +0 -1
- comfyui_frontend_package/static/assets/auth-D3RiiqZ8.js +0 -1
- comfyui_frontend_package/static/assets/firebaseAuthStore-CZgxeMyf.js +0 -1
- comfyui_frontend_package/static/assets/releaseStore-CubqSv5t.js +0 -1
- comfyui_frontend_package/static/assets/useSubscriptionDialog-BzMzio2H.js +0 -1
- {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/WHEEL +0 -0
- {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/top_level.txt +0 -0
comfyui_frontend_package/static/assets/{dialogService-BZ1FmjZL.js → dialogService-YG0RH337.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./core-
|
|
2
|
-
var Wm=Object.defineProperty;var n=(e,t)=>Wm(e,"name",{value:t,configurable:!0});import{r as nd}from"./rolldown-runtime-BN4meiq5.js";import{A as ti,C as $i,F as Ri,G as zm,I as Vm,J as Bi,K as Gm,M as sd,O as Fi,P as Hm,Q as rd,R as id,U as es,W as Ui,X as la,Y as ld,Z as Io,a as jm,at as ud,c as Mn,ct as Wi,d as cd,dt as ut,et as mo,f as xr,h as Ir,i as Qs,it as ca,j as Km,k as Ym,lt as jt,m as qm,mt as tn,n as er,nt as dd,ot as Xm,q as zi,r as ai,rt as pd,st as fd,tt as Aa,u as md,ut as Ea,w as oi}from"./vendor-primevue-DcMRXJN3.js";import{$i as gd,$o as $,$r as Zm,$t as Pn,Aa as _o,Ar as Un,Ba as v,Bi as Jm,Bo as ja,Br as Qm,C as eg,Ci as At,Co as hd,Da as Os,Di as Sr,Do as W,Fa as vd,Fi as yd,Fo as tg,Fr as ag,Ga as wd,Gi as og,Gr as ng,Ha as H,Ho as Qt,Hr as sg,Ia as bd,Ii as Vi,Io as rg,Ja as ft,Ji as ni,Jo as b,Jr as ig,Ka as fe,Ki as lg,Ko as Wt,Kr as tr,Lo as _d,Ma as Ve,Mr as ts,No as ua,Oa as ug,Oi as si,Oo as ze,Pa as Se,Pi as Gi,Po as bt,Pr as Be,Qa as kd,Qo as nt,Qr as ri,Qt as Cd,Ro as ra,Rr as Dn,S as cg,Si as dg,So as pg,Ti as fg,To as ar,Ua as P,Uo as Et,Ur as mg,Va as X,Vr as Hi,Wa as qo,Wi as gg,Wo as Ns,Xa as ji,Xi as hg,Xo as pe,Xr as vg,Ya as J,Yi as yg,Yr as Kl,Zi as xd,Zo as wg,Zr as Ln,_a as bg,_i as Id,_o as Wn,a as _g,aa as kg,ai as Cg,b as xg,ba as Ig,bi as Sg,bo as $s,c as an,ca as Eg,ci as Yl,co as it,d as Sd,di as So,do as C,ea as Ed,ei as Rs,en as Tg,eo as Ma,f as uo,fi as Ag,fo as ya,g as Mg,ga as Pg,gi as Xo,go as ht,h as Ki,ha as Dg,ho as Yi,ia as Lg,ii as Td,io as wa,j as Og,ja as Ja,jr as U,ka as io,kr as Ng,l as $g,la as Rg,li as Bg,lo as St,m as Zo,ma as Fg,mi as Ug,mo as tt,na as Ad,ni as Wg,no as _t,o as ws,oi as zg,oo as Wa,p as Vg,pa as Gg,pi as ql,po as Ze,qa as R,qi as Hg,ra as jg,ri as Kg,ro as Ht,rs as ii,s as Yg,si as qg,so as zn,ta as Mt,u as qi,ua as Xl,va as Zl,vi as Xg,wa as Zg,wo as be,x as Jg,xi as Xi,xo as rt,ya as Qg,yo as eh,za as E,zi as on,zo as A,zr as th}from"./vendor-other-DlQF6V2E.js";import{d as ah,m as Vn,n as Fe,p as Je}from"./vendor-vue-D9IUuwPJ.js";import{$ as oh,A as G,At as co,B as nh,Bt as Qa,C as sh,Dt as no,E as rh,Et as eo,G as bs,H as Zi,I as ih,It as Oe,Lt as qe,M as Md,Nt as lh,Pt as uh,Q as ch,Rt as dh,S as Bs,T as ph,U as fh,V as mh,W as gh,X as Fs,Y as hh,Z as Pd,_ as $a,_t as vh,a as yh,at as Dd,b as Jo,c as to,ct as _s,d as wh,dt as ia,et as bh,f as Ne,gt as _h,ht as kt,i as Ld,it as as,j as Er,k as De,l as Ji,lt as kh,m as va,mt as Od,nt as Nd,ot as ks,p as Cs,r as oe,rt as Ch,st as xh,t as Ih,tt as Tr,u as Sh,ut as Jl,v as $d,vt as os,w as Rd,wt as Bd,x as Eh,y as Th,yt as Ah,z as Ql,zt as Qi}from"./api-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./core-IYu8XAIx.js","./vendor-primevue-DcMRXJN3.js","./vendor-other-DlQF6V2E.js","./rolldown-runtime-BN4meiq5.js","./vendor-other-CaaUC6Qe.css","./vendor-three-BFcUNSs9.js","./vendor-tiptap-_UqYL7N_.js","./vendor-xterm-BU_lcTPR.js","./vendor-xterm-kHJ-D0s7.css","./PanelTemplate-BJda9e5J.js","./vendor-vue-D9IUuwPJ.js","./api-Dwq2LQIW.js","./widget-DNFXpyU8.js","./colorUtil-CzxntCbX.js","./Load3D-vYr8M3jJ.js","./_plugin-vue_export-helper-PHE0iSCb.js","./src-DTrob8OL.js","./Button-Do2I1OAA.js","./vendor-reka-ui-CmnTduBl.js","./Load3D-D4ptEnL6.css","./useErrorHandling-Cfa5N_7c.js","./remoteConfig-CZcEXsZS.js","./audioUtils-DD4rUYVZ.js","./audioService-DvVaKhuU.js","./userStore-BAS9m9W6.js","./markdownRendererUtil-DglHsU8t.js","./core-CZraG87T.css","./MediaVideoTop-CzOUYJ4U.js","./MediaAudioTop-b3HWsBXL.js","./MediaImageTop-BOppO98G.js","./Media3DTop-BLHLXCs_.js","./WidgetButton-C38jCi-K.js","./widgetPropFilter-CKhENku4.js","./WidgetInputText-C2hSgXgj.js","./WidgetLayoutField-DXI3EnEF.js","./layout-C9TPTaej.js","./WidgetInputNumber-BaClCNAC.js","./WidgetInputNumber-DU_D0Fzy.js","./Slider-De1ykl8L.js","./WidgetWithControl-Da6zUB5e.js","./WidgetInputNumber-rqpFMwbY.css","./WidgetToggleSwitch-Cr_gcxrn.js","./WidgetSelect-DzZPpO_-.js","./LazyImage-D5qRMpUj.js","./WidgetSelect-nSQrk_hd.js","./WidgetColorPicker-BqD_P_fO.js","./WidgetTextarea-DfQXNiz9.js","./WidgetChart-W7Mx0ol0.js","./WidgetImageCompare-DUdtG65y.js","./WidgetGalleria-CnVS2r7z.js","./WidgetGalleria-B85qzqLf.css","./WidgetMarkdown-BWek7AuF.js","./WidgetLegacy-B4nipUM9.js","./WidgetRecordAudio-Nk8dH238.js","./AudioPreviewPlayer-CkxKvcVf.js","./AudioPreviewPlayer-BxCSKPl9.js","./nodeFilterUtil-BYFD-MqA.js","./AudioPreviewPlayer-BBmjPObJ.css","./WidgetAudioUI-Dw-r3Ews.js","./Load3D-c9UwgGoI.js","./WidgetImageCrop-kERy9g5I.js","./WidgetBoundingBox-mqU1kZgk.js","./WidgetBoundingBox-Drks44-Z.js","./mixpanel.module-DaBZUFSE.js","./AboutPanel-lkjGFasi.js","./LegacyCreditsPanel-D-CboO8k.js","./SubscriptionPanel-B6txX4Vm.js","./CloudBadge-B4nmLus2.js","./SubscribeButton-DZBycfCA.js","./useSubscriptionDialog-792qfEJ2.js","./SubscriptionPanel-DUhYFTu8.css","./UserPanel-7N9QknQj.js","./UserAvatar-Cfg5vVJL.js","./KeybindingPanel-DF-bG4iO.js","./keybindingService-CBLPjYHI.js","./KeybindingPanel-DP3qiHOc.css","./ExtensionPanel-Bzb9QtKj.js","./ServerConfigPanel-VsC6xlZJ.js","./serverConfigStore-60S1CDhK.js","./useSubscriptionDialog-B-eGeK3j.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
var Wm=Object.defineProperty;var n=(e,t)=>Wm(e,"name",{value:t,configurable:!0});import{r as nd}from"./rolldown-runtime-BN4meiq5.js";import{A as ti,C as $i,F as Ri,G as zm,I as Vm,J as Bi,K as Gm,M as sd,O as Fi,P as Hm,Q as rd,R as id,U as es,W as Ui,X as la,Y as ld,Z as Io,a as jm,at as ud,c as Mn,ct as Wi,d as cd,dt as ut,et as mo,f as xr,h as Ir,i as Qs,it as ca,j as Km,k as Ym,lt as jt,m as qm,mt as tn,n as er,nt as dd,ot as Xm,q as zi,r as ai,rt as pd,st as fd,tt as Aa,u as md,ut as Ea,w as oi}from"./vendor-primevue-DcMRXJN3.js";import{$i as gd,$o as $,$r as Zm,$t as Pn,Aa as _o,Ar as Un,Ba as v,Bi as Jm,Bo as ja,Br as Qm,C as eg,Ci as At,Co as hd,Da as Os,Di as Sr,Do as W,Fa as vd,Fi as yd,Fo as tg,Fr as ag,Ga as wd,Gi as og,Gr as ng,Ha as H,Ho as Qt,Hr as sg,Ia as bd,Ii as Vi,Io as rg,Ja as ft,Ji as ni,Jo as b,Jr as ig,Ka as fe,Ki as lg,Ko as Wt,Kr as tr,Lo as _d,Ma as Ve,Mr as ts,No as ua,Oa as ug,Oi as si,Oo as ze,Pa as Se,Pi as Gi,Po as bt,Pr as Be,Qa as kd,Qo as nt,Qr as ri,Qt as Cd,Ro as ra,Rr as Dn,S as cg,Si as dg,So as pg,Ti as fg,To as ar,Ua as P,Uo as Et,Ur as mg,Va as X,Vr as Hi,Wa as qo,Wi as gg,Wo as Ns,Xa as ji,Xi as hg,Xo as pe,Xr as vg,Ya as J,Yi as yg,Yr as Kl,Zi as xd,Zo as wg,Zr as Ln,_a as bg,_i as Id,_o as Wn,a as _g,aa as kg,ai as Cg,b as xg,ba as Ig,bi as Sg,bo as $s,c as an,ca as Eg,ci as Yl,co as it,d as Sd,di as So,do as C,ea as Ed,ei as Rs,en as Tg,eo as Ma,f as uo,fi as Ag,fo as ya,g as Mg,ga as Pg,gi as Xo,go as ht,h as Ki,ha as Dg,ho as Yi,ia as Lg,ii as Td,io as wa,j as Og,ja as Ja,jr as U,ka as io,kr as Ng,l as $g,la as Rg,li as Bg,lo as St,m as Zo,ma as Fg,mi as Ug,mo as tt,na as Ad,ni as Wg,no as _t,o as ws,oi as zg,oo as Wa,p as Vg,pa as Gg,pi as ql,po as Ze,qa as R,qi as Hg,ra as jg,ri as Kg,ro as Ht,rs as ii,s as Yg,si as qg,so as zn,ta as Mt,u as qi,ua as Xl,va as Zl,vi as Xg,wa as Zg,wo as be,x as Jg,xi as Xi,xo as rt,ya as Qg,yo as eh,za as E,zi as on,zo as A,zr as th}from"./vendor-other-DlQF6V2E.js";import{d as ah,m as Vn,n as Fe,p as Je}from"./vendor-vue-D9IUuwPJ.js";import{$ as oh,A as G,At as co,B as nh,Bt as Qa,C as sh,Dt as no,E as rh,Et as eo,G as bs,H as Zi,I as ih,It as Oe,Lt as qe,M as Md,Nt as lh,Pt as uh,Q as ch,Rt as dh,S as Bs,T as ph,U as fh,V as mh,W as gh,X as Fs,Y as hh,Z as Pd,_ as $a,_t as vh,a as yh,at as Dd,b as Jo,c as to,ct as _s,d as wh,dt as ia,et as bh,f as Ne,gt as _h,ht as kt,i as Ld,it as as,j as Er,k as De,l as Ji,lt as kh,m as va,mt as Od,nt as Nd,ot as ks,p as Cs,r as oe,rt as Ch,st as xh,t as Ih,tt as Tr,u as Sh,ut as Jl,v as $d,vt as os,w as Rd,wt as Bd,x as Eh,y as Th,yt as Ah,z as Ql,zt as Qi}from"./api-Dwq2LQIW.js";import{r as Eo,t as or}from"./remoteConfig-CZcEXsZS.js";import{a as ns,n as Mh,t as el}from"./colorUtil-CzxntCbX.js";import{n as oo,t as ta}from"./useErrorHandling-Cfa5N_7c.js";import{t as Pe}from"./src-DTrob8OL.js";import{t as se}from"./Button-Do2I1OAA.js";import{C as Ph,D as Dh,E as Lh,O as Qo,S as Fd,_ as Oh,b as Nh,f as Ud,h as li,i as $h,k as nr,m as Ta,n as tl,o as Rh,p as Bh,r as go,s as sr,t as eu,u as rr,v as xs,x as dt,y as Fh}from"./PanelTemplate-BJda9e5J.js";import{t as ot}from"./_plugin-vue_export-helper-PHE0iSCb.js";import{a as Uh,c as Wh,i as zh,n as Vh,o as Gh,r as Hh,s as jh,t as tu}from"./vendor-tiptap-_UqYL7N_.js";import{n as Kh,t as Yh}from"./vendor-xterm-BU_lcTPR.js";import{t as qh}from"./Slider-De1ykl8L.js";import{$ as al,A as Wo,C as Xh,E as Oo,F as qt,G as Us,H as Ho,I as jo,J as au,K as ol,L as ou,M as Zh,N as Jh,P as nu,Q as Qh,R as Is,S as Ws,T as su,U as ev,V as ka,W as ui,X as tv,Y as zs,Z as av,_ as ov,a as nv,b as ci,c as sv,d as rv,et as di,f as iv,g as ru,h as lv,i as uv,j as cv,k as Wd,l as dv,m as iu,n as pv,nt as fv,o as mv,p as gv,q as lu,r as hv,s as pi,t as vv,tt as Ca,u as yv,v as uu,w as wv,x as cu,y as du,z as bn}from"./vendor-three-BFcUNSs9.js";import{t as zd}from"./markdownRendererUtil-DglHsU8t.js";import{t as bv}from"./userStore-BAS9m9W6.js";var _v={class:"flex h-110 max-w-96 flex-col gap-4 p-2"},kv={class:"mb-2 text-2xl font-medium"},Cv={class:"mb-4 text-base"},xv={class:"flex items-center justify-between"},Iv={class:"flex gap-2"},Sv=J({__name:"ApiNodesSignInContent",props:{apiNodeNames:{},onLogin:{type:Function},onCancel:{type:Function}},setup(e){const{t}=Fe(),{buildDocsUrl:a}=nr(),o=n(()=>{window.open(a("/tutorials/api-nodes/faq",{includeLocale:!0}),"_blank")},"handleLearnMoreClick");return(s,r)=>{const i=Yi("ApiNodesList");return C(),P("div",_v,[v("div",kv,$(b(t)("apiNodesSignInDialog.title")),1),v("div",Cv,$(b(t)("apiNodesSignInDialog.message")),1),R(i,{"node-names":s.apiNodeNames},null,8,["node-names"]),v("div",xv,[R(se,{variant:"textonly",onClick:o},{default:W(()=>[fe($(b(t)("g.learnMore")),1)]),_:1}),v("div",Iv,[R(se,{variant:"secondary",onClick:r[0]||(r[0]=l=>s.onCancel?.())},{default:W(()=>[fe($(b(t)("g.cancel")),1)]),_:1}),R(se,{onClick:r[1]||(r[1]=l=>s.onLogin?.())},{default:W(()=>[fe($(b(t)("g.login")),1)]),_:1})])])])}}}),Ev=Sv,ea=Tg(),Tv={class:"flex flex-col gap-2"},Av={class:"text-sm font-medium text-surface-600"},Mv={class:"ml-4 text-sm text-surface-500"},Pv=J({__name:"MissingCoreNodesMessage",props:{missingCoreNodes:{}},setup(e){const t=Qo(),a=E(()=>Object.keys(e.missingCoreNodes).length>0),o=E(()=>a.value?t.systemStats?.system?.comfyui_version??null:null),s=E(()=>Object.entries(e.missingCoreNodes).sort(([i],[l])=>(0,ea.compare)(l,i))),r=n(i=>i.reduce((l,u)=>(u.type&&!l.includes(u.type)&&l.push(u.type),l),[]).sort(),"getUniqueNodeNames");return(i,l)=>a.value?(C(),X(b(Ea),{key:0,severity:"info",icon:"pi pi-info-circle",class:"mx-2 my-2",pt:{root:{class:"flex-col"},text:{class:"flex-1"}}},{default:W(()=>[v("div",Tv,[v("div",null,$(o.value?i.$t("loadWorkflowWarning.outdatedVersion",{version:o.value}):i.$t("loadWorkflowWarning.outdatedVersionGeneric")),1),(C(!0),P(Se,null,Ze(s.value,([u,c])=>(C(),P("div",{key:u,class:"ml-4"},[v("div",Av,$(i.$t("loadWorkflowWarning.coreNodesFromVersion",{version:u||"unknown"})),1),v("div",Mv,$(r(c).join(", ")),1)]))),128))])]),_:1})):H("",!0)}}),Dv=Pv,ss=null;const Vd=n((e,t)=>{const{left:a,top:o,update:s}=Sg(e);return{clientPosToCanvasPos:n(l=>{const{offset:u,scale:c}=t.ds;return[(l[0]-a.value)/c-u[0],(l[1]-o.value)/c-u[1]]},"clientPosToCanvasPos"),canvasPosToClientPos:n(l=>{const{offset:u,scale:c}=t.ds;return[(l[0]+u[0])*c+a.value,(l[1]+u[1])*c+o.value]},"canvasPosToClientPos"),update:s}},"useCanvasPositionConversion");function ir(){if(ss)return ss;const e=gt().getCanvas();return ss=Vd(e.canvas,e),ss}n(ir,"useSharedCanvasPositionConversion");var Lv=U.array(U.tuple([U.string(),U.string()]));function Vs(e){typeof e=="string"&&(e=JSON.parse(e));const t=Lv.safeParse(typeof e=="string"?JSON.parse(e):e);if(t.success)return t.data;const a=Un(t.error);throw new Error(`Invalid assignment for properties.proxyWidgets:
|
|
3
3
|
${a}`)}n(Vs,"parseProxyWidgets");var Ov="download.png";function Gd(e,t){const a=document.createElement("a");a.href=e,a.download=t,a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a)}n(Gd,"triggerLinkDownload");function Gs(e,t){if(!e||typeof e!="string"||e.trim().length===0)throw new Error("Invalid URL provided for download");const a=t||Nv(e)||Ov;if(qe){$v(e,a).catch(o=>{console.error("Failed to download file",o)});return}Gd(e,a)}n(Gs,"downloadFile");function Ba(e,t){const a=URL.createObjectURL(t);Gd(a,e),queueMicrotask(()=>URL.revokeObjectURL(a))}n(Ba,"downloadBlob");var Nv=n(e=>{try{return new URL(e,window.location.origin).searchParams.get("filename")}catch{return null}},"extractFilenameFromUrl"),$v=n(async(e,t)=>{const a=await fetch(e);if(!a.ok)throw new Error(`Failed to fetch ${e}: ${a.status}`);Ba(t,await a.blob())},"downloadViaBlobFetch");function Hd(){const e=gt(),t=n(u=>u instanceof Md,"isIgnoredItem"),a=n(u=>{const c=new Set;for(const d of u)t(d)||c.add(d);return c},"filterSelectableItems"),o=n(()=>{const{selectedItems:u}=e.getCanvas();return a(u)},"getSelectableItems");return{isIgnoredItem:t,filterSelectableItems:a,getSelectableItems:o,hasSelectableItems:n(()=>o().size>0,"hasSelectableItems"),hasMultipleSelectableItems:n(()=>o().size>1,"hasMultipleSelectableItems"),getSelectedNodes:n(()=>{const u=Z.canvas.selected_nodes;if(!u)return[];const c=[];for(const d in u)c.push(u[d]);return c.some(d=>d.isSubgraphNode?.()&&d.subgraph)?fh(c):c},"getSelectedNodes"),toggleSelectedNodesMode:n(u=>{const c=Z.canvas.selected_nodes;if(!c)return;const d=[];for(const f in c)d.push(c[f]);const p=d.some(f=>f.mode!==u)?u:eo.ALWAYS;d.forEach(f=>{f.mode=p,f.isSubgraphNode?.()&&f.subgraph&&bh([f],{visitor:n(g=>{g!==f&&(g.mode=p)},"visitor")})})},"toggleSelectedNodesMode")}}n(Hd,"useSelectedLiteGraphItems");var Rv={class:"relative max-h-[200px] min-h-[28px] w-full overflow-y-auto rounded-lg px-4 py-2 text-xs"},Bv={class:"flex items-center gap-2"},Fv={class:"flex flex-1 items-center gap-2 break-all"},Uv=["innerHTML"],Wv=J({__name:"TextPreviewWidget",props:_t({nodeId:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=rt(e,"modelValue"),a=e,o=Ot(),s=A(!0),r=E(()=>{const u=t.value,c=[];let d=Nh(Fh(u.replace(/\[\[([^|\]]+)\|([^\]]+)\]\]/g,(p,f,g)=>(c.push({label:String(f),url:String(g)}),`__LNK${c.length-1}__`))));return d=d.replace(/__LNK(\d+)__/g,(p,f)=>{const{label:g,url:m}=c[+f],h=m.replace(/"/g,"""),y=g.replace(/</g,"<").replace(/>/g,">");return/^https?:\/\//i.test(m)?`<a href="${h}" target="_blank" rel="noopener noreferrer">${y}</a>`:y}),d});let i=null;it(()=>{i=a.nodeId});const l=be([()=>o.executingNodeIds,()=>o.isIdle],()=>{if(o.isIdle){s.value=!1,l();return}i&&!o.executingNodeIds.includes(i)&&(s.value=!1,l()),!i&&o.executingNodeIds.length>0&&(i=o.executingNodeIds[0])});return(u,c)=>(C(),P("div",Rv,[v("div",Bv,[v("div",Fv,[v("span",{innerHTML:r.value},null,8,Uv),s.value?(C(),X(b(jt),{key:0,class:"h-4! flex-1!"})):H("",!0)])])]))}}),zv=Wv;const Fa=n((e,...t)=>function(...a){e?.call(this,...a);for(const o of t)o.call(this,...a)},"useChainCallback"),Ua=Je("domWidget",()=>{const e=A(new Map),t=E(()=>[...e.value.values()].filter(c=>c.active)),a=E(()=>[...e.value.values()].filter(c=>!c.active));return{widgetStates:e,activeWidgetStates:t,inactiveWidgetStates:a,registerWidget:n(c=>{e.value.set(c.id,{widget:bt(c),visible:!0,readonly:!1,zIndex:0,pos:[0,0],size:[0,0],active:!0})},"registerWidget"),unregisterWidget:n(c=>{e.value.delete(c)},"unregisterWidget"),activateWidget:n(c=>{const d=e.value.get(c);d&&(d.active=!0)},"activateWidget"),deactivateWidget:n(c=>{const d=e.value.get(c);d&&(d.active=!1)},"deactivateWidget"),setWidget:n(c=>{const d=e.value.get(c.id);d&&(d.active=!0,d.widget=c)},"setWidget"),clear:n(()=>{e.value.clear()},"clear")}}),On=n(e=>"element"in e&&!!e.element,"isDOMWidget"),fi=n(e=>"component"in e&&!!e.component,"isComponentWidget");var jd=class Kd extends sh{static{n(this,"BaseDOMWidgetImpl")}static DEFAULT_MARGIN=10;id;constructor(t){const{node:a,name:o,type:s,options:r}=t;super({y:0,name:o,type:s,options:r},a),this.id=Ud()}get value(){return this.options.getValue?.()??""}set value(t){this.options.setValue?.(t),this.callback?.(this.value)}get margin(){return this.options.margin??Kd.DEFAULT_MARGIN}isVisible(){return!["hidden"].includes(this.type)&&this.node.isWidgetVisible(this)}draw(t,a,o,s,r,i){if(this.options.hideOnZoom&&i&&this.isVisible()){const l=t.fillStyle;t.beginPath(),t.fillStyle=Ne.WIDGET_BGCOLOR,t.rect(this.margin,s+this.margin,o-this.margin*2,(this.computedHeight??r)-2*this.margin),t.fill(),t.fillStyle=l}else if(this.promoted&&this.isVisible()){t.save();const l=this.margin-1;t.beginPath(),t.strokeStyle=Ne.WIDGET_PROMOTED_OUTLINE_COLOR,t.strokeRect(l,s+l,o-l*2,(this.computedHeight??r)-2*l),t.restore()}this.options.onDraw?.(this)}onRemove(){Ua().unregisterWidget(this.id)}createCopyForNode(t){const a=new this.constructor({node:t,name:this.name,type:this.type,options:this.options});return a.value=this.value,a.y=this.y,a}},Nn=class extends jd{static{n(this,"DOMWidgetImpl")}element;constructor(e){super(e),this.element=e.element}createCopyForNode(e){const t=new this.constructor({node:e,name:this.name,type:this.type,element:this.element,options:this.options});return t.value=this.value,t.y=this.y,t}computeLayoutSize(e){if(this.type==="hidden")return{minHeight:0,maxHeight:0,minWidth:0};const t=getComputedStyle(this.element);let a=this.options.getMinHeight?.()??parseInt(t.getPropertyValue("--comfy-widget-min-height")),o=this.options.getMaxHeight?.()??parseInt(t.getPropertyValue("--comfy-widget-max-height")),s=this.options.getHeight?.()??t.getPropertyValue("--comfy-widget-height");return typeof s=="string"&&s.endsWith?.("%")?s=e.size[1]*(parseFloat(s.substring(0,s.length-1))/100):(s=typeof s=="number"?s:parseInt(s),isNaN(a)&&(a=s)),{minHeight:isNaN(a)?50:a,maxHeight:isNaN(o)?void 0:o,minWidth:0}}},lr=class extends jd{static{n(this,"ComponentWidgetImpl")}component;inputSpec;props;constructor(e){super({type:"custom",...e}),this.component=e.component,this.inputSpec=e.inputSpec,this.props=e.props}computeLayoutSize(){return{minHeight:this.options.getMinHeight?.()??50,maxHeight:this.options.getMaxHeight?.(),minWidth:0}}serializeValue(){return Et(this.value)}};const ur=n((e,t)=>{e.addCustomWidget(t),e.graph&&Ua().registerWidget(t),e.onAdded=Fa(e.onAdded,()=>{Ua().registerWidget(t)}),e.onRemoved=Fa(e.onRemoved,()=>{t.onRemove?.()}),e.onResize=Fa(e.onResize,()=>{t.options.beforeResize?.call(t,e),t.options.afterResize?.call(t,e)})},"addWidget");Jo.prototype.addDOMWidget=function(e,t,a,o={}){const s=new Nn({node:this,name:e,type:t,element:a,options:{hideOnZoom:!0,...o}});return ur(this,s),Object.defineProperty(s,"value",{get(){return this.options.getValue?.()??""},set(r){this.options.setValue?.(r),this.callback?.(this.value)}}),s};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.domWidget=window.comfyAPI.domWidget||{};window.comfyAPI.domWidget.isDOMWidget=On;window.comfyAPI.domWidget.isComponentWidget=fi;window.comfyAPI.domWidget.DOMWidgetImpl=Nn;window.comfyAPI.domWidget.ComponentWidgetImpl=lr;window.comfyAPI.domWidget.addWidget=ur;var Vv=16;function Gv(e={}){function t(a,o){const s=A(""),r=new lr({node:a,name:o.name,component:zv,inputSpec:o,props:{nodeId:a.id},options:{getValue:n(()=>s.value,"getValue"),setValue:n(i=>{s.value=typeof i=="string"?i:String(i)},"setValue"),getMinHeight:n(()=>e.minHeight??42+Vv,"getMinHeight"),serialize:!1,read_only:!0},type:o.type});return ur(a,r),r}return n(t,"widgetConstructor"),t}n(Gv,"useTextPreviewWidget");var Ar="$$node-text-preview";function Hv(){const e=Gv(),t=n(r=>r.widgets?.find(i=>i.name===Ar),"findTextPreviewWidget"),a=n(r=>e(r,{name:Ar,type:"progressText"}),"addTextPreviewWidget");function o(r,i){const l=t(r)??a(r);l.value=i,r.setDirtyCanvas?.(!0)}n(o,"showTextPreview");function s(r){if(!r.widgets)return;const i=r.widgets.findIndex(l=>l.name===Ar);i>-1&&(r.widgets[i].onRemove?.(),r.widgets.splice(i,1))}return n(s,"removeTextPreview"),{showTextPreview:o,removeTextPreview:s}}n(Hv,"useNodeProgressText");var jv="https://api.comfy.org",Kv="https://platform.comfy.org",pu=jv,fu=Kv;function Yd(){return qe?or(Eo.value,"comfy_api_base_url",pu):pu}n(Yd,"getComfyApiBaseUrl");function nl(){return qe?or(Eo.value,"comfy_platform_base_url",fu):fu}n(nl,"getComfyPlatformBaseUrl");const fn={CURRENT_WORKSPACE:"Comfy.Workspace.Current",TOKEN:"Comfy.Workspace.Token",EXPIRES_AT:"Comfy.Workspace.ExpiresAt"},L8=300*1e3;var Yv="comfy_api_key";const Gn=Je("apiKeyAuth",()=>{const e=Pa(),t=si(Yv,null),a=Oe(),{wrapWithErrorHandlingAsync:o,toastErrorHandler:s}=ta(),r=A(null),i=E(()=>!!r.value),l=n(async()=>{const g=await e.createCustomer().catch(m=>{console.error(m)});if(!g)throw t.value=null,new Error(G("auth.login.noAssociatedUser"));r.value=g},"initializeUserFromApiKey");be(t,()=>{t.value?l():r.value=null},{immediate:!0});const u=n(g=>{g instanceof Error&&g.message==="STORAGE_FAILED"?a.add({severity:"error",summary:G("auth.apiKey.storageFailed"),detail:G("auth.apiKey.storageFailedDetail")}):s(g)},"reportError"),c=o(async g=>(t.value=g,a.add({severity:"success",summary:G("auth.apiKey.stored"),detail:G("auth.apiKey.storedDetail"),life:5e3}),!0),u),d=o(async()=>(t.value=null,a.add({severity:"success",summary:G("auth.apiKey.cleared"),detail:G("auth.apiKey.clearedDetail"),life:5e3}),!0),u),p=n(()=>t.value,"getApiKey");return{currentUser:r,isAuthenticated:i,storeApiKey:c,clearStoredApiKey:d,getAuthHeader:n(()=>{const g=p();return g?{"X-API-KEY":g}:null},"getAuthHeader"),getApiKey:p}});var Bt=class extends Error{static{n(this,"FirebaseAuthStoreError")}constructor(e){super(e),this.name="FirebaseAuthStoreError"}};const Pa=Je("firebaseAuth",()=>{const e=A(!1),t=A(null),a=A(!1),o=A(!1),s=A(!1),r=A(null),i=A(null),l=A(0),u=A(null),c=n(V=>`${Yd()}${V}`,"buildApiUrl"),d=new Lg;d.addScope("email"),d.setCustomParameters({prompt:"select_account"});const p=new jg;p.addScope("user:email"),p.setCustomParameters({prompt:"select_account"});const f=E(()=>!!t.value),g=E(()=>t.value?.email),m=E(()=>t.value?.uid),h=ah();Pg(h,kg),Gg(h,V=>{if(t.value=V,a.value=!0,V===null){u.value=null;try{sessionStorage.removeItem(fn.CURRENT_WORKSPACE),sessionStorage.removeItem(fn.TOKEN),sessionStorage.removeItem(fn.EXPIRES_AT)}catch{}}r.value=null,i.value=null}),Fg(h,V=>{if(V&&qe){if(u.value!==V.uid){u.value=V.uid;return}l.value++}});const y=n(async()=>{if(t.value)try{return await t.value.getIdToken()}catch(V){if(V instanceof ii&&V.code===Ad.NETWORK_REQUEST_FAILED){console.warn("Could not authenticate with Firebase. Features requiring authentication might not work.");return}pt().showErrorDialog(V,{title:G("errorDialog.defaultTitle"),reportType:"authenticationError"}),console.error(V)}},"getIdToken"),k=n(async()=>{if(Eo.value.team_workspaces_enabled){const q=sessionStorage.getItem(fn.TOKEN),re=sessionStorage.getItem(fn.EXPIRES_AT);if(q&&re){const ae=parseInt(re,10);if(Date.now()<ae)return{Authorization:`Bearer ${q}`}}}const V=await y();return V?{Authorization:`Bearer ${V}`}:Gn().getAuthHeader()},"getAuthHeader"),S=n(async()=>{s.value=!0;try{const V=await k();if(!V)throw new Bt(G("toastMessages.userNotAuthenticated"));const q=await fetch(c("/customers/balance"),{headers:{...V,"Content-Type":"application/json"}});if(!q.ok){if(q.status===404)return null;throw new Bt(G("toastMessages.failedToFetchBalance",{error:(await q.json()).message}))}const re=await q.json();return i.value=new Date,r.value=re,re}finally{s.value=!1}},"fetchBalance"),_=n(async()=>{const V=await k();if(!V)throw new Bt(G("toastMessages.userNotAuthenticated"));const q=await fetch(c("/customers"),{method:"POST",headers:{...V,"Content-Type":"application/json"}});if(!q.ok)throw new Bt(G("toastMessages.failedToCreateCustomer",{error:q.statusText}));const re=await q.json();if(!re?.id)throw new Bt(G("toastMessages.failedToCreateCustomer",{error:"No customer ID returned"}));return re},"createCustomer"),I=n(async(V,q={})=>{e.value=!0;try{const re=await V(h);if(q?.createCustomer){if(!await y())throw new Error("Cannot create customer: User not authenticated");await _()}return re}finally{e.value=!1}},"executeAuthAction"),w=n(async(V,q)=>{const re=await I(ae=>bg(ae,V,q),{createCustomer:!0});return qe&&yt()?.trackAuth({method:"email",is_new_user:!1}),re},"login"),x=n(async(V,q)=>{const re=await I(ae=>Eg(ae,V,q),{createCustomer:!0});return qe&&yt()?.trackAuth({method:"email",is_new_user:!0}),re},"register"),D=n(async()=>{const V=await I(q=>Zl(q,d),{createCustomer:!0});if(qe){const q=Xl(V)?.isNewUser??!1;yt()?.trackAuth({method:"google",is_new_user:q})}return V},"loginWithGoogle"),T=n(async()=>{const V=await I(q=>Zl(q,p),{createCustomer:!0});if(qe){const q=Xl(V)?.isNewUser??!1;yt()?.trackAuth({method:"github",is_new_user:q})}return V},"loginWithGithub"),N=n(async()=>I(V=>Qg(V)),"logout"),M=n(async V=>I(q=>Dg(q,V)),"sendPasswordReset"),O=n(async V=>{if(!t.value)throw new Bt(G("toastMessages.userNotAuthenticated"));await Ig(t.value,V)},"_updatePassword"),L=n(async()=>{if(!t.value)throw new Bt(G("toastMessages.userNotAuthenticated"));await Rg(t.value)},"_deleteAccount"),F=n(async V=>{const q=await k();if(!q)throw new Bt(G("toastMessages.userNotAuthenticated"));o.value||(await _(),o.value=!0);const re=await fetch(c("/customers/credit"),{method:"POST",headers:{...q,"Content-Type":"application/json"},body:JSON.stringify(V)});if(!re.ok)throw new Bt(G("toastMessages.failedToInitiateCreditPurchase",{error:(await re.json()).message}));return re.json()},"addCredits");return{loading:e,currentUser:t,isInitialized:a,balance:r,lastBalanceUpdateTime:i,isFetchingBalance:s,tokenRefreshTrigger:l,isAuthenticated:f,userEmail:g,userId:m,login:w,register:x,logout:N,createCustomer:_,getIdToken:y,loginWithGoogle:D,loginWithGithub:T,initiateCreditPurchase:n(async V=>I(q=>F(V)),"initiateCreditPurchase"),fetchBalance:S,accessBillingPortal:n(async V=>{const q=await k();if(!q)throw new Bt(G("toastMessages.userNotAuthenticated"));const re=V?{target_tier:V}:void 0,ae=await fetch(c("/customers/billing"),{method:"POST",headers:{...q,"Content-Type":"application/json"},...re&&{body:JSON.stringify(re)}});if(!ae.ok)throw new Bt(G("toastMessages.failedToAccessBillingPortal",{error:(await ae.json()).message}));return ae.json()},"accessBillingPortal"),sendPasswordReset:M,updatePassword:O,deleteAccount:L,getAuthHeader:k}}),qv={STANDARD:"standard",CREATOR:"creator",PRO:"pro",FOUNDERS_EDITION:"founder"},qd={standard:{monthly:20,yearly:16,credits:4200,videoEstimate:120},creator:{monthly:35,yearly:28,credits:7400,videoEstimate:211},pro:{monthly:100,yearly:80,credits:21100,videoEstimate:600}};var Xv={standard:{customLoRAs:!1},creator:{customLoRAs:!0},pro:{customLoRAs:!0},founder:{customLoRAs:!1}};const O8="standard";var Zv=20,Jv=5460;function N8(e,t=!1){if(e==="founder")return Zv;const a=qd[e];return t?a.yearly:a.monthly}n(N8,"getTierPrice");function $8(e){return e==="founder"?Jv:qd[e].credits}n($8,"getTierCredits");function R8(e){return Xv[e]}n(R8,"getTierFeatures");var Qv=4,mu=5e3,ey=3;function ty({fetchStatus:e,isActiveSubscription:t,subscriptionStatus:a,telemetry:o,shouldWatchCancellation:s}){const r=A(!1),i=A(0),l=A(!1),u=A(!1),c=A(mu);let d=null;const{start:p,stop:f}=gd(()=>{h()},c,{immediate:!1}),g=n(()=>{r.value=!1,f(),i.value=0,u.value=!1,d&&(d(),d=null)},"stopCancellationWatcher"),m=n(()=>{if(r.value){if(i.value>=Qv){g();return}c.value=mu*ey**i.value,i.value+=1,p()}},"scheduleNextCancellationCheck"),h=n(async(k=!1)=>{if(!(!r.value||u.value)){u.value=!0;try{if(await e(),!t.value){if(!l.value){l.value=!0;try{o?.trackMonthlySubscriptionCancelled()}catch(S){console.error("[Subscription] Failed to track cancellation telemetry:",S)}}g();return}k||m()}catch(S){console.error("[Subscription] Error checking cancellation status:",S),m()}finally{u.value=!1}}},"checkForCancellation"),y=n(()=>{!s()||!a.value?.is_active||(g(),r.value=!0,l.value=!1,i.value=0,!d&&ql&&(d=At(ql,"focus",()=>{r.value&&h(!0)})),m())},"startCancellationWatcher");return tg(()=>{g()}),{startCancellationWatcher:y,stopCancellationWatcher:g}}n(ty,"useSubscriptionCancellationWatcher");function ay(){const e=A(null),t=yt(),a=A(!1),o=E(()=>!qe||!window.__CONFIG__?.subscription_required?!0:e.value?.is_active??!1),{reportError:s,accessBillingPortal:r}=To(),{showSubscriptionRequiredDialog:i}=pt(),{getAuthHeader:l}=Pa(),{wrapWithErrorHandlingAsync:u}=ta(),{isLoggedIn:c}=Ko(),d=E(()=>!!e.value?.end_date),p=E(()=>e.value?.renewal_date?new Date(e.value.renewal_date).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):""),f=E(()=>e.value?.end_date?new Date(e.value.end_date).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):""),g=E(()=>e.value?.subscription_tier??null),m=E(()=>e.value?.subscription_duration??null),h=E(()=>m.value==="ANNUAL"),y=E(()=>{const j=g.value;if(!j)return"";const V=G(`subscription.tiers.${qv[j]??"standard"}.name`);return h.value?G("subscription.tierNameYearly",{name:V}):V}),k=n(j=>`${Yd()}${j}`,"buildApiUrl"),S=u(F,s),_=u(async()=>{const j=await K();if(!j.checkout_url)throw new Error(G("toastMessages.failedToInitiateSubscription",{error:"No checkout URL returned"}));window.open(j.checkout_url,"_blank")},s),I=n(()=>{qe&&yt()?.trackSubscription("modal_opened"),i()},"showSubscriptionDialog"),w=n(()=>!!(qe&&window.__CONFIG__?.subscription_required),"isSubscriptionEnabled"),{startCancellationWatcher:x,stopCancellationWatcher:D}=ty({fetchStatus:S,isActiveSubscription:o,subscriptionStatus:e,telemetry:t,shouldWatchCancellation:w}),T=n(async()=>{await r(),x()},"manageSubscription"),N=n(async()=>{await F(),o.value||I()},"requireActiveSubscription"),M=n(()=>{window.open(`${nl()}/profile/usage`,"_blank")},"handleViewUsageHistory"),O=n(()=>{window.open("https://docs.comfy.org","_blank")},"handleLearnMore"),L=n(async()=>{await r()},"handleInvoiceHistory");async function F(){const j=await l();if(!j)throw new Bt(G("toastMessages.userNotAuthenticated"));const V=await fetch(k("/customers/cloud-subscription-status"),{headers:{...j,"Content-Type":"application/json"}});if(!V.ok)throw new Bt(G("toastMessages.failedToFetchSubscription",{error:(await V.json()).message}));const q=await V.json();return e.value=q,q}n(F,"fetchSubscriptionStatus"),be(()=>c.value,async j=>{if(j)try{await F()}finally{a.value=!0}else e.value=null,D(),a.value=!0},{immediate:!0});const K=n(async()=>{const j=await l();if(!j)throw new Bt(G("toastMessages.userNotAuthenticated"));const V=await fetch(k("/customers/cloud-subscription-checkout"),{method:"POST",headers:{...j,"Content-Type":"application/json"}});if(!V.ok)throw new Bt(G("toastMessages.failedToInitiateSubscription",{error:(await V.json()).message}));return V.json()},"initiateSubscriptionCheckout");return{isActiveSubscription:o,isInitialized:a,isCancelled:d,formattedRenewalDate:p,formattedEndDate:f,subscriptionTier:g,subscriptionDuration:m,isYearlySubscription:h,subscriptionTierName:y,subscriptionStatus:e,isSubscriptionEnabled:w,subscribe:_,fetchStatus:S,showSubscriptionDialog:I,manageSubscription:T,requireActiveSubscription:N,handleViewUsageHistory:M,handleLearnMore:O,handleInvoiceHistory:L}}n(ay,"useSubscriptionInternal");const nn=on(ay),To=n(()=>{const e=Pa(),t=Oe(),{wrapWithErrorHandlingAsync:a,toastErrorHandler:o}=ta(),s=A(!1),r=n(y=>{y instanceof ii&&["auth/unauthorized-domain","auth/invalid-dynamic-link-domain","auth/unauthorized-continue-uri"].includes(y.code)?(s.value=!0,t.add({severity:"error",summary:G("g.error"),detail:G("toastMessages.unauthorizedDomain",{domain:window.location.hostname,email:"support@comfy.org"})})):o(y)},"reportError"),i=a(async()=>{if(await e.logout(),t.add({severity:"success",summary:G("auth.signOut.success"),detail:G("auth.signOut.successDetail"),life:5e3}),qe)try{window.location.href="/cloud/login"}catch{window.location.reload()}},r),l=a(async y=>{await e.sendPasswordReset(y),t.add({severity:"success",summary:G("auth.login.passwordResetSent"),detail:G("auth.login.passwordResetSentDetail"),life:5e3})},r),u=a(async y=>{const{isActiveSubscription:k}=nn();if(!k.value)return;const S=await e.initiateCreditPurchase({amount_micros:Dh(y),currency:"usd"});if(!S.checkout_url)throw new Error(G("toastMessages.failedToPurchaseCredits",{error:"No checkout URL returned"}));yt()?.startTopupTracking(),window.open(S.checkout_url,"_blank")},r),c=a(async(y,k=!0)=>{const S=await e.accessBillingPortal(y);if(!S.billing_portal_url)throw new Error(G("toastMessages.failedToAccessBillingPortal",{error:"No billing portal URL returned"}));k?window.open(S.billing_portal_url,"_blank"):globalThis.location.href=S.billing_portal_url},r),d=a(async()=>await e.fetchBalance(),r),p=a(async()=>await e.loginWithGoogle(),r),f=a(async()=>await e.loginWithGithub(),r),g=a(async(y,k)=>await e.login(y,k),r),m=a(async(y,k)=>await e.register(y,k),r),h=n(()=>{const y=pt();return{shouldHandle:n(k=>k instanceof ii&&k.code===Ad.CREDENTIAL_TOO_OLD_LOGIN_AGAIN,"shouldHandle"),recover:n(async(k,S,_)=>{await y.confirm({title:G("auth.reauthRequired.title"),message:G("auth.reauthRequired.message"),type:"default"})&&(await e.logout(),await y.showSignInDialog()&&await S(..._))},"recover")}},"createReauthenticationRecovery");return{logout:i,sendPasswordReset:l,purchaseCredits:u,accessBillingPortal:c,fetchBalance:d,signInWithGoogle:p,signInWithGithub:f,signInWithEmail:g,signUpWithEmail:m,updatePassword:a(async y=>{await e.updatePassword(y),t.add({severity:"success",summary:G("auth.passwordUpdate.success"),detail:G("auth.passwordUpdate.successDetail"),life:5e3})},r,void 0,[h()]),deleteAccount:a(async()=>{await e.deleteAccount(),t.add({severity:"success",summary:G("auth.deleteAccount.success"),detail:G("auth.deleteAccount.successDetail"),life:5e3})},r,void 0,[h()]),accessError:s,reportError:r}},"useFirebaseAuthActions"),oy=new Set(["Ctrl + a","Ctrl + c","Ctrl + v","Ctrl + x","Ctrl + z","Ctrl + y","Ctrl + p","Enter","Shift + Enter","Ctrl + Backspace","Ctrl + Delete","Home","Ctrl + Home","Ctrl + Shift + Home","End","Ctrl + End","Ctrl + Shift + End","PageUp","PageDown","Shift + PageUp","Shift + PageDown","ArrowLeft","Ctrl + ArrowLeft","Shift + ArrowLeft","Ctrl + Shift + ArrowLeft","ArrowRight","Ctrl + ArrowRight","Shift + ArrowRight","Ctrl + Shift + ArrowRight","ArrowUp","Shift + ArrowUp","ArrowDown","Shift + ArrowDown"]);var ny=class Xd{static{n(this,"KeybindingImpl")}commandId;combo;targetElementId;constructor(t){this.commandId=t.commandId,this.combo=new Zd(t.combo),this.targetElementId=t.targetElementId}equals(t){const a=Et(t);return a instanceof Xd?this.commandId===a.commandId&&this.combo.equals(a.combo)&&this.targetElementId===a.targetElementId:!1}},Zd=class mi{static{n(this,"KeyComboImpl")}key;ctrl;alt;shift;constructor(t){this.key=t.key,this.ctrl=t.ctrl??!1,this.alt=t.alt??!1,this.shift=t.shift??!1}static fromEvent(t){return new mi({key:t.key,ctrl:t.ctrlKey||t.metaKey,alt:t.altKey,shift:t.shiftKey})}equals(t){const a=Et(t);return a instanceof mi?this.key.toUpperCase()===a.key.toUpperCase()&&this.ctrl===a.ctrl&&this.alt===a.alt&&this.shift===a.shift:!1}serialize(){return`${this.key.toUpperCase()}:${this.ctrl}:${this.alt}:${this.shift}`}toString(){return this.getKeySequences().join(" + ")}get hasModifier(){return this.ctrl||this.alt||this.shift}get isModifier(){return["Control","Meta","Alt","Shift"].includes(this.key)}get modifierCount(){return[this.ctrl,this.alt,this.shift].reduce((t,a)=>t+Number(a),0)}get isShiftOnly(){return this.shift&&this.modifierCount===1}get isReservedByTextInput(){return!this.hasModifier||this.isShiftOnly||oy.has(this.toString())}getKeySequences(){const t=[];return this.ctrl&&t.push("Ctrl"),this.alt&&t.push("Alt"),this.shift&&t.push("Shift"),t.push(this.key),t}};const sl=Je("keybinding",()=>{const e=A({}),t=A({}),a=A({});function o(){return t.value}n(o,"getUserKeybindings");function s(){return a.value}n(s,"getUserUnsetKeybindings");const r=E(()=>{const I={...e.value};for(const w of Object.values(a.value)){const x=w.combo.serialize();I[x]?.equals(w)&&delete I[x]}return{...I,...t.value}}),i=E(()=>Object.values(r.value));function l(I){return r.value[I.serialize()]}n(l,"getKeybinding");const u=E(()=>Be.groupBy(i.value,"commandId"));function c(I){return u.value[I]??[]}n(c,"getKeybindingsByCommandId");const d=E(()=>Be.groupBy(Object.values(e.value),"commandId"));function p(I){return c(I)[0]}n(p,"getKeybindingByCommandId");function f(I,w,{existOk:x=!1}){if(!x&&w.combo.serialize()in I.value)throw new Error(`Keybinding on ${w.combo} already exists on ${I.value[w.combo.serialize()].commandId}`);I.value[w.combo.serialize()]=w}n(f,"addKeybinding");function g(I){f(e,I,{existOk:!1})}n(g,"addDefaultKeybinding");function m(I){const w=e.value[I.combo.serialize()],x=a.value[I.combo.serialize()];if(I.equals(w)&&I.equals(x)){delete a.value[I.combo.serialize()];return}w&&!w.equals(x)&&h(w),f(t,I,{existOk:!0})}n(m,"addUserKeybinding");function h(I){const w=I.combo.serialize();if(!(w in r.value)){console.warn(`Trying to unset non-exist keybinding: ${JSON.stringify(I)}`);return}if(t.value[w]?.equals(I)){delete t.value[w];return}if(e.value[w]?.equals(I)){f(a,I,{existOk:!1});return}console.warn(`Unset unknown keybinding: ${JSON.stringify(I)}`)}n(h,"unsetKeybinding");function y(I){const w=p(I.commandId);return w?.equals(I)?!1:(w&&h(w),m(I),!0)}n(y,"updateKeybindingOnCommand");function k(){t.value={},a.value={}}n(k,"resetAllKeybindings");function S(I){const w=p(I),x=d.value[I]?.[0];if(!x)return w?(h(w),!0):!1;if(w?.equals(x))return!1;w&&h(w);const D=x.combo.serialize();return a.value[D]?.equals(x)&&delete a.value[D],!0}n(S,"resetKeybindingForCommand");function _(I){const w=p(I),x=d.value[I]?.[0];return!(w===void 0&&x===void 0||w?.equals(x))}return n(_,"isCommandKeybindingModified"),{keybindings:i,getUserKeybindings:o,getUserUnsetKeybindings:s,getKeybinding:l,getKeybindingsByCommandId:c,getKeybindingByCommandId:p,addDefaultKeybinding:g,addUserKeybinding:m,unsetKeybinding:h,updateKeybindingOnCommand:y,resetAllKeybindings:k,resetKeybindingForCommand:S,isCommandKeybindingModified:_}});var sy=class{static{n(this,"ComfyCommandImpl")}id;function;_label;_icon;_tooltip;_menubarLabel;versionAdded;confirmation;source;active;category;constructor(e){this.id=e.id,this.function=e.function,this._label=e.label,this._icon=e.icon,this._tooltip=e.tooltip,this._menubarLabel=e.menubarLabel??e.label,this.versionAdded=e.versionAdded,this.confirmation=e.confirmation,this.source=e.source,this.active=e.active,this.category=e.category}get label(){return typeof this._label=="function"?this._label():this._label}get icon(){return typeof this._icon=="function"?this._icon():this._icon}get tooltip(){return typeof this._tooltip=="function"?this._tooltip():this._tooltip}get menubarLabel(){return typeof this._menubarLabel=="function"?this._menubarLabel():this._menubarLabel}get keybinding(){return sl().getKeybindingByCommandId(this.id)}};const Pt=Je("command",()=>{const e=A({}),t=E(()=>Object.values(e.value)),a=n(d=>{e.value[d.id]&&console.warn(`Command ${d.id} already registered`),e.value[d.id]=new sy(d)},"registerCommand"),o=n(d=>{for(const p of d)a(p)},"registerCommands"),s=n(d=>e.value[d],"getCommand"),{wrapWithErrorHandlingAsync:r}=ta();return{commands:t,execute:n(async(d,p)=>{const f=s(d);if(f)await r(()=>f.function(p?.metadata),p?.errorHandler)();else throw new Error(`Command ${d} not found`)},"execute"),getCommand:s,registerCommand:a,registerCommands:o,isRegistered:n(d=>!!e.value[d],"isRegistered"),loadExtensionCommands:n(d=>{if(d.commands)for(const p of d.commands)a({...p,source:d.name})},"loadExtensionCommands"),formatKeySequence:n(d=>(d.keybinding?.combo.getKeySequences()||[]).map(p=>p.replace(/Control/g,"Ctrl").replace(/Shift/g,"Shift")).join(" + "),"formatKeySequence")}}),Ko=n(()=>{const e=Pa(),t=Pt(),a=Gn(),o=pt(),{deleteAccount:s}=To(),r=E(()=>e.currentUser),i=E(()=>a.isAuthenticated),l=E(()=>!!i.value||r.value!==null),u=E(()=>i.value&&a.currentUser?{id:a.currentUser.id}:r.value?{id:r.value.uid}:null),c=n(w=>Mt(u,w,{immediate:!0}),"onUserResolved"),d=n(w=>Mt(()=>e.tokenRefreshTrigger,w),"onTokenRefreshed"),p=n(w=>{be(u,(x,D)=>{D&&!x&&w()})},"onUserLogout"),f=E(()=>i.value?a.currentUser?.name:r.value?.displayName),g=E(()=>i.value?a.currentUser?.email:r.value?.email),m=E(()=>{if(i.value)return"Comfy API Key";const w=r.value?.providerData[0]?.providerId;return w?.includes("google")?"Google":w?.includes("github")?"GitHub":w}),h=E(()=>{if(i.value)return"pi pi-key";const w=r.value?.providerData[0]?.providerId;return w?.includes("google")?"pi pi-google":w?.includes("github")?"pi pi-github":"pi pi-user"}),y=E(()=>i.value?!1:r.value?.providerData[0]?.providerId==="password"),k=E(()=>i.value?null:r.value?.photoURL),S=n(async()=>{i.value?await a.clearStoredApiKey():await t.execute("Comfy.User.SignOut")},"handleSignOut"),_=n(async()=>{await t.execute("Comfy.User.OpenSignInDialog")},"handleSignIn"),I=n(async()=>{await o.confirm({title:G("auth.deleteAccount.confirmTitle"),message:G("auth.deleteAccount.confirmMessage"),type:"delete"})&&await s()},"handleDeleteAccount");return{loading:e.loading,isLoggedIn:l,isApiKeyLogin:i,isEmailProvider:y,userDisplayName:f,userEmail:g,userPhotoUrl:k,providerName:m,providerIcon:h,resolvedUserInfo:u,handleSignOut:S,handleSignIn:_,handleDeleteAccount:I,onUserResolved:c,onTokenRefreshed:d,onUserLogout:p}},"useCurrentUser");var xn="pending_topup_timestamp",ry=1440*60*1e3;function iy(){localStorage.setItem(xn,Date.now().toString())}n(iy,"startTopupTracking");function ly(e){const t=localStorage.getItem(xn);if(!t)return!1;const a=parseInt(t,10);return Date.now()-a>ry?(localStorage.removeItem(xn),!1):!e||e.length===0?!1:e.find(o=>o.event_type==="credit_added"&&o.createdAt&&new Date(o.createdAt).getTime()>a)?(yt()?.trackApiCreditTopupSucceeded(),localStorage.removeItem(xn),!0):!1}n(ly,"checkForCompletedTopup");function Jd(){localStorage.removeItem(xn)}n(Jd,"clearTopupTracking");const rs=n(e=>({all:"icon-[lucide--list]","getting-started":"icon-[lucide--graduation-cap]","generation-image":"icon-[lucide--image]",image:"icon-[lucide--image]","generation-video":"icon-[lucide--film]",video:"icon-[lucide--film]","generation-3d":"icon-[lucide--box]","3d":"icon-[lucide--box]","generation-audio":"icon-[lucide--volume-2]",audio:"icon-[lucide--volume-2]","generation-llm":"icon-[lucide--message-square-text]","api-nodes":"icon-[lucide--hand-coins]","closed-models":"icon-[lucide--hand-coins]",llm:"icon-[lucide--message-square-text]",llms:"icon-[lucide--message-square-text]","llm-api":"icon-[lucide--message-square-text]","small-models":"icon-[lucide--zap]",performance:"icon-[lucide--zap]","mac-compatible":"icon-[lucide--command]","runs-on-mac":"icon-[lucide--command]","lora-training":"icon-[lucide--dumbbell]",training:"icon-[lucide--dumbbell]",extensions:"icon-[lucide--puzzle]",tools:"icon-[lucide--wrench]",upscaling:"icon-[lucide--maximize-2]",controlnet:"icon-[lucide--sliders-horizontal]","area-composition":"icon-[lucide--layout-grid]"})[e.toLowerCase()]||"icon-[lucide--folder]","getCategoryIcon");function gu(e,t){return`${e.toLowerCase().replace(/\s+/g,"-")}-${t.toLowerCase().replace(/\s+/g,"-")}`}n(gu,"generateCategoryId");const uy=Je("workflowTemplates",()=>{const e=Qt({}),t=Qt([]),a=Qt([]),o=A(!1),s=A(new Set),r=n(k=>f.value.find(S=>S.name===k),"getTemplateByName"),i=A(new Map),l=n((k,S)=>({...k,localizedTitle:De(`templateWorkflows.template.${dt(S)}.${dt(k.name)}`,k.title??k.name),localizedDescription:De(`templateWorkflows.templateDescription.${dt(S)}.${dt(k.name)}`,k.description)}),"addLocalizedFieldsToTemplate"),u=n((k,S)=>k.map(_=>l(_,S)),"localizeTemplateList"),c=n(k=>({...k,localizedTitle:De(`templateWorkflows.category.${dt(k.title)}`,k.title??k.moduleName),templates:u(k.templates,k.title)}),"localizeTemplateCategory"),d=n(()=>{const k=t.value.flatMap(_=>_.templates.map(I=>({...l(I,_.title),sourceModule:_.moduleName}))),S=Object.entries(e.value).flatMap(([_,I])=>I.map(w=>({name:w,mediaType:"image",mediaSubtype:"jpg",description:w,sourceModule:_})));return{moduleName:"all",title:"All",localizedTitle:De("templateWorkflows.category.All","All Templates"),templates:[...k,...S]}},"createAllCategory"),p=E(()=>{const k=[...t.value.map(c),...Object.entries(e.value).map(([S,_])=>({moduleName:S,title:S,localizedTitle:De(`templateWorkflows.category.${dt(S)}`,S),templates:_.map(I=>({name:I,mediaType:"image",mediaSubtype:"jpg",description:I}))}))];return[{label:De("templateWorkflows.category.ComfyUI Examples","ComfyUI Examples"),modules:[d(),...k.filter(S=>S.moduleName==="default")]},...Object.keys(e.value).length>0?[{label:De("templateWorkflows.category.Custom Nodes","Custom Nodes"),modules:k.filter(S=>S.moduleName!=="default")}]:[]]}),f=E(()=>{const k=[];return t.value.forEach(S=>{S.templates.forEach(_=>{const I={..._,sourceModule:S.moduleName,category:S.title,categoryType:S.type,categoryGroup:S.category,isEssential:S.isEssential,isPartnerNode:_.openSource===!1,searchableText:[_.title||_.name,_.description||"",S.title,..._.tags||[],..._.models||[]].join(" ")};k.push(I)})}),Object.entries(e.value).forEach(([S,_])=>{_.forEach(I=>{const w={name:I,title:I,description:I,mediaType:"image",mediaSubtype:"jpg",sourceModule:S,category:"Extensions",categoryType:"extension",searchableText:`${I} ${S} extension`};k.push(w)})}),qe?k:k.filter(S=>!S.requiresCustomNodes?.length)}),g=n(k=>{if(k==="all")return f.value;if(k.startsWith("basics-"))return f.value.filter(_=>_.isEssential&&_.category?.toLowerCase().replace(/\s+/g,"-")===k.replace("basics-",""));if(k==="popular")return f.value;if(k==="partner-nodes")return f.value.filter(_=>_.isPartnerNode);if(k.startsWith("extension-")){const _=k.replace("extension-","");return f.value.filter(I=>I.sourceModule===_)}const S=i.value.get(k);return S?f.value.filter(_=>!(S.category&&_.category!==S.category||S.categoryGroup&&_.categoryGroup!==S.categoryGroup)):f.value},"filterTemplatesByCategory"),m=E(()=>{if(!o.value)return[];const k=[];i.value.clear(),k.push({id:"all",label:De("templateWorkflows.category.All","All Templates"),icon:rs("all")}),k.push({id:"popular",label:De("templateWorkflows.category.Popular","Popular"),icon:"icon-[lucide--flame]"});const S=t.value.filter(I=>I.isEssential&&I.templates.length>0);S.length>0&&S.forEach(I=>{const w=I.icon,x=I.title??"Getting Started",D=gu("basics",I.title);k.push({id:D,label:De(`templateWorkflows.category.${dt(x)}`,x),icon:w||rs(I.type||"getting-started")})});const _=new Map;if(t.value.forEach(I=>{if(I.isEssential)return;const w=I.category,x=I.icon;if(w){_.has(w)||_.set(w,{title:w,items:[]});const D=_.get(w),T=gu(w,I.title);i.value.set(T,{category:I.title,categoryGroup:w}),D.items.push({id:T,label:De(`templateWorkflows.category.${dt(I.title)}`,I.title),icon:x||rs(I.type||"default")})}}),_.forEach((I,w)=>{I.items.length>0&&k.push({title:De(`templateWorkflows.category.${dt(w)}`,w.split(" ").map(x=>x.charAt(0).toUpperCase()+x.slice(1).toLowerCase()).join(" ")),items:I.items})}),f.value.filter(I=>I.isPartnerNode).length>0&&k.push({id:"partner-nodes",label:De("templateWorkflows.category.Partner Nodes","Partner Nodes"),icon:"icon-[lucide--handshake]"}),f.value.filter(I=>I.sourceModule!=="default").length>0){const I=Array.from(new Set(f.value.filter(w=>w.sourceModule!=="default").map(w=>w.sourceModule))).sort().map(w=>({id:`extension-${w}`,label:De(`templateWorkflows.category.${dt(w)}`,w),icon:rs("extensions")}));k.push({title:De("templateWorkflows.category.Extensions","Extensions"),items:I,collapsible:!0})}return k});async function h(){try{if(!o.value){e.value=await oe.getWorkflowTemplates();const k=rh.global.locale.value,[S,_]=await Promise.all([oe.getCoreWorkflowTemplates(k),qe&&k!=="en"?oe.getCoreWorkflowTemplates("en"):Promise.resolve([])]);t.value=S,a.value=_;const I=t.value.flatMap(x=>x.templates.map(D=>D.name)),w=Object.values(e.value).flat();s.value=new Set([...I,...w]),o.value=!0}}catch(k){console.error("Error fetching workflow templates:",k)}}n(h,"loadWorkflowTemplates");function y(k){if(a.value.length===0)return null;for(const S of a.value){const _=S.templates.find(I=>I.name===k);if(_)return{tags:_.tags,category:S.title,useCase:_.useCase,models:_.models,license:_.license}}return null}return n(y,"getEnglishMetadata"),{groupedTemplates:p,navGroupedTemplates:m,enhancedTemplates:f,filterTemplatesByCategory:g,isLoaded:o,loadWorkflowTemplates:h,knownTemplateNames:s,getTemplateByName:r,getEnglishMetadata:y}});var rl=U.union([U.string(),U.number()]),cy=U.object({route:U.string().url().or(U.string().startsWith("/")),refresh:U.number().gte(128).safe().or(U.number().lte(0).safe()).optional(),response_key:U.string().optional(),query_params:U.record(U.string(),U.string()).optional(),refresh_button:U.boolean().optional(),control_after_refresh:U.enum(["first","last"]).optional(),timeout:U.number().gte(0).optional(),max_retries:U.number().gte(0).optional()}),dy=U.object({placeholder:U.string().optional(),chip:U.boolean().optional()});const Nt=U.object({default:U.any().optional(),defaultInput:U.boolean().optional(),display_name:U.string().optional(),forceInput:U.boolean().optional(),tooltip:U.string().optional(),socketless:U.boolean().optional(),hidden:U.boolean().optional(),advanced:U.boolean().optional(),widgetType:U.string().optional(),rawLink:U.boolean().optional(),lazy:U.boolean().optional()}).passthrough();var Qd=Nt.extend({min:U.number().optional(),max:U.number().optional(),step:U.number().optional(),default:U.union([U.number(),U.array(U.number())]).optional(),display:U.enum(["slider","number","knob"]).optional()});const ep=Qd.extend({control_after_generate:U.boolean().optional()}),tp=Qd.extend({round:U.union([U.number(),U.literal(!1)]).optional()}),ap=Nt.extend({label_on:U.string().optional(),label_off:U.string().optional(),default:U.boolean().optional()}),op=Nt.extend({default:U.string().optional(),multiline:U.boolean().optional(),dynamicPrompts:U.boolean().optional(),defaultVal:U.string().optional(),placeholder:U.string().optional()}),il=Nt.extend({control_after_generate:U.boolean().optional(),image_upload:U.boolean().optional(),image_folder:yh.optional(),allow_batch:U.boolean().optional(),video_upload:U.boolean().optional(),audio_upload:U.boolean().optional(),animated_image_upload:U.boolean().optional(),options:U.array(rl).optional(),remote:cy.optional(),multi_select:dy.optional()});var py=U.tuple([U.literal("INT"),ep.optional()]),fy=U.tuple([U.literal("FLOAT"),tp.optional()]),my=U.tuple([U.literal("BOOLEAN"),ap.optional()]),gy=U.tuple([U.literal("STRING"),op.optional()]),hy=U.tuple([U.array(rl),il.optional()]),vy=U.tuple([U.literal("COMBO"),il.optional()]);function ll(e){return Array.isArray(e[0])}n(ll,"isComboInputSpecV1");function B8(e){return e[0]==="INT"}n(B8,"isIntInputSpec$1");function F8(e){return e[0]==="FLOAT"}n(F8,"isFloatInputSpec$1");function ul(e){return e[0]==="COMBO"}n(ul,"isComboInputSpecV2");function np(e){return ll(e)||ul(e)}n(np,"isComboInputSpec$1");function yy(e){return np(e)?"COMBO":e[0]}n(yy,"getInputSpecType");function wy(e){return(ul(e)?e[1]?.options:e[0])??[]}n(wy,"getComboSpecComboOptions");var by=new Set(["INT","FLOAT","BOOLEAN","STRING","COMBO"]),_y=U.tuple([U.string().refine(e=>!by.has(e)),Nt.optional()]),hu=U.union([py,fy,my,gy,hy,vy,_y]),cl=U.object({required:U.record(hu).optional(),optional:U.record(hu).optional(),hidden:U.record(U.any()).optional()}),ky=U.string(),Cy=U.array(rl),xy=U.array(U.union([ky,Cy]));const U8=U.object({input:cl.optional(),output:xy.optional(),output_is_list:U.array(U.boolean()).optional(),output_name:U.array(U.string()).optional(),output_tooltips:U.array(U.string()).optional(),output_matchtypes:U.array(U.string().optional()).optional(),name:U.string(),display_name:U.string(),description:U.string(),help:U.string().optional(),category:U.string(),output_node:U.boolean(),python_module:U.string(),deprecated:U.boolean().optional(),experimental:U.boolean().optional(),api_node:U.boolean().optional(),input_order:U.record(U.array(U.string())).optional()}),Iy=U.object({...Nt.shape,template:U.object({input:cl,names:U.array(U.string()).optional(),max:U.number().optional(),min:U.number().optional(),prefix:U.string().optional()})}),Sy=U.tuple([U.literal("COMFY_DYNAMICCOMBO_V3"),Nt.extend({options:U.array(U.object({inputs:cl,key:U.string()}))})]);function Ey(e){const t={};e.input?.required&&Object.entries(e.input.required).forEach(([o,s])=>{t[o]=ko(s,{name:o,isOptional:!1})}),e.input?.optional&&Object.entries(e.input.optional).forEach(([o,s])=>{t[o]=ko(s,{name:o,isOptional:!0})});const a=[];return e.output&&(Array.isArray(e.output)?e.output.forEach((o,s)=>{const r={index:s,name:e.output_name?.[s]||`output_${s}`,type:Array.isArray(o)?"COMBO":o,is_list:e.output_is_list?.[s]||!1,tooltip:e.output_tooltips?.[s]};Array.isArray(o)&&(r.options=o),a.push(r)}):console.warn("nodeDefV1.output is not an array:",e.output)),{inputs:t,outputs:a,hidden:e.input?.hidden,name:e.name,display_name:e.display_name,description:e.description,category:e.category,output_node:e.output_node,python_module:e.python_module,deprecated:e.deprecated,experimental:e.experimental}}n(Ey,"transformNodeDefV1ToV2");function ko(e,t){const{name:a,isOptional:o=!1}=t,s={name:a,isOptional:o,...e[1]||{}};return np(e)?{type:"COMBO",...s,options:ll(e)?e[0]:wy(e)}:typeof e[0]=="string"?{type:e[0],...s}:{type:"UNKNOWN",...s}}n(ko,"transformInputSpecV1ToV2");function Co(e){return[e.type,e]}n(Co,"transformInputSpecV2ToV1");var is=class{static{n(this,"FuseFilter")}fuseSearch;id;name;invokeSequence;getItemOptions;constructor(e,t){this.id=t.id,this.name=t.name,this.invokeSequence=t.invokeSequence,this.getItemOptions=t.getItemOptions,this.fuseSearch=new sp(this.getAllNodeOptions(e),{fuseOptions:t.fuseOptions})}getAllNodeOptions(e){const t=new Set;for(const a of e)for(const o of this.getItemOptions(a))t.add(o);return Array.from(t)}matches(e,t,a={}){const{wildcard:o}=a;if(o&&t===o)return!0;const s=this.getItemOptions(e);return o?s.some(r=>r===o):typeof t!="string"||!t.includes(",")?s.includes(t):t.split(",").some(r=>s.includes(r))}};function Ty(e){return"postProcessSearchScores"in e}n(Ty,"isFuseSearchable");var sp=class{static{n(this,"FuseSearch")}fuse;keys;data;advancedScoring;constructor(e,t){const{fuseOptions:a,createIndex:o=!0,advancedScoring:s=!1}=t;this.data=e,this.keys=a?.keys??[],this.advancedScoring=s,this.fuse=new Pn(e,a,o&&this.keys.length?Pn.createIndex(this.keys,e):void 0)}search(e,t){const a=e?this.fuse.search(e,t):this.data.map(o=>({item:o,score:0}));return this.advancedScoring?a.map(o=>({item:o.item,scores:this.calcAuxScores(e.toLocaleLowerCase(),o.item,o.score??0)})).sort((o,s)=>this.compareAux(o.scores,s.scores)).map(o=>o.item):a.map(o=>o.item)}calcAuxScores(e,t,a){let o=[];typeof t=="string"?o=[t]:typeof t=="object"&&t!==null&&(o=this.keys.map(i=>t[i]).filter(i=>typeof i=="string"));let s=o.map(i=>this.calcAuxSingle(e,i,a)).sort(this.compareAux)[0];const r=o.some(i=>i.toLocaleLowerCase().includes("deprecated"));return s[0]+=r&&s[0]!==0?5:0,Ty(t)&&(s=t.postProcessSearchScores(s)),s}calcAuxSingle(e,t,a){const o=t.split(/ |\b|(?<=[a-z])(?=[A-Z])|(?=[A-Z][a-z])/).map(c=>c.toLocaleLowerCase()),s=e.split(" ");t=t.toLocaleLowerCase();let r=9,i=0,l=0;if(t==e)r=0;else if(t.startsWith(e))r=1,l=t.length;else if(o.includes(e))r=2,i=t.indexOf(e)+t.length*.5,l=t.length;else if(t.includes(e))r=3,i=t.indexOf(e)+t.length*.5,l=t.length;else if(s.every(c=>o.includes(c))){const c=s.map(f=>o.indexOf(f)),d=Math.min(...c),p=Math.max(...c);r=4,i=p-d+p*.5+t.length*.5,l=t.length}else if(s.every(c=>t.includes(c))){const c=Math.min(...s.map(p=>t.indexOf(p))),d=Math.max(...s.map(p=>t.indexOf(p)+p.length));r=5,i=d-c+d*.5+t.length*.5,l=t.length}const u=.2*(1-Math.min(t.length,e.length)/Math.max(t.length,e.length));return[r,i,l,a+u]}compareAux(e,t){for(let a=0;a<Math.min(e.length,t.length);a++)if(e[a]!==t[a])return e[a]-t[a];return e.length-t.length}},Ay=class{static{n(this,"NodeSearchService")}nodeFuseSearch;inputTypeFilter;outputTypeFilter;nodeCategoryFilter;nodeSourceFilter;constructor(e){this.nodeFuseSearch=new sp(e,{fuseOptions:{keys:["name","display_name"],includeScore:!0,threshold:.3,shouldSort:!1,useExtendedSearch:!0},createIndex:!0,advancedScoring:!0});const t={includeScore:!0,threshold:.3,shouldSort:!0};this.inputTypeFilter=new is(e,{id:"input",name:"Input Type",invokeSequence:"i",getItemOptions:n(a=>Object.values(a.inputs??[]).flatMap(o=>o.type.split(",")),"getItemOptions"),fuseOptions:t}),this.outputTypeFilter=new is(e,{id:"output",name:"Output Type",invokeSequence:"o",getItemOptions:n(a=>a.outputs.flatMap(o=>o.type.split(",")),"getItemOptions"),fuseOptions:t}),this.nodeCategoryFilter=new is(e,{id:"category",name:"Category",invokeSequence:"c",getItemOptions:n(a=>[a.category],"getItemOptions"),fuseOptions:t}),this.nodeSourceFilter=new is(e,{id:"source",name:"Source",invokeSequence:"s",getItemOptions:n(a=>[a.nodeSource.displayText],"getItemOptions"),fuseOptions:t})}searchNode(e,t=[],a,o={}){const{matchWildcards:s=!0}=o,r=s?"*":void 0,i=this.nodeFuseSearch.search(e),l=i.filter(u=>t.every(c=>{const{filterDef:d,value:p}=c;return d.matches(u,p)}));if(s){const u=new Set(l.map(c=>c.name));l.push(...i.filter(c=>!u.has(c.name)).filter(c=>t.every(d=>{const{filterDef:p,value:f}=d;return p.matches(c,f,{wildcard:r})})))}return a?.limit?l.slice(0,a.limit):l}get nodeFilters(){return[this.inputTypeFilter,this.outputTypeFilter,this.nodeCategoryFilter,this.nodeSourceFilter]}};const Mr=n(e=>{const t=e.category||e.id.split(".");return{category:t[0]??"Other",subCategory:t[1]??"Other"}},"getSettingInfo");function vu(e,t){return e?.migrateDeprecatedValue?.(t)??t}n(vu,"tryMigrateDeprecatedValue");function yu(e,t,a){e?.onChange&&e.onChange(t,a),e&&Z.ui.settings.dispatchChange(e.id,t,a)}n(yu,"onChange");const Me=Je("setting",()=>{const e=A({}),t=A({});function a(p){return e.value[p]!==void 0}n(a,"exists");async function o(p,f){const g=Be.cloneDeep(f),m=vu(t.value[p],g),h=s(p);m!==h&&(yu(t.value[p],m,h),e.value[p]=m,await oe.storeSetting(p,m))}n(o,"set");function s(p){return Be.cloneDeep(e.value[p]??i(p))}n(s,"get$1");function r(p){return t.value[p]}n(r,"getSettingById");function i(p){const f=r(p);if(f===void 0)return;const g=l(p,f);if(g)return g;const m=f.defaultValue;return typeof m=="function"?m():m}n(i,"getDefaultValue$1");function l(p,f){const g=f?.defaultsByInstallVersion;if(g&&p!=="Comfy.InstalledVersion"){const m=s("Comfy.InstalledVersion");if(m){const h=Object.keys(g).sort((y,k)=>(0,ea.compare)(k,y));for(const y of h)if((0,ea.valid)(y)&&(0,ea.compare)(m,y)>=0){const k=g[y];if(k!==void 0)return typeof k=="function"?k():k}}}return null}n(l,"getVersionedDefaultValue");function u(p){if(!p.id)throw new Error("Settings must have an ID");if(p.id in t.value)throw new Error(`Setting ${p.id} must have a unique ID.`);t.value[p.id]=p,e.value[p.id]!==void 0&&(e.value[p.id]=vu(p,e.value[p.id])),yu(p,s(p.id),void 0)}n(u,"addSetting");async function c(){if(Object.keys(t.value).length)throw new Error("Setting values must be loaded before any setting is registered.");e.value=await oe.getSettings(),await d()}n(c,"loadSettingValues");async function d(){const p="LiteGraph.Canvas.LowQualityRenderingZoomThreshold",f="LiteGraph.Canvas.MinFontSizeForLOD";if(e.value[p]!==void 0&&e.value[f]===void 0){const g=e.value[p],m=Math.round(g*14),h=Math.max(1,Math.min(24,m));e.value[f]=h,delete e.value[p],await oe.storeSetting(f,h),await oe.storeSetting(p,void 0)}}return n(d,"migrateZoomThresholdToFontSize"),{settingValues:e,settingsById:t,addSetting:u,loadSettingValues:c,set:o,get:s,exists:a,getDefaultValue:i}}),cr={last_node_id:9,last_link_id:9,nodes:[{id:7,type:"CLIPTextEncode",pos:[413,389],size:[425.27801513671875,180.6060791015625],flags:{},order:3,mode:0,inputs:[{name:"clip",type:"CLIP",link:5}],outputs:[{name:"CONDITIONING",type:"CONDITIONING",links:[6],slot_index:0}],properties:{},widgets_values:["text, watermark"]},{id:6,type:"CLIPTextEncode",pos:[415,186],size:[422.84503173828125,164.31304931640625],flags:{},order:2,mode:0,inputs:[{name:"clip",type:"CLIP",link:3}],outputs:[{name:"CONDITIONING",type:"CONDITIONING",links:[4],slot_index:0}],properties:{},widgets_values:["beautiful scenery nature glass bottle landscape, , purple galaxy bottle,"]},{id:5,type:"EmptyLatentImage",pos:[473,609],size:[315,106],flags:{},order:1,mode:0,outputs:[{name:"LATENT",type:"LATENT",links:[2],slot_index:0}],properties:{},widgets_values:[512,512,1]},{id:3,type:"KSampler",pos:[863,186],size:[315,262],flags:{},order:4,mode:0,inputs:[{name:"model",type:"MODEL",link:1},{name:"positive",type:"CONDITIONING",link:4},{name:"negative",type:"CONDITIONING",link:6},{name:"latent_image",type:"LATENT",link:2}],outputs:[{name:"LATENT",type:"LATENT",links:[7],slot_index:0}],properties:{},widgets_values:[0x8e7ff42ed37e,!0,20,8,"euler","normal",1]},{id:8,type:"VAEDecode",pos:[1209,188],size:[210,46],flags:{},order:5,mode:0,inputs:[{name:"samples",type:"LATENT",link:7},{name:"vae",type:"VAE",link:8}],outputs:[{name:"IMAGE",type:"IMAGE",links:[9],slot_index:0}],properties:{}},{id:9,type:"SaveImage",pos:[1451,189],size:[210,26],flags:{},order:6,mode:0,inputs:[{name:"images",type:"IMAGE",link:9}],properties:{}},{id:4,type:"CheckpointLoaderSimple",pos:[26,474],size:[315,98],flags:{},order:0,mode:0,outputs:[{name:"MODEL",type:"MODEL",links:[1],slot_index:0},{name:"CLIP",type:"CLIP",links:[3,5],slot_index:1},{name:"VAE",type:"VAE",links:[8],slot_index:2}],properties:{},widgets_values:["v1-5-pruned-emaonly-fp16.safetensors"]}],links:[[1,4,0,3,0,"MODEL"],[2,5,0,3,3,"LATENT"],[3,4,1,6,0,"CLIP"],[4,6,0,3,1,"CONDITIONING"],[5,4,1,7,0,"CLIP"],[6,7,0,3,2,"CONDITIONING"],[7,3,0,8,0,"LATENT"],[8,4,2,8,1,"VAE"],[9,8,0,9,0,"IMAGE"]],groups:[],config:{},extra:{ds:{offset:[0,0],scale:1}},version:.4},rp=JSON.stringify(cr),ip={last_node_id:0,last_link_id:0,nodes:[],links:[],groups:[],config:{},extra:{},version:.4};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.defaultGraph=window.comfyAPI.defaultGraph||{};window.comfyAPI.defaultGraph.defaultGraph=cr;window.comfyAPI.defaultGraph.defaultGraphJSON=rp;window.comfyAPI.defaultGraph.blankGraph=ip;function My(e,t){const a=Zi(e);return t.replace(/%([^%]+)%/g,function(o,s){const r=s.split(".");if(r.length!==2)return r[0].startsWith("date:")?Rh(r[0].substring(5),new Date):(s!=="width"&&s!=="height"&&console.warn("Invalid replacement pattern",s),o);let i=a.filter(c=>c.properties?.["Node name for S&R"]===r[0]);if(i.length||(i=a.filter(c=>c.title===r[0])),!i.length)return console.warn("Unable to find node",r[0]),o;i.length>1&&console.warn("Multiple nodes matched",r[0],"using first match");const l=i[0],u=l.widgets?.find(c=>c.name===r[1]);return u?((u.value??"")+"").replaceAll(/[/?<>\\:*|"\x00-\x1F\x7F]/g,"_"):(console.warn("Unable to find widget",r[1],"on node",r[0],l),o)})}n(My,"applyTextReplacements$1");var wu={extensions:[".png",".webp",".svg",".avif"],mimeTypes:["image/png","image/webp","image/svg+xml","image/avif"]},bu={extensions:[".mp3",".ogg",".flac"],mimeTypes:["audio/mpeg","audio/ogg","audio/flac","audio/x-flac"]},_u={extensions:[".mp4",".mov",".m4v",".webm"],mimeTypes:["video/mp4","video/quicktime","video/x-m4v","video/webm"]},ku={extensions:[".glb"],mimeTypes:["model/gltf-binary"]},Cu={extensions:[".json",".latent",".safetensors"],mimeTypes:["application/json"]},xu={extensions:[...wu.extensions,...bu.extensions,..._u.extensions,...ku.extensions,...Cu.extensions],mimeTypes:[...wu.mimeTypes,...bu.mimeTypes,..._u.mimeTypes,...ku.mimeTypes,...Cu.mimeTypes]};const Py=[...xu.extensions,...xu.mimeTypes].join(",");var dr=class extends EventTarget{static{n(this,"ComfyDialog$1")}element;textElement;#e;constructor(e="div",t=null){super(),this.#e=t,this.element=Ee(e+".comfy-modal",{parent:document.body},[Ee("div.comfy-modal-content",[Ee("p",{$:n(a=>this.textElement=a,"$")}),...this.createButtons()])])}createButtons(){return this.#e??[Ee("button",{type:"button",textContent:"Close",onclick:n(()=>this.close(),"onclick")})]}close(){this.element.style.display="none"}show(e){typeof e=="string"?this.textElement.innerHTML=e:this.textElement.replaceChildren(...e instanceof Array?e:[e]),this.element.style.display="flex"}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.dialog=window.comfyAPI.dialog||{};window.comfyAPI.dialog.ComfyDialog=dr;var lp=class extends dr{static{n(this,"ComfySettingsDialog")}app;constructor(e){super(),this.app=e}dispatchChange(e,t,a){this.dispatchEvent(new CustomEvent(e+".change",{detail:{value:t,oldValue:a}}))}get settingsValues(){return Me().settingValues}get settingsLookup(){return Me().settingsById}get settingsParamLookup(){return Me().settingsById}getSettingValue(e,t){return t!==void 0&&console.warn("Parameter defaultValue is deprecated. The default value in settings definition will be used instead."),Me().get(e)}getSettingDefaultValue(e){return Me().getDefaultValue(e)}async setSettingValueAsync(e,t){await Me().set(e,t)}setSettingValue(e,t){Me().set(e,t).catch(a=>{Oe().addAlert(G("toastMessages.errorSaveSetting",{id:e,err:a}))})}addSetting(e){const t=Me();return t.addSetting(e),{get value(){return t.get(e.id)},set value(a){t.set(e.id,a)}}}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.settings=window.comfyAPI.settings||{};window.comfyAPI.settings.ComfySettingsDialog=lp;function up(e,t,a){const o=a?.onChange;let s,r;function i(u){s!=null&&r[s].classList.remove("comfy-toggle-selected"),o?.({item:t[u],prev:s==null?void 0:t[s]}),s=u,r[s].classList.add("comfy-toggle-selected")}n(i,"updateSelected"),r=t.map((u,c)=>{typeof u=="string"&&(u={text:u}),u.value||(u.value=u.text);const d=Ee("label",{textContent:u.text,title:u.tooltip??""},Ee("input",{name:e,type:"radio",value:u.value??u.text,checked:u.selected,onchange:n(()=>{i(c)},"onchange")}));return u.selected&&i(c),d});const l=Ee("div.comfy-toggle-switch",r);return s==null&&(r[0].children[0].checked=!0,i(0)),l}n(up,"toggleSwitch");window.comfyAPI=window.comfyAPI||{};window.comfyAPI.toggleSwitch=window.comfyAPI.toggleSwitch||{};window.comfyAPI.toggleSwitch.toggleSwitch=up;const cp=dr;function Ee(e,t,a){const o=e.split("."),s=document.createElement(o.shift());if(o.length>0&&s.classList.add(...o),t)if(typeof t=="string"?t={textContent:t}:t instanceof Element&&(t=[t]),Array.isArray(t))s.append(...t);else{const{parent:r,$:i,dataset:l,style:u,...c}=t;c.for&&s.setAttribute("for",c.for),u&&Object.assign(s.style,u),l&&Object.assign(s.dataset,l),Object.assign(s,c),a&&s.append(...Array.isArray(a)?a:[a]),r&&r.append(s),i&&i(s)}return s}n(Ee,"$el");function Dy(e){var t=0,a=0,o=0,s=0,r=0,i=0;e.getElementsByClassName("drag-handle")[0]?e.getElementsByClassName("drag-handle")[0].onmousedown=p:e.onmousedown=p,new ResizeObserver(()=>{l()}).observe(e);function l(){try{r=Math.min(document.body.clientWidth-e.clientWidth,Math.max(0,e.offsetLeft)),i=Math.min(document.body.clientHeight-e.clientHeight,Math.max(0,e.offsetTop)),u()}catch{}}n(l,"ensureInBounds");function u(){if(e.style.display==="none")return;const m=document.body.clientWidth/2;r+e.clientWidth/2>m?(e.style.left="unset",e.style.right=document.body.clientWidth-r-e.clientWidth+"px"):(e.style.left=r+"px",e.style.right="unset"),e.style.top=i+"px",e.style.bottom="unset",d&&localStorage.setItem("Comfy.MenuPosition",JSON.stringify({x:e.offsetLeft,y:e.offsetTop}))}n(u,"positionElement");function c(){let m=localStorage.getItem("Comfy.MenuPosition");if(m){const h=JSON.parse(m);r=h.x,i=h.y,u(),l()}}n(c,"restorePos");let d;c(),d=!0;function p(m){m=m||window.event,m.preventDefault(),o=m.clientX,s=m.clientY,document.onmouseup=g,document.onmousemove=f}n(p,"dragMouseDown");function f(m){m=m||window.event,m.preventDefault(),e.classList.add("comfy-menu-manual-pos"),t=m.clientX-o,a=m.clientY-s,o=m.clientX,s=m.clientY,r=Math.min(document.body.clientWidth-e.clientWidth,Math.max(0,e.offsetLeft+t)),i=Math.min(document.body.clientHeight-e.clientHeight,Math.max(0,e.offsetTop+a)),u()}n(f,"elementDrag"),window.addEventListener("resize",()=>{l()});function g(){document.onmouseup=null,document.onmousemove=null}return n(g,"closeDragElement"),c}n(Dy,"dragElement");var Iu=class{static{n(this,"ComfyList")}#e;#t;#a;element;button;constructor(e,t,a){this.#t=e,this.#e=t||e.toLowerCase(),this.#a=a||!1,this.element=Ee("div.comfy-list"),this.element.style.display="none"}get visible(){return this.element.style.display!=="none"}async load(){const e=await oe.getItems(this.#e);this.element.replaceChildren(...Object.keys(e).flatMap(t=>[Ee("h4",{textContent:t}),Ee("div.comfy-list-items",[...(this.#a?e[t].reverse():e[t]).map(a=>{const o=a.remove??{name:"Delete",cb:n(()=>oe.deleteItem(this.#e,a.prompt[1]),"cb")};return Ee("div",{textContent:a.prompt[0]+": "},[Ee("button",{textContent:"Load",onclick:n(async()=>{if(await Z.loadGraphData(a.prompt[3].extra_pnginfo.workflow,!0,!1),"outputs"in a&&a.outputs){Z.nodeOutputs={};for(const[s,r]of Object.entries(a.outputs)){const i=a.meta?.[s]?.display_node??s;Z.nodeOutputs[i]=r}}},"onclick")}),Ee("button",{textContent:o.name,onclick:n(async()=>{await o.cb(),await this.update()},"onclick")})])})])]),Ee("div.comfy-list-actions",[Ee("button",{textContent:"Clear "+this.#t,onclick:n(async()=>{await oe.clearItems(this.#e),await this.load()},"onclick")}),Ee("button",{textContent:"Refresh",onclick:n(()=>this.load(),"onclick")})]))}async update(){this.visible&&await this.load()}async show(){this.element.style.display="block",this.button.textContent="Close",await this.load()}hide(){this.element.style.display="none",this.button.textContent="View "+this.#t}toggle(){return this.visible?(this.hide(),!1):(this.show(),!0)}},dp=class{static{n(this,"ComfyUI")}app;dialog;settings;batchCount;lastQueueSize;queue;history;autoQueueMode;graphHasChanged;autoQueueEnabled;menuContainer;queueSize;restoreMenuPosition;loadFile;constructor(e){this.app=e,this.dialog=new cp,this.settings=new lp(e),this.batchCount=1,this.lastQueueSize=0,this.queue=new Iu("Queue"),this.history=new Iu("History","history",!0),oe.addEventListener("status",()=>{this.queue.update(),this.history.update()}),this.setup(document.body)}setup(e){const t=Ee("input",{id:"comfy-file-input",type:"file",accept:Py,style:{display:"none"},parent:document.body,onchange:n(async()=>{const o=t.files?.[0];o&&(await Z.handleFile(o,"file_button"),t.value="")},"onchange")});this.loadFile=()=>t.click();const a=up("autoQueueMode",[{text:"instant",tooltip:"A new prompt will be queued as soon as the queue reaches 0"},{text:"change",tooltip:"A new prompt will be queued when the queue is at 0 and the graph is/has changed"}],{onChange:n(o=>{this.autoQueueMode=o.item.value},"onChange")});a.style.display="none",oe.addEventListener("graphChanged",()=>{this.autoQueueMode==="change"&&this.autoQueueEnabled===!0&&(this.lastQueueSize===0?(this.graphHasChanged=!1,Z.queuePrompt(0,this.batchCount)):this.graphHasChanged=!0)}),this.menuContainer=Ee("div.comfy-menu.no-drag",{parent:e},[Ee("div.drag-handle.comfy-menu-header",{style:{overflow:"hidden",position:"relative",width:"100%",cursor:"default"}},[Ee("span.drag-handle"),Ee("span.comfy-menu-queue-size",{$:n(o=>this.queueSize=o,"$")}),Ee("div.comfy-menu-actions",[Ee("button.comfy-settings-btn",{textContent:"⚙️",onclick:n(()=>{pt().showSettingsDialog()},"onclick")}),Ee("button.comfy-close-menu-btn",{textContent:"×",onclick:n(()=>{Ra().focusMode=!0},"onclick")})])]),Ee("button.comfy-queue-btn",{id:"queue-button",textContent:"Queue Prompt",onclick:n(()=>{qe&&(yt()?.trackRunButton({trigger_source:"legacy_ui"}),yt()?.trackWorkflowExecution()),Z.queuePrompt(0,this.batchCount)},"onclick")}),Ee("div",{},[Ee("label",{innerHTML:"Extra options"},[Ee("input",{type:"checkbox",onchange:n(o=>{document.getElementById("extraOptions").style.display=o.srcElement.checked?"block":"none",this.batchCount=o.srcElement.checked?Number.parseInt(document.getElementById("batchCountInputRange").value):1,document.getElementById("autoQueueCheckbox").checked=!1,this.autoQueueEnabled=!1},"onchange")})])]),Ee("div",{id:"extraOptions",style:{width:"100%",display:"none"}},[Ee("div",[Ee("label",{innerHTML:"Batch count"}),Ee("input",{id:"batchCountInputNumber",type:"number",value:this.batchCount,min:"1",style:{width:"35%",marginLeft:"0.4em"},oninput:n(o=>{this.batchCount=o.target.value,document.getElementById("batchCountInputRange").value=this.batchCount.toString()},"oninput")}),Ee("input",{id:"batchCountInputRange",type:"range",min:"1",max:"100",value:this.batchCount,oninput:n(o=>{this.batchCount=o.srcElement.value,document.getElementById("batchCountInputNumber").value=o.srcElement.value},"oninput")})]),Ee("div",[Ee("label",{for:"autoQueueCheckbox",innerHTML:"Auto Queue"}),Ee("input",{id:"autoQueueCheckbox",type:"checkbox",checked:!1,title:"Automatically queue prompt when the queue size hits 0",onchange:n(o=>{this.autoQueueEnabled=o.target.checked,a.style.display=this.autoQueueEnabled?"":"none"},"onchange")}),a])]),Ee("div.comfy-menu-btns",[Ee("button",{id:"queue-front-button",textContent:"Queue Front",onclick:n(()=>{qe&&(yt()?.trackRunButton({trigger_source:"legacy_ui"}),yt()?.trackWorkflowExecution()),Z.queuePrompt(-1,this.batchCount)},"onclick")}),Ee("button",{$:n(o=>this.queue.button=o,"$"),id:"comfy-view-queue-button",textContent:"View Queue",onclick:n(()=>{this.history.hide(),this.queue.toggle()},"onclick")}),Ee("button",{$:n(o=>this.history.button=o,"$"),id:"comfy-view-history-button",textContent:"View History",onclick:n(()=>{this.queue.hide(),this.history.toggle()},"onclick")})]),this.queue.element,this.history.element,Ee("button",{id:"comfy-save-button",textContent:"Save",onclick:n(()=>{Pt().execute("Comfy.ExportWorkflow")},"onclick")}),Ee("button",{id:"comfy-dev-save-api-button",textContent:"Save (API Format)",style:{width:"100%",display:"none"},onclick:n(()=>{Pt().execute("Comfy.ExportWorkflowAPI")},"onclick")}),Ee("button",{id:"comfy-load-button",textContent:"Load",onclick:n(()=>t.click(),"onclick")}),Ee("button",{id:"comfy-refresh-button",textContent:"Refresh",onclick:n(()=>Z.refreshComboInNodes(),"onclick")}),Ee("button",{id:"comfy-clipspace-button",textContent:"Clipspace",onclick:n(()=>Z.openClipspace(),"onclick")}),Ee("button",{id:"comfy-clear-button",textContent:"Clear",onclick:n(()=>{(!Me().get("Comfy.ConfirmClear")||confirm("Clear workflow?"))&&(Z.clean(),Tt().resetView(),oe.dispatchCustomEvent("graphCleared"))},"onclick")}),Ee("button",{id:"comfy-load-default-button",textContent:"Load Default",onclick:n(async()=>{(!Me().get("Comfy.ConfirmClear")||confirm("Load default workflow?"))&&(Tt().resetView(),await Z.loadGraphData())},"onclick")}),Ee("button",{id:"comfy-reset-view-button",textContent:"Reset View",onclick:n(async()=>{Tt().resetView()},"onclick")})]),this.menuContainer.style.display="none",this.restoreMenuPosition=Dy(this.menuContainer),this.setStatus({exec_info:{queue_remaining:"X"}})}setStatus(e){this.queueSize.textContent="Queue size: "+(e?e.exec_info.queue_remaining:"ERR"),e&&(this.lastQueueSize!=0&&e.exec_info.queue_remaining==0&&this.autoQueueEnabled&&(this.autoQueueMode==="instant"||this.graphHasChanged)&&!Z.lastExecutionError&&(Z.queuePrompt(0,this.batchCount),e.exec_info.queue_remaining+=this.batchCount,this.graphHasChanged=!1),this.lastQueueSize=e.exec_info.queue_remaining)}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.ui=window.comfyAPI.ui||{};window.comfyAPI.ui.ComfyDialog=cp;window.comfyAPI.ui.$el=Ee;window.comfyAPI.ui.ComfyUI=dp;function pp(e){try{if(typeof structuredClone<"u")return structuredClone(e)}catch{}return JSON.parse(JSON.stringify(e))}n(pp,"clone$1");function Ly(e,t){return My(e.rootGraph,t)}n(Ly,"applyTextReplacements");async function Oy(e,t){return new Promise((a,o)=>{let s;e.endsWith(".js")?s=e.substr(0,e.length-2)+"css":s=new URL(e,t??`${window.location.protocol}//${window.location.host}`).toString(),Ee("link",{parent:document.head,rel:"stylesheet",type:"text/css",href:s,onload:a,onerror:o})})}n(Oy,"addStylesheet");function fp(e){return new Promise((t,a)=>{const o=document.createElement("input");o.type="file",o.accept=e,o.onchange=s=>{const r=s.target.files?.[0];if(!r)return a(new Error("No file selected"));t(r)},o.click()})}n(fp,"uploadFile$1");function Ft(e,t,a,o){let s;return Object.defineProperty(e,t,{get(){return s},set(r){const i=s;s=r,o?.(s,i,e,t)}}),a}n(Ft,"prop");function mp(e){const t=oe.clientId??oe.initialClientId;return(t&&sessionStorage.getItem(`${e}:${t}`))??localStorage.getItem(e)}n(mp,"getStorageValue");function gp(e,t){const a=oe.clientId??oe.initialClientId;a&&sessionStorage.setItem(`${e}:${a}`,t),localStorage.setItem(e,t)}n(gp,"setStorageValue");window.comfyAPI=window.comfyAPI||{};window.comfyAPI.utils=window.comfyAPI.utils||{};window.comfyAPI.utils.clone=pp;window.comfyAPI.utils.applyTextReplacements=Ly;window.comfyAPI.utils.addStylesheet=Oy;window.comfyAPI.utils.uploadFile=fp;window.comfyAPI.utils.prop=Ft;window.comfyAPI.utils.getStorageValue=mp;window.comfyAPI.utils.setStorageValue=gp;const Ny={node_slot:{BOOLEAN:"",CLIP:"#eacb8b",CLIP_VISION:"#A8DADC",CLIP_VISION_OUTPUT:"#ad7452",CONDITIONING:"#cf876f",CONTROL_NET:"#00d78d",CONTROL_NET_WEIGHTS:"",FLOAT:"",GLIGEN:"",IMAGE:"#80a1c0",IMAGEUPLOAD:"",INT:"",LATENT:"#b38ead",LATENT_KEYFRAME:"",MASK:"#a3bd8d",MODEL:"#8978a7",SAMPLER:"",SIGMAS:"",STRING:"",STYLE_MODEL:"#C2FFAE",T2I_ADAPTER_WEIGHTS:"",TAESD:"#DCC274",TIMESTEP_KEYFRAME:"",UPSCALE_MODEL:"",VAE:"#be616b"},litegraph_base:{BACKGROUND_IMAGE:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABcklEQVR4nO3YMUoDARgF4RfxBqZI6/0vZqFn0MYtrLIQMFN8U6V4LAtD+Jm9XG/v30OGl2e/AP7yevz4+vx45nvgF/+QGITEICQGITEIiUFIjNNC3q43u3/YnRJyPOzeQ+0e220nhRzReC8e7R7bbdvl+Jal1Bs46jEIiUFIDEJiEBKDkBhKPbZT6qHdptRTu02p53DUYxASg5AYhMQgJAYhMZR6bKfUQ7tNqad2m1LP4ajHICQGITEIiUFIDEJiKPXYTqmHdptST+02pZ7DUY9BSAxCYhASg5AYhMRQ6rGdUg/tNqWe2m1KPYejHoOQGITEICQGITEIiaHUYzulHtptSj2125R6Dkc9BiExCIlBSAxCYhASQ6nHdko9tNuUemq3KfUcjnoMQmIQEoOQGITEICSGUo/tlHpotyn11G5T6jkc9RiExCAkBiExCIlBSAylHtsp9dBuU+qp3abUczjqMQiJQUgMQmIQEoOQGITE+AHFISNQrFTGuwAAAABJRU5ErkJggg==",CLEAR_BACKGROUND_COLOR:"#2b2f38",NODE_TITLE_COLOR:"#b2b7bd",NODE_SELECTED_TITLE_COLOR:"#FFF",NODE_TEXT_SIZE:14,NODE_TEXT_COLOR:"#AAA",NODE_SUBTEXT_SIZE:12,NODE_DEFAULT_COLOR:"#2b2f38",NODE_DEFAULT_BGCOLOR:"#242730",NODE_DEFAULT_BOXCOLOR:"#6e7581",NODE_DEFAULT_SHAPE:2,NODE_BOX_OUTLINE_COLOR:"#FFF",NODE_BYPASS_BGCOLOR:"#FF00FF",NODE_ERROR_COLOUR:"#E00",DEFAULT_SHADOW_COLOR:"rgba(0,0,0,0.5)",DEFAULT_GROUP_FONT:22,WIDGET_BGCOLOR:"#2b2f38",WIDGET_OUTLINE_COLOR:"#6e7581",WIDGET_TEXT_COLOR:"#DDD",WIDGET_SECONDARY_TEXT_COLOR:"#b2b7bd",WIDGET_DISABLED_TEXT_COLOR:"#5c626d",LINK_COLOR:"#9A9",EVENT_LINK_COLOR:"#A86",CONNECTING_LINK_COLOR:"#AFA"},comfy_base:{"fg-color":"#fff","bg-color":"#2b2f38","comfy-menu-bg":"#242730","comfy-menu-secondary-bg":"#22252E","comfy-input-bg":"#2b2f38","input-text":"#ddd","descrip-text":"#b2b7bd","drag-text":"#ccc","error-text":"#ff4444","border-color":"#6e7581","tr-even-bg-color":"#2b2f38","tr-odd-bg-color":"#242730","content-bg":"#6e7581","content-fg":"#fff","content-hover-bg":"#2b2f38","content-hover-fg":"#fff","bar-shadow":"rgba(8, 8, 8, 0.75) 0 0 0.5rem"}};var $y={id:"arc",name:"Arc",colors:Ny};const Ry="dark",By="Dark (Default)",Fy={node_slot:{CLIP:"#FFD500",CLIP_VISION:"#A8DADC",CLIP_VISION_OUTPUT:"#ad7452",CONDITIONING:"#FFA931",CONTROL_NET:"#6EE7B7",IMAGE:"#64B5F6",LATENT:"#FF9CF9",MASK:"#81C784",MODEL:"#B39DDB",STYLE_MODEL:"#C2FFAE",VAE:"#FF6E6E",NOISE:"#B0B0B0",GUIDER:"#66FFFF",SAMPLER:"#ECB4B4",SIGMAS:"#CDFFCD",TAESD:"#DCC274"},litegraph_base:{BACKGROUND_IMAGE:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQBJREFUeNrs1rEKwjAUhlETUkj3vP9rdmr1Ysammk2w5wdxuLgcMHyptfawuZX4pJSWZTnfnu/lnIe/jNNxHHGNn//HNbbv+4dr6V+11uF527arU7+u63qfa/bnmh8sWLBgwYJlqRf8MEptXPBXJXa37BSl3ixYsGDBMliwFLyCV/DeLIMFCxYsWLBMwSt4Be/NggXLYMGCBUvBK3iNruC9WbBgwYJlsGApeAWv4L1ZBgsWLFiwYJmCV/AK3psFC5bBggULloJX8BpdwXuzYMGCBctgwVLwCl7Be7MMFixYsGDBsu8FH1FaSmExVfAxBa/gvVmwYMGCZbBg/W4vAQYA5tRF9QYlv/QAAAAASUVORK5CYII=",CLEAR_BACKGROUND_COLOR:"#141414",NODE_TITLE_COLOR:"#999",NODE_SELECTED_TITLE_COLOR:"#FFF",NODE_TEXT_SIZE:14,NODE_TEXT_COLOR:"#AAA",NODE_TEXT_HIGHLIGHT_COLOR:"#FFF",NODE_SUBTEXT_SIZE:12,NODE_DEFAULT_COLOR:"#333",NODE_DEFAULT_BGCOLOR:"#353535",NODE_DEFAULT_BOXCOLOR:"#666",NODE_DEFAULT_SHAPE:2,NODE_BOX_OUTLINE_COLOR:"#FFF",NODE_BYPASS_BGCOLOR:"#FF00FF",NODE_ERROR_COLOUR:"#E00",DEFAULT_SHADOW_COLOR:"rgba(0,0,0,0.5)",DEFAULT_GROUP_FONT:24,WIDGET_BGCOLOR:"#222",WIDGET_OUTLINE_COLOR:"#666",WIDGET_TEXT_COLOR:"#DDD",WIDGET_SECONDARY_TEXT_COLOR:"#999",WIDGET_DISABLED_TEXT_COLOR:"#666",LINK_COLOR:"#9A9",EVENT_LINK_COLOR:"#A86",CONNECTING_LINK_COLOR:"#AFA",BADGE_FG_COLOR:"#FFF",BADGE_BG_COLOR:"#0F1F0F"},comfy_base:{"fg-color":"#fff","bg-color":"#202020","comfy-menu-bg":"#171718","comfy-menu-secondary-bg":"#303030","comfy-input-bg":"#222","input-text":"#ddd","descrip-text":"#999","drag-text":"#ccc","error-text":"#ff4444","border-color":"#4e4e4e","tr-even-bg-color":"#222","tr-odd-bg-color":"#353535","content-bg":"#4e4e4e","content-fg":"#fff","content-hover-bg":"#222","content-hover-fg":"#fff","bar-shadow":"rgba(16, 16, 16, 0.5) 0 0 0.5rem"}};var dl={id:Ry,name:By,colors:Fy};const Uy="github",Wy="Github",zy={node_slot:{BOOLEAN:"",CLIP:"#eacb8b",CLIP_VISION:"#A8DADC",CLIP_VISION_OUTPUT:"#ad7452",CONDITIONING:"#cf876f",CONTROL_NET:"#00d78d",CONTROL_NET_WEIGHTS:"",FLOAT:"",GLIGEN:"",IMAGE:"#80a1c0",IMAGEUPLOAD:"",INT:"",LATENT:"#b38ead",LATENT_KEYFRAME:"",MASK:"#a3bd8d",MODEL:"#8978a7",SAMPLER:"",SIGMAS:"",STRING:"",STYLE_MODEL:"#C2FFAE",T2I_ADAPTER_WEIGHTS:"",TAESD:"#DCC274",TIMESTEP_KEYFRAME:"",UPSCALE_MODEL:"",VAE:"#be616b"},litegraph_base:{BACKGROUND_IMAGE:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmIyYzRhNjA5LWJmYTctYTg0MC1iOGFlLTk3MzE2ZjM1ZGIyNyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjk0ZmNlZGU4LTE1MTctZmQ0MC04ZGU3LWYzOTgxM2E3ODk5ZiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjIzMWIxMGIwLWI0ZmItMDI0ZS1iMTJlLTMwNTMwM2NkMDdjOCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MjMxYjEwYjAtYjRmYi0wMjRlLWIxMmUtMzA1MzAzY2QwN2M4IiBzdEV2dDp3aGVuPSIyMDIzLTExLTEzVDAwOjE4OjAyKzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ4OWY1NzlmLTJkNjUtZWQ0Zi04OTg0LTA4NGE2MGE1ZTMzNSIgc3RFdnQ6d2hlbj0iMjAyMy0xMS0xNVQwMjowNDo1OSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiMmM0YTYwOS1iZmE3LWE4NDAtYjhhZS05NzMxNmYzNWRiMjciIHN0RXZ0OndoZW49IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4OTe6GAAAAx0lEQVR42u3WMQoAIQxFwRzJys77X8vSLiRgITif7bYbgrwYc/mKXyBoY4VVBgsWLFiwYFmOlTv+9jfDOjHmr8u6eVkGCxYsWLBgmc5S8ApewXvgYRksWLBgKXidpeBdloL3wMOCBctgwVLwCl7BuyyDBQsWLFiwTGcpeAWv4D3wsAwWLFiwFLzOUvAuS8F74GHBgmWwYCl4Ba/gXZbBggULFixYprMUvIJX8B54WAYLFixYCl5nKXiXpeA98LBgwTJYsGC9tg1o8f4TTtqzNQAAAABJRU5ErkJggg==",CLEAR_BACKGROUND_COLOR:"#040506",NODE_TITLE_COLOR:"#999",NODE_SELECTED_TITLE_COLOR:"#e5eaf0",NODE_TEXT_SIZE:14,NODE_TEXT_COLOR:"#bcc2c8",NODE_SUBTEXT_SIZE:12,NODE_DEFAULT_COLOR:"#161b22",NODE_DEFAULT_BGCOLOR:"#13171d",NODE_DEFAULT_BOXCOLOR:"#30363d",NODE_DEFAULT_SHAPE:2,NODE_BOX_OUTLINE_COLOR:"#e5eaf0",NODE_BYPASS_BGCOLOR:"#FF00FF",NODE_ERROR_COLOUR:"#E00",DEFAULT_SHADOW_COLOR:"rgba(0,0,0,0.5)",DEFAULT_GROUP_FONT:24,WIDGET_BGCOLOR:"#161b22",WIDGET_OUTLINE_COLOR:"#30363d",WIDGET_TEXT_COLOR:"#bcc2c8",WIDGET_SECONDARY_TEXT_COLOR:"#999",WIDGET_DISABLED_TEXT_COLOR:"#30363d",LINK_COLOR:"#9A9",EVENT_LINK_COLOR:"#A86",CONNECTING_LINK_COLOR:"#AFA"},comfy_base:{"fg-color":"#e5eaf0","bg-color":"#161b22","comfy-menu-bg":"#13171d","comfy-menu-secondary-bg":"#11141A","comfy-input-bg":"#161b22","input-text":"#bcc2c8","descrip-text":"#999","drag-text":"#ccc","error-text":"#ff4444","border-color":"#30363d","tr-even-bg-color":"#161b22","tr-odd-bg-color":"#13171d","content-bg":"#30363d","content-fg":"#e5eaf0","content-hover-bg":"#161b22","content-hover-fg":"#e5eaf0","bar-shadow":"rgba(0, 0, 0, 1) 0 0 0.5rem"}};var Vy={id:Uy,name:Wy,colors:zy};const Gy="light",Hy="Light";const jy={node_slot:{CLIP:"#FFA726",CLIP_VISION:"#5C6BC0",CLIP_VISION_OUTPUT:"#8D6E63",CONDITIONING:"#EF5350",CONTROL_NET:"#66BB6A",IMAGE:"#42A5F5",LATENT:"#AB47BC",MASK:"#9CCC65",MODEL:"#7E57C2",STYLE_MODEL:"#D4E157",VAE:"#FF7043",NOISE:"#B0B0B0",GUIDER:"#66FFFF",SAMPLER:"#ECB4B4",SIGMAS:"#CDFFCD",TAESD:"#DCC274"},litegraph_base:{BACKGROUND_IMAGE:"data:image/gif;base64,R0lGODlhZABkALMAAAAAAP///+vr6+rq6ujo6Ofn5+bm5uXl5d3d3f///wAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAkALAAAAABkAGQAAAT/UMhJq7046827HkcoHkYxjgZhnGG6si5LqnIM0/fL4qwwIMAg0CAsEovBIxKhRDaNy2GUOX0KfVFrssrNdpdaqTeKBX+dZ+jYvEaTf+y4W66mC8PUdrE879f9d2mBeoNLfH+IhYBbhIx2jkiHiomQlGKPl4uZe3CaeZifnnijgkESBqipqqusra6vsLGys62SlZO4t7qbuby7CLa+wqGWxL3Gv3jByMOkjc2lw8vOoNSi0czAncXW3Njdx9Pf48/Z4Kbbx+fQ5evZ4u3k1fKR6cn03vHlp7T9/v8A/8Gbp4+gwXoFryXMB2qgwoMMHyKEqA5fxX322FG8tzBcRnMW/zlulPbRncmQGidKjMjyYsOSKEF2FBlJQMCbOHP6c9iSZs+UnGYCdbnSo1CZI5F64kn0p1KnTH02nSoV3dGTV7FFHVqVq1dtWcMmVQZTbNGu72zqXMuW7danVL+6e4t1bEy6MeueBYLXrNO5Ze36jQtWsOG97wIj1vt3St/DjTEORss4nNq2mDP3e7w4r1bFkSET5hy6s2TRlD2/mSxXtSHQhCunXo26NevCpmvD/UU6tuullzULH76q92zdZG/Ltv1a+W+osI/nRmyc+fRi1Xdbh+68+0vv10dH3+77KD/i6IdnX669/frn5Zsjh4/2PXju8+8bzc9/6fj27LFnX11/+IUnXWl7BJfegm79FyB9JOl3oHgSklefgxAC+FmFGpqHIYcCfkhgfCohSKKJVo044YUMttggiBkmp6KFXw1oII24oYhjiDByaKOOHcp3Y5BD/njikSkO+eBREQAAOw==",CLEAR_BACKGROUND_COLOR:"lightgray",NODE_TITLE_COLOR:"#222",NODE_SELECTED_TITLE_COLOR:"#000",NODE_TEXT_SIZE:14,NODE_TEXT_COLOR:"#444",NODE_TEXT_HIGHLIGHT_COLOR:"#1e293b",NODE_SUBTEXT_SIZE:12,NODE_DEFAULT_COLOR:"#F7F7F7",NODE_DEFAULT_BGCOLOR:"#F5F5F5",NODE_DEFAULT_BOXCOLOR:"#CCC",NODE_DEFAULT_SHAPE:2,NODE_BOX_OUTLINE_COLOR:"#000",NODE_BYPASS_BGCOLOR:"#FF00FF",NODE_ERROR_COLOUR:"#E00",DEFAULT_SHADOW_COLOR:"rgba(0,0,0,0.1)",DEFAULT_GROUP_FONT:24,WIDGET_BGCOLOR:"#D4D4D4",WIDGET_OUTLINE_COLOR:"#999",WIDGET_TEXT_COLOR:"#222",WIDGET_SECONDARY_TEXT_COLOR:"#555",WIDGET_DISABLED_TEXT_COLOR:"#999",LINK_COLOR:"#4CAF50",EVENT_LINK_COLOR:"#FF9800",CONNECTING_LINK_COLOR:"#2196F3",BADGE_FG_COLOR:"#000",BADGE_BG_COLOR:"#FFF"},comfy_base:{"fg-color":"#222","bg-color":"#DDD","comfy-menu-bg":"#FFFFFF","comfy-menu-hover-bg":"#ccc","comfy-menu-secondary-bg":"#EEE","comfy-input-bg":"#C9C9C9","input-text":"#222","descrip-text":"#444","drag-text":"#555","error-text":"#F44336","border-color":"#888","tr-even-bg-color":"#f9f9f9","tr-odd-bg-color":"#fff","content-bg":"#e0e0e0","content-fg":"#222","content-hover-bg":"#adadad","content-hover-fg":"#222","bar-shadow":"rgba(16, 16, 16, 0.25) 0 0 0.5rem","interface-panel-box-shadow":"1px 1px 8px 0 rgba(0, 0, 0, 0.2)","interface-panel-drop-shadow":"1px 1px 4px rgba(0, 0, 0, 0.4)","interface-panel-hover-surface":"var(--color-gray-200)","interface-panel-selected-surface":"color-mix(in srgb, var(--interface-panel-surface) 78%, var(--contrast-mix-color))","contrast-mix-color":"#000"}};var hp={id:Gy,name:Hy,light_theme:!0,colors:jy};const Ky="nord",Yy="Nord",qy={node_slot:{BOOLEAN:"",CLIP:"#eacb8b",CLIP_VISION:"#A8DADC",CLIP_VISION_OUTPUT:"#ad7452",CONDITIONING:"#cf876f",CONTROL_NET:"#00d78d",CONTROL_NET_WEIGHTS:"",FLOAT:"",GLIGEN:"",IMAGE:"#80a1c0",IMAGEUPLOAD:"",INT:"",LATENT:"#b38ead",LATENT_KEYFRAME:"",MASK:"#a3bd8d",MODEL:"#8978a7",SAMPLER:"",SIGMAS:"",STRING:"",STYLE_MODEL:"#C2FFAE",T2I_ADAPTER_WEIGHTS:"",TAESD:"#DCC274",TIMESTEP_KEYFRAME:"",UPSCALE_MODEL:"",VAE:"#be616b"},litegraph_base:{BACKGROUND_IMAGE:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFu2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjUwNDFhMmZjLTEzNzQtMTk0ZC1hZWY4LTYxMzM1MTVmNjUwMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMzFiMTBiMC1iNGZiLTAyNGUtYjEyZS0zMDUzMDNjZDA3YzgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyMzFiMTBiMC1iNGZiLTAyNGUtYjEyZS0zMDUzMDNjZDA3YzgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjIzMWIxMGIwLWI0ZmItMDI0ZS1iMTJlLTMwNTMwM2NkMDdjOCIgc3RFdnQ6d2hlbj0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDQxYTJmYy0xMzc0LTE5NGQtYWVmOC02MTMzNTE1ZjY1MDAiIHN0RXZ0OndoZW49IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz73jWg/AAAAyUlEQVR42u3WKwoAIBRFQRdiMb1idv9Lsxn9gEFw4Dbb8JCTojbbXEJwjJVL2HKwYMGCBQuWLbDmjr+9zrBGjHl1WVcvy2DBggULFizTWQpewSt4HzwsgwULFiwFr7MUvMtS8D54WLBgGSxYCl7BK3iXZbBgwYIFC5bpLAWv4BW8Dx6WwYIFC5aC11kK3mUpeB88LFiwDBYsBa/gFbzLMliwYMGCBct0loJX8AreBw/LYMGCBUvB6ywF77IUvA8eFixYBgsWrNfWAZPltufdad+1AAAAAElFTkSuQmCC",CLEAR_BACKGROUND_COLOR:"#212732",NODE_TITLE_COLOR:"#999",NODE_SELECTED_TITLE_COLOR:"#e5eaf0",NODE_TEXT_SIZE:14,NODE_TEXT_COLOR:"#bcc2c8",NODE_SUBTEXT_SIZE:12,NODE_DEFAULT_COLOR:"#2e3440",NODE_DEFAULT_BGCOLOR:"#161b22",NODE_DEFAULT_BOXCOLOR:"#545d70",NODE_DEFAULT_SHAPE:2,NODE_BOX_OUTLINE_COLOR:"#e5eaf0",NODE_BYPASS_BGCOLOR:"#FF00FF",NODE_ERROR_COLOUR:"#E00",DEFAULT_SHADOW_COLOR:"rgba(0,0,0,0.5)",DEFAULT_GROUP_FONT:24,WIDGET_BGCOLOR:"#2e3440",WIDGET_OUTLINE_COLOR:"#545d70",WIDGET_TEXT_COLOR:"#bcc2c8",WIDGET_SECONDARY_TEXT_COLOR:"#999",WIDGET_DISABLED_TEXT_COLOR:"#545d70",LINK_COLOR:"#9A9",EVENT_LINK_COLOR:"#A86",CONNECTING_LINK_COLOR:"#AFA"},comfy_base:{"fg-color":"#e5eaf0","bg-color":"#2e3440","comfy-menu-bg":"#161b22","comfy-menu-secondary-bg":"#14181F","comfy-input-bg":"#2e3440","input-text":"#bcc2c8","descrip-text":"#999","drag-text":"#ccc","error-text":"#ff4444","border-color":"#545d70","tr-even-bg-color":"#2e3440","tr-odd-bg-color":"#161b22","content-bg":"#545d70","content-fg":"#e5eaf0","content-hover-bg":"#2e3440","content-hover-fg":"#e5eaf0","bar-shadow":"rgba(0, 0, 0, 0.75) 0 0 0.5rem"}};var Xy={id:Ky,name:Yy,colors:qy};const Zy="solarized",Jy="Solarized",Qy={node_slot:{CLIP:"#2AB7CA",CLIP_VISION:"#6c71c4",CLIP_VISION_OUTPUT:"#859900",CONDITIONING:"#d33682",CONTROL_NET:"#d1ffd7",IMAGE:"#5940bb",LATENT:"#268bd2",MASK:"#CCC9E7",MODEL:"#dc322f",STYLE_MODEL:"#1a998a",UPSCALE_MODEL:"#054A29",VAE:"#facfad"},litegraph_base:{NODE_TITLE_COLOR:"#fdf6e3",NODE_SELECTED_TITLE_COLOR:"#A9D400",NODE_TEXT_SIZE:14,NODE_TEXT_COLOR:"#657b83",NODE_SUBTEXT_SIZE:12,NODE_DEFAULT_COLOR:"#094656",NODE_DEFAULT_BGCOLOR:"#073642",NODE_DEFAULT_BOXCOLOR:"#839496",NODE_DEFAULT_SHAPE:2,NODE_BOX_OUTLINE_COLOR:"#fdf6e3",NODE_BYPASS_BGCOLOR:"#FF00FF",NODE_ERROR_COLOUR:"#E00",DEFAULT_SHADOW_COLOR:"rgba(0,0,0,0.5)",DEFAULT_GROUP_FONT:24,WIDGET_BGCOLOR:"#002b36",WIDGET_OUTLINE_COLOR:"#839496",WIDGET_TEXT_COLOR:"#fdf6e3",WIDGET_SECONDARY_TEXT_COLOR:"#93a1a1",WIDGET_DISABLED_TEXT_COLOR:"#657b83",LINK_COLOR:"#2aa198",EVENT_LINK_COLOR:"#268bd2",CONNECTING_LINK_COLOR:"#859900"},comfy_base:{"fg-color":"#fdf6e3","bg-color":"#002b36","comfy-menu-bg":"#073642","comfy-menu-secondary-bg":"#06323D","comfy-input-bg":"#002b36","input-text":"#93a1a1","descrip-text":"#586e75","drag-text":"#839496","error-text":"#dc322f","border-color":"#657b83","tr-even-bg-color":"#002b36","tr-odd-bg-color":"#073642","content-bg":"#657b83","content-fg":"#fdf6e3","content-hover-bg":"#002b36","content-hover-fg":"#fdf6e3","bar-shadow":"rgba(16, 16, 16, 0.5) 0 0 0.5rem"}};var ew={id:Zy,name:Jy,colors:Qy};const Su={dark:dl,light:hp,solarized:ew,arc:$y,nord:Xy,github:Vy},tw=dl,aw=dl,ow=hp,za=Je("colorPalette",()=>{const e=A({}),t=A(tw.id),a=E(()=>({...Su,...e.value})),o=E(()=>Object.values(a.value)),s=E(()=>u(a.value[t.value])),r=n(c=>{if(c.id in a.value)throw new Error(`Palette with id ${c.id} already exists`);e.value[c.id]=c,t.value=c.id},"addCustomPalette"),i=n(c=>{if(!(c in e.value))throw new Error(`Palette with id ${c} does not exist`);delete e.value[c],t.value=Su.dark.id},"deleteCustomPalette"),l=n(c=>c in e.value,"isCustomPalette"),u=n(c=>{c.colors.comfy_base["comfy-menu-bg"]&&!c.colors.comfy_base["comfy-menu-secondary-bg"]&&(c.colors.comfy_base["comfy-menu-secondary-bg"]=c.colors.comfy_base["comfy-menu-bg"]);const d=c.light_theme?ow:aw;return{...c,colors:{...c.colors,node_slot:{...d.colors.node_slot,...c.colors.node_slot},litegraph_base:{...d.colors.litegraph_base,...c.colors.litegraph_base},comfy_base:{...d.colors.comfy_base,...c.colors.comfy_base}}}},"completePalette");return{customPalettes:e,activePaletteId:t,palettesLookup:a,palettes:o,completedActivePalette:s,isCustomPalette:l,addCustomPalette:r,deleteCustomPalette:i,completePalette:u}});var Pr={NODE_BOX_OUTLINE_COLOR:"component-node-border",NODE_DEFAULT_BGCOLOR:"component-node-background",NODE_DEFAULT_BOXCOLOR:"node-component-header-icon",NODE_DEFAULT_COLOR:"node-component-header-surface",NODE_TITLE_COLOR:"node-component-header",WIDGET_BGCOLOR:"component-node-widget-background",WIDGET_TEXT_COLOR:"component-node-foreground"};const vp=n(()=>{const e=za(),t=Me(),a=zt(),{wrapWithErrorHandling:o,wrapWithErrorHandlingAsync:s}=ta(),r=n(I=>{const w=wh.safeParse(I);if(w.success)return w.data;const x=Un(w.error);throw new Error(`Invalid color palette against zod schema:
|
|
4
4
|
${x}`)},"validateColorPalette"),i=n(async()=>{await t.set("Comfy.CustomColorPalettes",e.customPalettes)},"persistCustomColorPalettes"),l=n(async I=>{e.deleteCustomPalette(I),await i()},"deleteCustomColorPalette"),u=n(async I=>{r(I),e.addCustomPalette(I),await i()},"addCustomColorPalette"),c=n(I=>{const w=Object.fromEntries(Array.from(a.nodeDataTypes).map(x=>[x,""]));Object.assign(Z.canvas.default_connection_color_byType,w,I),Object.assign(va.link_type_colors,w,I)},"loadLinkColorPalette");function d(I){return I in Pr}n(d,"validThemeProp");function p(I){if(!I)return;const w=document.body?.style;if(w)for(const x of a.nodeDataTypes){const D=`color-datatype-${x}`,T=I[x];T?w.setProperty(`--${D}`,T):w.removeProperty(`--${D}`)}}n(p,"loadLinkColorPaletteForVueNodes");function f(I,w){if(!I)return;const x=document.body?.style;if(x)for(const D of Object.keys(Pr)){if(!d(D))continue;const T=Pr[D];if(w==="dark"||w==="light"){x.removeProperty(`--${T}`);continue}const N=I[D];N?x.setProperty(`--${T}`,N):x.removeProperty(`--${T}`)}}n(f,"loadLitegraphForVueNodes");const g=n(I=>{Z.canvas.node_title_color=I.NODE_TITLE_COLOR,Z.canvas.default_link_color=I.LINK_COLOR,t.get("Comfy.Canvas.BackgroundImage")?Z.canvas.clear_background_color="transparent":(Z.canvas.background_image=I.BACKGROUND_IMAGE,Z.canvas.clear_background_color=I.CLEAR_BACKGROUND_COLOR),Z.canvas._pattern=void 0;for(const[w,x]of Object.entries(I))Object.prototype.hasOwnProperty.call(Ne,w)&&(w==="NODE_DEFAULT_SHAPE"&&typeof x=="string"?(console.warn(`litegraph_base.NODE_DEFAULT_SHAPE only accepts [${[Ne.BOX_SHAPE,Ne.ROUND_SHAPE,Ne.CARD_SHAPE].join(", ")}] but got ${x}`),Ne.NODE_DEFAULT_SHAPE=Ne.ROUND_SHAPE):Ne[w]=x)},"loadLiteGraphColorPalette"),h=n(I=>{const w=[],x=I.shape;for(const[D,T]of Object.entries(x))(T instanceof U.ZodOptional||T instanceof U.ZodDefault)&&w.push(D);return w},"getOptionalKeys")(Sh),y=n(I=>{if(!I)return;const w=document.documentElement.style;for(const[D,T]of Object.entries(I))w.setProperty("--"+D,T);for(const D of h)D in I||w.setProperty("--"+D,`var(--palette-${D})`);const x=t.get("Comfy.Canvas.BackgroundImage");x?w.setProperty("--bg-img",`url('${x}') no-repeat center /cover`):w.removeProperty("--bg-img")},"loadComfyColorPalette"),k=n(async I=>{const w=e.palettesLookup[I];if(!w)throw new Error(`Color palette ${I} not found`);const x=e.completePalette(w);c(x.colors.node_slot),g(x.colors.litegraph_base),f(x.colors.litegraph_base,I),p(x.colors.node_slot),y(x.colors.comfy_base),Z.canvas.setDirty(!0,!0),e.activePaletteId=I},"loadColorPalette"),S=n(I=>{const w=e.palettesLookup[I];if(!w)throw new Error(`Color palette ${I} not found`);Ba(w.id+".json",new Blob([JSON.stringify(Et(w),null,2)],{type:"application/json"}))},"exportColorPalette"),_=n(async()=>{const I=await(await fp("application/json")).text(),w=JSON.parse(I);return await u(w),w},"importColorPalette");return{getActiveColorPalette:n(()=>e.completedActivePalette,"getActiveColorPalette"),addCustomColorPalette:s(u),deleteCustomColorPalette:s(l),loadColorPalette:s(k),exportColorPalette:o(S),importColorPalette:s(_)}},"useColorPaletteService");var nw=class{static{n(this,"LegacyMenuCompat")}originalMethods=new Map;hasWarned=new Set;currentExtension=null;isExtracting=!1;wrapperMethods=new Map;preWrapperMethods=new Map;wrapperInstalled=new Map;setCurrentExtension(e){this.currentExtension=e}registerWrapper(e,t,a,o){this.wrapperMethods.set(e,t),this.preWrapperMethods.set(e,a);const s=o&&o[e]===t;this.wrapperInstalled.set(e,!!s)}install(e,t){const a=e[t];this.originalMethods.set(t,a);let o=a;Object.defineProperty(e,t,{get(){return o},set:n(s=>{if(!s)return;const r=`${t}:${s.toString().slice(0,100)}`;!this.hasWarned.has(r)&&this.currentExtension&&(this.hasWarned.add(r),console.warn(`%c[DEPRECATED]%c Monkey-patching ${t} is deprecated. (Extension: "${this.currentExtension}")
|
|
5
5
|
Please use the new context menu API instead.
|
|
@@ -7,7 +7,7 @@ Please use the new context menu API instead.
|
|
|
7
7
|
See: https://docs.comfy.org/custom-nodes/js/context-menu-migration`,"color: orange; font-weight: bold","color: inherit")),o=s},"set")})}extractLegacyItems(e,t,...a){if(this.isExtracting)return[];const o=this.originalMethods.get(e);if(!o)return[];try{this.isExtracting=!0;const s=o.apply(t,a);if(!s)return[];const r=t.constructor.prototype[e];if(!r||r===o)return[];const i=this.wrapperMethods.get(e);if(i&&r===i)return[];const l=this.preWrapperMethods.get(e),u=this.wrapperInstalled.get(e),c=(l&&u&&r!==l?l:r).apply(t,a);if(!c)return[];const d=new Set(s),p=c.filter(g=>!d.has(g)),f=c.filter(g=>d.has(g)).length;return f<s.length&&console.warn(`[Context Menu Compat] Monkey patch for ${e} removed ${s.length-f} original menu item(s). This may cause unexpected behavior.`),p}catch(s){return console.error("[Context Menu Compat] Failed to extract legacy items:",s),[]}finally{this.isExtracting=!1}}};const Dr=new nw,sw=[[[],["Comfy.NewBlankWorkflow"]],[[],[]],[["File"],["Comfy.OpenWorkflow"]],[["File"],["Comfy.SaveWorkflow","Comfy.SaveWorkflowAs","Comfy.ExportWorkflow","Comfy.ExportWorkflowAPI"]],[["Edit"],["Comfy.Undo","Comfy.Redo"]],[["Edit"],["Comfy.ClearWorkflow"]],[["Edit"],["Comfy.OpenClipspace"]],[["Edit"],["Comfy.RefreshNodeDefinitions",...qe?[]:["Comfy.Memory.UnloadModels","Comfy.Memory.UnloadModelsAndExecutionCache"]]],[["View"],[]],[["Help"],["Comfy.Help.OpenComfyUIIssues","Comfy.Help.OpenComfyUIDocs","Comfy.Help.OpenComfyOrgDiscord","Comfy.Help.OpenComfyUIForum"]],[["Help"],["Comfy.Help.AboutComfyUI","Comfy.ContactSupport"]]],yp=Je("menuItem",()=>{const e=gt(),t=Pt(),a=A([]),o=A({}),s=A(!1);Mt(()=>e.linearMode,()=>s.value=!0,{immediate:!0,once:!0});const r=n((c,d)=>{let p=a.value;for(let g=0;g<c.length;g++){const m=c[g];let h=p.find(y=>y.label===m);h||(h={label:m,key:m,items:[]},p.push(h)),h.items||(h.items=[]),p=h.items}p.length>0&&p.push({separator:!0}),p.push(...d);const f=c.join(".");o.value[f]||(o.value[f]=d.some(g=>g.comfyCommand?.active))},"registerMenuGroup"),i=n((c,d)=>{r(c,d.map(p=>t.getCommand(p)).map(p=>({command:n(()=>t.execute(p.id),"command"),label:p.menubarLabel,icon:p.icon,tooltip:p.tooltip,comfyCommand:p,parentPath:c.join(".")})))},"registerCommands");return{menuItems:a,registerMenuGroup:r,registerCommands:i,loadExtensionMenuCommands:n(c=>{if(!c.menuCommands)return;const d=new Set(c.commands?.map(p=>p.id)??[]);c.menuCommands.forEach(p=>{const f=p.commands.filter(g=>d.has(g));f.length&&i(p.path,f)})},"loadExtensionMenuCommands"),registerCoreMenuCommands:n(()=>{for(const[c,d]of sw)i(c,d)},"registerCoreMenuCommands"),menuItemHasActiveStateChildren:o,hasSeenLinear:s}});var rw=!1;function wp(e,t){e.widgets??=[];const{widget:a}=t;a&&e.widgets.some(o=>o.name===a.name)||(e.widgets.push({draw(o,s,r,i){o.save(),o.fillStyle=Ne.NODE_TEXT_COLOR,o.fillText(t.label??t.name,20,i+15),o.restore()},name:t.name,options:{},serialize:!1,type:"shim",y:0}),t.alwaysVisible=!0,t.widget={name:t.name})}n(wp,"ensureWidgetForInput");function iw(e,t,a,o,s){const{addNodeInput:r}=Tt(),i=Sy.safeParse(a);if(!i.success)throw new Error("invalid DynamicCombo spec");const l=i.data,u=Object.fromEntries(l[1].options.map(({key:y,inputs:k})=>[y,k])),c=[Object.keys(u),{}],{widget:d,minWidth:p,minHeight:f}=Z.widgets.COMBO(e,t,c,o,s);function g(y){return y.name.startsWith(t+".")}n(g,"isInGroup");const m=n(y=>{if(!e.widgets)throw new Error("Not Reachable");const k=y?u[y]:void 0,S=Rs(e.inputs,g);for(const T of Rs(e.widgets,g))T.onRemove?.();if(!k)return;const _=e.widgets.findIndex(T=>T===d)+1,I=e.widgets.length,w=e.inputs.length;if(_===0)throw new Error("Dynamic widget doesn't exist on node");[k.required,k.optional].forEach((T,N)=>{for(const M in T??{}){const O=`${d.name}.${M}`,L=ko(T[M],{name:O,isOptional:N!==0});L.display_name=M,r(e,L);const F=e.inputs.slice(w).filter(K=>K.name.startsWith(O));for(const K of F);}});const x=e.inputs.findIndex(T=>T.name===d.name)+1,D=e.widgets.splice(I);if(e.widgets.splice(_,0,...D),x===0){if(D.length===0&&e.inputs.length!==w)throw new Error("Failed to find input socket for "+d.name);return}In(e,x,0,...In(e,w).map(T=>{const N=e.inputs.findIndex(M=>T.name===M.name);return N===-1?T:In(e,N,1)[0]}));for(const T of S){const N=e.inputs.findIndex(M=>M.name===T.name);if(N===-1)e.inputs.push(T),e.removeInput(e.inputs.length-1);else{if(e.inputs[N].link=T.link,!T.link)continue;const M=e.graph?.links?.[T.link];if(!M)continue;M.target_slot=N,e.onConnectionsChange?.(Ne.INPUT,N,!0,M,e.inputs[N])}}e.size[1]=e.computeSize([...e.size])[1],e.graph&&(e._setConcreteSlots(),e.arrange(),Z.canvas?.setDirty(!0,!0))},"updateWidgets");let h=d.value;return Object.defineProperty(d,"value",{get(){return h},set(y){h=y,m(y)}}),d.value=h,{widget:d,minWidth:p,minHeight:f}}n(iw,"dynamicComboWidget");const lw={COMFY_DYNAMICCOMBO_V3:iw};var Eu={COMFY_AUTOGROW_V3:yw,COMFY_MATCHTYPE_V3:pw};function uw(e,t){return t.type in Eu?(Eu[t.type](e,t),!0):!1}n(uw,"applyDynamicInputs");function In(e,t,a=-1,...o){if(a<0)return e.inputs.splice(t);const s=e.inputs.splice(t,a,...o);return e.inputs.slice(t).forEach((r,i)=>{const l=r.link&&e.graph?.links?.get(r.link);l&&(l.target_slot=t+i)}),s}n(In,"spliceInputs");function cw(e,t,a){if(t.type!==a&&(t.type=a,!!e.graph))for(const o of t.links??[]){const s=e.graph.links[o];if(!s)continue;const{input:r,inputNode:i,subgraphOutput:l}=s.resolve(e.graph),u=(r??l)?.type;if(!u)continue;const c=Ne.isValidConnection(a,u);!c&&l?l.disconnect():!c&&i&&i.disconnectInput(s.target_slot),r&&i?.onConnectionsChange&&i.onConnectionsChange(Ne.INPUT,s.target_slot,c,s,r)}}n(cw,"changeOutputType");function dw(e){if(e.comfyDynamic?.matchType)return;e.comfyDynamic??={},e.comfyDynamic.matchType={};const t=e.constructor.nodeData?.output_matchtypes;e.onConnectionsChange=Fa(e.onConnectionsChange,function(a,o,s,r){const i=this.inputs[o];if(a!==Ne.INPUT||!this.graph||!i)return;const[l,u]=Object.entries(this.comfyDynamic.matchType).find(([,f])=>i.name in f)??["",void 0];if(!u)return;if(s&&r){const{output:f,subgraphInput:g}=r.resolve(this.graph),m=(f??g)?.type;m&&(r.type=m)}const c=e.inputs.filter(f=>f.name in u),d=c.map(f=>{if(!f.link)return"*";const g=this.graph.links[f.link];if(!g)return"*";const{output:m,subgraphInput:h}=g.resolve(this.graph);return(m??h)?.type??"*"});c.forEach((f,g)=>{const m=Ql(...d.slice(0,g),...d.slice(g+1),u[f.name]);if(!m)throw new Error("invalid connection");f.type=m});const p=Ql(...d);if(!p)throw new Error("invalid connection");this.outputs.forEach((f,g)=>{t?.[g]==l&&cw(this,f,p)}),Z.canvas?.setDirty(!0,!0)})}n(dw,"withComfyMatchType");function pw(e,t){const{addNodeInput:a}=Tt(),o=t.name,{allowed_types:s,template_id:r}=t.template;a(e,{...t,type:s}),dw(e),e.comfyDynamic.matchType[r]??={},e.comfyDynamic.matchType[r][o]=s;const i=e.inputs.length-1;requestAnimationFrame(()=>{const l=e.inputs.at(i);e.onConnectionsChange?.(Ne.INPUT,i,!!l.link,l.link?e.graph?.links?.[l.link]:void 0,l)})}n(pw,"applyMatchType");function fw(e,t,a,o){const{names:s,prefix:r="",inputSpecs:i}=o.comfyDynamic.autogrow[a],l=s?s[e]:(i.length==1?r:t)+e;return{name:`${a}.${l}`,display_name:l}}n(fw,"autogrowOrdinalToName");function bp(e,t,a){const{addNodeInput:o}=Tt(),{max:s,min:r,inputSpecs:i}=a.comfyDynamic.autogrow[t];if(e>=s)return;const l=i.map(c=>({...c,isOptional:e>=(r??0)||c.isOptional,...fw(e,c.name,t,a)})).filter(c=>!a.inputs.some(d=>d.name===c.name)).map(c=>{o(a,c);const d=In(a,a.inputs.length-1,1)[0];return(i.length!==1||rw)&&wp(a,d),d}),u=a.inputs.findLastIndex(c=>c.name.startsWith(t));In(a,u===-1?a.inputs.length:u+1,0,...l),Z.canvas?.setDirty(!0,!0)}n(bp,"addAutogrowGroup");var mw=/\d+$/;function gi(e,t,a){const o=e.slice(t.length+1),{names:s}=a.comfyDynamic.autogrow[t];if(s){const l=s.findIndex(u=>u===o);return l===-1?void 0:l}const r=o.match(mw);if(!r)return;const i=parseInt(r[0]);return i!==i?void 0:i}n(gi,"resolveAutogrowOrdinal");function gw(e,t){const a=t.inputs[e],o=a.name.slice(0,a.name.lastIndexOf(".")),s=t.inputs.findLast(i=>i.name.startsWith(o)),r=gi(a.name,o,t);!s||r==null||r!==gi(s.name,o,t)||bp(r+1,o,t)}n(gw,"autogrowInputConnected");function hw(e,t){const a=t.inputs[e];if(!a)return;const o=a.name.slice(0,a.name.lastIndexOf(".")),{min:s=1,inputSpecs:r}=t.comfyDynamic.autogrow[o],i=gi(a.name,o,t);if(i==null||i+1<s)return;const l=t.inputs.filter(f=>f.name.startsWith(o+".")&&f.name.lastIndexOf(".")===o.length),u=r.length;if(l.length%u!==0){console.error("Failed to group multi-input autogrow inputs");return}Z.canvas?.setDirty(!0,!0);for(let f=0;f<u;f++){for(let m=i*u+f;m+u<l.length;m+=u){const h=l[m];if(h.link=l[m+u].link,!h.link)continue;const y=t.graph?.links[h.link];if(!y)continue;const k=t.inputs.findIndex(S=>S===h);if(k===-1)throw new Error("missing input");y.target_slot=k}const g=l.at(f-u);g&&(g.link=null)}const c=l.slice((s-1)*u);let d;for(d=c.length-u;d>=0&&!c.slice(d,d+u).some(f=>f.link);d-=u);const p=c.slice(d+u*2);Rs(t.inputs,f=>p.includes(f));for(const f of p){const g=f?.widget?.name;if(g)for(const m of Rs(t.widgets,h=>h.name===g))m.onRemove?.()}t.size[1]=t.computeSize([...t.size])[1]}n(hw,"autogrowInputDisconnected");function vw(e){if(e.comfyDynamic?.autogrow)return;e.comfyDynamic??={},e.comfyDynamic.autogrow={};let t,a=!1;const o=e.onConnectInput;e.onConnectInput=function(s,...r){return t=s,requestAnimationFrame(()=>t=void 0),o?.apply(this,[s,...r])??!0},e.onConnectionsChange=Fa(e.onConnectionsChange,function(s,r,i,l){const u=this.inputs[r];if(s!==Ne.INPUT||!u)return;const c=u.name.slice(0,u.name.lastIndexOf("."));if(this.comfyDynamic.autogrow[c])if(Z.configuringGraph&&u.widget&&wp(e,u),i&&l){if(a||!l)return;gw(r,this)}else{if(t===r){a=!0,requestAnimationFrame(()=>a=!1);return}requestAnimationFrame(()=>hw(r,this))}})}n(vw,"withComfyAutogrow");function yw(e,t){vw(e);const a=Iy.safeParse(t);if(!a.success)throw new Error("invalid Autogrow spec");const{input:o,min:s=1,names:r,prefix:i,max:l=100}=a.data.template,u=[o.required,o.optional].flatMap((c,d)=>Object.entries(c??{}).map(([p,f])=>ko(f,{name:p,isOptional:d===1})));e.comfyDynamic.autogrow[t.name]={names:r,min:s,max:r?.length??l,prefix:i,inputSpecs:u};for(let c=0;c<s;c++)bp(c,t.name,e)}n(yw,"applyAutogrow");var ww=ep.extend({type:U.literal("INT"),name:U.string(),isOptional:U.boolean().optional()}),bw=tp.extend({type:U.literal("FLOAT"),name:U.string(),isOptional:U.boolean().optional()}),_w=ap.extend({type:U.literal("BOOLEAN"),name:U.string(),isOptional:U.boolean().optional()}),kw=op.extend({type:U.literal("STRING"),name:U.string(),isOptional:U.boolean().optional()}),Cw=il.extend({type:U.literal("COMBO"),name:U.string(),isOptional:U.boolean().optional()}),xw=Nt.extend({type:U.literal("COLOR"),name:U.string(),isOptional:U.boolean().optional(),options:U.object({default:U.string().optional()}).optional()}),Iw=Nt.extend({type:U.literal("IMAGE"),name:U.string(),isOptional:U.boolean().optional(),options:U.record(U.unknown()).optional()}),Sw=Nt.extend({type:U.literal("IMAGECOMPARE"),name:U.string(),isOptional:U.boolean().optional(),options:U.record(U.unknown()).optional()}),Ew=Nt.extend({type:U.literal("BOUNDINGBOX"),name:U.string(),isOptional:U.boolean().optional(),component:U.enum(["ImageCrop"]).optional(),default:U.object({x:U.number(),y:U.number(),width:U.number(),height:U.number()}).optional()}),Tw=Nt.extend({type:U.literal("MARKDOWN"),name:U.string(),isOptional:U.boolean().optional(),options:U.object({content:U.string().optional()}).optional()}),Aw=Nt.extend({type:U.literal("CHART"),name:U.string(),isOptional:U.boolean().optional(),options:U.object({type:U.enum(["bar","line"]).optional(),data:U.object({}).optional()}).optional()}),Mw=Nt.extend({type:U.literal("GALLERIA"),name:U.string(),isOptional:U.boolean().optional(),options:U.object({images:U.array(U.string()).optional()}).optional()}),Pw=Nt.extend({type:U.literal("TEXTAREA"),name:U.string(),isOptional:U.boolean().optional(),options:U.object({rows:U.number().optional(),cols:U.number().optional(),default:U.string().optional()}).optional()}),Dw=Nt.extend({type:U.string(),name:U.string(),isOptional:U.boolean().optional()}),Lw=U.union([ww,bw,_w,kw,Cw,xw,Iw,Sw,Ew,Tw,Aw,Mw,Pw,Dw]),Ow=U.object({index:U.number(),name:U.string(),type:U.string(),is_list:U.boolean(),options:U.array(U.any()).optional(),tooltip:U.string().optional()});const W8=U.object({inputs:U.record(Lw),outputs:U.array(Ow),hidden:U.record(U.any()).optional(),name:U.string(),display_name:U.string(),description:U.string(),help:U.string().optional(),category:U.string(),output_node:U.boolean(),python_module:U.string(),deprecated:U.boolean().optional(),experimental:U.boolean().optional(),api_node:U.boolean().optional()}),Nw=n(e=>e.type==="INT","isIntInputSpec"),$w=n(e=>e.type==="FLOAT","isFloatInputSpec"),Rw=n(e=>e.type==="BOOLEAN","isBooleanInputSpec"),Bw=n(e=>e.type==="STRING","isStringInputSpec"),Fw=n(e=>e.type==="COMBO","isComboInputSpec"),Uw=n(e=>e.type==="CHART","isChartInputSpec"),_p=n(()=>n((t,a)=>{if(!Rw(a))throw new Error(`Invalid input data: ${a}`);const o=a.default??!1,s={on:a.label_on,off:a.label_off};return t.addWidget("toggle",a.name,o,()=>{},s)},"widgetConstructor"),"useBooleanWidget");function Ww(e){return e.type==="boundingbox"||e.type==="imagecrop"}n(Ww,"isBoundingBoxLikeWidget");function zw(e){return e.type==="number"}n(zw,"isNumericWidget");const Vw=n(()=>(e,t)=>{const a=t,{name:o,component:s}=a,r=a.default??{x:0,y:0,width:512,height:512},i=s==="ImageCrop"?"imagecrop":"boundingbox",l=["x","y","width","height"],u=[],c=e.addWidget(i,o,{...r},null,{serialize:!0,canvasOnly:!1});if(!Ww(c))throw new Error(`Unexpected widget type: ${c.type}`);const d=c;d.callback=()=>{for(let p=0;p<l.length;p++){const f=l[p],g=u[p];g&&(g.value=d.value[f])}};for(const p of l){const f=e.addWidget("number",p,r[p],function(g){this.value=Math.round(g),d.value[p]=this.value,d.callback?.(d.value)},{min:p==="width"||p==="height"?1:0,max:8192,step:10,step2:1,precision:0,serialize:!1,canvasOnly:!0});if(!zw(f))throw new Error(`Unexpected widget type: ${f.type}`);u.push(f)}return d.linkedWidgets=u,d},"useBoundingBoxWidget"),Gw=n(()=>(e,t)=>{if(!Uw(t))throw new Error("Invalid input spec for chart widget");const{name:a,options:o={}}=t,s=o.type||"line";return e.addWidget("chart",a,o.data||{},()=>{},{serialize:!0,type:s,...o})},"useChartWidget"),Hw=n(()=>(e,t)=>{const{name:a,options:o}=t,s=o?.default||"#000000";return e.addWidget("color",a,s,()=>{},{serialize:!0})},"useColorWidget");var jw=J({__name:"MultiSelectWidget",props:_t({widget:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=rt(e,"modelValue"),a=e.widget.inputSpec,o=a.options??[],s=a.multi_select?.placeholder??"Select items",r=a.multi_select?.chip?"chip":"comma";return(i,l)=>(C(),P("div",null,[R(b(pd),{modelValue:t.value,"onUpdate:modelValue":l[0]||(l[0]=u=>t.value=u),options:b(o),filter:"",placeholder:b(s),"max-selected-labels":3,display:b(r),class:"w-full",pt:{dropdownIcon:"text-button-icon"}},null,8,["modelValue","options","placeholder","display"])]))}}),Kw=jw,Yw=J({__name:"SearchFilterChip",props:{text:{},badge:{},badgeClass:{}},emits:["remove"],setup(e){return(t,a)=>(C(),X(b(fd),{removable:"",onRemove:a[0]||(a[0]=o=>t.$emit("remove",o))},{default:W(()=>[R(b(dd),{size:"small",class:pe(t.badgeClass)},{default:W(()=>[fe($(t.badge),1)]),_:1},8,["class"]),fe(" "+$(t.text),1)]),_:1}))}}),qw=ot(Yw,[["__scopeId","data-v-1adce2e7"]]),Xw={key:0,class:"search-filters flex flex-wrap gap-2 pt-2"},Zw=J({__name:"SearchBox",props:_t({placeholder:{default:"Search..."},icon:{default:"pi pi-search"},debounceTime:{default:300},filterIcon:{},filters:{default:n(()=>[],"default")},autofocus:{type:Boolean,default:!1},showBorder:{type:Boolean,default:!1},size:{default:"md"},class:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:_t(["search","showFilter","removeFilter"],["update:modelValue"]),setup(e,{expose:t,emit:a}){const o=a,s=rt(e,"modelValue"),r=A();t({focus:n(()=>{r.value?.$el?.focus()},"focus")}),Ed(s,l=>{o("search",l,e.filters)},{debounce:e.debounceTime});const i=E(()=>{if(e.showBorder)return Pe("rounded p-2 border border-solid border-border-default");const l={md:"h-8 px-2 py-1.5",lg:"h-10 px-4 py-2"}[e.size];return Pe("rounded-lg",l)});return(l,u)=>(C(),P(Se,null,[v("div",{class:pe(b(Pe)("relative flex w-full items-center gap-2 bg-comfy-input cursor-text text-comfy-input-foreground",e.class,i.value))},[R(b(ca),{ref_key:"inputRef",ref:r,modelValue:s.value,"onUpdate:modelValue":u[0]||(u[0]=c=>s.value=c),placeholder:l.placeholder,autofocus:l.autofocus,unstyled:"",class:"absolute inset-0 size-full pl-11 border-none outline-none bg-transparent text-sm","aria-label":l.placeholder},null,8,["modelValue","placeholder","autofocus","aria-label"]),l.filterIcon?(C(),X(se,{key:0,size:"icon",variant:"textonly",class:"filter-button absolute right-0 inset-y-0 m-0 p-0",onClick:u[1]||(u[1]=c=>l.$emit("showFilter",c))},{default:W(()=>[v("i",{class:pe(l.filterIcon)},null,2)]),_:1})):H("",!0),s.value?H("",!0):(C(),X(b(ud),{key:1,class:pe(l.icon)},null,8,["class"])),s.value?(C(),X(se,{key:2,class:"clear-button absolute left-0",variant:"textonly",size:"icon",onClick:u[2]||(u[2]=c=>s.value="")},{default:W(()=>u[3]||(u[3]=[v("i",{class:"icon-[lucide--x] size-4"},null,-1)])),_:1})):H("",!0)],2),l.filters?.length?(C(),P("div",Xw,[(C(!0),P(Se,null,Ze(l.filters,c=>(C(),X(qw,{key:c.id,text:c.text,badge:c.badge,"badge-class":c.badgeClass,onRemove:n(d=>l.$emit("removeFilter",c),"onRemove")},null,8,["text","badge","badge-class","onRemove"]))),128))])):H("",!0)],64))}}),Ao=ot(Zw,[["__scopeId","data-v-0c8505a3"]]);const pl=Symbol();var Jw={class:"base-widget-layout rounded-2xl overflow-hidden relative"},Qw={class:"flex h-full w-full"},eb={class:"flex-1 flex bg-base-background"},tb={class:"flex h-full w-full flex-col"},ab={key:0,class:"w-full h-18 px-6 flex items-center justify-between gap-2"},ob={class:"flex flex-1 shrink-0 gap-2"},nb={class:"flex min-h-0 flex-1 flex-col"},sb={key:0,class:"text-xxl m-0 px-6 pt-2 pb-6 capitalize"},rb={class:"min-h-0 flex-1 px-6 pt-0 pb-10 overflow-y-auto scrollbar-custom"},ib={key:0,class:"w-1/4 min-w-40 max-w-80 pt-16 pb-8"},lb=J({__name:"BaseModalLayout",props:_t({contentTitle:{}},{rightPanelOpen:{type:Boolean,default:!1},rightPanelOpenModifiers:{}}),emits:["update:rightPanelOpen"],setup(e){const t=rt(e,"rightPanelOpen"),a={md:880},o={width:"w-1/3",minWidth:"min-w-40",maxWidth:"max-w-56"},s=pg(),r=Ma(pl,()=>{}),i=Id(a).greater("md"),l=A(!0),u=A(!1),c=E(()=>!!s.rightPanel);be(i,g=>{g||(u.value=!1)});const d=E(()=>i.value?l.value:u.value),p=n(()=>{i.value?l.value=!l.value:u.value=!u.value},"toggleLeftPanel"),f=n(()=>{t.value=!t.value},"toggleRightPanel");return(g,m)=>(C(),P("div",Jw,[ze(R(se,{size:"lg",class:pe(b(Pe)("absolute top-4 right-18 z-10","transition-opacity duration-200",{"opacity-0 pointer-events-none":t.value||!c.value})),onClick:f},{default:W(()=>m[0]||(m[0]=[v("i",{class:"icon-[lucide--panel-right]"},null,-1)])),_:1},8,["class"]),[[_o,!t.value&&c.value]]),R(se,{size:"lg",class:"absolute top-4 right-6 z-10 transition-opacity duration-200 w-10",onClick:b(r)},{default:W(()=>m[1]||(m[1]=[v("i",{class:"pi pi-times"},null,-1)])),_:1},8,["onClick"]),v("div",Qw,[R(Zg,{name:"slide-panel"},{default:W(()=>[g.$slots.leftPanel&&d.value?(C(),P("nav",{key:0,class:pe([o.width,o.minWidth,o.maxWidth])},[tt(g.$slots,"leftPanel",{},void 0,!0)],2)):H("",!0)]),_:3}),v("div",eb,[v("div",tb,[g.$slots.header?(C(),P("header",ab,[v("div",ob,[b(i)?H("",!0):(C(),X(se,{key:0,size:"icon",onClick:p},{default:W(()=>[v("i",{class:pe(b(Pe)(d.value?"icon-[lucide--panel-left]":"icon-[lucide--panel-left-close]"))},null,2)]),_:1})),tt(g.$slots,"header",{},void 0,!0)]),tt(g.$slots,"header-right-area",{},void 0,!0),v("div",{class:pe(b(Pe)("flex justify-end gap-2 w-0",c.value&&!t.value?"min-w-22":"min-w-10"))},[t.value&&c.value?(C(),X(se,{key:0,size:"lg",onClick:f},{default:W(()=>m[2]||(m[2]=[v("i",{class:"icon-[lucide--panel-right-close]"},null,-1)])),_:1})):H("",!0)],2)])):H("",!0),v("main",nb,[tt(g.$slots,"contentFilter",{},void 0,!0),g.$slots.leftPanel?H("",!0):(C(),P("h2",sb,$(g.contentTitle),1)),v("div",rb,[tt(g.$slots,"content",{},void 0,!0)])])]),c.value&&t.value?(C(),P("aside",ib,[tt(g.$slots,"rightPanel",{},void 0,!0)])):H("",!0)])])]))}}),kp=ot(lb,[["__scopeId","data-v-d16cf54a"]]),ub=J({__name:"NavIcon",props:{icon:{}},setup(e){return(t,a)=>(C(),P("i",{class:pe([t.icon,"text-neutral text-sm shrink-0"])},null,2))}}),cb=ub,db={key:0,class:"pt-0.5"},pb={key:1,class:"text-neutral icon-[lucide--folder] text-xs shrink-0"},fb=J({__name:"NavItem",props:{icon:{},active:{type:Boolean},onClick:{type:Function}},setup(e){const t=A(null),a=A(!1),o=n(()=>{t.value&&(a.value=t.value.scrollWidth>t.value.clientWidth+1)},"checkOverflow"),s=E(()=>t.value?.textContent??"");return(r,i)=>{const l=ht("tooltip");return ze((C(),P("div",{class:pe(["flex cursor-pointer items-start gap-2 rounded-md px-4 py-3 text-sm transition-colors text-base-foreground",r.active?"bg-interface-menu-component-surface-selected":"hover:bg-interface-menu-component-surface-hovered"]),role:"button",onMouseenter:o,onClick:i[0]||(i[0]=(...u)=>r.onClick&&r.onClick(...u))},[r.icon?(C(),P("div",db,[R(cb,{icon:r.icon},null,8,["icon"])])):(C(),P("i",pb)),v("span",{ref_key:"textRef",ref:t,class:"min-w-0 truncate"},[tt(r.$slots,"default")],512)],34)),[[l,{value:s.value,disabled:!a.value,pt:{text:{class:"whitespace-nowrap"}}},void 0,{right:!0}]])}}}),Tu=fb,mb={class:"text-xs font-bold text-text-secondary uppercase"},gb=J({__name:"NavTitle",props:{title:{},modelValue:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(e,{emit:t}){const a=t,o=E({get:n(()=>e.modelValue,"get"),set:n(r=>a("update:modelValue",r),"set")}),s=n(()=>{o.value=!o.value},"toggleCollapse");return(r,i)=>(C(),P("div",{class:pe(b(Pe)("flex items-center justify-between m-0 px-3 py-0 pt-5",r.collapsible&&"cursor-pointer select-none")),onClick:i[0]||(i[0]=l=>r.collapsible&&s())},[v("h3",mb,$(r.title),1),r.collapsible?(C(),P("i",{key:0,class:pe(b(Pe)("pi transition-transform duration-200 text-xs text-text-secondary ",o.value?"pi-chevron-right":"pi-chevron-down"))},null,2)):H("",!0)],2))}}),hb=gb,vb={},yb={class:"flex h-16 items-center justify-between px-6"},wb={class:"flex items-center gap-2 pl-1"},bb={class:"text-neutral text-base font-bold"};function _b(e,t){return C(),P("header",yb,[v("div",wb,[tt(e.$slots,"icon",{},()=>[t[0]||(t[0]=v("i",{class:"text-neutral icon-[lucide--puzzle] text-base"},null,-1))]),v("h2",bb,[tt(e.$slots,"default")])])])}n(_b,"_sfc_render$5");var kb=ot(vb,[["render",_b]]),Cb={class:"flex h-full w-full flex-col bg-modal-panel-background"},xb={class:"flex scrollbar-hide flex-1 flex-col gap-1 overflow-y-auto px-3 py-4"},Ib={key:0,class:"flex flex-col gap-2"},Sb={key:1,class:"flex flex-col gap-2"},Eb=J({__name:"LeftSidePanel",props:{navItems:{default:n(()=>[],"default")},modelValue:{}},emits:["update:modelValue"],setup(e,{emit:t}){const a=t,o=A({}),s=n(()=>{if(!e.navItems||e.navItems.length===0)return null;const i=e.navItems[0];return"items"in i&&i.items.length>0?i.items[0].id:"id"in i?i.id:null},"getFirstItemId"),r=E({get:n(()=>e.modelValue??s(),"get"),set:n(i=>a("update:modelValue",i),"set")});return(i,l)=>(C(),P("div",Cb,[R(kb,null,{icon:W(()=>[tt(i.$slots,"header-icon")]),default:W(()=>[tt(i.$slots,"header-title")]),_:3}),v("nav",xb,[(C(!0),P(Se,null,Ze(i.navItems,(u,c)=>(C(),P(Se,{key:c},["items"in u?(C(),P("div",Ib,[R(hb,{modelValue:o.value[u.title],"onUpdate:modelValue":n(d=>o.value[u.title]=d,"onUpdate:modelValue"),title:u.title,collapsible:u.collapsible},null,8,["modelValue","onUpdate:modelValue","title","collapsible"]),!u.collapsible||!o.value[u.title]?(C(!0),P(Se,{key:0},Ze(u.items,d=>(C(),X(Tu,{key:d.id,icon:d.icon,active:r.value===d.id,onClick:n(p=>r.value=d.id,"onClick")},{default:W(()=>[fe($(d.label),1)]),_:2},1032,["icon","active","onClick"]))),128)):H("",!0)])):(C(),P("div",Sb,[R(Tu,{icon:u.icon,active:r.value===u.id,onClick:n(d=>r.value=u.id,"onClick")},{default:W(()=>[fe($(u.label),1)]),_:2},1032,["icon","active","onClick"])]))],64))),128))])]))}}),Cp=Eb;function Tb(e){return E(()=>{const{minWidth:t,maxWidth:a}=e,o={};return t&&(o.minWidth=t),a&&(o.maxWidth=a),o})}n(Tb,"usePopoverSizing");var Ab={class:"flex flex-col px-2 pt-2 pb-0"},Mb={key:1,class:"mt-2 flex items-center justify-between"},Pb={key:0,class:"px-1 text-sm text-base-foreground"},Db={class:"text-sm"},Lb={key:0,class:"pointer-events-none absolute -top-2 -right-2 z-10 flex h-5 w-5 items-center justify-center rounded-full bg-primary-background text-xs font-semibold text-base-foreground"},Ob={key:0,class:"text-bold icon-[lucide--check] text-xs text-base-foreground"},Nb=J({inheritAttrs:!1,__name:"MultiSelect",props:_t({label:{},showSearchBox:{type:Boolean,default:!1},showSelectedCount:{type:Boolean,default:!1},showClearButton:{type:Boolean,default:!1},searchPlaceholder:{default:"Search..."},listMaxHeight:{default:"28rem"},popoverMinWidth:{},popoverMaxWidth:{}},{modelValue:{required:!0},modelModifiers:{},searchQuery:{default:""},searchQueryModifiers:{}}),emits:["update:modelValue","update:searchQuery"],setup(e){const t=rt(e,"modelValue"),a=rt(e,"searchQuery"),{t:o}=Fe(),s=E(()=>t.value.length),r=Tb({minWidth:e.popoverMinWidth,maxWidth:e.popoverMaxWidth}),i=eh(),l=E(()=>i.options||[]),{results:u}=Cd(a,l,{fuseOptions:{keys:["name","value"],threshold:.3,includeScore:!1},matchAllWhenSearchEmpty:!0}),c=E(()=>{if(!a.value||a.value.trim()==="")return l.value;const d=u.value.map(p=>p.item);return[...t.value.filter(p=>!d.some(f=>f.value===p.value)),...d]});return(d,p)=>(C(),X(b(pd),Ht({modelValue:t.value,"onUpdate:modelValue":p[2]||(p[2]=f=>t.value=f)},{...d.$attrs,options:c.value},{"option-label":"name",unstyled:"","max-selected-labels":0,pt:{root:n(({props:f})=>({class:b(Pe)("h-10 relative inline-flex cursor-pointer select-none","rounded-lg bg-secondary-background text-base-foreground","transition-all duration-200 ease-in-out","border-[2.5px] border-solid",s.value>0?"border-node-component-border":"border-transparent","focus-within:border-node-component-border",{"opacity-60 cursor-default":f.disabled})}),"root"),labelContainer:{class:"flex-1 flex items-center overflow-hidden whitespace-nowrap pl-4 py-2 "},label:{class:"p-0"},dropdown:{class:"flex shrink-0 cursor-pointer items-center justify-center px-3"},header:n(()=>({class:d.showSearchBox||d.showSelectedCount||d.showClearButton?"block":"hidden"}),"header"),overlay:{class:b(Pe)("mt-2 rounded-lg py-2 px-2","bg-base-background","text-base-foreground","border border-solid border-border-default")},listContainer:n(()=>({style:{maxHeight:`min(${d.listMaxHeight}, 50vh)`},class:"scrollbar-custom"}),"listContainer"),list:{class:"flex flex-col gap-0 p-0 m-0 list-none border-none text-sm"},option:n(({context:f})=>({class:b(Pe)("flex gap-2 items-center h-10 px-2 rounded-lg cursor-pointer","hover:bg-secondary-background-hover",f?.focused&&"bg-secondary-background-selected hover:bg-secondary-background-selected")}),"option"),pcHeaderCheckbox:{root:{class:"hidden"},style:{display:"none"}},pcOptionCheckbox:{root:{class:"hidden"},style:{display:"none"}}},"aria-label":d.label||b(o)("g.multiSelectDropdown"),role:"combobox","aria-expanded":!1,"aria-haspopup":"listbox",tabindex:0}),qo({value:W(()=>[v("span",Db,$(d.label),1),s.value>0?(C(),P("span",Lb,$(s.value),1)):H("",!0)]),dropdownicon:W(()=>[p[4]||(p[4]=v("i",{class:"icon-[lucide--chevron-down] text-muted-foreground"},null,-1))]),option:W(f=>[v("div",{role:"button",class:"flex items-center gap-2 cursor-pointer",style:nt(b(r))},[v("div",{class:pe(["flex size-4 shrink-0 items-center justify-center rounded p-0.5 transition-all duration-200",f.selected?"bg-primary-background":"bg-secondary-background"])},[f.selected?(C(),P("i",Ob)):H("",!0)],2),v("span",null,$(f.option.name),1)],4)]),_:2},[d.showSearchBox||d.showSelectedCount||d.showClearButton?{name:"header",fn:W(()=>[v("div",Ab,[d.showSearchBox?(C(),X(Ao,{key:0,modelValue:a.value,"onUpdate:modelValue":p[0]||(p[0]=f=>a.value=f),class:pe(d.showSelectedCount||d.showClearButton?"mb-2":""),"show-order":!0,"show-border":!0,"place-holder":d.searchPlaceholder},null,8,["modelValue","class","place-holder"])):H("",!0),d.showSelectedCount||d.showClearButton?(C(),P("div",Mb,[d.showSelectedCount?(C(),P("span",Pb,$(s.value>0?d.$t("g.itemsSelected",{selectedCount:s.value}):d.$t("g.itemSelected",{selectedCount:s.value})),1)):H("",!0),d.showClearButton?(C(),X(se,{key:1,variant:"textonly",size:"md",onClick:p[1]||(p[1]=Ve(f=>t.value=[],["stop"]))},{default:W(()=>[fe($(d.$t("g.clearAll")),1)]),_:1})):H("",!0)])):H("",!0),p[3]||(p[3]=v("div",{class:"my-4 h-px bg-border-default"},null,-1))])]),key:"0"}:void 0]),1040,["modelValue","pt","aria-label"]))}}),Au=Nb,$b={class:"flex items-center gap-2 text-sm"},Rb={key:0,class:"text-base-foreground"},Bb={key:1,class:"text-base-foreground"},Fb={class:"truncate"},Ub={key:0,class:"icon-[lucide--check] text-base-foreground"},Wb=J({inheritAttrs:!1,__name:"SingleSelect",props:_t({label:{},options:{},listMaxHeight:{default:"28rem"},popoverMinWidth:{},popoverMaxWidth:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=rt(e,"modelValue"),{t:a}=Fe(),o=n(r=>{if(r==null||!e.options)return e.label??"";const i=e.options.find(l=>l.value===r);return i?i.name:e.label??""},"getLabel"),s=E(()=>{if(!e.popoverMinWidth&&!e.popoverMaxWidth)return;const r=[];return e.popoverMinWidth&&r.push(`min-width: ${e.popoverMinWidth}`),e.popoverMaxWidth&&r.push(`max-width: ${e.popoverMaxWidth}`),r.join("; ")});return(r,i)=>(C(),X(b(Aa),Ht({modelValue:t.value,"onUpdate:modelValue":i[0]||(i[0]=l=>t.value=l)},r.$attrs,{options:r.options,"option-label":"name","option-value":"value",unstyled:"",pt:{root:n(({props:l})=>({class:["h-10 relative inline-flex cursor-pointer select-none items-center","rounded-lg","bg-secondary-background text-base-foreground","border-[2.5px] border-solid border-transparent","transition-all duration-200 ease-in-out","focus-within:border-node-component-border",{"opacity-60 cursor-default":l.disabled}]}),"root"),label:{class:"flex-1 flex items-center whitespace-nowrap pl-4 py-2 outline-hidden"},dropdown:{class:"flex shrink-0 items-center justify-center px-3 py-2"},overlay:{class:b(Pe)("mt-2 p-2 rounded-lg","bg-base-background text-base-foreground","border border-solid border-border-default")},listContainer:n(()=>({style:`max-height: min(${r.listMaxHeight}, 50vh)`,class:"scrollbar-custom"}),"listContainer"),list:{class:"flex flex-col gap-0 p-0 m-0 list-none border-none text-sm"},option:n(({context:l})=>({class:b(Pe)("flex items-center justify-between gap-3 px-2 py-3 rounded","hover:bg-secondary-background-hover",l.focused&&"bg-secondary-background-hover",l.selected&&"bg-secondary-background-selected hover:bg-secondary-background-selected")}),"option"),optionLabel:{class:"truncate"},optionGroupLabel:{class:"px-3 py-2 text-xs uppercase tracking-wide text-muted-foreground"},emptyMessage:{class:"px-3 py-2 text-sm text-muted-foreground"}},"aria-label":r.label||b(a)("g.singleSelectDropdown"),role:"combobox","aria-expanded":!1,"aria-haspopup":"listbox",tabindex:0}),{value:W(l=>[v("div",$b,[tt(r.$slots,"icon"),l.value!==null&&l.value!==void 0?(C(),P("span",Rb,$(o(l.value)),1)):(C(),P("span",Bb,$(r.label),1))])]),dropdownicon:W(()=>i[1]||(i[1]=[v("i",{class:"icon-[lucide--chevron-down] text-muted-foreground"},null,-1)])),option:W(({option:l,selected:u})=>[v("div",{class:"flex w-full items-center justify-between gap-3",style:nt(s.value)},[v("span",Fb,$(l.name),1),u?(C(),P("i",Ub)):H("",!0)],4)]),_:3},16,["modelValue","options","pt","aria-label"]))}}),$n=Wb;function zb(e){return{availableFileFormats:E(()=>Kl(Wt(e).map(t=>{const a=t.name.split(".").pop();return a&&a!==t.name?a:null}).filter(t=>t!==null),(t,a)=>t===a).sort().map(t=>({name:`.${t}`,value:t}))),availableBaseModels:E(()=>Kl(Wt(e).map(t=>t.user_metadata?.base_model).filter(t=>t!==void 0&&typeof t=="string"),(t,a)=>t===a).sort().map(t=>({name:t,value:t})))}}n(zb,"useAssetFilterOptions");var Vb={class:"flex gap-4 items-center justify-between px-6 pt-2 pb-6","data-component-id":"asset-filter-bar"},Gb={class:"flex gap-4 items-center","data-component-id":"asset-filter-bar-left"},Hb={class:"flex items-center","data-component-id":"asset-filter-bar-right"},jb=J({__name:"AssetFilterBar",props:{assets:{default:n(()=>[],"default")},allAssets:{default:n(()=>[],"default")}},emits:["filterChange"],setup(e,{emit:t}){const a=[{name:G("assetBrowser.sortRecent"),value:"recent"},{name:G("assetBrowser.sortAZ"),value:"name-asc"},{name:G("assetBrowser.sortZA"),value:"name-desc"}],o=[{name:G("assetBrowser.ownershipAll"),value:"all"},{name:G("assetBrowser.ownershipMyModels"),value:"my-models"},{name:G("assetBrowser.ownershipPublicModels"),value:"public-models"}],s=A([]),r=A([]),i=A("recent"),l=A("all"),{availableFileFormats:u,availableBaseModels:c}=zb(e.assets),d=E(()=>(e.allAssets.length?e.allAssets:e.assets).some(g=>g.is_immutable===!1)),p=t;function f(){p("filterChange",{fileFormats:s.value.map(g=>g.value),baseModels:r.value.map(g=>g.value),sortBy:i.value,ownership:l.value})}return n(f,"handleFilterChange"),(g,m)=>(C(),P("div",Vb,[v("div",Gb,[b(u).length>0?(C(),X(Au,{key:0,modelValue:s.value,"onUpdate:modelValue":[m[0]||(m[0]=h=>s.value=h),f],label:g.$t("assetBrowser.fileFormats"),options:b(u),class:"min-w-32","data-component-id":"asset-filter-file-formats"},null,8,["modelValue","label","options"])):H("",!0),b(c).length>0?(C(),X(Au,{key:1,modelValue:r.value,"onUpdate:modelValue":[m[1]||(m[1]=h=>r.value=h),f],label:g.$t("assetBrowser.baseModels"),options:b(c),class:"min-w-32","data-component-id":"asset-filter-base-models"},null,8,["modelValue","label","options"])):H("",!0),d.value?(C(),X($n,{key:2,modelValue:l.value,"onUpdate:modelValue":[m[2]||(m[2]=h=>l.value=h),f],label:g.$t("assetBrowser.ownership"),options:o,class:"min-w-42","data-component-id":"asset-filter-ownership"},null,8,["modelValue","label"])):H("",!0)]),v("div",Hb,[R($n,{modelValue:i.value,"onUpdate:modelValue":[m[3]||(m[3]=h=>i.value=h),f],label:g.$t("assetBrowser.sortBy"),options:a,class:"min-w-32","data-component-id":"asset-filter-sort"},{icon:W(()=>m[4]||(m[4]=[v("i",{class:"icon-[lucide--arrow-up-down]"},null,-1)])),_:1},8,["modelValue","label"])])]))}}),Kb=jb,Yb=J({__name:"VirtualGrid",props:{items:{},gridStyle:{},bufferRows:{default:1},scrollThrottle:{default:64},resizeDebounce:{default:64},defaultItemHeight:{default:200},defaultItemWidth:{default:200}},emits:["approach-end"],setup(e,{emit:t}){const a=t,o=A(e.defaultItemHeight),s=A(e.defaultItemWidth),r=A(null),{width:i,height:l}=dg(r),{y:u}=yd(r,{throttle:e.scrollThrottle,eventListenerOptions:{passive:!0}}),c=E(()=>Math.floor(i.value/s.value)||1),d=E(()=>Math.ceil(l.value/o.value)),p=E(()=>Math.floor(u.value/o.value)),f=E(()=>l.value&&i.value&&e.items?.length),g=E(()=>{const k=p.value-e.bufferRows,S=p.value+e.bufferRows+d.value,_=k*c.value,I=S*c.value,w=e.items.length-I,x=w>=0;return{start:ri(_,0,e.items?.length),end:ri(I,_,e.items?.length),isNearEnd:x&&w<=c.value*e.bufferRows}}),m=E(()=>f.value?e.items.slice(g.value.start,g.value.end):[]);Mt(()=>g.value.isNearEnd,()=>{a("approach-end")});const h=n(()=>{if(r.value){const k=r.value.querySelector("[data-virtual-grid-item]");if(!k?.clientHeight||!k?.clientWidth)return;o.value!==k.clientHeight&&(o.value=k.clientHeight),s.value!==k.clientWidth&&(s.value=k.clientWidth)}},"updateItemSize"),y=tr(h,e.resizeDebounce);return be([i,l],y,{flush:"post"}),Mt(()=>e.items,h,{flush:"post"}),Wa(()=>{y.cancel()}),(k,S)=>(C(),P("div",{ref_key:"container",ref:r,class:"scroll-container"},[v("div",{style:nt({height:`${g.value.start/c.value*o.value}px`})},null,4),v("div",{style:nt(k.gridStyle)},[(C(!0),P(Se,null,Ze(m.value,_=>(C(),P("div",{key:_.key,"data-virtual-grid-item":""},[tt(k.$slots,"item",{item:_},void 0,!0)]))),128))],4),v("div",{style:nt({height:`${(k.items.length-g.value.end)/c.value*o.value}px`})},null,4)],512))}}),pr=ot(Yb,[["__scopeId","data-v-c3b01db5"]]),qb=J({__name:"IconGroup",props:{backgroundClass:{}},setup(e){return(t,a)=>(C(),P("div",{class:pe(b(Pe)("flex justify-center items-center shrink-0 outline-hidden border-none p-0 rounded-lg shadow-sm transition-all duration-200 cursor-pointer bg-secondary-background",t.backgroundClass))},[tt(t.$slots,"default")],2))}}),xp=qb,Xb={class:"relative inline-flex items-center"},Zb={class:"flex min-w-40 flex-col gap-2 p-2"},Jb=J({inheritAttrs:!1,__name:"MoreButton",props:{isVertical:{type:Boolean,default:!1}},emits:["menuOpened","menuClosed"],setup(e,{expose:t}){const a=A(!1),o=A();function s(){o.value?.hide()}return n(s,"hide"),t({hide:s,isOpen:a}),(r,i)=>(C(),P("div",Xb,[R(se,Ht({size:"icon",variant:"secondary"},r.$attrs,{onClick:o.value?.toggle}),{default:W(()=>[v("i",{class:pe(b(Pe)(r.isVertical?"icon-[lucide--more-vertical]":"icon-[lucide--ellipsis]","text-sm"))},null,2)]),_:1},16,["onClick"]),R(b(mo),{ref_key:"popover",ref:o,"append-to":"body","auto-z-index":"",dismissable:"","close-on-escape":"",unstyled:"","base-z-index":1e3,pt:{root:{class:b(Pe)("absolute z-50")},content:{class:b(Pe)("mt-1 rounded-lg","bg-secondary-background text-base-foreground","shadow-lg")}},onShow:i[0]||(i[0]=()=>{a.value=!0,r.$emit("menuOpened")}),onHide:i[1]||(i[1]=()=>{a.value=!1,r.$emit("menuClosed")})},{default:W(()=>[v("div",Zb,[tt(r.$slots,"default",{close:s})])]),_:3},8,["pt"])]))}}),Qb=Jb,e_={class:"editable-text"},t_={key:0},a_=J({__name:"EditableText",props:{modelValue:{},isEditing:{type:Boolean,default:!1},inputAttrs:{default:n(()=>({}),"default")}},emits:["edit","cancel"],setup(e,{emit:t}){const a=t,o=A(e.modelValue),s=A(),r=A(!1),i=n(()=>{s.value?.$el.blur()},"blurInputElement"),l=n(()=>{r.value||a("edit",o.value),r.value=!1},"finishEditing"),u=n(()=>{r.value=!0,o.value=e.modelValue,a("cancel"),i()},"cancelEditing");be(()=>e.isEditing,async d=>{d&&(o.value=e.modelValue,await wa(()=>{if(!s.value)return;const p=o.value.includes(".")?o.value.split(".").slice(0,-1).join("."):o.value,f=0,g=p.length;s.value.$el.setSelectionRange?.(f,g)}))},{immediate:!0});const c={mounted:n(d=>d.focus(),"mounted")};return(d,p)=>(C(),P("div",e_,[d.isEditing?ze((C(),X(b(ca),{key:1,ref_key:"inputRef",ref:s,"model-value":o.value,"onUpdate:modelValue":p[0]||(p[0]=f=>o.value=f),type:"text",size:"small",fluid:"",pt:{root:{onBlur:l,...d.inputAttrs}},onKeyupCapture:Ja(Ve(i,["stop"]),["enter"]),onKeyup:Ja(Ve(u,["stop"]),["escape"]),onClick:p[1]||(p[1]=Ve(()=>{},["stop"])),onContextmenu:p[2]||(p[2]=Ve(()=>{},["stop"])),onPointerdownCapture:p[3]||(p[3]=Ve(()=>{},["stop"])),onPointermoveCapture:p[4]||(p[4]=Ve(()=>{},["stop"]))},null,8,["model-value","pt","onKeyupCapture","onKeyup"])),[[c]]):(C(),P("span",t_,$(d.modelValue),1))]))}}),fl=ot(a_,[["__scopeId","data-v-f1af930a"]]),o_={class:"flex flex-col px-4 py-2 text-sm text-muted-foreground border-t border-border-default"},n_={key:0},s_=J({__name:"ConfirmBody",props:{promptText:{}},setup(e){const t=E(()=>Wt(e.promptText));return(a,o)=>(C(),P("div",o_,[t.value?(C(),P("p",n_,$(t.value),1)):H("",!0)]))}}),r_=s_,i_={class:"w-full flex gap-2 justify-end px-2 pb-2"},l_=J({__name:"ConfirmFooter",props:{cancelText:{},confirmText:{},confirmClass:{},optionsDisabled:{}},emits:["cancel","confirm"],setup(e){const{t}=Fe(),a=E(()=>e.confirmText||t("g.confirm")),o=E(()=>e.cancelText||t("g.cancel")),s=E(()=>Wt(e.optionsDisabled));return(r,i)=>(C(),P("section",i_,[R(se,{disabled:s.value,variant:"textonly",autofocus:"",onClick:i[0]||(i[0]=l=>r.$emit("cancel"))},{default:W(()=>[fe($(o.value),1)]),_:1},8,["disabled"]),R(se,{disabled:s.value,variant:"textonly",class:pe(r.confirmClass),onClick:i[1]||(i[1]=l=>r.$emit("confirm"))},{default:W(()=>[fe($(a.value),1)]),_:1},8,["disabled","class"])]))}}),u_=l_,c_={class:"flex items-center gap-2 p-4 font-bold text-sm text-base-foreground font-inter"},d_={key:0,class:"flex-auto"},p_=J({__name:"ConfirmHeader",props:{title:{}},setup(e){return(t,a)=>(C(),P("div",c_,[t.title?(C(),P("span",d_,$(t.title),1)):H("",!0)]))}}),f_=p_;const Ct=Je("dialog",()=>{const e=A([]),t=A(null),a=n(()=>`dialog-${Math.random().toString(36).slice(2,9)}`,"genDialogKey");function o(p){const f=e.value.findIndex(g=>g.priority<=p.priority);e.value.splice(f===-1?e.value.length:f,0,p)}n(o,"insertDialogByPriority");function s(p){const f=p.key,g=e.value.findIndex(m=>m.key===f);if(g!==-1){const[m]=e.value.splice(g,1);o(m),t.value=f,l()}}n(s,"riseDialog");function r(p){const f=p?e.value.find(m=>m.key===p.key):e.value.find(m=>m.key===t.value);if(!f)return;f.dialogComponentProps?.onClose?.();const g=e.value.indexOf(f);e.value.splice(g,1),t.value=e.value.length>0?e.value[e.value.length-1].key:null,l()}n(r,"closeDialog");function i(p){e.value.length>=10&&e.value.shift();const f={key:p.key,visible:!0,title:p.title,headerComponent:p.headerComponent?bt(p.headerComponent):void 0,footerComponent:p.footerComponent?bt(p.footerComponent):void 0,component:bt(p.component),headerProps:{...p.headerProps},contentProps:{...p.props},footerProps:{...p.footerProps},priority:p.priority??1,dialogComponentProps:{maximizable:!1,modal:!0,closable:!0,closeOnEscape:!0,dismissableMask:!0,...p.dialogComponentProps,maximized:!1,onMaximize:n(()=>{f.dialogComponentProps.maximized=!0},"onMaximize"),onUnmaximize:n(()=>{f.dialogComponentProps.maximized=!1},"onUnmaximize"),onAfterHide:n(()=>{r(f)},"onAfterHide"),pt:Hi(p.dialogComponentProps?.pt||{},{root:{onMousedown:n(()=>{s(f)},"onMousedown")}})}};return o(f),t.value=p.key,l(),f}n(i,"createDialog");function l(){const p=e.value.find(g=>g.key===t.value),f=p?.dialogComponentProps.closable;e.value.forEach(g=>{g.dialogComponentProps={...g.dialogComponentProps,closeOnEscape:g===p&&!!f}})}n(l,"updateCloseOnEscapeStates");function u(p){const f=p.key||a();let g=e.value.find(m=>m.key===f);return g?(g.visible=!0,s(g)):g=i({...p,key:f}),g}n(u,"showDialog");function c(p){const{key:f}=p;if(!f){console.error("Extension dialog key is required");return}const g=f.startsWith("extension-")?f:`extension-${f}`,m=e.value.find(h=>h.key===g);return m?(m.visible=!0,s(m),m):i({...p,key:g})}n(c,"showExtensionDialog");function d(p){return e.value.some(f=>f.key===p)}return n(d,"isDialogOpen"),{dialogStack:e,riseDialog:s,showDialog:u,closeDialog:r,showExtensionDialog:c,isDialogOpen:d,activeKey:t}});function m_(e={}){const t=Ct(),{headerProps:a,props:o,footerProps:s}=e;return t.showDialog({headerComponent:f_,component:r_,footerComponent:u_,headerProps:a,props:o,footerProps:s,dialogComponentProps:{pt:{header:"py-0! px-0!",content:"p-0!",footer:"p-0!"}}})}n(m_,"showConfirmDialog");var g_={class:"absolute left-2 bottom-2 flex flex-wrap justify-start gap-1"},h_=J({__name:"AssetBadgeGroup",props:{badges:{}},setup(e){return(t,a)=>(C(),P("div",g_,[(C(!0),P(Se,null,Ze(t.badges,o=>(C(),P("span",{key:o.label,class:pe(b(Pe)("px-2 py-1 rounded text-xs font-bold uppercase tracking-wider text-modal-card-tag-foreground bg-modal-card-tag-background break-all"))},$(o.label),3))),128))]))}}),v_=h_,ml=U.object({id:U.string(),name:U.string(),asset_hash:U.string().nullish(),size:U.number().optional(),mime_type:U.string().nullish(),tags:U.array(U.string()).optional().default([]),preview_id:U.string().nullable().optional(),preview_url:U.string().optional(),created_at:U.string(),updated_at:U.string().optional(),is_immutable:U.boolean().optional(),last_access_time:U.string().optional(),user_metadata:U.record(U.unknown()).optional()}),y_=U.object({assets:U.array(ml).optional(),total:U.number().optional(),has_more:U.boolean().optional()});U.object({name:U.string(),folders:U.array(U.string())});U.object({name:U.string(),pathIndex:U.number()});var Mu=U.object({code:U.string(),message:U.string(),field:U.string()}),w_=U.object({is_valid:U.boolean(),errors:U.array(Mu).optional(),warnings:U.array(Mu).optional()});U.object({content_length:U.number(),final_url:U.string(),content_type:U.string().optional(),filename:U.string().optional(),name:U.string().optional(),tags:U.array(U.string()).optional(),preview_url:U.string().optional(),preview_image:U.string().optional(),validation:w_.optional()});var b_=U.object({task_id:U.string(),status:U.enum(["created","running","completed","failed"]),message:U.string().optional()}),__=U.discriminatedUnion("type",[U.object({type:U.literal("sync"),asset:ml}),U.object({type:U.literal("async"),task:b_})]);const k_=U.string().min(1,"Filename cannot be empty").regex(/^[^\\:*?"<>|]+$/,"Invalid filename characters").regex(/^(?!\/|.*\.\.)/,"Path must not start with / or contain ..").trim(),gl=ml,Ip=y_,Pu=__;var C_=class{static{n(this,"ModelNodeProvider")}nodeDef;key;constructor(e,t){this.nodeDef=e,this.key=t}};const en=Je("modelToNode",()=>{const e=A({}),t=zt(),a=A(!1),o=E(()=>Object.fromEntries(Object.values(e.value).flat().filter(f=>!!f.nodeDef).map(f=>[f.nodeDef.name,f.key]))),s=E(()=>{const f={};for(const[g,m]of Object.entries(e.value))for(const h of m)h.nodeDef&&(f[h.nodeDef.name]||(f[h.nodeDef.name]=g));return f});function r(){return p(),o.value}n(r,"getRegisteredNodeTypes");function i(f){if(p(),!(!f||typeof f!="string"))return s.value[f]}n(i,"getCategoryForNodeType");function l(f){return p(),e.value[f]?.[0]}n(l,"getNodeProvider");function u(f){return p(),e.value[f]??[]}n(u,"getAllNodeProviders");function c(f,g){p(),g.nodeDef&&(e.value[f]||(e.value[f]=[]),e.value[f].push(g))}n(c,"registerNodeProvider");function d(f,g,m){c(f,new C_(t.nodeDefsByName[g],m))}n(d,"quickRegister");function p(){a.value||Object.keys(t.nodeDefsByName).length!==0&&(a.value=!0,d("checkpoints","CheckpointLoaderSimple","ckpt_name"),d("checkpoints","ImageOnlyCheckpointLoader","ckpt_name"),d("loras","LoraLoader","lora_name"),d("loras","LoraLoaderModelOnly","lora_name"),d("vae","VAELoader","vae_name"),d("controlnet","ControlNetLoader","control_net_name"),d("diffusion_models","UNETLoader","unet_name"),d("upscale_models","UpscaleModelLoader","model_name"),d("style_models","StyleModelLoader","style_model_name"),d("gligen","GLIGENLoader","gligen_name"),d("clip_vision","CLIPVisionLoader","clip_name"),d("text_encoders","CLIPLoader","clip_name"),d("audio_encoders","AudioEncoderLoader","audio_encoder_name"),d("model_patches","ModelPatchLoader","name"),d("animatediff_models","ADE_LoadAnimateDiffModel","model_name"),d("animatediff_motion_lora","ADE_AnimateDiffLoRALoader","name"))}return n(p,"registerDefaults"),{modelToNodeMap:e,getRegisteredNodeTypes:r,getCategoryForNodeType:i,getNodeProvider:l,getAllNodeProviders:u,registerNodeProvider:c,quickRegister:d,registerDefaults:p}});function Du(e){return{FILE_TOO_LARGE:De("assetBrowser.errorFileTooLarge","File too large"),FORMAT_NOT_ALLOWED:De("assetBrowser.errorFormatNotAllowed","Format not allowed"),UNSAFE_PICKLE_SCAN:De("assetBrowser.errorUnsafePickleScan","Unsafe pickle scan"),UNSAFE_VIRUS_SCAN:De("assetBrowser.errorUnsafeVirusScan","Unsafe virus scan"),MODEL_TYPE_NOT_SUPPORTED:De("assetBrowser.errorModelTypeNotSupported","Model type not supported")}[e]||De("assetBrowser.errorUnknown","Unknown error")||"Unknown error"}n(Du,"getLocalizedErrorMessage");var ba="/assets",x_="/assets/download",Ss=`EXPERIMENTAL: If you are seeing this please make sure "Comfy.Assets.UseAssetAPI" is set to "false" in your ComfyUI Settings.
|
|
8
8
|
`,ls=500;const I_="models",z8="missing";function S_(e){const t=Ip.safeParse(e);if(t.success)return t.data;const a=Un(t.error);throw new Error(`${Ss}Invalid asset response against zod schema:
|
|
9
9
|
${a}`)}n(S_,"validateAssetResponse");function E_(){async function e(g,m){const h=await oe.fetchApi(g);if(!h.ok)throw new Error(`${Ss}Unable to load ${m}: Server returned ${h.status}. Please try again.`);return S_(await h.json())}n(e,"handleAssetRequest");async function t(){const g=await e(`${ba}?include_tags=${I_}&limit=${ls}`,"model folders"),m=new Set(["configs"]),h=new Set(g?.assets?.filter(y=>!y.tags.includes("missing"))?.flatMap(y=>y.tags)?.filter(y=>y!=="models"&&!m.has(y))??[]);return Array.from(h).toSorted().map(y=>({name:y,folders:[]}))}n(t,"getAssetModelFolders");async function a(g){return(await e(`${ba}?include_tags=models,${g}&limit=${ls}`,`models for ${g}`))?.assets?.filter(m=>!m.tags.includes("missing")&&m.tags.includes(g))?.map(m=>({name:m.name,pathIndex:0}))??[]}n(a,"getAssetModels");function o(g,m){return!g||!m?!1:en().getRegisteredNodeTypes()[g]===m}n(o,"isAssetBrowserEligible");async function s(g){if(!g||typeof g!="string")return[];const m=en().getCategoryForNodeType(g);return m?(await e(`${ba}?include_tags=models,${m}&limit=${ls}`,`assets for ${g}`))?.assets?.filter(h=>!h.tags.includes("missing")&&h.tags.includes(m))??[]:[]}n(s,"getAssetsForNodeType");async function r(g){const m=await oe.fetchApi(`${ba}/${g}`);if(!m.ok)throw new Error(`${Ss}Unable to load asset details for ${g}: Server returned ${m.status}. Please try again.`);const h=await m.json(),y=Ip.safeParse({assets:[h]});if(y.success&&y.data.assets?.[0])return y.data.assets[0];const k=y.error?Un(y.error):"Unknown validation error";throw new Error(`${Ss}Invalid asset response against zod schema:
|
|
10
|
-
${k}`)}n(r,"getAssetDetails");async function i(g,m=!0,{limit:h=ls,offset:y=0}={}){const k=new URLSearchParams({include_tags:g,limit:h.toString(),include_public:m?"true":"false"});return y>0&&k.set("offset",y.toString()),(await e(`${ba}?${k.toString()}`,`assets for tag ${g}`))?.assets?.filter(S=>!S.tags.includes("missing"))??[]}n(i,"getAssetsByTag");async function l(g){const m=await oe.fetchApi(`${ba}/${g}`,{method:"DELETE"});if(!m.ok)throw new Error(`Unable to delete asset ${g}: Server returned ${m.status}`)}n(l,"deleteAsset");async function u(g,m){const h=await oe.fetchApi(`${ba}/${g}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)});if(!h.ok)throw new Error(`Unable to update asset ${g}: Server returned ${h.status}`);const y=gl.safeParse(await h.json());if(y.success)return y.data;throw new Error(`Unable to update asset ${g}: Invalid response - ${y.error}`)}n(u,"updateAsset");async function c(g){const m=encodeURIComponent(g),h=await oe.fetchApi(`${ba}/remote-metadata?url=${m}`);if(!h.ok){const k=await h.json().catch(()=>({}));throw new Error(Du(k.code||"UNKNOWN_ERROR"))}const y=await h.json();if(y.validation?.is_valid===!1)throw new Error(Du(y.validation?.errors?.[0]?.code||"UNKNOWN_ERROR"));return y}n(c,"getAssetMetadata");async function d(g){const m=await oe.fetchApi(ba,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)});if(!m.ok)throw new Error(De("assetBrowser.errorUploadFailed","Failed to upload asset. Please try again."));return await m.json()}n(d,"uploadAssetFromUrl");async function p(g){if(!g.data||!g.data.startsWith("data:"))throw new Error('Invalid data URL: expected a string starting with "data:"');const m=await fetch(g.data).then(k=>k.blob()),h=new FormData;h.append("file",m,g.name),g.tags&&h.append("tags",JSON.stringify(g.tags)),g.user_metadata&&h.append("user_metadata",JSON.stringify(g.user_metadata));const y=await oe.fetchApi(ba,{method:"POST",body:h});if(!y.ok)throw new Error(`Failed to upload asset from base64: ${y.status} ${y.statusText}`);return await y.json()}n(p,"uploadAssetFromBase64");async function f(g){const m=await oe.fetchApi(x_,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)});if(!m.ok)throw new Error(De("assetBrowser.errorUploadFailed","Failed to upload asset. Please try again."));const h=await m.json();if(m.status===202){const k=Pu.safeParse({type:"async",task:h});if(!k.success)throw new Error(De("assetBrowser.errorUploadFailed","Failed to parse async upload response. Please try again."));return k.data}const y=Pu.safeParse({type:"sync",asset:h});if(!y.success)throw new Error(De("assetBrowser.errorUploadFailed","Failed to parse sync upload response. Please try again."));return y.data}return n(f,"uploadAssetAsync"),{getAssetModelFolders:t,getAssetModels:a,isAssetBrowserEligible:o,getAssetsForNodeType:s,getAssetDetails:r,getAssetsByTag:i,deleteAsset:l,updateAsset:u,getAssetMetadata:c,uploadAssetFromUrl:d,uploadAssetFromBase64:p,uploadAssetAsync:f}}n(E_,"createAssetService");const Zt=E_();var T_=["data-asset-id","aria-labelledby","aria-describedby","tabindex"],A_={class:"relative aspect-square w-full overflow-hidden rounded-xl"},M_=["src","alt"],P_={class:"max-h-32 flex flex-col gap-2 justify-between flex-auto"},D_=["id"],L_=["id"],O_={class:"flex gap-4 text-xs text-muted-foreground mt-auto"},N_={key:0,class:"flex items-center gap-1"},$_={key:1,class:"flex items-center gap-1"},R_={key:2,class:"flex items-center gap-1"},B_=J({__name:"AssetCard",props:{asset:{},interactive:{type:Boolean}},emits:["select","deleted"],setup(e,{emit:t}){const a=t,{t:o}=Fe(),s=Me(),{closeDialog:r}=Ct(),{flags:i}=oo(),l=Oe(),u=hd("dropdown-menu-button"),c=$s(),d=$s(),p=A(!1),f=A(),g=E(()=>f.value??e.asset.name),m=E(()=>(i.assetDeletionEnabled||i.assetRenameEnabled)&&!(e.asset.is_immutable??!0)),h=E(()=>s.get("LiteGraph.Node.TooltipDelay")),{isLoading:y,error:k}=fg({src:e.asset.preview_url??"",alt:e.asset.name});function S(){u.value?.hide();const w=Wt(g),x=A(o("assetBrowser.deletion.body")),D=A(!1),T=m_({headerProps:{title:o("assetBrowser.deletion.header")},props:{promptText:x},footerProps:{confirmText:o("g.delete"),confirmClass:Pe("bg-danger-200 text-base-foreground hover:bg-danger-200/80 focus:bg-danger-200/80 focus:ring ring-base-foreground"),optionsDisabled:D,onCancel:n(()=>{r(T)},"onCancel"),onConfirm:n(async()=>{D.value=!0;try{x.value=o("assetBrowser.deletion.inProgress",{assetName:w}),await Zt.deleteAsset(e.asset.id),x.value=o("assetBrowser.deletion.complete",{assetName:w}),await new Promise(N=>setTimeout(N,1e3)),a("deleted",e.asset)}catch(N){console.error(N),x.value=o("assetBrowser.deletion.failed",{assetName:w}),await new Promise(M=>setTimeout(M,3e3))}finally{r(T)}},"onConfirm")}})}n(S,"confirmDeletion");function _(){u.value?.hide(),p.value=!0}n(_,"startAssetRename");async function I(w){if(p.value=!1,w){f.value=w;try{f.value=(await Zt.updateAsset(e.asset.id,{name:w})).name}catch(x){console.error(x),l.add({severity:"error",summary:o("assetBrowser.rename.failed"),life:1e4}),f.value=void 0}}}return n(I,"assetRename"),(w,x)=>{const D=ht("tooltip");return C(),P("div",{"data-component-id":"AssetCard","data-asset-id":w.asset.id,"aria-labelledby":b(c),"aria-describedby":b(d),tabindex:w.interactive?0:-1,class:pe(b(Pe)("rounded-2xl overflow-hidden transition-all duration-200 bg-modal-card-background p-2 gap-2 flex flex-col h-full",w.interactive&&"group appearance-none bg-transparent m-0 outline-none text-left hover:bg-secondary-background focus:bg-secondary-background border-none focus:outline-solid outline-base-foreground outline-4")),onKeydown:x[3]||(x[3]=Ja(Ve(T=>w.interactive&&w.$emit("select",w.asset),["self"]),["enter"]))},[v("div",A_,[b(y)||b(k)?(C(),P("div",{key:0,class:"flex size-full cursor-pointer items-center justify-center bg-gradient-to-br from-smoke-400 via-smoke-800 to-charcoal-400",role:"button",onClick:x[0]||(x[0]=Ve(T=>w.interactive&&w.$emit("select",w.asset),["self"]))})):(C(),P("img",{key:1,src:w.asset.preview_url,alt:g.value,class:"size-full object-cover cursor-pointer",role:"button",onClick:x[1]||(x[1]=Ve(T=>w.interactive&&w.$emit("select",w.asset),["self"]))},null,8,M_)),R(v_,{badges:w.asset.badges},null,8,["badges"]),m.value?(C(),X(xp,{key:2,class:pe(b(Pe)("absolute top-2 right-2 invisible group-hover:visible",b(u)?.isOpen&&"visible"))},{default:W(()=>[R(Qb,{ref:"dropdown-menu-button",size:"sm"},{default:W(()=>[b(i).assetRenameEnabled?(C(),X(se,{key:0,variant:"secondary",size:"md",class:"justify-start",onClick:_},{default:W(()=>[x[4]||(x[4]=v("i",{class:"icon-[lucide--pencil]"},null,-1)),v("span",null,$(w.$t("g.rename")),1)]),_:1})):H("",!0),b(i).assetDeletionEnabled?(C(),X(se,{key:1,variant:"secondary",size:"md",class:"justify-start",onClick:S},{default:W(()=>[x[5]||(x[5]=v("i",{class:"icon-[lucide--trash-2]"},null,-1)),v("span",null,$(w.$t("g.delete")),1)]),_:1})):H("",!0)]),_:1},512)]),_:1},8,["class"])):H("",!0)]),v("div",P_,[ze((C(),P("h3",{id:b(c),class:pe(b(Pe)("mb-2 m-0 text-base font-semibold line-clamp-2 wrap-anywhere","text-base-foreground"))},[R(fl,{"model-value":g.value,"is-editing":p.value,"input-attrs":{"data-testid":"asset-name-input"},onEdit:I,onCancel:x[2]||(x[2]=T=>I())},null,8,["model-value","is-editing"])],10,D_)),[[D,{value:g.value,showDelay:h.value},void 0,{top:!0}]]),ze((C(),P("p",{id:b(d),class:pe(b(Pe)("m-0 text-sm leading-6 overflow-hidden [-webkit-box-orient:vertical] [-webkit-line-clamp:2] [display:-webkit-box] text-muted-foreground"))},[fe($(w.asset.description),1)],10,L_)),[[D,{value:w.asset.description,showDelay:h.value},void 0,{top:!0}]]),v("div",O_,[w.asset.stats.stars?(C(),P("span",N_,[x[6]||(x[6]=v("i",{class:"icon-[lucide--star] size-3"},null,-1)),fe(" "+$(w.asset.stats.stars),1)])):H("",!0),w.asset.stats.downloadCount?(C(),P("span",$_,[x[7]||(x[7]=v("i",{class:"icon-[lucide--download] size-3"},null,-1)),fe(" "+$(w.asset.stats.downloadCount),1)])):H("",!0),w.asset.stats.formattedDate?(C(),P("span",R_,[x[8]||(x[8]=v("i",{class:"icon-[lucide--clock] size-3"},null,-1)),fe(" "+$(w.asset.stats.formattedDate),1)])):H("",!0)])])],42,T_)}}}),F_=B_,U_=["aria-label","aria-setsize"],W_={key:0,class:"flex h-full items-center justify-center py-20"},z_={key:1,class:"flex h-full flex-col items-center justify-center py-16 text-muted-foreground"},V_={class:"mb-2 text-lg font-medium"},G_={class:"text-sm"},H_=J({__name:"AssetGrid",props:{assets:{},loading:{type:Boolean}},emits:["assetSelect","assetDeleted"],setup(e){const t=E(()=>e.assets.map(o=>({...o,key:o.id}))),a={display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(15rem, 1fr))",gap:"1rem",padding:"0.5rem"};return(o,s)=>(C(),P("div",{"data-component-id":"AssetGrid",class:"h-full",role:"grid","aria-label":o.$t("assetBrowser.assetCollection"),"aria-rowcount":-1,"aria-colcount":-1,"aria-setsize":o.assets.length},[o.loading?(C(),P("div",W_,s[2]||(s[2]=[v("i",{class:"icon-[lucide--loader] size-12 animate-spin text-muted-foreground"},null,-1)]))):o.assets.length===0?(C(),P("div",z_,[s[3]||(s[3]=v("i",{class:"mb-4 icon-[lucide--search] size-10"},null,-1)),v("h3",V_,$(o.$t("assetBrowser.noAssetsFound")),1),v("p",G_,$(o.$t("assetBrowser.tryAdjustingFilters")),1)])):(C(),X(pr,{key:2,items:t.value,"grid-style":a,"default-item-height":320,"default-item-width":240},{item:W(({item:r})=>[R(F_,{asset:r,interactive:!0,onSelect:s[0]||(s[0]=i=>o.$emit("assetSelect",i)),onDeleted:s[1]||(s[1]=i=>o.$emit("assetDeleted",i))},null,8,["asset"])]),_:1},8,["items"]))],8,U_))}}),j_=H_;function K_(e){return typeof e.user_metadata?.description=="string"?e.user_metadata.description:null}n(K_,"getAssetDescription");function Sp(e){return typeof e.user_metadata?.base_model=="string"?e.user_metadata.base_model:null}n(Sp,"getAssetBaseModel");function Y_(e){return t=>e==="all"||t.tags.includes(e)?!0:t.tags.some(a=>typeof a=="string"&&a.includes("/")?a.split("/")[0]===e:!1)}n(Y_,"filterByCategory");function q_(e){return t=>{if(e.length===0)return!0;const a=new Set(e),o=t.name.split(".").pop()?.toLowerCase();return o?a.has(o):!1}}n(q_,"filterByFileFormats");function X_(e){return t=>{if(e.length===0)return!0;const a=new Set(e),o=Sp(t);return o?a.has(o):!1}}n(X_,"filterByBaseModels");function Z_(e){return t=>e==="all"?!0:e==="my-models"?t.is_immutable===!1:e==="public-models"?t.is_immutable===!0:!0}n(Z_,"filterByOwnership");function J_(e=A([])){const t=E(()=>e.value??[]),a=A(""),o=A("all"),s=A({sortBy:"recent",fileFormats:[],baseModels:[],ownership:"all"});function r(g){const m=g.tags.find(_=>_!=="models"),h=K_(g)||`${m||G("assetBrowser.unknown")} model`,y=[];if(m){const _=m.includes("/")?m.substring(m.indexOf("/")+1):m;y.push({label:_,type:"type"})}const k=Sp(g);k&&y.push({label:k,type:"base"});const S={formattedDate:ph(new Date(g.created_at),{dateStyle:"short"}),downloadCount:void 0,stars:void 0};return{...g,description:h,badges:y,stats:S}}n(r,"transformAssetForDisplay");const i=E(()=>{const g=t.value.filter(h=>h.tags[0]==="models").map(h=>h.tags[1]).filter(h=>typeof h=="string"&&h.length>0).map(h=>h.split("/")[0]),m=Array.from(new Set(g)).sort().map(h=>({id:h,label:h.charAt(0).toUpperCase()+h.slice(1),icon:"icon-[lucide--package]"}));return[{id:"all",label:G("assetBrowser.allModels"),icon:"icon-[lucide--folder]"},...m]}),l=E(()=>o.value==="all"?G("assetBrowser.allModels"):i.value.find(g=>g.id===o.value)?.label||G("assetBrowser.assets")),u=E(()=>t.value.filter(Y_(o.value))),{results:c}=Cd(a,u,{fuseOptions:{keys:[{name:"name",weight:.4},{name:"tags",weight:.3}],threshold:.4,ignoreLocation:!0,includeScore:!0},matchAllWhenSearchEmpty:!0}),d=E(()=>c.value.map(g=>g.item)),p=E(()=>{const g=[...d.value.filter(q_(s.value.fileFormats)).filter(X_(s.value.baseModels)).filter(Z_(s.value.ownership))];return g.sort((m,h)=>{switch(s.value.sortBy){case"name-desc":return h.name.localeCompare(m.name);case"recent":return new Date(h.created_at).getTime()-new Date(m.created_at).getTime();case"popular":return m.name.localeCompare(h.name);case"name-asc":default:return m.name.localeCompare(h.name)}}),g.map(r)});function f(g){s.value={...g}}return n(f,"updateFilters"),{searchQuery:a,selectedCategory:o,availableCategories:i,contentTitle:l,categoryFilteredAssets:u,filteredAssets:p,updateFilters:f}}n(J_,"useAssetBrowser");function Q_(e){const t={loras:"LoRA",ipadapter:"IP-Adapter",sams:"SAM",clip_vision:"CLIP Vision",animatediff_motion_lora:"AnimateDiff Motion LoRA",animatediff_models:"AnimateDiff Model",vae:"VAE",sam2:"SAM 2",controlnet:"ControlNet",gligen:"GLIGEN"};return t[e]?t[e]:e.split("_").map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(" ")}n(Q_,"formatDisplayName");var ek=["nlf"];const Ep=on(()=>{const{state:e,isLoading:t,error:a,execute:o}=Xo(async()=>(await oe.getModelFolders()).filter(s=>!ek.includes(s.name)).map(s=>({name:Q_(s.name),value:s.name})).sort((s,r)=>s.name.localeCompare(r.name)),[],{immediate:!1,onError:n(s=>{console.error("Failed to fetch model types:",s)},"onError")});return{modelTypes:e,isLoading:t,error:a,fetchModelTypes:o}});var tk={class:"flex flex-col gap-4 text-sm text-muted-foreground"},ak={class:"flex flex-col gap-2"},ok={class:"m-0"},nk={class:"flex items-center gap-3 rounded-lg bg-secondary-background px-4 py-2"},sk=["src","alt"],rk={class:"m-0 min-w-0 flex-1 truncate text-base-foreground"},ik={class:"flex flex-col gap-2"},lk={class:"flex items-center gap-2"},uk={class:"text-muted-foreground"},ck=J({__name:"UploadModelConfirmation",props:_t({metadata:{},previewImage:{}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=rt(e,"modelValue"),{modelTypes:a,isLoading:o}=Ep();return(s,r)=>(C(),P("div",tk,[v("div",ak,[v("p",ok,$(s.$t("assetBrowser.modelAssociatedWithLink")),1),v("div",nk,[s.previewImage?(C(),P("img",{key:0,src:s.previewImage,alt:s.metadata?.filename||s.metadata?.name||"Model preview",class:"size-14 flex-shrink-0 rounded object-cover"},null,8,sk)):H("",!0),v("p",rk,$(s.metadata?.filename||s.metadata?.name),1)])]),v("div",ik,[v("div",lk,[v("label",null,$(s.$t("assetBrowser.modelTypeSelectorLabel")),1),r[1]||(r[1]=v("i",{class:"icon-[lucide--circle-question-mark] text-muted-foreground"},null,-1)),v("span",uk,$(s.$t("assetBrowser.notSureLeaveAsIs")),1)]),R($n,{modelValue:t.value,"onUpdate:modelValue":r[0]||(r[0]=i=>t.value=i),label:b(o)?s.$t("g.loading"):s.$t("assetBrowser.modelTypeSelectorPlaceholder"),options:b(a),disabled:b(o),"data-attr":"upload-model-step2-type-selector"},null,8,["modelValue","label","options","disabled"])])]))}}),dk=ck,pk={class:"relative"},fk=["aria-label","src"],mk=J({__name:"VideoHelpDialog",props:_t({videoUrl:{},ariaLabel:{default:"Help video"}},{modelValue:{type:Boolean,required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=rt(e,"modelValue"),a=n(o=>{o.key==="Escape"&&(o.stopImmediatePropagation(),o.stopPropagation(),o.preventDefault(),t.value=!1)},"handleEscapeKey");return be(t,o=>{o&&rg(At(document,"keydown",a,{capture:!0}))},{immediate:!0}),(o,s)=>(C(),X(b(rd),{visible:t.value,"onUpdate:visible":s[1]||(s[1]=r=>t.value=r),modal:"",closable:!1,"close-on-escape":!1,"dismissable-mask":!0,pt:{root:{class:"video-help-dialog"},header:{class:"!hidden"},content:{class:"!p-0"},mask:{class:"!bg-black/70"}},style:{width:"90vw"}},{default:W(()=>[v("div",pk,[R(se,{variant:"textonly",size:"icon",class:"absolute top-4 right-6 z-10","aria-label":o.$t("g.close"),onClick:s[0]||(s[0]=r=>t.value=!1)},{default:W(()=>s[2]||(s[2]=[v("i",{class:"pi pi-times text-sm"},null,-1)])),_:1},8,["aria-label"]),v("video",{autoplay:"",muted:"",loop:"","aria-label":o.ariaLabel,class:"w-full rounded-lg",src:o.videoUrl},$(o.$t("g.videoFailedToLoad")),9,fk)])]),_:1},8,["visible"]))}}),Lu=mk,gk={class:"flex justify-end gap-2 w-full"},hk={key:0,class:"mr-auto flex items-center gap-2"},vk={key:4},yk={key:0,class:"icon-[lucide--loader-circle] animate-spin"},wk={key:0,class:"icon-[lucide--loader-circle] animate-spin"},bk=J({__name:"UploadModelFooter",props:{currentStep:{},isFetchingMetadata:{type:Boolean},isUploading:{type:Boolean},canFetchMetadata:{type:Boolean},canUploadModel:{type:Boolean},uploadStatus:{}},emits:["back","fetchMetadata","upload","close","importAnother"],setup(e,{emit:t}){const{flags:a}=oo(),o=A(!1),s=A(!1),r=t;return(i,l)=>(C(),P("div",gk,[i.currentStep===1&&b(a).huggingfaceModelImportEnabled?(C(),P("div",hk,[l[11]||(l[11]=v("i",{class:"icon-[lucide--circle-question-mark] text-muted-foreground"},null,-1)),R(se,{variant:"muted-textonly",size:"sm","data-attr":"upload-model-step1-help-civitai",onClick:l[0]||(l[0]=u=>o.value=!0)},{default:W(()=>[fe($(i.$t("assetBrowser.providerCivitai")),1)]),_:1}),R(se,{variant:"muted-textonly",size:"sm","data-attr":"upload-model-step1-help-huggingface",onClick:l[1]||(l[1]=u=>s.value=!0)},{default:W(()=>[fe($(i.$t("assetBrowser.providerHuggingFace")),1)]),_:1})])):i.currentStep===1?(C(),X(se,{key:1,variant:"muted-textonly",size:"lg",class:"mr-auto underline","data-attr":"upload-model-step1-help-link",onClick:l[2]||(l[2]=u=>o.value=!0)},{default:W(()=>[l[12]||(l[12]=v("i",{class:"icon-[lucide--circle-question-mark]"},null,-1)),v("span",null,$(i.$t("assetBrowser.uploadModelHowDoIFindThis")),1)]),_:1})):H("",!0),i.currentStep===1?(C(),X(se,{key:2,variant:"muted-textonly",size:"lg","data-attr":"upload-model-step1-cancel-button",disabled:i.isFetchingMetadata||i.isUploading,onClick:l[3]||(l[3]=u=>r("close"))},{default:W(()=>[fe($(i.$t("g.cancel")),1)]),_:1},8,["disabled"])):H("",!0),i.currentStep!==1&&i.currentStep!==3?(C(),X(se,{key:3,variant:"muted-textonly",size:"lg","data-attr":`upload-model-step${i.currentStep}-back-button`,disabled:i.isFetchingMetadata||i.isUploading,onClick:l[4]||(l[4]=u=>r("back"))},{default:W(()=>[fe($(i.$t("g.back")),1)]),_:1},8,["data-attr","disabled"])):(C(),P("span",vk)),i.currentStep===1?(C(),X(se,{key:5,variant:"secondary",size:"lg","data-attr":"upload-model-step1-continue-button",disabled:!i.canFetchMetadata||i.isFetchingMetadata,onClick:l[5]||(l[5]=u=>r("fetchMetadata"))},{default:W(()=>[i.isFetchingMetadata?(C(),P("i",yk)):H("",!0),v("span",null,$(i.$t("g.continue")),1)]),_:1},8,["disabled"])):i.currentStep===2?(C(),X(se,{key:6,variant:"secondary",size:"lg","data-attr":"upload-model-step2-confirm-button",disabled:!i.canUploadModel||i.isUploading,onClick:l[6]||(l[6]=u=>r("upload"))},{default:W(()=>[i.isUploading?(C(),P("i",wk)):H("",!0),v("span",null,$(i.$t("assetBrowser.upload")),1)]),_:1},8,["disabled"])):i.currentStep===3&&(i.uploadStatus==="success"||i.uploadStatus==="processing")?(C(),P(Se,{key:7},[R(se,{variant:"muted-textonly",size:"lg","data-attr":"upload-model-step3-import-another-button",onClick:l[7]||(l[7]=u=>r("importAnother"))},{default:W(()=>[fe($(i.$t("assetBrowser.importAnother")),1)]),_:1}),R(se,{variant:"secondary",size:"lg","data-attr":"upload-model-step3-finish-button",onClick:l[8]||(l[8]=u=>r("close"))},{default:W(()=>[fe($(i.uploadStatus==="processing"?i.$t("g.close"):i.$t("assetBrowser.finish")),1)]),_:1})],64)):H("",!0),R(Lu,{modelValue:o.value,"onUpdate:modelValue":l[9]||(l[9]=u=>o.value=u),"video-url":"https://media.comfy.org/compressed_768/civitai_howto.webm","aria-label":i.$t("assetBrowser.uploadModelHelpVideo")},null,8,["modelValue","aria-label"]),R(Lu,{modelValue:s.value,"onUpdate:modelValue":l[10]||(l[10]=u=>s.value=u),"video-url":"https://media.comfy.org/byom/huggingfacehowto.mp4","aria-label":i.$t("assetBrowser.uploadModelHelpVideo")},null,8,["modelValue","aria-label"])]))}}),_k=bk,kk={class:"flex flex-1 flex-col gap-6 text-sm text-muted-foreground"},Ck={key:0,class:"flex flex-col gap-2"},xk={class:"m-0 font-bold"},Ik={class:"m-0"},Sk={class:"flex flex-row items-center gap-3 rounded-lg bg-modal-card-background p-4"},Ek=["src","alt"],Tk={class:"flex min-w-0 flex-1 flex-col items-start justify-center gap-1"},Ak={class:"m-0 w-full truncate text-base-foreground"},Mk={class:"m-0 text-sm text-muted"},Pk={key:1,class:"flex flex-col gap-2"},Dk={class:"m-0 font-bold"},Lk={class:"m-0"},Ok={class:"flex flex-row items-center gap-3 rounded-lg bg-modal-card-background p-4"},Nk=["src","alt"],$k={class:"flex min-w-0 flex-1 flex-col items-start justify-center gap-1"},Rk={class:"m-0 w-full truncate text-base-foreground"},Bk={class:"m-0 text-sm text-muted"},Fk={key:2,class:"flex flex-1 flex-col items-center justify-center gap-6"},Uk={class:"text-center"},Wk={class:"m-0 text-sm font-bold"},zk={key:0,class:"text-sm text-muted mb-0"},Vk=J({__name:"UploadModelProgress",props:{result:{},error:{},metadata:{},modelType:{},previewImage:{}},setup(e){return(t,a)=>(C(),P("div",kk,[t.result==="processing"?(C(),P("div",Ck,[v("p",xk,$(t.$t("assetBrowser.processingModel")),1),v("p",Ik,$(t.$t("assetBrowser.processingModelDescription")),1),v("div",Sk,[t.previewImage?(C(),P("img",{key:0,src:t.previewImage,alt:t.metadata?.filename||t.metadata?.name||"Model preview",class:"size-14 flex-shrink-0 rounded object-cover"},null,8,Ek)):H("",!0),v("div",Tk,[v("p",Ak,$(t.metadata?.filename||t.metadata?.name),1),v("p",Mk,$(t.modelType),1)])])])):t.result==="success"?(C(),P("div",Pk,[v("p",Dk,$(t.$t("assetBrowser.modelUploaded")),1),v("p",Lk,$(t.$t("assetBrowser.findInLibrary",{type:t.modelType})),1),v("div",Ok,[t.previewImage?(C(),P("img",{key:0,src:t.previewImage,alt:t.metadata?.filename||t.metadata?.name||"Model preview",class:"size-14 flex-shrink-0 rounded object-cover"},null,8,Nk)):H("",!0),v("div",$k,[v("p",Rk,$(t.metadata?.filename||t.metadata?.name),1),v("p",Bk,$(t.modelType),1)])])])):t.result==="error"?(C(),P("div",Fk,[a[0]||(a[0]=v("i",{class:"icon-[lucide--x-circle] text-6xl text-error"},null,-1)),v("div",Uk,[v("p",Wk,$(t.$t("assetBrowser.uploadFailed")),1),t.error?(C(),P("p",zk,$(t.error),1)):H("",!0)])])):H("",!0)]))}}),Gk=Vk;const Hs={type:"civitai",name:"Civitai",hostnames:["civitai.com"]},Tp={type:"huggingface",name:"Hugging Face",hostnames:["huggingface.co"]};function hl(e,t){try{const a=new URL(e).hostname.toLowerCase();return t.hostnames.some(o=>a===o||a.endsWith(`.${o}`))}catch{return!1}}n(hl,"validateSourceUrl");var Hk={class:"flex flex-col justify-between h-full gap-6 text-sm"},jk={class:"flex flex-col gap-6"},Kk={class:"flex flex-col gap-2"},Yk={class:"m-0 text-foreground"},qk={class:"m-0"},Xk={class:"m-0 text-muted-foreground"},Zk={class:"inline-flex items-center gap-1 flex-wrap mt-2"},Jk={class:"inline-flex items-center gap-1"},Qk=["alt"],e1={class:"inline-flex items-center gap-1"},t1=["alt"],a1={class:"flex flex-col gap-2"},o1={class:"relative"},n1={key:0,class:"icon-[lucide--circle-check-big] absolute top-1/2 right-3 size-5 -translate-y-1/2 text-green-500"},s1={key:0,class:"text-sm text-error"},r1={key:1,class:"text-foreground"},i1={class:"font-bold italic"},l1={class:"text-sm text-muted"},u1="/assets/images/civitai.svg",c1="https://civitai.com/models",d1="/assets/images/hf-logo.svg",p1="https://huggingface.co",f1=J({__name:"UploadModelUrlInput",props:{modelValue:{},error:{}},emits:["update:modelValue"],setup(e,{emit:t}){const{flags:a}=oo(),o=e,s=t,r=E({get:n(()=>o.modelValue,"get"),set:n(u=>s("update:modelValue",u),"set")}),i=[Hs,Tp],l=E(()=>{const u=r.value.trim();return u?i.some(c=>hl(u,c)):!1});return(u,c)=>{const d=Yi("i18n-t");return C(),P("div",Hk,[v("div",jk,[v("div",Kk,[v("p",Yk,$(u.$t("assetBrowser.uploadModelDescription1Generic")),1),v("div",qk,[v("p",Xk,$(u.$t("assetBrowser.uploadModelDescription2Generic")),1),v("span",Zk,[v("span",Jk,[v("img",{src:u1,alt:u.$t("assetBrowser.providerCivitai"),class:"w-4 h-4"},null,8,Qk),v("a",{href:c1,target:"_blank",rel:"noopener noreferrer",class:"text-muted-foreground underline"},$(u.$t("assetBrowser.providerCivitai")),1),c[1]||(c[1]=v("span",null,",",-1))]),v("span",e1,[v("img",{src:d1,alt:u.$t("assetBrowser.providerHuggingFace"),class:"w-4 h-4"},null,8,t1),v("a",{href:p1,target:"_blank",rel:"noopener noreferrer",class:"text-muted-foreground underline"},$(u.$t("assetBrowser.providerHuggingFace")),1)])])])]),v("div",a1,[v("div",o1,[R(b(ca),{modelValue:r.value,"onUpdate:modelValue":c[0]||(c[0]=p=>r.value=p),autofocus:"",placeholder:u.$t("assetBrowser.genericLinkPlaceholder"),class:"w-full border-0 bg-secondary-background p-4 pr-10","data-attr":"upload-model-step1-url-input"},null,8,["modelValue","placeholder"]),l.value?(C(),P("i",n1)):H("",!0)]),u.error?(C(),P("p",s1,$(u.error),1)):b(a).asyncModelUploadEnabled?H("",!0):(C(),P("p",r1,[R(d,{keypath:"assetBrowser.maxFileSize",tag:"span"},{size:W(()=>[v("span",i1,$(u.$t("assetBrowser.maxFileSizeValue")),1)]),_:1})]))])]),v("div",l1,$(u.$t("assetBrowser.uploadModelHelpFooterText")),1)])}}}),m1=f1,g1={class:"flex flex-col gap-6 text-sm text-muted-foreground"},h1={class:"flex flex-col gap-2"},v1={class:"m-0"},y1={class:"list-disc space-y-1 pl-5 mt-0"},w1={href:"https://civitai.com/models",target:"_blank",class:"text-muted-foreground underline"},b1={key:0},_1={class:"font-bold italic"},k1={class:"flex flex-col gap-2"},C1={class:"font-bold italic"},x1={class:"relative"},I1={key:0,class:"icon-[lucide--circle-check-big] absolute top-1/2 right-3 size-5 -translate-y-1/2 text-green-500"},S1={key:0,class:"text-sm text-error"},E1={href:"https://civitai.com/models/10706/luisap-z-image-and-qwen-pixel-art-refiner?modelVersionId=2225295",target:"_blank",class:"text-muted-foreground underline"},T1=J({__name:"UploadModelUrlInputCivitai",props:_t({error:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const{flags:t}=oo(),a=rt(e,"modelValue"),o=E(()=>{const s=a.value.trim();return s?hl(s,Hs):!1});return(s,r)=>{const i=Yi("i18n-t");return C(),P("div",g1,[v("div",h1,[v("p",v1,$(s.$t("assetBrowser.uploadModelDescription1")),1),v("ul",y1,[v("li",null,[R(i,{keypath:"assetBrowser.uploadModelDescription2",tag:"span"},{link:W(()=>[v("a",w1,$(s.$t("assetBrowser.uploadModelDescription2Link")),1)]),_:1})]),b(t).asyncModelUploadEnabled?H("",!0):(C(),P("li",b1,[R(i,{keypath:"assetBrowser.uploadModelDescription3",tag:"span"},{size:W(()=>[v("span",_1,$(s.$t("assetBrowser.maxFileSizeValue")),1)]),_:1})]))])]),v("div",k1,[R(i,{keypath:"assetBrowser.civitaiLinkLabel",tag:"label",class:"mb-0"},{download:W(()=>[v("span",C1,$(s.$t("assetBrowser.civitaiLinkLabelDownload")),1)]),_:1}),v("div",x1,[R(b(ca),{modelValue:a.value,"onUpdate:modelValue":r[0]||(r[0]=l=>a.value=l),autofocus:"",placeholder:s.$t("assetBrowser.civitaiLinkPlaceholder"),class:"w-full border-0 bg-secondary-background p-4 pr-10","data-attr":"upload-model-step1-url-input"},null,8,["modelValue","placeholder"]),o.value?(C(),P("i",I1)):H("",!0)]),s.error?(C(),P("p",S1,$(s.error),1)):(C(),X(i,{key:1,keypath:"assetBrowser.civitaiLinkExample",tag:"p",class:"text-sm"},{example:W(()=>[v("strong",null,$(s.$t("assetBrowser.civitaiLinkExampleStrong")),1)]),link:W(()=>[v("a",E1,$(s.$t("assetBrowser.civitaiLinkExampleUrl")),1)]),_:1}))])])}}}),A1=T1,M1="/tasks",P1=U.enum(["created","running","completed","failed"]),D1=U.object({success:U.boolean(),file_path:U.string().optional(),bytes_downloaded:U.number().optional(),content_type:U.string().optional(),hash:U.string().optional(),filename:U.string().optional(),asset_id:U.string().optional(),metadata:U.record(U.unknown()).optional(),error:U.string().optional()}),L1=U.object({id:U.string().uuid(),idempotency_key:U.string(),task_name:U.string(),payload:U.record(U.unknown()),status:P1,result:D1.optional(),error_message:U.string().optional(),create_time:U.string().datetime(),update_time:U.string().datetime(),started_at:U.string().datetime().optional(),completed_at:U.string().datetime().optional()});function O1(){async function e(t){const a=await oe.fetchApi(`${M1}/${t}`);if(!a.ok)throw a.status===404?new Error(`Task not found: ${t}`):new Error(`Failed to get task ${t}: ${a.status}`);const o=await a.json(),s=L1.safeParse(o);if(!s.success)throw new Error(Un(s.error).message);return s.data}return n(e,"getTask"),{getTask:e}}n(O1,"createTaskService");const N1=O1();var $1=1e4,R1=1e4;function B1(e,t,a){return{taskId:e,modelType:t,assetName:a,bytesTotal:0,bytesDownloaded:0,progress:0,status:"created",lastUpdate:Date.now()}}n(B1,"generateDownloadTrackingPlaceholder");const Ap=Je("assetDownload",()=>{const e=A(new Map),t=A(null),a=E(()=>Array.from(e.value.values())),o=E(()=>a.value.filter(g=>g.status==="created"||g.status==="running")),s=E(()=>a.value.filter(g=>g.status==="completed"||g.status==="failed")),r=E(()=>o.value.length>0),i=E(()=>e.value.size>0);function l(g,m,h){e.value.has(g)||e.value.set(g,B1(g,m,h))}n(l,"trackDownload");function u(g){const m=g.detail,h=e.value.get(m.task_id);if(h?.status==="completed"||h?.status==="failed")return;const y={taskId:m.task_id,assetId:m.asset_id,assetName:m.asset_name,bytesTotal:m.bytes_total,bytesDownloaded:m.bytes_downloaded,progress:m.progress,status:m.status,error:m.error,lastUpdate:Date.now(),modelType:h?.modelType};e.value.set(m.task_id,y),m.status==="completed"&&y.modelType&&(t.value={taskId:m.task_id,modelType:y.modelType,timestamp:Date.now()})}n(u,"handleAssetDownload");async function c(){const g=Date.now(),m=o.value.filter(y=>g-y.lastUpdate>=$1);if(m.length===0)return;async function h(y){try{const k=await N1.getTask(y.taskId);if(k.status==="completed"||k.status==="failed"){const S=k.result;u(new CustomEvent("asset_download",{detail:{task_id:y.taskId,asset_id:S?.asset_id??y.assetId,asset_name:S?.filename??y.assetName,bytes_total:y.bytesTotal,bytes_downloaded:S?.bytes_downloaded??y.bytesTotal,progress:k.status==="completed"?100:y.progress,status:k.status,error:k.error_message??S?.error}}))}}catch{}}n(h,"pollSingleDownload"),await Promise.all(m.map(h))}n(c,"pollStaleDownloads");const{pause:d,resume:p}=hg(()=>{c()},R1,{immediate:!1});be(r,g=>{g?p():d()},{immediate:!0}),oe.addEventListener("asset_download",u);function f(){for(const g of s.value)e.value.delete(g.taskId)}return n(f,"clearFinishedDownloads"),{activeDownloads:o,finishedDownloads:s,hasActiveDownloads:r,hasDownloads:i,downloadList:a,lastCompletedDownload:t,trackDownload:l,clearFinishedDownloads:f}});function Mp(e){return e?.[0]==="output"?"output":"input"}n(Mp,"getAssetType$1");function Pp(e,t){const a={promptId:e.promptId,nodeId:t.nodeId,subfolder:t.subfolder,executionTimeInSeconds:e.executionTimeInSeconds,format:t.format,create_time:e.createTime};return{id:e.promptId,name:t.filename,size:0,created_at:e.executionStartTimestamp?new Date(e.executionStartTimestamp).toISOString():new Date().toISOString(),tags:["output"],preview_url:t.url,user_metadata:a}}n(Pp,"mapTaskOutputToAssetItem");function F1(e,t,a="input"){return{id:`${a}-${t}-${e}`,name:e,size:0,created_at:new Date().toISOString(),tags:[a],preview_url:oe.apiURL(`/view?filename=${encodeURIComponent(e)}&type=${a}`)}}n(F1,"mapInputFileToAssetItem");var U1=100;async function W1(){const e=await fetch(oe.internalURL("/files/input"),{headers:{"Comfy-User":oe.user}});if(!e.ok)throw new Error("Failed to fetch input files");return(await e.json()).map((t,a)=>F1(t,a,"input"))}n(W1,"fetchInputFilesFromAPI");async function z1(){return await Zt.getAssetsByTag("input",!1,{limit:U1})}n(z1,"fetchInputFilesFromCloud");function V1(e){const t=[];for(const a of e){if(a.status!=="completed"||!a.preview_output)continue;const o=new _n(a);if(!o.previewOutput)continue;const s=Pp(o,o.previewOutput);s.user_metadata={...s.user_metadata,outputCount:a.outputs_count,allOutputs:o.previewableOutputs},t.push(s)}return t.sort((a,o)=>new Date(o.created_at).getTime()-new Date(a.created_at).getTime())}n(V1,"mapHistoryToAssets");var Lr=200,Or=1e3;const ao=Je("assets",()=>{const e=Ap(),t=en(),a=A(0),o=A(!0),s=A(!1),r=A([]),i=ja(new Set),{state:l,isLoading:u,error:c,execute:d}=Xo(qe?z1:W1,[],{immediate:!1,resetOnExecute:!1,onError:n(N=>{console.error("Error fetching input assets:",N)},"onError")}),p=n(async(N=!1)=>{N||(a.value=0,o.value=!0,r.value=[],i.clear());const M=await oe.getHistory(Lr,{offset:a.value}),O=V1(M);if(N)for(const L of O){if(i.has(L.id))continue;i.add(L.id);const F=new Date(L.created_at).getTime(),K=r.value.findIndex(j=>new Date(j.created_at).getTime()<F);K===-1?r.value.push(L):r.value.splice(K,0,L)}else r.value=O,O.forEach(L=>i.add(L.id));if(a.value+=Lr,o.value=M.length===Lr,r.value.length>Or){const L=r.value.slice(Or);r.value=r.value.slice(0,Or),L.forEach(F=>i.delete(F.id))}return r.value},"fetchHistoryAssets"),f=A([]),g=A(!1),m=A(null),h=n(async()=>{g.value=!0,m.value=null;try{await p(!1),f.value=r.value}catch(N){console.error("Error fetching history assets:",N),m.value=N,f.value.length||(f.value=[])}finally{g.value=!1}},"updateHistory"),y=n(async()=>{if(!(!o.value||s.value)){s.value=!0,m.value=null;try{await p(!0),f.value=r.value}catch(N){console.error("Error loading more history:",N),m.value=N,f.value.length||(f.value=[])}finally{s.value=!1}}},"loadMoreHistory"),k=E(()=>{const N=new Map;for(const M of l.value)M.asset_hash&&N.set(M.asset_hash,M);return N});function S(N){return k.value.get(N)?.name??N}n(S,"getInputName");const _=n(()=>{if(qe){const N=ja(new Map),M=ja(new Map),O=ja(new Map),L=ja(new Map);async function F(V,q){L.has(V)||L.set(V,Xo(q,[],{immediate:!1,resetOnExecute:!1,onError:n(ce=>{console.error(`Error fetching model assets for ${V}:`,ce)},"onError")}));const re=L.get(V);M.set(V,!0),O.set(V,null);try{await re.execute()}finally{M.set(V,re.isLoading.value)}const ae=re.state.value;return mg(N.get(V),ae)||N.set(V,ae),O.set(V,re.error.value instanceof Error?re.error.value:null),ae}n(F,"updateModelsForKey");async function K(V){return F(V,()=>Zt.getAssetsForNodeType(V))}n(K,"updateModelsForNodeType$1");async function j(V){return F(`tag:${V}`,()=>Zt.getAssetsByTag(V))}return n(j,"updateModelsForTag$1"),{modelAssetsByNodeType:N,modelLoadingByNodeType:M,modelErrorByNodeType:O,updateModelsForNodeType:K,updateModelsForTag:j}}return{modelAssetsByNodeType:ja(new Map),modelLoadingByNodeType:ja(new Map),modelErrorByNodeType:ja(new Map),updateModelsForNodeType:n(async()=>[],"updateModelsForNodeType"),updateModelsForTag:n(async()=>[],"updateModelsForTag")}},"getModelState"),{modelAssetsByNodeType:I,modelLoadingByNodeType:w,modelErrorByNodeType:x,updateModelsForNodeType:D,updateModelsForTag:T}=_();return Mt(()=>e.lastCompletedDownload,async N=>{const{modelType:M}=N,O=t.getAllNodeProviders(M).filter(K=>K.nodeDef?.name).map(K=>D(K.nodeDef.name).then(()=>K.nodeDef.name)),L=[T(M),T("models")],F=await Promise.allSettled([...O,...L]);for(const K of F)K.status==="rejected"&&console.error(`Failed to refresh model cache for provider: ${K.reason}`)}),{inputAssets:l,historyAssets:f,inputLoading:u,historyLoading:g,inputError:c,historyError:m,hasMoreHistory:o,isLoadingMore:s,updateInputs:d,updateHistory:h,loadMoreHistory:y,inputAssetsByFilename:k,getInputName:S,modelAssetsByNodeType:I,modelLoadingByNodeType:w,modelErrorByNodeType:x,updateModelsForNodeType:D,updateModelsForTag:T}});function G1(e){const{t}=Fe(),a=ao(),o=Ap(),s=en(),{flags:r}=oo(),i=A(1),l=A(!1),u=A(!1),c=A(),d=A(""),p=A({url:"",name:"",tags:[]}),f=A(),g=r.huggingfaceModelImportEnabled?[Hs,Tp]:[Hs],m=E(()=>{const D=p.value.url.trim();return D?g.find(T=>hl(D,T))??null:null});be(()=>p.value.url,()=>{d.value=""});const h=E(()=>p.value.url.trim().length>0),y=E(()=>!!f.value);async function k(){if(!h.value)return;let D=p.value.url.trim();try{D=new URL(encodeURI(D)).toString()}catch{}if(p.value.url=D,!m.value){d.value=t("assetBrowser.unsupportedUrlSource",{sources:g.map(T=>T.name).join(", ")});return}l.value=!0;try{const T=await Zt.getAssetMetadata(p.value.url);if(T.filename)try{T.filename=decodeURIComponent(T.filename)}catch{}if(T.name)try{T.name=decodeURIComponent(T.name)}catch{}if(p.value.metadata=T,p.value.name=T.filename||T.name||"",p.value.previewImage=T.preview_image,T.tags&&T.tags.length>0){p.value.tags=T.tags;const N=T.tags.find(M=>e.value.some(O=>O.value===M));N&&(f.value=N)}i.value=2}catch(T){console.error("Failed to retrieve metadata:",T),d.value=T instanceof Error?T.message:De("assetBrowser.uploadModelFailedToRetrieveMetadata","Failed to retrieve metadata. Please check the link and try again."),i.value=1}finally{l.value=!1}}n(k,"fetchMetadata");async function S(D){if(p.value.previewImage)try{const T=D.split(".")[0];let N="png";const M=p.value.previewImage.match(/^data:image\/([^;]+);/);return M&&(N=M[1]==="jpeg"?"jpg":M[1]),(await Zt.uploadAssetFromBase64({data:p.value.previewImage,name:`${T}_preview.${N}`,tags:["preview"]})).id}catch(T){console.error("Failed to upload preview image:",T);return}}n(S,"uploadPreviewImage");async function _(){if(!f.value)return;const D=s.getAllNodeProviders(f.value);(await Promise.allSettled(D.map(T=>a.updateModelsForNodeType(T.nodeDef.name)))).forEach((T,N)=>{T.status==="rejected"&&console.error(`Failed to refresh ${D[N].nodeDef.name}:`,T.reason)})}n(_,"refreshModelCaches");async function I(){if(!y.value)return!1;const D=m.value;if(!D)return d.value=t("assetBrowser.noValidSourceDetected"),!1;u.value=!0;try{const T=f.value?["models",f.value]:["models"],N=p.value.metadata?.filename||p.value.metadata?.name||"model",M=await S(N),O={source:D.type,source_url:p.value.url,model_type:f.value};if(r.asyncModelUploadEnabled){const L=await Zt.uploadAssetAsync({source_url:p.value.url,tags:T,user_metadata:O,preview_id:M});L.type==="async"&&L.task.status!=="completed"?(f.value&&o.trackDownload(L.task.task_id,f.value,N),c.value="processing"):(c.value="success",await _()),i.value=3}else await Zt.uploadAssetFromUrl({url:p.value.url,name:N,tags:T,user_metadata:O,preview_id:M}),c.value="success",await _(),i.value=3}catch(T){console.error("Failed to upload asset:",T),c.value="error",d.value=T instanceof Error?T.message:"Failed to upload model",i.value=3}finally{u.value=!1}return c.value!=="error"}n(I,"uploadModel");function w(){i.value>1&&(i.value=i.value-1)}n(w,"goToPreviousStep");function x(){i.value=1,l.value=!1,u.value=!1,c.value=void 0,d.value="",p.value={url:"",name:"",tags:[]},f.value=void 0}return n(x,"resetWizard"),{currentStep:i,isFetchingMetadata:l,isUploading:u,uploadStatus:c,uploadError:d,wizardData:p,selectedModelType:f,canFetchMetadata:h,canUploadModel:y,detectedSource:m,fetchMetadata:k,uploadModel:I,goToPreviousStep:w,resetWizard:x}}n(G1,"useUploadModelWizard");var H1={class:"upload-model-dialog flex flex-col gap-6 border-t border-border-default p-4 pt-6"},j1={class:"min-h-0 flex-auto basis-0 overflow-y-auto"},K1=J({__name:"UploadModelDialog",emits:["upload-success"],setup(e,{emit:t}){const{flags:a}=oo(),o=Ct(),{modelTypes:s,fetchModelTypes:r}=Ep(),i=t,{currentStep:l,isFetchingMetadata:u,isUploading:c,uploadStatus:d,uploadError:p,wizardData:f,selectedModelType:g,canFetchMetadata:m,canUploadModel:h,fetchMetadata:y,uploadModel:k,goToPreviousStep:S,resetWizard:_}=G1(s);async function I(){await y()}n(I,"handleFetchMetadata");async function w(){await k()&&i("upload-success")}n(w,"handleUploadModel");function x(){o.closeDialog({key:"upload-model"})}return n(x,"handleClose"),it(()=>{r()}),(D,T)=>(C(),P("div",H1,[v("div",j1,[b(l)===1&&b(a).huggingfaceModelImportEnabled?(C(),X(m1,{key:0,modelValue:b(f).url,"onUpdate:modelValue":T[0]||(T[0]=N=>b(f).url=N),error:b(p)},null,8,["modelValue","error"])):b(l)===1?(C(),X(A1,{key:1,modelValue:b(f).url,"onUpdate:modelValue":T[1]||(T[1]=N=>b(f).url=N),error:b(p)},null,8,["modelValue","error"])):b(l)===2?(C(),X(dk,{key:2,modelValue:b(g),"onUpdate:modelValue":T[2]||(T[2]=N=>ua(g)?g.value=N:null),metadata:b(f).metadata,"preview-image":b(f).previewImage},null,8,["modelValue","metadata","preview-image"])):b(l)===3&&b(d)!=null?(C(),X(Gk,{key:3,result:b(d),error:b(p),metadata:b(f).metadata,"model-type":b(g),"preview-image":b(f).previewImage},null,8,["result","error","metadata","model-type","preview-image"])):H("",!0)]),R(_k,{class:"flex-shrink-0","current-step":b(l),"is-fetching-metadata":b(u),"is-uploading":b(c),"can-fetch-metadata":b(m),"can-upload-model":b(h),"upload-status":b(d),onBack:b(S),onFetchMetadata:I,onUpload:w,onClose:x,onImportAnother:b(_)},null,8,["current-step","is-fetching-metadata","is-uploading","can-fetch-metadata","can-upload-model","upload-status","onBack","onImportAnother"])]))}}),Y1=ot(K1,[["__scopeId","data-v-f4fd265e"]]),q1=""+new URL("images/civitai.svg",import.meta.url).href,X1={class:"flex items-center gap-2 p-4 font-bold"},Z1={key:0,src:q1,class:"size-4"},J1={class:"rounded-full bg-white px-1.5 py-0 text-xxs font-inter font-semibold uppercase text-black"},Q1=J({__name:"UploadModelDialogHeader",setup(e){const{flags:t}=oo(),a=E(()=>t.huggingfaceModelImportEnabled?"assetBrowser.uploadModelGeneric":"assetBrowser.uploadModelFromCivitai");return(o,s)=>(C(),P("div",X1,[b(t).huggingfaceModelImportEnabled?H("",!0):(C(),P("img",Z1)),v("span",null,$(o.$t(a.value)),1),v("span",J1,$(o.$t("g.beta")),1)]))}}),e0=Q1,t0={},a0={class:"flex flex-1 flex-col items-center justify-center text-base text-muted-foreground"},o0={class:"m-0 max-w-md"};function n0(e,t){return C(),P("div",a0,[v("p",o0,$(e.$t("assetBrowser.upgradeFeatureDescription")),1)])}n(n0,"_sfc_render$4");var s0=ot(t0,[["render",n0]]),r0={class:"flex flex-wrap justify-end gap-2 w-full"},i0={href:"https://blog.comfy.org/p/comfy-cloud-new-features-and-pricing",target:"_blank",rel:"noopener noreferrer",class:"text-muted-foreground mr-auto underline flex items-center gap-2"},l0=J({__name:"UploadModelUpgradeModalFooter",emits:["close","subscribe"],setup(e,{emit:t}){const a=t;return(o,s)=>(C(),P("div",r0,[v("a",i0,[s[2]||(s[2]=v("i",{class:"icon-[lucide--external-link]"},null,-1)),v("span",null,$(o.$t("g.learnMore")),1)]),R(se,{variant:"textonly",onClick:s[0]||(s[0]=r=>a("close"))},{default:W(()=>[fe($(o.$t("g.close")),1)]),_:1}),R(se,{variant:"secondary",onClick:s[1]||(s[1]=r=>a("subscribe"))},{default:W(()=>[fe($(o.$t("subscription.required.subscribe")),1)]),_:1})]))}}),u0=l0,c0={class:"flex flex-col justify-between gap-10 p-4 border-t border-border-default w-auto max-w-[min(500px,90vw)]"},d0=J({__name:"UploadModelUpgradeModal",setup(e){const t=Ct(),{showSubscriptionDialog:a}=nn();function o(){t.closeDialog({key:"upload-model-upgrade"})}n(o,"handleClose");function s(){a()}return n(s,"handleSubscribe"),(r,i)=>(C(),P("div",c0,[R(s0),R(u0,{onClose:o,onSubscribe:s})]))}}),p0=d0,f0={},m0={class:"flex items-center gap-2 p-4 font-bold"};function g0(e,t){return C(),P("div",m0,[v("span",null,$(e.$t("assetBrowser.upgradeToUnlockFeature")),1)])}n(g0,"_sfc_render$3");var h0=ot(f0,[["render",g0]]);function v0(e){const t=Ct(),{flags:a}=oo(),o=E(()=>a.modelUploadButtonEnabled);function s(){a.privateModelsEnabled?t.showDialog({key:"upload-model",headerComponent:e0,component:Y1,props:{onUploadSuccess:n(async()=>{await e?.()},"onUploadSuccess")},dialogComponentProps:{pt:{header:"py-0! pl-0!",content:"p-0! overflow-y-hidden!"}}}):t.showDialog({key:"upload-model-upgrade",headerComponent:h0,component:p0,dialogComponentProps:{pt:{header:"py-0! pl-0!",content:"p-0! overflow-y-hidden!"}}})}return n(s,"showUploadDialog"),{isUploadButtonEnabled:o,showUploadDialog:s}}n(v0,"useModelUpload");var y0=new Set(["VAE","CLIP","GLIGEN"]);function w0(e){return e?e==="diffusion_models"?"Diffusion":e.split("_").map(t=>{const a=t.toUpperCase();if(y0.has(a))return a;const o=t.toLowerCase();return o.charAt(0).toUpperCase()+o.slice(1)}).join(" "):"Models"}n(w0,"formatCategoryLabel");var b0={class:"capitalize"},_0={class:"flex w-full items-center justify-between gap-2"},k0={class:"hidden md:inline"},C0=J({__name:"AssetBrowserModal",props:{nodeType:{},assetType:{},onSelect:{type:Function},onClose:{type:Function},showLeftPanel:{type:Boolean},title:{}},emits:["asset-select","close"],setup(e,{emit:t}){const{t:a}=Fe(),o=ao(),s=en(),r=Id(Ag),i=e,l=t;ya(pl,i.onClose??(()=>{}));const u=E(()=>i.nodeType?i.nodeType:i.assetType?`tag:${i.assetType}`:""),c=E(()=>o.modelAssetsByNodeType.get(u.value)??[]),d=E(()=>o.modelLoadingByNodeType.get(u.value)??!1),p=E(()=>d.value&&c.value.length===0);async function f(){return i.nodeType?await o.updateModelsForNodeType(i.nodeType):i.assetType?await o.updateModelsForTag(i.assetType):[]}n(f,"refreshAssets"),f();const{isUploadButtonEnabled:g,showUploadDialog:m}=v0(f),{searchQuery:h,selectedCategory:y,availableCategories:k,categoryFilteredAssets:S,filteredAssets:_,updateFilters:I}=J_(c),w=E(()=>{const O=(c.value??[]).map(L=>L.tags?.find(F=>F!=="models")).find(L=>typeof L=="string"&&L.length>0);if(O)return O;if(i.nodeType){const L=s.getCategoryForNodeType(i.nodeType);if(L)return L}return i.assetType?i.assetType:"models"}),x=E(()=>y.value!=="all"?y.value:w.value),D=E(()=>i.title?i.title:a("assetBrowser.allCategory",{category:w0(x.value)})),T=E(()=>i.showLeftPanel??!0);function N(){i.onClose?.(),l("close")}n(N,"handleClose");function M(O){l("asset-select",O),i.onSelect?.(O)}return n(M,"handleAssetSelectAndEmit"),(O,L)=>(C(),X(kp,{"data-component-id":"AssetBrowserModal",class:"size-full max-h-full max-w-full min-w-0","content-title":D.value,onClose:N},qo({header:W(()=>[v("div",_0,[R(Ao,{modelValue:b(h),"onUpdate:modelValue":L[1]||(L[1]=F=>ua(h)?h.value=F:null),autofocus:!0,size:"lg",placeholder:O.$t("g.searchPlaceholder"),class:"max-w-96"},null,8,["modelValue","placeholder"]),b(g)?(C(),X(se,{key:0,variant:"primary",size:b(r).md?"lg":"icon","data-attr":"upload-model-button",onClick:b(m)},{default:W(()=>[L[3]||(L[3]=v("i",{class:"icon-[lucide--folder-input]"},null,-1)),v("span",k0,$(O.$t("assetBrowser.uploadModel")),1)]),_:1},8,["size","onClick"])):H("",!0)])]),contentFilter:W(()=>[R(Kb,{assets:b(S),"all-assets":c.value,onFilterChange:b(I)},null,8,["assets","all-assets","onFilterChange"])]),content:W(()=>[R(j_,{assets:b(_),loading:p.value,onAssetSelect:M,onAssetDeleted:f},null,8,["assets","loading"])]),_:2},[T.value?{name:"leftPanel",fn:W(()=>[R(Cp,{modelValue:b(y),"onUpdate:modelValue":L[0]||(L[0]=F=>ua(y)?y.value=F:null),"data-component-id":"AssetBrowserModal-LeftSidePanel","nav-items":b(k)},{"header-icon":W(()=>L[2]||(L[2]=[v("div",{class:"icon-[lucide--folder] size-4"},null,-1)])),"header-title":W(()=>[v("span",b0,$(D.value),1)]),_:1},8,["modelValue","nav-items"])]),key:"0"}:void 0]),1032,["content-title"]))}}),Ou=C0,Nu={headless:!0,modal:!0,closable:!0,pt:{root:{class:"rounded-2xl overflow-hidden asset-browser-dialog"},header:{class:"!p-0 hidden"},content:{class:"!p-0 !m-0 h-full w-full"}}};const x0=n(()=>{const e=Ct(),t="global-asset-browser";async function a(s){const r=n(i=>{s.onAssetSelected?.(i),e.closeDialog({key:t})},"handleAssetSelected");e.showDialog({key:t,component:Ou,props:{nodeType:s.nodeType,inputName:s.inputName,currentValue:s.currentValue,onSelect:r,onClose:n(()=>e.closeDialog({key:t}),"onClose")},dialogComponentProps:Nu})}n(a,"show");async function o(s){const r=n(i=>{s.onAssetSelected?.(i),e.closeDialog({key:t})},"handleAssetSelected");e.showDialog({key:t,component:Ou,props:{showLeftPanel:!0,assetType:s.assetType,title:s.title,onSelect:r,onClose:n(()=>e.closeDialog({key:t}),"onClose")},dialogComponentProps:Nu})}return n(o,"browse"),{show:a,browse:o}},"useAssetBrowserDialog");var I0=5,S0=4096;async function E0(){if(qe){const e=await Pa().getAuthHeader();return{...e&&{headers:e}}}return{}}n(E0,"getAuthHeaders");var Ka=new Map,T0=n(e=>{const{route:t,query_params:a={},refresh:o=0}=e,s=Object.entries(a).sort(([r],[i])=>r.localeCompare(i)).map(([r,i])=>`${r}=${i}`).join("&");return[t,`r=${o}`,s].join(";")},"createCacheKey"),A0=n(e=>Math.min(1e3*Math.pow(2,e),512),"getBackoff"),$u=n(e=>e?.data&&e?.timestamp&&e.timestamp>0,"isInitialized"),M0=n((e,t)=>e?.timestamp&&Date.now()-e.timestamp>=t,"isStale"),P0=n(e=>e?.fetchPromise!==void 0,"isFetching"),D0=n(e=>e?.failed===!0,"isFailed"),L0=n(e=>e?.error&&e?.lastErrorTime&&Date.now()-e.lastErrorTime<A0(e.retryCount||0),"isBackingOff"),O0=n(async(e,t)=>{const{route:a,response_key:o,query_params:s,timeout:r=S0}=e,i=await E0(),l=await So.get(a,{params:s,signal:t.signal,timeout:r,...i});return o?l.data[o]:l.data},"fetchData");function N0(e){const{remoteConfig:t,defaultValue:a,node:o,widget:s}=e,{refresh:r=0,max_retries:i=I0}=t,l=r<=0,u=T0(t);let c=!1,d=!1;const p=n((D,T)=>{D.retryCount=0,D.lastErrorTime=0,D.error=null,D.timestamp=Date.now(),D.data=T??a},"setSuccess"),f=n((D,T)=>{D.retryCount=(D.retryCount||0)+1,D.lastErrorTime=Date.now(),D.error=T instanceof Error?T:new Error(String(T)),D.data??=a,D.fetchPromise=void 0,D.retryCount>=i&&g(D)},"setError"),g=n(D=>{Ka.set(u,{data:D.data??a,failed:!0})},"setFailed"),m=n(()=>!c&&$u(Ka.get(u)),"isFirstLoad"),h=n(D=>{c=!0,s.value=D[0],s.callback?.(s.value),o.graph?.setDirtyCanvas(!0)},"onFirstLoad"),y=n(async()=>{const D=Ka.get(u);if(D0(D)||$u(D)&&(l||!M0(D,r))||L0(D)||P0(D))return D.data;const T=D||{data:a};Ka.set(u,T);try{return T.controller=new AbortController,T.fetchPromise=O0(t,T.controller),p(T,await T.fetchPromise),T.data}catch(N){return f(T,N),T.data}finally{T.fetchPromise=void 0,T.controller=void 0}},"fetchValue"),k=n(()=>{if(t.control_after_refresh){const D=_();if(!Array.isArray(D))return;switch(t.control_after_refresh){case"first":s.value=D[0]??a;break;case"last":s.value=D.at(-1)??a;break}s.callback?.(s.value),o.graph?.setDirtyCanvas(!0)}},"onRefresh"),S=n(()=>{const D=Ka.get(u);D&&(D.fetchPromise&&D.controller?.abort(),Ka.delete(u))},"clearCachedValue");function _(){return Ka.get(u)?.data}n(_,"getCachedValue");function I(D){return y().then(T=>{m()&&h(T),d&&T!==a&&(k(),d=!1),D?.()}).catch(T=>{console.error(T)}),_()??a}n(I,"getValue"),s.refresh=function(){d=!0,S(),I()};function w(){o.addWidget("button","refresh","refresh",s.refresh)}n(w,"addRefreshButton");function x(){let D=!1;const T=n(()=>{D&&s.refresh&&s.refresh()},"handleExecutionSuccess"),N=o.addWidget("toggle","Auto-refresh after generation",!1,M=>{D=M},{serialize:!1});return oe.addEventListener("execution_success",T),o.onRemoved=Fa(o.onRemoved,function(){oe.removeEventListener("execution_success",T)}),N}return n(x,"addAutoRefreshToggle"),x(),{getCachedValue:_,getValue:I,refreshValue:s.refresh,addRefreshButton:w,getCacheEntry:n(()=>Ka.get(u),"getCacheEntry"),cacheKey:u}}n(N0,"useRemoteWidget");var $0=n(e=>{if(e.default)return e.default;if(e.options?.length)return e.options[0];if(e.remote)return"Loading..."},"getDefaultValue"),Dp={LoadImage:"image",LoadVideo:"video",LoadAudio:"audio"},R0={LoadImage:"widgets.uploadSelect.placeholderImage",LoadVideo:"widgets.uploadSelect.placeholderVideo",LoadAudio:"widgets.uploadSelect.placeholderAudio"},B0=n((e,t)=>{const a=A([]),o=new lr({node:e,name:t.name,component:Kw,inputSpec:t,options:{getValue:n(()=>a.value,"getValue"),setValue:n(s=>{a.value=s},"setValue")}});return ur(e,o),t.control_after_generate&&(o.linkedWidgets=Hn(e,o,"fixed",void 0,Co(t))),o},"addMultiSelectWidget"),F0=n((e,t,a)=>{const o=a??G("widgets.selectModel"),s=x0();async function r(l){if(!Eh(l))throw new Error(`Expected asset widget but received ${l.type}`);await s.show({nodeType:e.comfyClass||"",inputName:t.name,currentValue:l.value,onAssetSelected:n(u=>{const c=gl.safeParse(u);if(!c.success){console.error("Invalid asset item:",c.error.errors,"Received:",u);return}const d=c.data.user_metadata?.filename,p=k_.safeParse(d);if(!p.success){console.error("Invalid asset filename:",p.error.errors,"for asset:",c.data.id);return}const f=l.value;l.value=p.data,e.onWidgetChanged?.(l.name,p.data,f,l)},"onAssetSelected")})}n(r,"openModal");const i={openModal:r};return e.addWidget("asset",t.name,o,()=>{},i)},"createAssetBrowserWidget"),U0=n((e,t,a)=>{const o=ao(),s=e.addWidget("combo",t.name,a??"",()=>{},{values:[],getOptionLabel:n(i=>i?o.getInputName(i):G(R0[e.comfyClass??""]??"widgets.uploadSelect.placeholder"),"getOptionLabel")});o.inputAssets.length===0&&!o.inputLoading&&o.updateInputs().then(()=>{e.setDirtyCanvas(!0,!1)});const r=s.options;if(s.options=new Proxy(r,{get(i,l){return l!=="values"?i[l]:o.inputAssets.filter(u=>Ta(u.name)===Dp[e.comfyClass??""]).map(u=>u.asset_hash).filter(u=>!!u)}}),t.control_after_generate){if(!Bs(s))throw new Error(`Expected combo widget but received ${s.type}`);s.linkedWidgets=Hn(e,s,void 0,void 0,Co(t))}return s},"createInputMappingWidget"),W0=n((e,t)=>{const a=$0(t);if(qe){const s=Me().get("Comfy.Assets.UseAssetAPI"),r=Zt.isAssetBrowserEligible(e.comfyClass,t.name);if(s&&r)return F0(e,t,a);if(Dp[e.comfyClass??""])return U0(e,t,a)}const o=e.addWidget("combo",t.name,a,()=>{},{values:t.options??[]});if(t.remote){if(!Bs(o))throw new Error(`Expected combo widget but received ${o.type}`);const s=N0({remoteConfig:t.remote,defaultValue:a,node:e,widget:o});t.remote.refresh_button&&s.addRefreshButton();const r=o.options;o.options=new Proxy(r,{get(i,l){return l!=="values"?i[l]:s.getValue()}})}if(t.control_after_generate){if(!Bs(o))throw new Error(`Expected combo widget but received ${o.type}`);o.linkedWidgets=Hn(e,o,void 0,void 0,Co(t))}return o},"addComboWidget");const z0=n(()=>n((t,a)=>{if(!Fw(a))throw new Error(`Invalid input data: ${a}`);return a.multi_select?B0(t,a):W0(t,a)},"widgetConstructor"),"useComboWidget");function V0(e){const t=this.options.round;if(t){const a=this.options.precision??Math.max(0,-Math.floor(Math.log10(t))),o=Math.round(e/t)*t;this.value=ri(Number(o.toFixed(a)),this.options.min??-1/0,this.options.max??1/0)}else this.value=e}n(V0,"onFloatValueChange");const Lp=n(()=>n((t,a)=>{if(!$w(a))throw new Error(`Invalid input data: ${a}`);const o=Me(),s=!o.get("Comfy.DisableSliders"),r=a.display,i=s&&r=="slider"?"slider":r=="knob"?"knob":"number",l=a.step??.5,u=o.get("Comfy.FloatRoundingPrecision")||Math.max(0,-Math.floor(Math.log10(l))),c=!o.get("Comfy.DisableFloatRounding"),d=a.default??0,p=t.addWidget(i,a.name,d,V0,{min:a.min??0,max:a.max??2048,round:c&&u&&!a.round?Math.pow(10,-u):a.round,step:l*10,step2:l,precision:u});return a.control_after_generate&&(p.linkedWidgets=[bl(t,p,"fixed",void 0,void 0,Co(a))]),p},"widgetConstructor"),"useFloatWidget"),G0=n(()=>(e,t)=>{const{name:a,options:o={}}=t;return e.addWidget("galleria",a,o.images||[],()=>{},{serialize:!0,...o})},"useGalleriaWidget"),H0=n(()=>(e,t)=>{const{name:a,options:o={}}=t;return e.addWidget("imagecompare",a,["",""],()=>{},{serialize:!0,...o})},"useImageCompareWidget");function j0(e){return"button"in e&&e.button===1?!0:"buttons"in e&&typeof e.buttons=="number"?e.buttons===4:!1}n(j0,"isMiddlePointerInput");function vl(){const e=Me(),t=gt(),{getCanvas:a}=t,o=E(()=>e.get("Comfy.Canvas.NavigationMode")==="standard"),s=E(()=>!(t.canvas?.read_only??!1)),r=n(u=>{if(!u.target?.closest('[data-capture-wheel="true"]')){if(o.value&&(u.ctrlKey||u.metaKey)){l(u);return}if(!o.value){l(u);return}}},"handleWheel"),i=n(u=>{if(j0(u)){l(u);return}const c=a();if(!c)return;const d=c.read_only&&u.buttons===1,p=u.buttons===4;if(d||p){u.preventDefault(),u.stopPropagation(),l(u);return}},"handlePointer"),l=n(u=>{if(u.target?.closest('[data-capture-wheel="true"]'))return;const c=Z.canvas?.canvas;if(!c)return;if(u.preventDefault(),u.stopPropagation(),u instanceof WheelEvent){const{clientX:f,clientY:g,deltaX:m,deltaY:h,ctrlKey:y,metaKey:k,shiftKey:S}=u;c.dispatchEvent(new WheelEvent("wheel",{clientX:f,clientY:g,deltaX:m,deltaY:h,ctrlKey:y,metaKey:k,shiftKey:S}));return}const d=u.constructor,p=new d(u.type,u);c.dispatchEvent(p)},"forwardEventToCanvas");return{handleWheel:r,handlePointer:i,forwardEventToCanvas:l,shouldHandleNodePointerEvents:s}}n(vl,"useCanvasInteractions");const K0=n(e=>{if(!e.length||e.length===1)return!0;const t=e[0].naturalWidth/e[0].naturalHeight;for(let a=1;a<e.length;a++)if(t!=e[a].naturalWidth/e[a].naturalHeight)return!1;return!0},"is_all_same_aspect_ratio"),Y0=n((e,t,a,o=64)=>{const s=e/t;if(!s||isNaN(s))return{minHeight:0,minWidth:0};const r=a;return{minHeight:Math.max(r/s,o),minWidth:r}},"fitDimensionsToNodeWidth");var Ru="video-preview",q0={playsInline:!0,controls:!0,loop:!0},X0=8192,Z0=1,Nr=256,J0=n(()=>{const e=document.createElement("div");return e.classList.add("comfy-img-preview"),e},"createContainer"),Q0=n(e=>new Promise(t=>setTimeout(()=>t(null),e)),"createTimeout"),Op=n((e,t)=>{const{loadElement:a,onLoaded:o,onFailedLoading:s}=t,r=Gt(),i=n(async(c,d=0)=>{const p=await Promise.race([a(c),Q0(X0)]);return p===null&&d<Z0?i(c,d+1):p},"loadElementWithTimeout"),l=n(async c=>Promise.all(c.map(d=>i(d))),"loadElements");function u(c={}){if(e.isLoading)return;const d=r.getNodeImageUrls(e);d?.length&&(c?.block&&(e.isLoading=!0),l(d).then(p=>{const f=p.filter(g=>g!==null);f.length&&(o?.(f),e.graph?.setDirtyCanvas(!0))}).catch(()=>{s?.()}).finally(()=>{e.isLoading=!1}))}return n(u,"showPreview"),{showPreview:u}},"useNodePreview");const Np=n((e,t)=>(e.previewMediaType="image",Op(e,{loadElement:n(s=>new Promise(r=>{const i=new Image;i.onload=()=>r(i),i.onerror=()=>r(null),i.src=s}),"loadElement"),onLoaded:n(s=>{e.imageIndex=null,e.imgs=s,t?.()},"onLoaded"),onFailedLoading:n(()=>{e.imgs=void 0},"onFailedLoading")})),"useNodeImage"),$p=n((e,t)=>{e.previewMediaType="video";let a=Nr,o=Nr;const{handleWheel:s,handlePointer:r}=vl(),i=n(d=>{const{minHeight:p,minWidth:f}=Y0(d.videoWidth,d.videoHeight,e.size?.[0]||Nr);o=f,a=p},"setMinDimensions"),l=n(d=>new Promise(p=>{const f=document.createElement("video");Object.assign(f,q0),f.addEventListener("wheel",s),f.addEventListener("pointermove",r),f.addEventListener("pointerdown",r),f.onloadeddata=()=>{i(f),p(f)},f.onerror=()=>p(null),f.src=d}),"loadElement"),u=n(d=>{if(!e.widgets?.some(p=>p.name===Ru)){const p=e.addDOMWidget(Ru,"video",d,{canvasOnly:!0,hideOnZoom:!1});p.serialize=!1,p.computeLayoutSize=()=>({minHeight:a,minWidth:o})}},"addVideoDomWidget");return Op(e,{loadElement:l,onLoaded:n(d=>{const p=d[0];p&&(e.videoContainer||(e.videoContainer=J0(),u(e.videoContainer)),e.videoContainer.replaceChildren(p),t?.())},"onLoaded"),onFailedLoading:n(()=>{e.videoContainer=void 0},"onFailedLoading")})},"useNodeVideo"),eC=n((e,t)=>{const{onDragOver:a,onDrop:o,fileFilter:s=n(()=>!0,"fileFilter")}=t,r=n(d=>!!Array.from(d).find(p=>p.kind==="file"),"hasFiles"),i=n(d=>Array.from(d).filter(s),"filterFiles"),l=n(d=>i(d).length>0,"hasValidFiles"),u=n(d=>d?.dataTransfer?.items?a?.(d)??r(d.dataTransfer.items):!1,"isDraggingFiles"),c=n(d=>d?.dataTransfer?.files?l(d.dataTransfer.files):!1,"isDraggingValidFiles");e.onDragOver=u,e.onDragDrop=function(d){return c(d)?(o(i(d.dataTransfer.files)),!0):!1}},"useNodeDragAndDrop");function tC(e,t){const{accept:a,allow_batch:o=!1,fileFilter:s=n(()=>!0,"fileFilter"),onSelect:r}=t;let i=document.createElement("input");return i.type="file",i.accept=a??"*",i.multiple=o,i.onchange=()=>{if(i?.files?.length){const l=Array.from(i.files).filter(s);l.length&&r(l)}},e.onRemoved=Fa(e.onRemoved,()=>{i&&(i.onchange=null,i=null)}),{openFileSelection:n(()=>i?.click(),"openFileSelection")}}n(tC,"useNodeFileInput");const aC=n((e,t)=>{const{onPaste:a,fileFilter:o=n(()=>!0,"fileFilter"),allow_batch:s=!1}=t;e.pasteFiles=function(r){const i=Array.from(r).filter(o);return i.length?(a(s?i:i.slice(0,1)),!0):!1}},"useNodePaste");var oC=2e3,nC=n(async(e,t,a={})=>{const o=new FormData;o.append("image",e),t&&o.append("subfolder","pasted"),a.type&&o.append("type",a.type);const s=await oe.fetchApi("/upload/image",{method:"POST",body:o});if(s.status!==200){Oe().addAlert(s.status+" - "+s.statusText);return}const r=await s.json();return(a.type==="input"||!a.type&&!t)&&await ao().updateInputs(),r.subfolder?`${r.subfolder}/${r.name}`:r.name},"uploadFile");const sC=n((e,t)=>{const{fileFilter:a,onUploadComplete:o,allow_batch:s,accept:r}=t,i=n(d=>d.name==="image.png"&&d.lastModified-Date.now()<oC,"isPastedFile"),l=n(async d=>{try{const p=await nC(d,i(d),{type:t.folder});return p||void 0}catch(p){Oe().addAlert(String(p))}},"handleUpload"),u=n(async d=>{const p=(await Promise.all(d.map(l))).filter(f=>!!f);return p.length&&o(p),p},"handleUploadBatch");eC(e,{fileFilter:a,onDrop:u}),aC(e,{fileFilter:a,allow_batch:s,onPaste:u});const{openFileSelection:c}=tC(e,{fileFilter:a,allow_batch:s,accept:r,onSelect:u});return{openFileSelection:c,handleUpload:l}},"useNodeImageUpload");function rC(e,t){let a=t,o=e(t),s=!1;return{get:n(()=>(s&&(o=e(a)),o),"get"),set:n(r=>{s=!0,a=r},"set")}}n(rC,"useValueTransform");function iC(e){const t=e[1];return t!==void 0&&typeof t=="object"&&"imageInputName"in t&&typeof t.imageInputName=="string"}n(iC,"isImageUploadInput");var lC=n(e=>/\[(input|output|temp)\]/i.test(e),"hasAnnotation"),Bu=n((e,t="input")=>!lC(e)&&t!=="input"?` [${t}]`:"","createAnnotation"),Fu=n((e,t="")=>t?`${t}/${e}`:e,"createPath");function js(e,t={}){const{rootFolder:a="input",subfolder:o}=t;return typeof e=="string"?`${Fu(e,o)}${Bu(e,a)}`:`${Fu(e.filename??"",e.subfolder)}${e.type?Bu(e.type,a):""}`}n(js,"createAnnotatedPath");function yl(e){return e?e.previewMediaType==="image"||e.previewMediaType!=="video"&&!!e.imgs?.length:!1}n(yl,"isImageNode");function wl(e){return e?e.previewMediaType==="video"||!!e.videoContainer:!1}n(wl,"isVideoNode");function uC(e){return!!e&&e.previewMediaType==="audio"}n(uC,"isAudioNode");function cC(e,t){e.options||(e.options={values:[]}),e.options.values||(e.options.values=[]),e.options.values.includes(t)||e.options.values.push(t)}n(cC,"addToComboValues");const Rp=n(e=>e instanceof Jo,"isLGraphNode"),dC=n(e=>e instanceof Th,"isLGraphGroup"),pC=n(e=>e instanceof Md,"isReroute"),V8=n(e=>{const t=Be.filter(e,nh);if(Be.isEmpty(t))return null;const a=Be.map(t,o=>o.getColorOption());return Be.every(a,o=>Be.isEqual(o,Be.head(a)))?Be.head(a):null},"getItemsColorOption");function fC(e,t){for(const a of e)for(const o of a.widgets??[])o[t]?.()}n(fC,"executeWidgetsCallback");function Uu(e,t,a){const o=new Set(t.map(r=>r.name)),s=Object.values(e).filter(r=>o.has(r.name)||r.forceInput);return Be.sum(s.map(r=>r.control_after_generate||["seed","noise_seed"].includes(r.name)?2:1))===a?.length?Be.zip(s,a).filter(([r])=>!r?.forceInput).map(([r,i])=>i):a}n(Uu,"migrateWidgetsValues");function Bp(e){for(const t of e.nodes){for(const[a,o]of t.inputs.entries()){const s=o.link;if(!s)continue;const r=e.links.get(s);r&&(r.target_slot=a)}t.isSubgraphNode?.()&&t.subgraph&&Bp(t.subgraph)}}n(Bp,"fixLinkInputSlots");function mC(e){for(const t of e.nodes){t.inputs=t.inputs?.filter(Fp);for(const[a,o]of t.inputs?.entries()??[])if(o.link){const s=e.links.find(r=>r[0]===o.link);s&&(s[4]=a)}}Up(e.definitions?.subgraphs)}n(mC,"compressWidgetInputSlots");function Fp(e){return!(e.widget&&e.link===null&&!e.label)}n(Fp,"matchesLegacyApi");function Up(e,t=new WeakSet){if(e)for(const a of e){if(t.has(a))throw new Error("Infinite loop detected");if(t.add(a),a.nodes){for(const o of a.nodes)if(o.inputs=o.inputs?.filter(Fp),!!a.links){for(const[s,r]of o.inputs?.entries()??[])if(r.link){const i=a.links.find(l=>l.id===r.link);i&&(i.target_slot=s)}}}Up(a.definitions?.subgraphs,t)}}n(Up,"compressSubgraphWidgetInputSlots");function G8(e){return e&&e.type&&(e.type==="Load3D"||e.type==="Load3DAnimation")}n(G8,"isLoad3dNode");var gC="image/png,image/jpeg,image/webp",hC="video/webm,video/mp4",vC=n(e=>e.type.startsWith("image/"),"isImageFile"),yC=n(e=>e.type.startsWith("video/"),"isVideoFile"),wC=n((e,t)=>e.widgets.find(a=>a.name===t),"findFileComboWidget");const bC=n(()=>n((t,a,o)=>{if(!iC(o))throw new Error("Image upload widget requires imageInputName augmentation");const s=o[1],{imageInputName:r,allow_batch:i,image_folder:l="input"}=s,u=l,c=Gt(),d=!!s.animated_image_upload,p=!!s.video_upload,f=p?hC:gC,{showPreview:g}=p?$p(t):Np(t),m=p?yC:vC,h=wC(t,r),y=`${h.value}`,k=n(w=>js(w,{rootFolder:l}),"formatPath");Object.defineProperty(h,"value",rC(n(w=>w?Array.isArray(w)?i?w.map(k):k(w[0]):k(w):y,"transform"),y));const{openFileSelection:_}=sC(t,{allow_batch:i,fileFilter:m,accept:f,folder:u,onUploadComplete:n(w=>{w.forEach(D=>cC(h,D));const x=i?[...w]:w[0];h.value=x,h.callback?.(x)},"onUploadComplete")}),I=t.addWidget("button",a,"image",()=>_(),{serialize:!1,canvasOnly:!0});return I.label=G("g.choose_file_to_upload"),h.callback=function(){c.setNodeOutputs(t,h.value,{isAnimated:d}),t.graph?.setDirtyCanvas(!0)},requestAnimationFrame(()=>{c.setNodeOutputs(t,h.value,{isAnimated:d}),g({block:!1})}),{widget:I}},"widgetConstructor"),"useImageUploadWidget");function _C(e){const t=this.options.step2||1;if(t===1)this.value=Math.round(e);else{const a=(this.options.min??0)%t;this.value=Math.round((e-a)/t)*t+a}}n(_C,"onValueChange");const kC=n(()=>n((t,a)=>{if(!Nw(a))throw new Error(`Invalid input data: ${a}`);const o=!Me().get("Comfy.DisableSliders"),s=a.display,r=o&&s=="slider"?"slider":s=="knob"?"knob":"number",i=a.step??1,l=a.default??0,u=t.addWidget(r,a.name,l,_C,{min:a.min??0,max:a.max??2048,step:i*10,step2:i,precision:0});return(a.control_after_generate??["seed","noise_seed"].includes(a.name))&&(u.linkedWidgets=[bl(t,u,"randomize",void 0,void 0,Co(a))]),u},"widgetConstructor"),"useIntWidget");function CC(e,t,a){tu.configure({html:!1,breaks:!0,transformPastedText:!0});const o=new Wh({extensions:[Vh,tu,jh,Gh,Uh,zh,Hh],content:a.defaultVal,editable:!1}),s=o.options.element;s.classList.add("comfy-markdown");const r=document.createElement("textarea");s.append(r);const i=e.addDOMWidget(t,"MARKDOWN",s,{getValue(){return r.value},setValue(l){r.value=l,o.commands.setContent(l)}});return i.inputEl=s,i.options.minNodeSize=[400,200],s.addEventListener("dblclick",()=>{s.classList.add("editing"),setTimeout(()=>{r.focus()},0)}),r.addEventListener("blur",()=>{s.classList.remove("editing")}),r.addEventListener("change",()=>{o.commands.setContent(r.value),i.callback?.(i.value)}),s.addEventListener("keydown",l=>{l.stopPropagation()}),s.addEventListener("pointerdown",l=>{l.button===1&&Z.canvas.processMouseDown(l)}),s.addEventListener("pointermove",l=>{(l.buttons&4)===4&&Z.canvas.processMouseMove(l)}),s.addEventListener("pointerup",l=>{l.button===1&&Z.canvas.processMouseUp(l)}),i}n(CC,"addMarkdownWidget");const xC=n(()=>n((t,a)=>CC(t,a.name,{defaultVal:a.default??""}),"widgetConstructor"),"useMarkdownWidget");var IC=50;function SC(e,t,a){const o=document.createElement("textarea");o.className="comfy-multiline-input",o.value=a.defaultVal,o.placeholder=a.placeholder||t,o.spellcheck=Me().get("Comfy.TextareaWidget.Spellcheck");const s=e.addDOMWidget(t,"customtext",o,{getValue(){return o.value},setValue(r){o.value=r}});return s.inputEl=o,s.options.minNodeSize=[400,200],o.addEventListener("input",()=>{s.callback?.(s.value)}),o.addEventListener("pointerdown",r=>{r.button===1&&Z.canvas.processMouseDown(r)}),o.addEventListener("pointermove",r=>{(r.buttons&4)===4&&Z.canvas.processMouseMove(r)}),o.addEventListener("pointerup",r=>{r.button===1&&Z.canvas.processMouseUp(r)}),o.addEventListener("wheel",r=>{const i=Me().get("LiteGraph.Pointer.TrackpadGestures"),l=r.deltaX,u=r.deltaY,c=o.scrollHeight>o.clientHeight,d=Math.abs(l)>Math.abs(u);if(r.ctrlKey){r.preventDefault(),r.stopPropagation(),Z.canvas.processMouseWheel(r);return}if(i&&(Math.abs(l)>0||Math.abs(u)<IC)){r.preventDefault(),r.stopPropagation(),Z.canvas.processMouseWheel(r);return}if(d){r.preventDefault(),r.stopPropagation(),Z.canvas.processMouseWheel(r);return}if(c){r.stopPropagation();return}r.preventDefault(),Z.canvas.processMouseWheel(r)}),s}n(SC,"addMultilineWidget");const Wp=n(()=>n((t,a)=>{if(!Bw(a))throw new Error(`Invalid input data: ${a}`);const o=a.default??"",s=a.multiline?SC(t,a.name,{defaultVal:o,placeholder:a.placeholder}):t.addWidget("text",a.name,o,()=>{},{});return typeof a.dynamicPrompts=="boolean"&&(s.dynamicPrompts=a.dynamicPrompts),s},"widgetConstructor"),"useStringWidget"),EC=n(()=>(e,t)=>{const{name:a,options:o={}}=t;return e.addWidget("textarea",a,o.default||"",()=>{},{serialize:!0,rows:o.rows||5,cols:o.cols||50,...o})},"useTextareaWidget");var Wu=Wp(),TC=Lp(),AC=_p();function MC(e,t){let a;if(typeof t=="string")a=Wu(e,{type:"STRING",name:"UNKNOWN",multiline:t.length>20});else if(typeof t=="number")a=TC(e,{type:"FLOAT",name:"UNKNOWN"});else if(typeof t=="boolean")a=AC(e,{type:"BOOLEAN",name:"UNKNOWN"});else{a=Wu(e,{type:"STRING",name:"UNKNOWN",multiline:!0}),a.value=JSON.stringify(t);return}a.value=t}n(MC,"addWidgetFromValue");Jo.prototype.onConfigure=Fa(Jo.prototype.onConfigure,function(e){if(!(!this.has_errors||!e.widgets_values)){for(let t=0;t<e.widgets_values.length;t++){const a=e.widgets_values[t];MC(this,a)}this.serialize_widgets=!0}});var aa=n(e=>(t,a,o)=>{const s=e(t,ko(o,{name:a}));return{widget:s,minWidth:s.options.minNodeSize?.[0],minHeight:s.options.minNodeSize?.[1]}},"transformWidgetConstructorV2ToV1");function hi(){return Me().get("Comfy.WidgetControlMode")==="before"}n(hi,"controlValueRunBefore");function vi(e){hi()?e.label=G("g.control_before_generate"):e.label=G("g.control_after_generate")}n(vi,"updateControlWidgetLabel");const zp=Symbol();var zu=Symbol();function bl(e,t,a,o,s,r){let i=r?.[1]?.control_after_generate;return typeof i!="string"&&(i=s),Hn(e,t,a??"randomize",{addFilterList:!1,controlAfterGenerateName:i},r)[0]}n(bl,"addValueControlWidget");function Hn(e,t,a,o,s){a||(a="randomize"),o||(o={});const r=n((p,f)=>{let g=p;return o[f]?g=o[f]:typeof s?.[1]?.[p]=="string"?g=s?.[1]?.[p]:s?.[1]?.control_prefix&&(g=s?.[1]?.control_prefix+" "+g),g},"getName"),i=e.addWidget("combo",r("control_after_generate","controlAfterGenerateName"),a,function(){},{values:["fixed","increment","decrement","randomize"],serialize:!1,canvasOnly:!0});i.tooltip="Allows the linked widget to be changed automatically, for example randomizing the noise seed.",i[zp]=!0,vi(i),Object.defineProperty(i,"disabled",{get:n(()=>t.computedDisabled,"get")});const l=[i],u=Bs(t);let c;u&&i.options.values&&i.options.values.push("increment-wrap"),u&&o.addFilterList!==!1&&(c=e.addWidget("string",r("control_filter_list","controlFilterListName"),"",function(){},{serialize:!1}),vi(c),c.tooltip="Allows for filtering the list of values when changing the value via the control generate mode. Allows for RegEx matches in the format /abc/ to only filter to values containing 'abc'.",Object.defineProperty(c,"disabled",{get:n(()=>t.computedDisabled,"get")}),l.push(c));const d=n(()=>{var p=i.value;if(u&&p!=="fixed"){let f=t.options.values??[];const g=c?.value;if(g){let y;if(g.startsWith("/")&&g.endsWith("/"))try{const k=new RegExp(g.substring(1,g.length-1));y=n(S=>k.test(S),"check")}catch(k){console.error("Error constructing RegExp filter for node "+e.id,g,k)}if(!y){const k=g.toLocaleLowerCase();y=n(S=>S.toLocaleLowerCase().includes(k),"check")}f=f.filter(k=>y(k)),!f.length&&t.options.values?.length&&console.warn("Filter for node "+e.id+" has filtered out all items",g)}let m=f.indexOf(t.value),h=f.length;switch(p){case"increment":m+=1;break;case"increment-wrap":m+=1,m>=h&&(m=0);break;case"decrement":m-=1;break;case"randomize":m=Math.floor(Math.random()*h);break;default:break}if(m=Math.max(0,m),m=Math.min(h-1,m),m>=0){let y=f[m];t.value=y,t.callback?.(y)}}else{let{min:f=0,max:g=1,step2:m=1}=t.options;g=Math.min(0x4000000000000,g),f=Math.max(-0x4000000000000,f);let h=(g-f)/m;switch(p){case"fixed":break;case"increment":t.value+=m;break;case"decrement":t.value-=m;break;case"randomize":t.value=Math.floor(Math.random()*h)*m+f;break;default:break}t.value<f&&(t.value=f),t.value>g&&(t.value=g),t.callback?.(t.value)}},"applyWidgetControl");return i.beforeQueued=()=>{hi()&&i[zu]&&d(),i[zu]=!0},i.afterQueued=()=>{hi()||d()},l}n(Hn,"addValueControlWidgets");const _l={INT:aa(kC()),FLOAT:aa(Lp()),BOOLEAN:aa(_p()),STRING:aa(Wp()),MARKDOWN:aa(xC()),COMBO:aa(z0()),IMAGEUPLOAD:bC(),COLOR:aa(Hw()),IMAGECOMPARE:aa(H0()),BOUNDINGBOX:aa(Vw()),CHART:aa(Gw()),GALLERIA:aa(G0()),TEXTAREA:aa(EC()),...lw};function PC(e){return _l[e]!==void 0}n(PC,"isValidWidgetType");window.comfyAPI=window.comfyAPI||{};window.comfyAPI.widgets=window.comfyAPI.widgets||{};window.comfyAPI.widgets.updateControlWidgetLabel=vi;window.comfyAPI.widgets.IS_CONTROL_WIDGET=zp;window.comfyAPI.widgets.addValueControlWidget=bl;window.comfyAPI.widgets.addValueControlWidgets=Hn;window.comfyAPI.widgets.ComfyWidgets=_l;window.comfyAPI.widgets.isValidWidgetType=PC;const jn=Je("widget",()=>{const e=_l,t=A(new Map),a=E(()=>new Map([...t.value,...Object.entries(e)]));function o(r){const i=Array.isArray(r)?yy(r):r.type;return a.value.has(i)}n(o,"inputIsWidget");function s(r){for(const[i,l]of Object.entries(r))t.value.set(i,l)}return n(s,"registerCustomWidgets"),{widgets:a,inputIsWidget:o,registerCustomWidgets:s}});function Vp(e,t){return{subcategories:E(()=>{const a={};for(const o of e.value){let s=t.defaultSubcategory;for(const r of t.rules)if(typeof r.pattern=="string"?o.id.includes(r.pattern):r.pattern.test(o.id)){s=r.subcategory;break}a[s]||(a[s]=[]),a[s].push(o)}return a})}}n(Vp,"useCommandSubcategories");const DC={defaultSubcategory:"view",rules:[{pattern:"Zoom",subcategory:"view"},{pattern:"Fit",subcategory:"view"},{pattern:"Panel",subcategory:"panel-controls"},{pattern:"Sidebar",subcategory:"panel-controls"}]},LC={defaultSubcategory:"workflow",rules:[{pattern:"Workflow",subcategory:"workflow"},{pattern:"Node",subcategory:"node"},{pattern:"Queue",subcategory:"queue"}]};var OC={class:"shortcuts-list flex justify-center"},NC={class:"grid h-full w-[90%] grid-cols-1 gap-4 md:grid-cols-3 md:gap-24"},$C={class:"subcategory-title mb-4 text-xs font-bold tracking-wide text-text-secondary uppercase"},RC={class:"flex flex-col gap-1"},BC={class:"shortcut-info grow pr-4"},FC={class:"shortcut-name text-sm font-medium"},UC={class:"keybinding-display shrink-0"},WC=["aria-label"],zC=J({__name:"ShortcutsList",props:{subcategories:{}},setup(e){const{t}=Fe(),a=E(()=>{const r={};for(const[i,l]of Object.entries(e.subcategories))r[i]=l.filter(u=>!!u.keybinding);return r}),o=n(r=>({workflow:t("shortcuts.subcategories.workflow"),node:t("shortcuts.subcategories.node"),queue:t("shortcuts.subcategories.queue"),view:t("shortcuts.subcategories.view"),"panel-controls":t("shortcuts.subcategories.panelControls")})[r]||r,"getSubcategoryTitle"),s=n(r=>({Control:"Ctrl",Meta:"Cmd",ArrowUp:"↑",ArrowDown:"↓",ArrowLeft:"←",ArrowRight:"→",Backspace:"⌫",Delete:"⌦",Enter:"↵",Escape:"Esc",Tab:"⇥"," ":"Space"})[r]||r,"formatKey");return(r,i)=>(C(),P("div",OC,[v("div",NC,[(C(!0),P(Se,null,Ze(a.value,(l,u)=>(C(),P("div",{key:u,class:"flex flex-col"},[v("h3",$C,$(o(u)),1),v("div",RC,[(C(!0),P(Se,null,Ze(l,c=>(C(),P("div",{key:c.id,class:"shortcut-item flex items-center justify-between rounded py-2 transition-colors duration-200"},[v("div",BC,[v("div",FC,$(b(t)(`commands.${b(dt)(c.id)}.label`)),1)]),v("div",UC,[v("div",{class:"keybinding-combo flex gap-1","aria-label":`Keyboard shortcut: ${c.keybinding.combo.getKeySequences().join(" + ")}`},[(C(!0),P(Se,null,Ze(c.keybinding.combo.getKeySequences(),d=>(C(),P("span",{key:d,class:"key-badge min-w-6 rounded bg-muted-background px-2 py-1 text-center font-mono text-xs"},$(s(d)),1))),128))],8,WC)])]))),128))])]))),128))])]))}}),Gp=zC,VC={class:"flex h-full flex-col p-4"},GC={class:"min-h-0 flex-1 overflow-auto"},HC=J({__name:"EssentialsPanel",setup(e){const t=Pt(),a=E(()=>t.commands.filter(s=>s.category==="essentials")),{subcategories:o}=Vp(a,LC);return(s,r)=>(C(),P("div",VC,[v("div",GC,[R(Gp,{commands:a.value,subcategories:b(o)},null,8,["commands","subcategories"])])]))}}),jC=HC,KC={class:"flex h-full flex-col p-4"},YC={class:"min-h-0 flex-1 overflow-auto"},qC=J({__name:"ViewControlsPanel",setup(e){const t=Pt(),a=E(()=>t.commands.filter(s=>s.category==="view-controls")),{subcategories:o}=Vp(a,DC);return(s,r)=>(C(),P("div",KC,[v("div",YC,[R(Gp,{commands:a.value,subcategories:b(o)},null,8,["commands","subcategories"])])]))}}),XC=qC;const ZC=n(()=>{const{t:e}=Fe();return[{id:"shortcuts-essentials",title:e("shortcuts.essentials"),titleKey:"shortcuts.essentials",component:bt(jC),type:"vue",targetPanel:"shortcuts"},{id:"shortcuts-view-controls",title:e("shortcuts.viewControls"),titleKey:"shortcuts.viewControls",component:bt(XC),type:"vue",targetPanel:"shortcuts"}]},"useShortcutsTab");var JC=Kh(),QC=Yh();function ex(e){const t=new JC.FitAddon,a=bt(new QC.Terminal({convertEol:!0,theme:dh?{background:"#171717"}:void 0}));return a.loadAddon(t),a.attachCustomKeyEventHandler(o=>!(o.type==="keydown"&&(o.ctrlKey||o.metaKey)&&(o.key==="c"&&a.hasSelection()||o.key==="v"))),it(async()=>{e.value&&a.open(e.value)}),St(()=>{a.dispose()}),{terminal:a,useAutoSize({root:o,autoRows:s=!0,autoCols:r=!0,minCols:i=Number.NEGATIVE_INFINITY,minRows:l=Number.NEGATIVE_INFINITY,onResize:u}){const c=n(g=>g==null||isNaN(g)?(o.value?.clientHeight??80)/20:g,"ensureValidRows"),d=n(g=>g==null||isNaN(g)?(o.value?.clientWidth??80)/8:g,"ensureValidCols"),p=n(()=>{const g=t.proposeDimensions();a.resize(Math.max(r?d(g?.cols):a.cols,i),Math.max(s?c(g?.rows):a.rows,l)),u?.()},"resize"),f=new ResizeObserver(tr(p,25));return it(async()=>{o.value&&(f.observe(o.value),p())}),St(()=>{f.disconnect()}),{resize:p}}}}n(ex,"useTerminal");var tx={class:"p-terminal h-full w-full rounded-none p-2"},ax=J({__name:"BaseTerminal",emits:["created","unmounted"],setup(e,{emit:t}){const{t:a}=Fe(),o=t,s=A(),r=A(),i=A(!1),l=Xi(r),u=ex(s);o("created",u,A(r));const{terminal:c}=u;let d;const p=E(()=>i.value?a("serverStart.copySelectionTooltip"):a("serverStart.copyAllTooltip")),f=n(async()=>{const m=c.getSelection(),h=!m;h&&c.selectAll();const y=h?c.getSelection():m;y&&(await navigator.clipboard.writeText(y),h&&c.clearSelection())},"handleCopy"),g=n(m=>{m.preventDefault(),Qi()?.showContextMenu({type:"text"})},"showContextMenu");return Qa()&&At(s,"contextmenu",g),it(()=>{d=c.onSelectionChange(()=>{i.value=c.hasSelection()})}),St(()=>{d?.dispose(),o("unmounted")}),(m,h)=>{const y=ht("tooltip");return C(),P("div",{ref_key:"rootEl",ref:r,class:"relative h-full w-full overflow-hidden bg-neutral-900"},[v("div",tx,[v("div",{ref_key:"terminalEl",ref:s,class:"terminal-host h-full"},null,512)]),ze((C(),X(se,{variant:"secondary",size:"sm",class:pe(b(Pe)("absolute top-2 right-8 transition-opacity",{"opacity-0 pointer-events-none select-none":!b(l)})),"aria-label":p.value,onClick:f},{default:W(()=>h[0]||(h[0]=[v("i",{class:"pi pi-copy"},null,-1)])),_:1},8,["class","aria-label"])),[[y,{value:p.value,showDelay:300},void 0,{left:!0}]])],512)}}}),Hp=ot(ax,[["__scopeId","data-v-f7040d8a"]]),ox=J({__name:"CommandTerminal",setup(e){const t=n(({terminal:a,useAutoSize:o},s)=>{const r=Qi().Terminal;let i,l;o({root:s,autoRows:!0,autoCols:!0,onResize:n(async()=>{a.element?.offsetParent&&await r.resize(a.cols,a.rows)},"onResize")}),it(async()=>{i=a.onData(async c=>{await r.write(c)}),l=r.onOutput(c=>{a.write(c)});const u=await r.restore();setTimeout(()=>{u.buffer.length&&(a.resize(u.size.cols,u.size.rows),a.write(u.buffer.join("")))},500)}),St(()=>{i?.dispose(),l?.()})},"terminalCreated");return(a,o)=>(C(),X(Hp,{onCreated:t}))}}),nx=ot(ox,[["__scopeId","data-v-49782f06"]]),sx={class:"h-full w-full bg-transparent"},rx={key:0,class:"p-4 text-center"},ix=J({__name:"LogsTerminal",setup(e){const t=A(""),a=A(!0),o=n(({terminal:s,useAutoSize:r},i)=>{r({root:i,autoRows:!0,autoCols:!0,minCols:80});const l=n(p=>{s.write(p.map(f=>f.m).join(""))},"update"),u=n(p=>{l(p.detail.entries)},"logReceived"),c=n(async()=>{l((await oe.getRawLogs()).entries)},"loadLogEntries"),d=n(async()=>{const{clientId:p}=Vn(Ot());p.value||await ni(p).not.toBeNull(),await oe.subscribeLogs(!0),oe.addEventListener("logs",u)},"watchLogs");it(async()=>{try{await c()}catch(p){console.error("Error loading logs",p),t.value="Unable to load logs, please ensure you have updated your ComfyUI backend.";return}await d(),a.value=!1}),St(async()=>{oe.clientId&&await oe.subscribeLogs(!1),oe.removeEventListener("logs",u)})},"terminalCreated");return(s,r)=>(C(),P("div",sx,[t.value?(C(),P("p",rx,$(t.value),1)):a.value?(C(),X(b(Io),{key:1,class:"relative inset-0 z-10 flex h-full items-center justify-center"})):H("",!0),ze(R(Hp,{onCreated:o},null,512),[[_o,!a.value]])]))}}),lx=ot(ix,[["__scopeId","data-v-c03d3536"]]);const ux=n(()=>{const{t:e}=Fe();return{id:"logs-terminal",title:e("g.logs"),titleKey:"g.logs",component:bt(lx),type:"vue"}},"useLogsTerminalTab"),cx=n(()=>{const{t:e}=Fe();return{id:"command-terminal",title:e("g.terminal"),titleKey:"g.terminal",component:bt(nx),type:"vue"}},"useCommandTerminalTab"),jp=Je("bottomPanel",()=>{const e=A({terminal:{tabs:[],activeTabId:"",visible:!1},shortcuts:{tabs:[],activeTabId:"",visible:!1}}),t=A(null),a=E(()=>t.value?e.value[t.value]:null),o=E(()=>{const m=a.value;return m?m.tabs.find(h=>h.id===m.activeTabId)??null:null}),s=E({get:n(()=>!!t.value,"get"),set:n(m=>{m||(t.value=null)},"set")}),r=E(()=>a.value?.tabs??[]),i=E({get:n(()=>a.value?.activeTabId??"","get"),set:n(m=>{const h=a.value;h&&(h.activeTabId=m)},"set")}),l=n(m=>{const h=e.value[m];h.tabs.length!==0&&(t.value===m?t.value=null:(t.value=m,!h.activeTabId&&h.tabs.length>0&&(h.activeTabId=h.tabs[0].id)))},"togglePanel"),u=n(()=>{l("terminal")},"toggleBottomPanel"),c=n(m=>{const h=a.value;h&&(h.activeTabId=m)},"setActiveTab"),d=n(m=>{for(const[h,y]of Object.entries(e.value))if(y.tabs.find(k=>k.id===m)){t.value===h&&y.activeTabId===m?t.value=null:(t.value=h,y.activeTabId=m);return}},"toggleBottomPanelTab"),p=n(m=>{const h=m.targetPanel??"terminal",y=e.value[h];y.tabs=[...y.tabs,m],y.tabs.length===1&&(y.activeTabId=m.id);const k=m.title||m.titleKey||m.id;Pt().registerCommand({id:`Workspace.ToggleBottomPanelTab.${m.id}`,icon:"pi pi-list",label:`Toggle ${k} Bottom Panel`,category:"view-controls",function:n(()=>d(m.id),"function"),source:"System"})},"registerBottomPanelTab");return{panels:e,activePanel:t,togglePanel:l,bottomPanelVisible:s,toggleBottomPanel:u,bottomPanelTabs:r,activeBottomPanelTab:o,activeBottomPanelTabId:i,setActiveTab:c,toggleBottomPanelTab:d,registerBottomPanelTab:p,registerCoreBottomPanelTabs:n(()=>{p(ux()),Qa()&&p(cx()),ZC().forEach(p)},"registerCoreBottomPanelTabs"),registerExtensionBottomPanelTabs:n(m=>{m.bottomPanelTabs&&m.bottomPanelTabs.forEach(p)},"registerExtensionBottomPanelTabs")}}),Lt=n(()=>{const e=tl(),t=Me(),a=sl(),{wrapWithErrorHandling:o,wrapWithErrorHandlingAsync:s,toastErrorHandler:r}=ta();return{loadExtensions:n(async()=>{e.loadDisabledExtensionNames(t.get("Comfy.Extension.Disabled"));const d=await oe.getExtensions();await ut(()=>import("./core-DBfeqMDR.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]),import.meta.url),e.captureCoreExtensions(),await Promise.all(d.filter(p=>!p.includes("extensions/core")).map(async p=>{try{await ut(()=>import(oe.fileURL(p)),[],import.meta.url)}catch(f){console.error("Error loading extension",p,f)}}))},"loadExtensions"),registerExtension:n(d=>{e.registerExtension(d);const p=o(a.addDefaultKeybinding),f=o(t.addSetting);if(d.keybindings?.forEach(g=>{p(new ny(g))}),Pt().loadExtensionCommands(d),yp().loadExtensionMenuCommands(d),d.settings?.forEach(f),jp().registerExtensionBottomPanelTabs(d),d.getCustomWidgets&&(async()=>{if(d.getCustomWidgets){const g=await d.getCustomWidgets(Z);jn().registerCustomWidgets(g)}})(),d.onAuthUserResolved){const{onUserResolved:g}=Ko(),m=s(h=>d.onAuthUserResolved?.(h,Z),h=>{console.error("[Extension Auth Hook Error]",{extension:d.name,hook:"onAuthUserResolved",error:h}),r(h)});g(h=>{m(h)})}if(d.onAuthTokenRefreshed){const{onTokenRefreshed:g}=Ko(),m=s(()=>d.onAuthTokenRefreshed?.(),h=>{console.error("[Extension Auth Hook Error]",{extension:d.name,hook:"onAuthTokenRefreshed",error:h}),r(h)});g(()=>{m()})}if(d.onAuthUserLogout){const{onUserLogout:g}=Ko(),m=s(()=>d.onAuthUserLogout?.(),h=>{console.error("[Extension Auth Hook Error]",{extension:d.name,hook:"onAuthUserLogout",error:h}),r(h)});g(()=>{m()})}},"registerExtension"),invokeExtensions:n((d,...p)=>{const f=[];for(const g of e.enabledExtensions)if(d in g)try{f.push(g[d](...p,Z))}catch(m){console.error(`Error calling extension '${g.name}' method '${d}'`,{error:m},{extension:g},{args:p})}return f},"invokeExtensions"),invokeExtensionsAsync:n(async(d,...p)=>await Promise.all(e.enabledExtensions.map(async f=>{if(d in f)try{d==="setup"&&Dr.setCurrentExtension(f.name);const g=await f[d](...p,Z);return d==="setup"&&Dr.setCurrentExtension(null),g}catch(g){d==="setup"&&Dr.setCurrentExtension(null),console.error(`Error calling extension '${f.name}' method '${d}'`,{error:g},{extension:f},{args:p})}})),"invokeExtensionsAsync")}},"useExtensionService");var Mo=nd(Og(),1),dx=50,px=50,Vu=new Mo.default({maxSize:dx}),Gu=new Mo.default({maxSize:px}),Hu=null;function H8(e,t){return Rn.findByUrl(e,t)}n(H8,"findActiveIndex");async function j8(e){const t=String(e.promptId);if(Hu=t,!((e.outputsCount??0)>1))return[...e.previewableOutputs];const a=Vu.get(t);if(a)return[...a.previewableOutputs];try{const o=await e.loadFullOutputs();return Hu!==t?null:(Vu.set(t,o),[...o.previewableOutputs])}catch(o){return console.warn("Failed to load full outputs, using preview:",o),[...e.previewableOutputs]}}n(j8,"getOutputsForTask");async function Ks(e){const t=Gu.get(e);if(t)return t;try{const a=await oe.getJobDetail(e);return a&&Gu.set(e,a),a}catch(a){console.warn("Failed to fetch job detail:",a);return}}n(Ks,"getJobDetail");async function yi(e){return await Ld(await Ks(e))}n(yi,"getJobWorkflow");var so=(function(e){return e.Running="Running",e.Pending="Pending",e.Completed="Completed",e.Failed="Failed",e.Cancelled="Cancelled",e})(so||{}),Rn=class{static{n(this,"ResultItemImpl")}filename;subfolder;type;nodeId;mediaType;format;frame_rate;constructor(e){this.filename=e.filename??"",this.subfolder=e.subfolder??"",this.type=e.type??"",this.nodeId=e.nodeId,this.mediaType=e.mediaType,this.format=e.format,this.frame_rate=e.frame_rate}get urlParams(){const e=new URLSearchParams;return e.set("filename",this.filename),e.set("type",this.type),e.set("subfolder",this.subfolder),this.format&&e.set("format",this.format),this.frame_rate&&e.set("frame_rate",this.frame_rate.toString()),e}get vhsAdvancedPreviewUrl(){return oe.apiURL("/viewvideo?"+this.urlParams)}get url(){return oe.apiURL("/view?"+this.urlParams)}get urlWithTimestamp(){return`${this.url}&t=${+new Date}`}get isVhsFormat(){return!!this.format&&!!this.frame_rate}get htmlVideoType(){if(this.isWebm)return"video/webm";if(this.isMp4)return"video/mp4";if(this.isVhsFormat){if(this.format?.endsWith("webm"))return"video/webm";if(this.format?.endsWith("mp4"))return"video/mp4"}}get htmlAudioType(){if(this.isMp3)return"audio/mpeg";if(this.isWav)return"audio/wav";if(this.isOgg)return"audio/ogg";if(this.isFlac)return"audio/flac"}get isGif(){return this.filename.endsWith(".gif")}get isWebp(){return this.filename.endsWith(".webp")}get isWebm(){return this.filename.endsWith(".webm")}get isMp4(){return this.filename.endsWith(".mp4")}get isVideoBySuffix(){return this.isWebm||this.isMp4}get isImageBySuffix(){return this.isGif||this.isWebp}get isMp3(){return this.filename.endsWith(".mp3")}get isWav(){return this.filename.endsWith(".wav")}get isOgg(){return this.filename.endsWith(".ogg")}get isFlac(){return this.filename.endsWith(".flac")}get isAudioBySuffix(){return this.isMp3||this.isWav||this.isOgg||this.isFlac}get isVideo(){const e=this.mediaType==="video"||!!this.format?.startsWith("video/");return this.isVideoBySuffix||e&&!this.isImageBySuffix&&!this.isAudioBySuffix}get isImage(){return this.isImageBySuffix||this.mediaType==="images"&&!this.isVideoBySuffix&&!this.isAudioBySuffix}get isAudio(){const e=this.mediaType==="audio"||!!this.format?.startsWith("audio/");return this.isAudioBySuffix||e&&!this.isImageBySuffix&&!this.isVideoBySuffix}get is3D(){return Ta(this.filename)==="3D"}get supportsPreview(){return this.isImage||this.isVideo||this.isAudio||this.is3D}static filterPreviewable(e){return e.filter(t=>t.supportsPreview)}static findByUrl(e,t){if(!t)return 0;const a=e.findIndex(o=>o.url===t);return a>=0?a:0}},_n=class wi{static{n(this,"TaskItemImpl")}job;outputs;flatOutputs;constructor(t,a,o){this.job=t;const s=a??(t.preview_output?{[t.preview_output.nodeId]:{[t.preview_output.mediaType]:[t.preview_output]}}:{});this.outputs=Be.mapValues(s,r=>Be.omit(r,"animated")),this.flatOutputs=o??this.calculateFlatOutputs()}calculateFlatOutputs(){return this.outputs?Object.entries(this.outputs).flatMap(([t,a])=>Object.entries(a).flatMap(([o,s])=>s.map(r=>new Rn({...r,nodeId:t,mediaType:o})))):[]}get previewableOutputs(){return Rn.filterPreviewable(this.flatOutputs)}get previewOutput(){const t=this.previewableOutputs;return t.find(a=>a.type==="output")??t[0]}get taskType(){switch(this.job.status){case"in_progress":return"Running";case"pending":return"Pending";default:return"History"}}get apiTaskType(){switch(this.taskType){case"Running":case"Pending":return"queue";case"History":return"history"}}get key(){return this.promptId+this.displayStatus}get queueIndex(){return this.job.priority}get promptId(){return this.job.id}get outputsCount(){return this.job.outputs_count??void 0}get status(){return this.job.status}get errorMessage(){return this.job.execution_error?.exception_message??void 0}get executionError(){return this.job.execution_error??void 0}get workflowId(){return this.job.workflow_id??void 0}get createTime(){return this.job.create_time}get interrupted(){return this.job.status==="failed"&&this.job.execution_error?.exception_type==="InterruptProcessingException"}get isHistory(){return this.taskType==="History"}get isRunning(){return this.taskType==="Running"}get displayStatus(){switch(this.job.status){case"in_progress":return so.Running;case"pending":return so.Pending;case"completed":return so.Completed;case"failed":return so.Failed;case"cancelled":return so.Cancelled}}get executionStartTimestamp(){return this.job.execution_start_time??void 0}get executionEndTimestamp(){return this.job.execution_end_time??void 0}get executionTime(){if(!(!this.executionStartTimestamp||!this.executionEndTimestamp))return this.executionEndTimestamp-this.executionStartTimestamp}get executionTimeInSeconds(){return this.executionTime!==void 0?this.executionTime/1e3:void 0}async loadFullOutputs(){if(!this.isHistory)return this;const t=await Ks(this.promptId);return t?.outputs?new wi(this.job,t.outputs):this}async loadWorkflow(t){if(!this.isHistory)return;const a=await Ks(this.promptId),o=await Ld(a);if(!o)return;await t.loadGraphData(Et(o));const s=a?.outputs??this.outputs;if(!s)return;const r=Gt(),i=Et(s);for(const l in i)r.setNodeOutputsByExecutionId(l,i[l]);Lt().invokeExtensions("onNodeOutputsUpdated",t.nodeOutputs)}flatten(){return this.displayStatus!==so.Completed?[this]:this.flatOutputs.map((t,a)=>new wi({...this.job,id:`${this.promptId}-${a}`},{[t.nodeId]:{[t.mediaType]:[t]}},[t]))}};const kl=Je("queue",()=>{const e=Qt([]),t=Qt([]),a=Qt([]),o=A(64),s=A(!1),r=E(()=>[...t.value,...e.value,...a.value]),i=E(()=>r.value.flatMap(f=>f.flatten())),l=E(()=>a.value.length?a.value[0].queueIndex:-1),u=E(()=>t.value.length>0),c=n(async()=>{s.value=!0;try{const[f,g]=await Promise.all([oe.getQueue(),oe.getHistory(o.value)]);e.value=f.Running.map(_=>new _n(_)),t.value=f.Pending.map(_=>new _n(_));const m=Wt(a),h=[...t.value,...e.value],y=Ot();h.forEach(_=>{const I=String(_.promptId),w=_.workflowId;w&&I&&y.registerPromptWorkflowIdMapping(I,w)});const k=[...g].sort((_,I)=>I.create_time-_.create_time).slice(0,Wt(o)),S=new Map(m.map(_=>[_.promptId,_]));a.value=k.map(_=>{const I=S.get(_.id);return I?I.outputsCount!==(_.outputs_count??void 0)?new _n(_):I:new _n(_)})}finally{s.value=!1}},"update");return{runningTasks:e,pendingTasks:t,historyTasks:a,maxHistoryItems:o,isLoading:s,tasks:r,flatTasks:i,lastHistoryQueueIndex:l,hasPendingTasks:u,update:c,clear:n(async(f=["queue","history"])=>{f.length!==0&&(await Promise.all(f.map(g=>oe.clearItems(g))),await c())},"clear"),delete:n(async f=>{await oe.deleteItem(f.apiTaskType,f.promptId),await c()},"deleteTask")}}),K8=Je("queuePendingTaskCount",{state:n(()=>({count:0}),"state"),actions:{update(e){this.count=e.detail?.exec_info?.queue_remaining||0}}}),fx=Je("queueSettingsStore",{state:n(()=>({mode:"disabled",batchCount:1}),"state")}),Y8=Je("queueUIStore",()=>{const e=Me(),t=E({get:n(()=>e.get("Comfy.Queue.History.Expanded"),"get"),set:n(o=>e.set("Comfy.Queue.History.Expanded",o),"set")});function a(){t.value=!t.value}return n(a,"toggleOverlay"),{isOverlayExpanded:t,toggleOverlay:a}});var mx={class:"flex flex-col items-center"},gx=J({__name:"NoResultsPlaceholder",props:{class:{},icon:{},title:{},message:{},textClass:{},buttonLabel:{}},emits:["action"],setup(e){const t=e;return(a,o)=>(C(),P("div",{class:pe(["no-results-placeholder h-full p-8",t.class])},[R(b(ld),null,{content:W(()=>[v("div",mx,[v("i",{class:pe(a.icon),style:{"font-size":"3rem","margin-bottom":"1rem"}},null,2),v("h3",null,$(a.title),1),v("p",{class:pe([a.textClass,"text-center whitespace-pre-line"])},$(a.message),3),a.buttonLabel?(C(),X(se,{key:0,variant:"textonly",onClick:o[0]||(o[0]=s=>a.$emit("action"))},{default:W(()=>[fe($(a.buttonLabel),1)]),_:1})):H("",!0)])]),_:1})],2))}}),Va=ot(gx,[["__scopeId","data-v-f45f4900"]]),hx={key:0,class:"pointer-events-auto absolute top-0 left-0 z-10 flex w-full flex-col items-center gap-2 pt-2"},vx={class:"flex items-center justify-center gap-2"},yx={class:"flex w-full max-w-xs items-center gap-2 px-4"},wx={class:"min-w-16 text-xs text-base-foreground"},bx=J({__name:"AnimationControls",props:{animations:{},animationsModifiers:{},playing:{type:Boolean},playingModifiers:{},selectedSpeed:{},selectedSpeedModifiers:{},selectedAnimation:{},selectedAnimationModifiers:{},animationProgress:{default:0},animationProgressModifiers:{},animationDuration:{default:0},animationDurationModifiers:{}},emits:_t(["seek"],["update:animations","update:playing","update:selectedSpeed","update:selectedAnimation","update:animationProgress","update:animationDuration"]),setup(e,{emit:t}){const a=rt(e,"animations"),o=rt(e,"playing"),s=rt(e,"selectedSpeed"),r=rt(e,"selectedAnimation"),i=rt(e,"animationProgress"),l=rt(e,"animationDuration"),u=t,c=[{name:"0.1x",value:.1},{name:"0.5x",value:.5},{name:"1x",value:1},{name:"1.5x",value:1.5},{name:"2x",value:2}],d=E(()=>l.value?i.value/100*l.value:0);function p(m){const h=Math.floor(m/60),y=(m%60).toFixed(1);return h>0?`${h}:${y.padStart(4,"0")}`:`${y}s`}n(p,"formatTime");function f(){o.value=!o.value}n(f,"togglePlay");function g(m){if(!m)return;const h=m[0];i.value=h,u("seek",h)}return n(g,"handleSliderChange"),(m,h)=>a.value&&a.value.length>0?(C(),P("div",hx,[v("div",vx,[R(se,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":m.$t("g.playPause"),onClick:f},{default:W(()=>[v("i",{class:pe(["pi",o.value?"pi-pause":"pi-play","text-lg text-base-foreground"])},null,2)]),_:1},8,["aria-label"]),R(b(Aa),{modelValue:s.value,"onUpdate:modelValue":h[0]||(h[0]=y=>s.value=y),options:c,"option-label":"name","option-value":"value",class:"w-24"},null,8,["modelValue"]),R(b(Aa),{modelValue:r.value,"onUpdate:modelValue":h[1]||(h[1]=y=>r.value=y),options:a.value,"option-label":"name","option-value":"index",class:"w-32"},null,8,["modelValue","options"])]),v("div",yx,[R(qh,{"model-value":[i.value],min:0,max:100,step:.1,class:"flex-1","onUpdate:modelValue":g},null,8,["model-value"]),v("span",wx,$(p(d.value))+" / "+$(p(l.value)),1)])])):H("",!0)}}),_x=bx,kx={class:"space-y-4"},Cx={class:"space-y-4"},xx={key:0,class:"space-y-4"},Ix=J({__name:"ViewerCameraControls",props:{cameraType:{},cameraTypeModifiers:{},fov:{},fovModifiers:{}},emits:["update:cameraType","update:fov"],setup(e){const t=[{title:G("load3d.cameraType.perspective"),value:"perspective"},{title:G("load3d.cameraType.orthographic"),value:"orthographic"}],a=rt(e,"cameraType"),o=rt(e,"fov"),s=E(()=>a.value==="perspective");return(r,i)=>(C(),P("div",kx,[v("div",Cx,[v("label",null,$(b(G)("load3d.viewer.cameraType")),1),R(b(Aa),{modelValue:a.value,"onUpdate:modelValue":i[0]||(i[0]=l=>a.value=l),options:t,"option-label":"title","option-value":"value"},null,8,["modelValue"])]),s.value?(C(),P("div",xx,[v("label",null,$(b(G)("load3d.fov")),1),R(b(Bi),{modelValue:o.value,"onUpdate:modelValue":i[1]||(i[1]=l=>o.value=l),min:10,max:150,step:1,"aria-label":b(G)("load3d.fov")},null,8,["modelValue","aria-label"])])):H("",!0)]))}}),Sx=Ix,Ex={class:"space-y-4"},Tx=J({__name:"ViewerExportControls",emits:["exportModel"],setup(e,{emit:t}){const a=t,o=[{label:"GLB",value:"glb"},{label:"OBJ",value:"obj"},{label:"STL",value:"stl"}],s=A("obj"),r=n(i=>{a("exportModel",i)},"exportModel");return(i,l)=>(C(),P("div",Ex,[R(b(Aa),{modelValue:s.value,"onUpdate:modelValue":l[0]||(l[0]=u=>s.value=u),options:o,"option-label":"label","option-value":"value"},null,8,["modelValue"]),R(se,{variant:"muted-textonly",class:"rounded-full",onClick:l[1]||(l[1]=u=>r(s.value))},{default:W(()=>[fe($(i.$t("load3d.export")),1)]),_:1})]))}}),Ax=Tx,Mx={class:"space-y-4"},Px=J({__name:"ViewerLightControls",props:{lightIntensity:{},lightIntensityModifiers:{}},emits:["update:lightIntensity"],setup(e){const t=rt(e,"lightIntensity"),a=Me().get("Comfy.Load3D.LightIntensityMaximum"),o=Me().get("Comfy.Load3D.LightIntensityMinimum"),s=Me().get("Comfy.Load3D.LightAdjustmentIncrement");return(r,i)=>(C(),P("div",Mx,[v("label",null,$(r.$t("load3d.lightIntensity")),1),R(b(Bi),{modelValue:t.value,"onUpdate:modelValue":i[0]||(i[0]=l=>t.value=l),class:"w-full",min:b(o),max:b(a),step:b(s)},null,8,["modelValue","min","max","step"])]))}}),Dx=Px,Lx={class:"space-y-4"},Ox={key:0},Nx=J({__name:"ViewerModelControls",props:_t({hideMaterialMode:{type:Boolean,default:!1},isPlyModel:{type:Boolean,default:!1}},{upDirection:{},upDirectionModifiers:{},materialMode:{},materialModeModifiers:{}}),emits:["update:upDirection","update:materialMode"],setup(e){const t=rt(e,"upDirection"),a=rt(e,"materialMode"),o=[{label:G("load3d.upDirections.original"),value:"original"},{label:"-X",value:"-x"},{label:"+X",value:"+x"},{label:"-Y",value:"-y"},{label:"+Y",value:"+y"},{label:"-Z",value:"-z"},{label:"+Z",value:"+z"}],s=E(()=>{const r=[{label:G("load3d.materialModes.original"),value:"original"}];return e.isPlyModel&&r.push({label:G("load3d.materialModes.pointCloud"),value:"pointCloud"}),r.push({label:G("load3d.materialModes.normal"),value:"normal"},{label:G("load3d.materialModes.wireframe"),value:"wireframe"}),r});return(r,i)=>(C(),P("div",Lx,[v("div",null,[v("label",null,$(r.$t("load3d.upDirection")),1),R(b(Aa),{modelValue:t.value,"onUpdate:modelValue":i[0]||(i[0]=l=>t.value=l),options:o,"option-label":"label","option-value":"value"},null,8,["modelValue"])]),r.hideMaterialMode?H("",!0):(C(),P("div",Ox,[v("label",null,$(r.$t("load3d.materialMode")),1),R(b(Aa),{modelValue:a.value,"onUpdate:modelValue":i[1]||(i[1]=l=>a.value=l),options:s.value,"option-label":"label","option-value":"value"},null,8,["modelValue","options"])]))]))}}),$x=Nx,Rx={class:"space-y-4"},Bx={key:0},Fx={for:"showGrid",class:"pl-2"},Ux={key:1},Wx={key:2,class:"space-y-2"},zx={class:"flex gap-2"},Vx=J({__name:"ViewerSceneControls",props:_t({hasBackgroundImage:{type:Boolean},disableBackgroundUpload:{type:Boolean}},{backgroundColor:{},backgroundColorModifiers:{},showGrid:{type:Boolean},showGridModifiers:{},backgroundRenderMode:{},backgroundRenderModeModifiers:{}}),emits:_t(["updateBackgroundImage"],["update:backgroundColor","update:showGrid","update:backgroundRenderMode"]),setup(e,{emit:t}){const a=rt(e,"backgroundColor"),o=rt(e,"showGrid"),s=rt(e,"backgroundRenderMode"),r=t,i=A(null),l=n(()=>{i.value?.click()},"openImagePicker"),u=n(p=>{const f=p.target;f.files&&f.files[0]&&r("updateBackgroundImage",f.files[0]),f.value=""},"handleImageUpload"),c=n(()=>{r("updateBackgroundImage",null)},"removeBackgroundImage"),d=n(p=>{s.value=p},"setBackgroundRenderMode");return(p,f)=>(C(),P("div",Rx,[p.hasBackgroundImage?H("",!0):(C(),P("div",Bx,[v("label",null,$(p.$t("load3d.backgroundColor")),1),ze(v("input",{"onUpdate:modelValue":f[0]||(f[0]=g=>a.value=g),type:"color",class:"w-full"},null,512),[[io,a.value]])])),v("div",null,[R(b(Wi),{modelValue:o.value,"onUpdate:modelValue":f[1]||(f[1]=g=>o.value=g),"input-id":"showGrid",binary:"",name:"showGrid"},null,8,["modelValue"]),v("label",Fx,$(p.$t("load3d.showGrid")),1)]),!p.hasBackgroundImage&&!p.disableBackgroundUpload?(C(),P("div",Ux,[R(se,{variant:"secondary",class:"w-full",onClick:l},{default:W(()=>[f[4]||(f[4]=v("i",{class:"pi pi-image"},null,-1)),fe(" "+$(p.$t("load3d.uploadBackgroundImage")),1)]),_:1}),v("input",{ref_key:"imagePickerRef",ref:i,type:"file",accept:"image/*",class:"hidden",onChange:u},null,544)])):H("",!0),p.hasBackgroundImage?(C(),P("div",Wx,[v("div",zx,[R(se,{variant:s.value==="tiled"?"primary":"secondary",class:"flex-1",onClick:f[2]||(f[2]=g=>d("tiled"))},{default:W(()=>[f[5]||(f[5]=v("i",{class:"pi pi-th-large"},null,-1)),fe(" "+$(p.$t("load3d.tiledMode")),1)]),_:1},8,["variant"]),R(se,{variant:s.value==="panorama"?"primary":"secondary",class:"flex-1",onClick:f[3]||(f[3]=g=>d("panorama"))},{default:W(()=>[f[6]||(f[6]=v("i",{class:"pi pi-globe"},null,-1)),fe(" "+$(p.$t("load3d.panoramaMode")),1)]),_:1},8,["variant"])]),R(se,{variant:"secondary",class:"w-full",onClick:c},{default:W(()=>[f[7]||(f[7]=v("i",{class:"pi pi-times"},null,-1)),fe(" "+$(p.$t("load3d.removeBackgroundImage")),1)]),_:1})])):H("",!0)]))}}),Gx=Vx;const Kp=new Set([".gltf",".glb",".obj",".fbx",".stl",".spz",".splat",".ply",".ksplat"]);window.comfyAPI=window.comfyAPI||{};window.comfyAPI.interfaces=window.comfyAPI.interfaces||{};window.comfyAPI.interfaces.SUPPORTED_EXTENSIONS=Kp;function Hx(e){const t=A(!1),a=A(""),o=E(()=>Wt(e.disabled)??!1);function s(u){const c=u.name.toLowerCase(),d=c.substring(c.lastIndexOf("."));return Kp.has(d)}n(s,"isValidModelFile");function r(u){o.value||u.dataTransfer&&u.dataTransfer.types.includes("Files")&&(t.value=!0,u.dataTransfer.dropEffect="copy",a.value=G("load3d.dropToLoad"))}n(r,"handleDragOver");function i(){t.value=!1}n(i,"handleDragLeave");async function l(u){if(t.value=!1,o.value||!u.dataTransfer)return;const c=Array.from(u.dataTransfer.files);if(c.length===0)return;const d=c.find(s);d?await e.onModelDrop(d):Oe().addAlert(G("load3d.unsupportedFileType"))}return n(l,"handleDrop"),{isDragging:t,dragMessage:a,handleDragOver:r,handleDragLeave:i,handleDrop:l}}n(Hx,"useLoad3dDrag");var Yp=class{static{n(this,"AnimationManager")}currentAnimation=null;animationActions=[];animationClips=[];selectedAnimationIndex=0;isAnimationPlaying=!1;animationSpeed=1;eventManager;constructor(e){this.eventManager=e}init(){}dispose(){this.currentAnimation&&(this.animationActions.forEach(e=>{e.stop()}),this.currentAnimation=null),this.animationActions=[],this.animationClips=[],this.selectedAnimationIndex=0,this.isAnimationPlaying=!1,this.animationSpeed=1,this.eventManager.emitEvent("animationListChange",[])}setupModelAnimations(e,t){this.currentAnimation&&(this.currentAnimation.stopAllAction(),this.animationActions=[]);let a=[];e.animations?.length>0?a=e.animations:t&&"animations"in t&&Array.isArray(t.animations)&&(a=t.animations),a.length>0?(this.animationClips=a,this.currentAnimation=new ov(e),this.animationClips.length>0&&this.updateSelectedAnimation(0)):this.animationClips=[],this.updateAnimationList()}updateAnimationList(){let e=[];this.animationClips.length>0&&(e=this.animationClips.map((t,a)=>({name:t.name||`Animation ${a+1}`,index:a}))),this.eventManager.emitEvent("animationListChange",e)}setAnimationSpeed(e){this.animationSpeed=e,this.animationActions.forEach(t=>{t.setEffectiveTimeScale(e)})}updateSelectedAnimation(e){if(!this.currentAnimation||!this.animationClips||e>=this.animationClips.length){console.warn("Invalid animation update request");return}this.animationActions.forEach(o=>{o.stop()}),this.currentAnimation.stopAllAction(),this.animationActions=[],this.selectedAnimationIndex=e;const t=this.animationClips[e],a=this.currentAnimation.clipAction(t);a.setEffectiveTimeScale(this.animationSpeed),a.reset(),a.clampWhenFinished=!1,a.loop=Jh,this.isAnimationPlaying?a.play():(a.play(),a.paused=!0),this.animationActions=[a],this.eventManager.emitEvent("animationProgressChange",{progress:0,currentTime:0,duration:t.duration})}toggleAnimation(e){if(!this.currentAnimation||this.animationActions.length===0){console.warn("No animation to toggle");return}this.isAnimationPlaying=e??!this.isAnimationPlaying,this.animationActions.forEach(t=>{this.isAnimationPlaying?(t.paused=!1,(t.time===0||t.time===t.getClip().duration)&&t.reset()):t.paused=!0})}update(e){if(this.currentAnimation&&this.isAnimationPlaying&&(this.currentAnimation.update(e),this.animationActions.length>0)){const t=this.animationActions[0],a=t.getClip(),o=t.time/a.duration*100;this.eventManager.emitEvent("animationProgressChange",{progress:o,currentTime:t.time,duration:a.duration})}}getAnimationTime(){return this.animationActions.length===0?0:this.animationActions[0].time}getAnimationDuration(){return this.animationActions.length===0?0:this.animationActions[0].getClip().duration}setAnimationTime(e){if(this.animationActions.length===0)return;const t=this.getAnimationDuration(),a=Math.max(0,Math.min(e,t)),o=this.animationActions.map(s=>s.paused);this.animationActions.forEach(s=>{s.paused=!1,s.time=a}),this.currentAnimation&&(this.currentAnimation.setTime(a),this.currentAnimation.update(0)),this.animationActions.forEach((s,r)=>{s.paused=o[r]}),this.eventManager.emitEvent("animationProgressChange",{progress:a/t*100,currentTime:a,duration:t})}reset(){}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.AnimationManager=window.comfyAPI.AnimationManager||{};window.comfyAPI.AnimationManager.AnimationManager=Yp;var qp=class{static{n(this,"CameraManager")}perspectiveCamera;orthographicCamera;activeCamera;eventManager;controls=null;DEFAULT_DISTANCE=10;DEFAULT_LOOK_AT=0;DEFAULT_CAMERA={near:.01,far:1e4};DEFAULT_PERSPECTIVE_CAMERA={fov:35,aspect:1};DEFAULT_FRUSTUM_SIZE=10;DEFAULT_ORTHOGRAPHIC_CAMERA={left:-this.DEFAULT_FRUSTUM_SIZE/2,right:this.DEFAULT_FRUSTUM_SIZE/2,top:this.DEFAULT_FRUSTUM_SIZE/2,bottom:-this.DEFAULT_FRUSTUM_SIZE/2};constructor(e,t){this.eventManager=t,this.perspectiveCamera=new Ho(this.DEFAULT_PERSPECTIVE_CAMERA.fov,this.DEFAULT_PERSPECTIVE_CAMERA.aspect,this.DEFAULT_CAMERA.near,this.DEFAULT_CAMERA.far),this.orthographicCamera=new ka(this.DEFAULT_ORTHOGRAPHIC_CAMERA.left,this.DEFAULT_ORTHOGRAPHIC_CAMERA.right,this.DEFAULT_ORTHOGRAPHIC_CAMERA.top,this.DEFAULT_ORTHOGRAPHIC_CAMERA.bottom,this.DEFAULT_CAMERA.near,this.DEFAULT_CAMERA.far),this.reset(),this.activeCamera=this.perspectiveCamera}init(){}dispose(){}setControls(e){this.controls=e,this.controls&&this.controls.addEventListener("end",()=>{this.eventManager.emitEvent("cameraChanged",this.getCameraState())})}getCurrentCameraType(){return this.activeCamera===this.perspectiveCamera?"perspective":"orthographic"}toggleCamera(e){const t=this.activeCamera,a=t.position.clone(),o=t.rotation.clone(),s=this.controls?.target.clone()||new Ca,r=(t instanceof ka,t.zoom);if(!e)this.activeCamera=t===this.perspectiveCamera?this.orthographicCamera:this.perspectiveCamera;else if(this.activeCamera=e==="perspective"?this.perspectiveCamera:this.orthographicCamera,t===this.activeCamera)return;this.activeCamera.position.copy(a),this.activeCamera.rotation.copy(o),this.activeCamera instanceof ka?(this.activeCamera.zoom=r,this.activeCamera.updateProjectionMatrix()):this.activeCamera instanceof Ho&&(this.activeCamera.zoom=r,this.activeCamera.updateProjectionMatrix()),this.controls&&(this.controls.object=this.activeCamera,this.controls.target.copy(s),this.controls.update()),this.eventManager.emitEvent("cameraTypeChange",e)}setFOV(e){this.activeCamera===this.perspectiveCamera&&(this.perspectiveCamera.fov=e,this.perspectiveCamera.updateProjectionMatrix()),this.eventManager.emitEvent("fovChange",e)}getCameraState(){return{position:this.activeCamera.position.clone(),target:this.controls?.target.clone()||new Ca,zoom:this.activeCamera instanceof ka?this.activeCamera.zoom:this.activeCamera.zoom,cameraType:this.getCurrentCameraType()}}setCameraState(e){this.activeCamera.position.copy(e.position),this.controls?.target.copy(e.target),this.activeCamera instanceof ka?(this.activeCamera.zoom=e.zoom,this.activeCamera.updateProjectionMatrix()):this.activeCamera instanceof Ho&&(this.activeCamera.zoom=e.zoom,this.activeCamera.updateProjectionMatrix()),this.controls?.update()}handleResize(e,t){const a=e/t;this.updateAspectRatio(a)}updateAspectRatio(e){this.activeCamera===this.perspectiveCamera?(this.perspectiveCamera.aspect=e,this.perspectiveCamera.updateProjectionMatrix()):(this.orthographicCamera.left=-10*e/2,this.orthographicCamera.right=10*e/2,this.orthographicCamera.top=10/2,this.orthographicCamera.bottom=-10/2,this.orthographicCamera.updateProjectionMatrix())}setupForModel(e){const t=Math.max(e.x,e.z)*2,a=e.y*2;if(this.perspectiveCamera.position.set(t,a,t),this.orthographicCamera.position.set(t,a,t),this.activeCamera===this.perspectiveCamera)this.perspectiveCamera.lookAt(0,e.y/2,0),this.perspectiveCamera.updateProjectionMatrix();else{const o=Math.max(e.x,e.y,e.z)*2,s=this.perspectiveCamera.aspect;this.orthographicCamera.left=-o*s/2,this.orthographicCamera.right=o*s/2,this.orthographicCamera.top=o/2,this.orthographicCamera.bottom=-o/2,this.orthographicCamera.lookAt(0,e.y/2,0),this.orthographicCamera.updateProjectionMatrix()}this.controls?.target.set(0,e.y/2,0),this.controls?.update()}reset(){this.perspectiveCamera.position.set(this.DEFAULT_DISTANCE,this.DEFAULT_DISTANCE,this.DEFAULT_DISTANCE),this.orthographicCamera.position.set(this.DEFAULT_DISTANCE,this.DEFAULT_DISTANCE,this.DEFAULT_DISTANCE),this.perspectiveCamera.lookAt(this.DEFAULT_LOOK_AT,this.DEFAULT_LOOK_AT,this.DEFAULT_LOOK_AT),this.orthographicCamera.lookAt(this.DEFAULT_LOOK_AT,this.DEFAULT_LOOK_AT,this.DEFAULT_LOOK_AT),this.perspectiveCamera.updateProjectionMatrix(),this.orthographicCamera.updateProjectionMatrix()}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.CameraManager=window.comfyAPI.CameraManager||{};window.comfyAPI.CameraManager.CameraManager=qp;var Xp=class{static{n(this,"ControlsManager")}controls;eventManager;camera;constructor(e,t,a){this.eventManager=a,this.camera=t,this.controls=new lv(t,e.domElement.parentElement||e.domElement),this.controls.enableDamping=!0}init(){this.controls.addEventListener("end",()=>{const e={position:this.camera.position.clone(),target:this.controls.target.clone(),zoom:this.camera instanceof ka?this.camera.zoom:this.camera.zoom,cameraType:this.camera instanceof Ho?"perspective":"orthographic"};this.eventManager.emitEvent("cameraChanged",e)})}dispose(){this.controls.dispose()}handleResize(){}update(){this.controls.update()}updateCamera(e){const t=this.controls.object.position.clone(),a=this.controls.target.clone();this.camera=e,this.controls.object=e,this.controls.target=a,e.position.copy(t),this.controls.update()}reset(){this.controls.target.set(0,0,0),this.controls.update()}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.ControlsManager=window.comfyAPI.ControlsManager||{};window.comfyAPI.ControlsManager.ControlsManager=Xp;var Zp=class{static{n(this,"EventManager")}listeners={};addEventListener(e,t){this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push(t)}removeEventListener(e,t){this.listeners[e]&&(this.listeners[e]=this.listeners[e].filter(a=>a!==t))}emitEvent(e,t){this.listeners[e]&&this.listeners[e].forEach(a=>a(t))}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.EventManager=window.comfyAPI.EventManager||{};window.comfyAPI.EventManager.EventManager=Zp;var Jp=class{static{n(this,"LightingManager")}lights=[];currentIntensity=3;scene;eventManager;constructor(e,t){this.scene=e,this.eventManager=t}init(){this.setupLights()}dispose(){this.lights.forEach(e=>{this.scene.remove(e)}),this.lights=[]}setupLights(){const e=new ru(16777215,.5);this.scene.add(e),this.lights.push(e);const t=new Oo(16777215,.8);t.position.set(0,10,10),this.scene.add(t),this.lights.push(t);const a=new Oo(16777215,.5);a.position.set(0,10,-10),this.scene.add(a),this.lights.push(a);const o=new Oo(16777215,.3);o.position.set(-10,0,0),this.scene.add(o),this.lights.push(o);const s=new Oo(16777215,.3);s.position.set(10,0,0),this.scene.add(s),this.lights.push(s);const r=new Oo(16777215,.2);r.position.set(0,-10,0),this.scene.add(r),this.lights.push(r)}setLightIntensity(e){this.currentIntensity=e,this.lights.forEach(t=>{t instanceof Oo?t===this.lights[1]?t.intensity=e*.8:t===this.lights[2]?t.intensity=e*.5:t===this.lights[5]?t.intensity=e*.2:t.intensity=e*.3:t instanceof ru&&(t.intensity=e*.5)}),this.eventManager.emitEvent("lightIntensityChange",e)}reset(){}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.LightingManager=window.comfyAPI.LightingManager||{};window.comfyAPI.LightingManager.LightingManager=Jp;function jx(e){let t=0,a=0,o=!1,s=-1,r=-1,i=-1,l=-1,u=-1,c=-1,d=0;for(let p=0;p<e.length;p++){const f=e[p].trim();if(f.startsWith("element vertex"))t=parseInt(f.split(/\s+/)[2]);else if(f.startsWith("property")){const g=f.split(/\s+/),m=g[g.length-1];m==="x"?s=d:m==="y"?r=d:m==="z"?i=d:m==="red"?(o=!0,l=d):m==="green"?u=d:m==="blue"&&(c=d),d++}else if(f==="end_header"){a=p;break}}return t===0||s<0||r<0||i<0?null:{vertexCount:t,hasColor:o,propertyIndices:{x:s,y:r,z:i,red:l,green:u,blue:c},headerEndLine:a}}n(jx,"parsePLYHeader");function Kx(e,t){const{vertexCount:a,hasColor:o,propertyIndices:s,headerEndLine:r}=t,{x:i,y:l,z:u}=s,{red:c,green:d,blue:p}=s,f=new Float32Array(a*3),g=o?new Float32Array(a*3):null;let m=0;for(let h=r+1;h<e.length&&m<a;h++){const y=e[h].trim();if(!y)continue;const k=y.split(/\s+/);if(k.length<3)continue;const S=m*3;f[S]=parseFloat(k[i]),f[S+1]=parseFloat(k[l]),f[S+2]=parseFloat(k[u]),o&&g&&c>=0&&d>=0&&p>=0&&k.length>Math.max(c,d,p)&&(g[S]=parseInt(k[c])/255,g[S+1]=parseInt(k[d])/255,g[S+2]=parseInt(k[p])/255),m++}return{positions:f,colors:g,vertexCount:m}}n(Kx,"parsePLYVertices");function Qp(e){const t=new TextDecoder().decode(e).split(`
|
|
10
|
+
${k}`)}n(r,"getAssetDetails");async function i(g,m=!0,{limit:h=ls,offset:y=0}={}){const k=new URLSearchParams({include_tags:g,limit:h.toString(),include_public:m?"true":"false"});return y>0&&k.set("offset",y.toString()),(await e(`${ba}?${k.toString()}`,`assets for tag ${g}`))?.assets?.filter(S=>!S.tags.includes("missing"))??[]}n(i,"getAssetsByTag");async function l(g){const m=await oe.fetchApi(`${ba}/${g}`,{method:"DELETE"});if(!m.ok)throw new Error(`Unable to delete asset ${g}: Server returned ${m.status}`)}n(l,"deleteAsset");async function u(g,m){const h=await oe.fetchApi(`${ba}/${g}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)});if(!h.ok)throw new Error(`Unable to update asset ${g}: Server returned ${h.status}`);const y=gl.safeParse(await h.json());if(y.success)return y.data;throw new Error(`Unable to update asset ${g}: Invalid response - ${y.error}`)}n(u,"updateAsset");async function c(g){const m=encodeURIComponent(g),h=await oe.fetchApi(`${ba}/remote-metadata?url=${m}`);if(!h.ok){const k=await h.json().catch(()=>({}));throw new Error(Du(k.code||"UNKNOWN_ERROR"))}const y=await h.json();if(y.validation?.is_valid===!1)throw new Error(Du(y.validation?.errors?.[0]?.code||"UNKNOWN_ERROR"));return y}n(c,"getAssetMetadata");async function d(g){const m=await oe.fetchApi(ba,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)});if(!m.ok)throw new Error(De("assetBrowser.errorUploadFailed","Failed to upload asset. Please try again."));return await m.json()}n(d,"uploadAssetFromUrl");async function p(g){if(!g.data||!g.data.startsWith("data:"))throw new Error('Invalid data URL: expected a string starting with "data:"');const m=await fetch(g.data).then(k=>k.blob()),h=new FormData;h.append("file",m,g.name),g.tags&&h.append("tags",JSON.stringify(g.tags)),g.user_metadata&&h.append("user_metadata",JSON.stringify(g.user_metadata));const y=await oe.fetchApi(ba,{method:"POST",body:h});if(!y.ok)throw new Error(`Failed to upload asset from base64: ${y.status} ${y.statusText}`);return await y.json()}n(p,"uploadAssetFromBase64");async function f(g){const m=await oe.fetchApi(x_,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)});if(!m.ok)throw new Error(De("assetBrowser.errorUploadFailed","Failed to upload asset. Please try again."));const h=await m.json();if(m.status===202){const k=Pu.safeParse({type:"async",task:h});if(!k.success)throw new Error(De("assetBrowser.errorUploadFailed","Failed to parse async upload response. Please try again."));return k.data}const y=Pu.safeParse({type:"sync",asset:h});if(!y.success)throw new Error(De("assetBrowser.errorUploadFailed","Failed to parse sync upload response. Please try again."));return y.data}return n(f,"uploadAssetAsync"),{getAssetModelFolders:t,getAssetModels:a,isAssetBrowserEligible:o,getAssetsForNodeType:s,getAssetDetails:r,getAssetsByTag:i,deleteAsset:l,updateAsset:u,getAssetMetadata:c,uploadAssetFromUrl:d,uploadAssetFromBase64:p,uploadAssetAsync:f}}n(E_,"createAssetService");const Zt=E_();var T_=["data-asset-id","aria-labelledby","aria-describedby","tabindex"],A_={class:"relative aspect-square w-full overflow-hidden rounded-xl"},M_=["src","alt"],P_={class:"max-h-32 flex flex-col gap-2 justify-between flex-auto"},D_=["id"],L_=["id"],O_={class:"flex gap-4 text-xs text-muted-foreground mt-auto"},N_={key:0,class:"flex items-center gap-1"},$_={key:1,class:"flex items-center gap-1"},R_={key:2,class:"flex items-center gap-1"},B_=J({__name:"AssetCard",props:{asset:{},interactive:{type:Boolean}},emits:["select","deleted"],setup(e,{emit:t}){const a=t,{t:o}=Fe(),s=Me(),{closeDialog:r}=Ct(),{flags:i}=oo(),l=Oe(),u=hd("dropdown-menu-button"),c=$s(),d=$s(),p=A(!1),f=A(),g=E(()=>f.value??e.asset.name),m=E(()=>(i.assetDeletionEnabled||i.assetRenameEnabled)&&!(e.asset.is_immutable??!0)),h=E(()=>s.get("LiteGraph.Node.TooltipDelay")),{isLoading:y,error:k}=fg({src:e.asset.preview_url??"",alt:e.asset.name});function S(){u.value?.hide();const w=Wt(g),x=A(o("assetBrowser.deletion.body")),D=A(!1),T=m_({headerProps:{title:o("assetBrowser.deletion.header")},props:{promptText:x},footerProps:{confirmText:o("g.delete"),confirmClass:Pe("bg-danger-200 text-base-foreground hover:bg-danger-200/80 focus:bg-danger-200/80 focus:ring ring-base-foreground"),optionsDisabled:D,onCancel:n(()=>{r(T)},"onCancel"),onConfirm:n(async()=>{D.value=!0;try{x.value=o("assetBrowser.deletion.inProgress",{assetName:w}),await Zt.deleteAsset(e.asset.id),x.value=o("assetBrowser.deletion.complete",{assetName:w}),await new Promise(N=>setTimeout(N,1e3)),a("deleted",e.asset)}catch(N){console.error(N),x.value=o("assetBrowser.deletion.failed",{assetName:w}),await new Promise(M=>setTimeout(M,3e3))}finally{r(T)}},"onConfirm")}})}n(S,"confirmDeletion");function _(){u.value?.hide(),p.value=!0}n(_,"startAssetRename");async function I(w){if(p.value=!1,w){f.value=w;try{f.value=(await Zt.updateAsset(e.asset.id,{name:w})).name}catch(x){console.error(x),l.add({severity:"error",summary:o("assetBrowser.rename.failed"),life:1e4}),f.value=void 0}}}return n(I,"assetRename"),(w,x)=>{const D=ht("tooltip");return C(),P("div",{"data-component-id":"AssetCard","data-asset-id":w.asset.id,"aria-labelledby":b(c),"aria-describedby":b(d),tabindex:w.interactive?0:-1,class:pe(b(Pe)("rounded-2xl overflow-hidden transition-all duration-200 bg-modal-card-background p-2 gap-2 flex flex-col h-full",w.interactive&&"group appearance-none bg-transparent m-0 outline-none text-left hover:bg-secondary-background focus:bg-secondary-background border-none focus:outline-solid outline-base-foreground outline-4")),onKeydown:x[3]||(x[3]=Ja(Ve(T=>w.interactive&&w.$emit("select",w.asset),["self"]),["enter"]))},[v("div",A_,[b(y)||b(k)?(C(),P("div",{key:0,class:"flex size-full cursor-pointer items-center justify-center bg-gradient-to-br from-smoke-400 via-smoke-800 to-charcoal-400",role:"button",onClick:x[0]||(x[0]=Ve(T=>w.interactive&&w.$emit("select",w.asset),["self"]))})):(C(),P("img",{key:1,src:w.asset.preview_url,alt:g.value,class:"size-full object-cover cursor-pointer",role:"button",onClick:x[1]||(x[1]=Ve(T=>w.interactive&&w.$emit("select",w.asset),["self"]))},null,8,M_)),R(v_,{badges:w.asset.badges},null,8,["badges"]),m.value?(C(),X(xp,{key:2,class:pe(b(Pe)("absolute top-2 right-2 invisible group-hover:visible",b(u)?.isOpen&&"visible"))},{default:W(()=>[R(Qb,{ref:"dropdown-menu-button",size:"sm"},{default:W(()=>[b(i).assetRenameEnabled?(C(),X(se,{key:0,variant:"secondary",size:"md",class:"justify-start",onClick:_},{default:W(()=>[x[4]||(x[4]=v("i",{class:"icon-[lucide--pencil]"},null,-1)),v("span",null,$(w.$t("g.rename")),1)]),_:1})):H("",!0),b(i).assetDeletionEnabled?(C(),X(se,{key:1,variant:"secondary",size:"md",class:"justify-start",onClick:S},{default:W(()=>[x[5]||(x[5]=v("i",{class:"icon-[lucide--trash-2]"},null,-1)),v("span",null,$(w.$t("g.delete")),1)]),_:1})):H("",!0)]),_:1},512)]),_:1},8,["class"])):H("",!0)]),v("div",P_,[ze((C(),P("h3",{id:b(c),class:pe(b(Pe)("mb-2 m-0 text-base font-semibold line-clamp-2 wrap-anywhere","text-base-foreground"))},[R(fl,{"model-value":g.value,"is-editing":p.value,"input-attrs":{"data-testid":"asset-name-input"},onEdit:I,onCancel:x[2]||(x[2]=T=>I())},null,8,["model-value","is-editing"])],10,D_)),[[D,{value:g.value,showDelay:h.value},void 0,{top:!0}]]),ze((C(),P("p",{id:b(d),class:pe(b(Pe)("m-0 text-sm leading-6 overflow-hidden [-webkit-box-orient:vertical] [-webkit-line-clamp:2] [display:-webkit-box] text-muted-foreground"))},[fe($(w.asset.description),1)],10,L_)),[[D,{value:w.asset.description,showDelay:h.value},void 0,{top:!0}]]),v("div",O_,[w.asset.stats.stars?(C(),P("span",N_,[x[6]||(x[6]=v("i",{class:"icon-[lucide--star] size-3"},null,-1)),fe(" "+$(w.asset.stats.stars),1)])):H("",!0),w.asset.stats.downloadCount?(C(),P("span",$_,[x[7]||(x[7]=v("i",{class:"icon-[lucide--download] size-3"},null,-1)),fe(" "+$(w.asset.stats.downloadCount),1)])):H("",!0),w.asset.stats.formattedDate?(C(),P("span",R_,[x[8]||(x[8]=v("i",{class:"icon-[lucide--clock] size-3"},null,-1)),fe(" "+$(w.asset.stats.formattedDate),1)])):H("",!0)])])],42,T_)}}}),F_=B_,U_=["aria-label","aria-setsize"],W_={key:0,class:"flex h-full items-center justify-center py-20"},z_={key:1,class:"flex h-full flex-col items-center justify-center py-16 text-muted-foreground"},V_={class:"mb-2 text-lg font-medium"},G_={class:"text-sm"},H_=J({__name:"AssetGrid",props:{assets:{},loading:{type:Boolean}},emits:["assetSelect","assetDeleted"],setup(e){const t=E(()=>e.assets.map(o=>({...o,key:o.id}))),a={display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(15rem, 1fr))",gap:"1rem",padding:"0.5rem"};return(o,s)=>(C(),P("div",{"data-component-id":"AssetGrid",class:"h-full",role:"grid","aria-label":o.$t("assetBrowser.assetCollection"),"aria-rowcount":-1,"aria-colcount":-1,"aria-setsize":o.assets.length},[o.loading?(C(),P("div",W_,s[2]||(s[2]=[v("i",{class:"icon-[lucide--loader] size-12 animate-spin text-muted-foreground"},null,-1)]))):o.assets.length===0?(C(),P("div",z_,[s[3]||(s[3]=v("i",{class:"mb-4 icon-[lucide--search] size-10"},null,-1)),v("h3",V_,$(o.$t("assetBrowser.noAssetsFound")),1),v("p",G_,$(o.$t("assetBrowser.tryAdjustingFilters")),1)])):(C(),X(pr,{key:2,items:t.value,"grid-style":a,"default-item-height":320,"default-item-width":240},{item:W(({item:r})=>[R(F_,{asset:r,interactive:!0,onSelect:s[0]||(s[0]=i=>o.$emit("assetSelect",i)),onDeleted:s[1]||(s[1]=i=>o.$emit("assetDeleted",i))},null,8,["asset"])]),_:1},8,["items"]))],8,U_))}}),j_=H_;function K_(e){return typeof e.user_metadata?.description=="string"?e.user_metadata.description:null}n(K_,"getAssetDescription");function Sp(e){return typeof e.user_metadata?.base_model=="string"?e.user_metadata.base_model:null}n(Sp,"getAssetBaseModel");function Y_(e){return t=>e==="all"||t.tags.includes(e)?!0:t.tags.some(a=>typeof a=="string"&&a.includes("/")?a.split("/")[0]===e:!1)}n(Y_,"filterByCategory");function q_(e){return t=>{if(e.length===0)return!0;const a=new Set(e),o=t.name.split(".").pop()?.toLowerCase();return o?a.has(o):!1}}n(q_,"filterByFileFormats");function X_(e){return t=>{if(e.length===0)return!0;const a=new Set(e),o=Sp(t);return o?a.has(o):!1}}n(X_,"filterByBaseModels");function Z_(e){return t=>e==="all"?!0:e==="my-models"?t.is_immutable===!1:e==="public-models"?t.is_immutable===!0:!0}n(Z_,"filterByOwnership");function J_(e=A([])){const t=E(()=>e.value??[]),a=A(""),o=A("all"),s=A({sortBy:"recent",fileFormats:[],baseModels:[],ownership:"all"});function r(g){const m=g.tags.find(_=>_!=="models"),h=K_(g)||`${m||G("assetBrowser.unknown")} model`,y=[];if(m){const _=m.includes("/")?m.substring(m.indexOf("/")+1):m;y.push({label:_,type:"type"})}const k=Sp(g);k&&y.push({label:k,type:"base"});const S={formattedDate:ph(new Date(g.created_at),{dateStyle:"short"}),downloadCount:void 0,stars:void 0};return{...g,description:h,badges:y,stats:S}}n(r,"transformAssetForDisplay");const i=E(()=>{const g=t.value.filter(h=>h.tags[0]==="models").map(h=>h.tags[1]).filter(h=>typeof h=="string"&&h.length>0).map(h=>h.split("/")[0]),m=Array.from(new Set(g)).sort().map(h=>({id:h,label:h.charAt(0).toUpperCase()+h.slice(1),icon:"icon-[lucide--package]"}));return[{id:"all",label:G("assetBrowser.allModels"),icon:"icon-[lucide--folder]"},...m]}),l=E(()=>o.value==="all"?G("assetBrowser.allModels"):i.value.find(g=>g.id===o.value)?.label||G("assetBrowser.assets")),u=E(()=>t.value.filter(Y_(o.value))),{results:c}=Cd(a,u,{fuseOptions:{keys:[{name:"name",weight:.4},{name:"tags",weight:.3}],threshold:.4,ignoreLocation:!0,includeScore:!0},matchAllWhenSearchEmpty:!0}),d=E(()=>c.value.map(g=>g.item)),p=E(()=>{const g=[...d.value.filter(q_(s.value.fileFormats)).filter(X_(s.value.baseModels)).filter(Z_(s.value.ownership))];return g.sort((m,h)=>{switch(s.value.sortBy){case"name-desc":return h.name.localeCompare(m.name);case"recent":return new Date(h.created_at).getTime()-new Date(m.created_at).getTime();case"popular":return m.name.localeCompare(h.name);case"name-asc":default:return m.name.localeCompare(h.name)}}),g.map(r)});function f(g){s.value={...g}}return n(f,"updateFilters"),{searchQuery:a,selectedCategory:o,availableCategories:i,contentTitle:l,categoryFilteredAssets:u,filteredAssets:p,updateFilters:f}}n(J_,"useAssetBrowser");function Q_(e){const t={loras:"LoRA",ipadapter:"IP-Adapter",sams:"SAM",clip_vision:"CLIP Vision",animatediff_motion_lora:"AnimateDiff Motion LoRA",animatediff_models:"AnimateDiff Model",vae:"VAE",sam2:"SAM 2",controlnet:"ControlNet",gligen:"GLIGEN"};return t[e]?t[e]:e.split("_").map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(" ")}n(Q_,"formatDisplayName");var ek=["nlf"];const Ep=on(()=>{const{state:e,isLoading:t,error:a,execute:o}=Xo(async()=>(await oe.getModelFolders()).filter(s=>!ek.includes(s.name)).map(s=>({name:Q_(s.name),value:s.name})).sort((s,r)=>s.name.localeCompare(r.name)),[],{immediate:!1,onError:n(s=>{console.error("Failed to fetch model types:",s)},"onError")});return{modelTypes:e,isLoading:t,error:a,fetchModelTypes:o}});var tk={class:"flex flex-col gap-4 text-sm text-muted-foreground"},ak={class:"flex flex-col gap-2"},ok={class:"m-0"},nk={class:"flex items-center gap-3 rounded-lg bg-secondary-background px-4 py-2"},sk=["src","alt"],rk={class:"m-0 min-w-0 flex-1 truncate text-base-foreground"},ik={class:"flex flex-col gap-2"},lk={class:"flex items-center gap-2"},uk={class:"text-muted-foreground"},ck=J({__name:"UploadModelConfirmation",props:_t({metadata:{},previewImage:{}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=rt(e,"modelValue"),{modelTypes:a,isLoading:o}=Ep();return(s,r)=>(C(),P("div",tk,[v("div",ak,[v("p",ok,$(s.$t("assetBrowser.modelAssociatedWithLink")),1),v("div",nk,[s.previewImage?(C(),P("img",{key:0,src:s.previewImage,alt:s.metadata?.filename||s.metadata?.name||"Model preview",class:"size-14 flex-shrink-0 rounded object-cover"},null,8,sk)):H("",!0),v("p",rk,$(s.metadata?.filename||s.metadata?.name),1)])]),v("div",ik,[v("div",lk,[v("label",null,$(s.$t("assetBrowser.modelTypeSelectorLabel")),1),r[1]||(r[1]=v("i",{class:"icon-[lucide--circle-question-mark] text-muted-foreground"},null,-1)),v("span",uk,$(s.$t("assetBrowser.notSureLeaveAsIs")),1)]),R($n,{modelValue:t.value,"onUpdate:modelValue":r[0]||(r[0]=i=>t.value=i),label:b(o)?s.$t("g.loading"):s.$t("assetBrowser.modelTypeSelectorPlaceholder"),options:b(a),disabled:b(o),"data-attr":"upload-model-step2-type-selector"},null,8,["modelValue","label","options","disabled"])])]))}}),dk=ck,pk={class:"relative"},fk=["aria-label","src"],mk=J({__name:"VideoHelpDialog",props:_t({videoUrl:{},ariaLabel:{default:"Help video"}},{modelValue:{type:Boolean,required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=rt(e,"modelValue"),a=n(o=>{o.key==="Escape"&&(o.stopImmediatePropagation(),o.stopPropagation(),o.preventDefault(),t.value=!1)},"handleEscapeKey");return be(t,o=>{o&&rg(At(document,"keydown",a,{capture:!0}))},{immediate:!0}),(o,s)=>(C(),X(b(rd),{visible:t.value,"onUpdate:visible":s[1]||(s[1]=r=>t.value=r),modal:"",closable:!1,"close-on-escape":!1,"dismissable-mask":!0,pt:{root:{class:"video-help-dialog"},header:{class:"!hidden"},content:{class:"!p-0"},mask:{class:"!bg-black/70"}},style:{width:"90vw"}},{default:W(()=>[v("div",pk,[R(se,{variant:"textonly",size:"icon",class:"absolute top-4 right-6 z-10","aria-label":o.$t("g.close"),onClick:s[0]||(s[0]=r=>t.value=!1)},{default:W(()=>s[2]||(s[2]=[v("i",{class:"pi pi-times text-sm"},null,-1)])),_:1},8,["aria-label"]),v("video",{autoplay:"",muted:"",loop:"","aria-label":o.ariaLabel,class:"w-full rounded-lg",src:o.videoUrl},$(o.$t("g.videoFailedToLoad")),9,fk)])]),_:1},8,["visible"]))}}),Lu=mk,gk={class:"flex justify-end gap-2 w-full"},hk={key:0,class:"mr-auto flex items-center gap-2"},vk={key:4},yk={key:0,class:"icon-[lucide--loader-circle] animate-spin"},wk={key:0,class:"icon-[lucide--loader-circle] animate-spin"},bk=J({__name:"UploadModelFooter",props:{currentStep:{},isFetchingMetadata:{type:Boolean},isUploading:{type:Boolean},canFetchMetadata:{type:Boolean},canUploadModel:{type:Boolean},uploadStatus:{}},emits:["back","fetchMetadata","upload","close","importAnother"],setup(e,{emit:t}){const{flags:a}=oo(),o=A(!1),s=A(!1),r=t;return(i,l)=>(C(),P("div",gk,[i.currentStep===1&&b(a).huggingfaceModelImportEnabled?(C(),P("div",hk,[l[11]||(l[11]=v("i",{class:"icon-[lucide--circle-question-mark] text-muted-foreground"},null,-1)),R(se,{variant:"muted-textonly",size:"sm","data-attr":"upload-model-step1-help-civitai",onClick:l[0]||(l[0]=u=>o.value=!0)},{default:W(()=>[fe($(i.$t("assetBrowser.providerCivitai")),1)]),_:1}),R(se,{variant:"muted-textonly",size:"sm","data-attr":"upload-model-step1-help-huggingface",onClick:l[1]||(l[1]=u=>s.value=!0)},{default:W(()=>[fe($(i.$t("assetBrowser.providerHuggingFace")),1)]),_:1})])):i.currentStep===1?(C(),X(se,{key:1,variant:"muted-textonly",size:"lg",class:"mr-auto underline","data-attr":"upload-model-step1-help-link",onClick:l[2]||(l[2]=u=>o.value=!0)},{default:W(()=>[l[12]||(l[12]=v("i",{class:"icon-[lucide--circle-question-mark]"},null,-1)),v("span",null,$(i.$t("assetBrowser.uploadModelHowDoIFindThis")),1)]),_:1})):H("",!0),i.currentStep===1?(C(),X(se,{key:2,variant:"muted-textonly",size:"lg","data-attr":"upload-model-step1-cancel-button",disabled:i.isFetchingMetadata||i.isUploading,onClick:l[3]||(l[3]=u=>r("close"))},{default:W(()=>[fe($(i.$t("g.cancel")),1)]),_:1},8,["disabled"])):H("",!0),i.currentStep!==1&&i.currentStep!==3?(C(),X(se,{key:3,variant:"muted-textonly",size:"lg","data-attr":`upload-model-step${i.currentStep}-back-button`,disabled:i.isFetchingMetadata||i.isUploading,onClick:l[4]||(l[4]=u=>r("back"))},{default:W(()=>[fe($(i.$t("g.back")),1)]),_:1},8,["data-attr","disabled"])):(C(),P("span",vk)),i.currentStep===1?(C(),X(se,{key:5,variant:"secondary",size:"lg","data-attr":"upload-model-step1-continue-button",disabled:!i.canFetchMetadata||i.isFetchingMetadata,onClick:l[5]||(l[5]=u=>r("fetchMetadata"))},{default:W(()=>[i.isFetchingMetadata?(C(),P("i",yk)):H("",!0),v("span",null,$(i.$t("g.continue")),1)]),_:1},8,["disabled"])):i.currentStep===2?(C(),X(se,{key:6,variant:"secondary",size:"lg","data-attr":"upload-model-step2-confirm-button",disabled:!i.canUploadModel||i.isUploading,onClick:l[6]||(l[6]=u=>r("upload"))},{default:W(()=>[i.isUploading?(C(),P("i",wk)):H("",!0),v("span",null,$(i.$t("assetBrowser.upload")),1)]),_:1},8,["disabled"])):i.currentStep===3&&(i.uploadStatus==="success"||i.uploadStatus==="processing")?(C(),P(Se,{key:7},[R(se,{variant:"muted-textonly",size:"lg","data-attr":"upload-model-step3-import-another-button",onClick:l[7]||(l[7]=u=>r("importAnother"))},{default:W(()=>[fe($(i.$t("assetBrowser.importAnother")),1)]),_:1}),R(se,{variant:"secondary",size:"lg","data-attr":"upload-model-step3-finish-button",onClick:l[8]||(l[8]=u=>r("close"))},{default:W(()=>[fe($(i.uploadStatus==="processing"?i.$t("g.close"):i.$t("assetBrowser.finish")),1)]),_:1})],64)):H("",!0),R(Lu,{modelValue:o.value,"onUpdate:modelValue":l[9]||(l[9]=u=>o.value=u),"video-url":"https://media.comfy.org/compressed_768/civitai_howto.webm","aria-label":i.$t("assetBrowser.uploadModelHelpVideo")},null,8,["modelValue","aria-label"]),R(Lu,{modelValue:s.value,"onUpdate:modelValue":l[10]||(l[10]=u=>s.value=u),"video-url":"https://media.comfy.org/byom/huggingfacehowto.mp4","aria-label":i.$t("assetBrowser.uploadModelHelpVideo")},null,8,["modelValue","aria-label"])]))}}),_k=bk,kk={class:"flex flex-1 flex-col gap-6 text-sm text-muted-foreground"},Ck={key:0,class:"flex flex-col gap-2"},xk={class:"m-0 font-bold"},Ik={class:"m-0"},Sk={class:"flex flex-row items-center gap-3 rounded-lg bg-modal-card-background p-4"},Ek=["src","alt"],Tk={class:"flex min-w-0 flex-1 flex-col items-start justify-center gap-1"},Ak={class:"m-0 w-full truncate text-base-foreground"},Mk={class:"m-0 text-sm text-muted"},Pk={key:1,class:"flex flex-col gap-2"},Dk={class:"m-0 font-bold"},Lk={class:"m-0"},Ok={class:"flex flex-row items-center gap-3 rounded-lg bg-modal-card-background p-4"},Nk=["src","alt"],$k={class:"flex min-w-0 flex-1 flex-col items-start justify-center gap-1"},Rk={class:"m-0 w-full truncate text-base-foreground"},Bk={class:"m-0 text-sm text-muted"},Fk={key:2,class:"flex flex-1 flex-col items-center justify-center gap-6"},Uk={class:"text-center"},Wk={class:"m-0 text-sm font-bold"},zk={key:0,class:"text-sm text-muted mb-0"},Vk=J({__name:"UploadModelProgress",props:{result:{},error:{},metadata:{},modelType:{},previewImage:{}},setup(e){return(t,a)=>(C(),P("div",kk,[t.result==="processing"?(C(),P("div",Ck,[v("p",xk,$(t.$t("assetBrowser.processingModel")),1),v("p",Ik,$(t.$t("assetBrowser.processingModelDescription")),1),v("div",Sk,[t.previewImage?(C(),P("img",{key:0,src:t.previewImage,alt:t.metadata?.filename||t.metadata?.name||"Model preview",class:"size-14 flex-shrink-0 rounded object-cover"},null,8,Ek)):H("",!0),v("div",Tk,[v("p",Ak,$(t.metadata?.filename||t.metadata?.name),1),v("p",Mk,$(t.modelType),1)])])])):t.result==="success"?(C(),P("div",Pk,[v("p",Dk,$(t.$t("assetBrowser.modelUploaded")),1),v("p",Lk,$(t.$t("assetBrowser.findInLibrary",{type:t.modelType})),1),v("div",Ok,[t.previewImage?(C(),P("img",{key:0,src:t.previewImage,alt:t.metadata?.filename||t.metadata?.name||"Model preview",class:"size-14 flex-shrink-0 rounded object-cover"},null,8,Nk)):H("",!0),v("div",$k,[v("p",Rk,$(t.metadata?.filename||t.metadata?.name),1),v("p",Bk,$(t.modelType),1)])])])):t.result==="error"?(C(),P("div",Fk,[a[0]||(a[0]=v("i",{class:"icon-[lucide--x-circle] text-6xl text-error"},null,-1)),v("div",Uk,[v("p",Wk,$(t.$t("assetBrowser.uploadFailed")),1),t.error?(C(),P("p",zk,$(t.error),1)):H("",!0)])])):H("",!0)]))}}),Gk=Vk;const Hs={type:"civitai",name:"Civitai",hostnames:["civitai.com"]},Tp={type:"huggingface",name:"Hugging Face",hostnames:["huggingface.co"]};function hl(e,t){try{const a=new URL(e).hostname.toLowerCase();return t.hostnames.some(o=>a===o||a.endsWith(`.${o}`))}catch{return!1}}n(hl,"validateSourceUrl");var Hk={class:"flex flex-col justify-between h-full gap-6 text-sm"},jk={class:"flex flex-col gap-6"},Kk={class:"flex flex-col gap-2"},Yk={class:"m-0 text-foreground"},qk={class:"m-0"},Xk={class:"m-0 text-muted-foreground"},Zk={class:"inline-flex items-center gap-1 flex-wrap mt-2"},Jk={class:"inline-flex items-center gap-1"},Qk=["alt"],e1={class:"inline-flex items-center gap-1"},t1=["alt"],a1={class:"flex flex-col gap-2"},o1={class:"relative"},n1={key:0,class:"icon-[lucide--circle-check-big] absolute top-1/2 right-3 size-5 -translate-y-1/2 text-green-500"},s1={key:0,class:"text-sm text-error"},r1={key:1,class:"text-foreground"},i1={class:"font-bold italic"},l1={class:"text-sm text-muted"},u1="/assets/images/civitai.svg",c1="https://civitai.com/models",d1="/assets/images/hf-logo.svg",p1="https://huggingface.co",f1=J({__name:"UploadModelUrlInput",props:{modelValue:{},error:{}},emits:["update:modelValue"],setup(e,{emit:t}){const{flags:a}=oo(),o=e,s=t,r=E({get:n(()=>o.modelValue,"get"),set:n(u=>s("update:modelValue",u),"set")}),i=[Hs,Tp],l=E(()=>{const u=r.value.trim();return u?i.some(c=>hl(u,c)):!1});return(u,c)=>{const d=Yi("i18n-t");return C(),P("div",Hk,[v("div",jk,[v("div",Kk,[v("p",Yk,$(u.$t("assetBrowser.uploadModelDescription1Generic")),1),v("div",qk,[v("p",Xk,$(u.$t("assetBrowser.uploadModelDescription2Generic")),1),v("span",Zk,[v("span",Jk,[v("img",{src:u1,alt:u.$t("assetBrowser.providerCivitai"),class:"w-4 h-4"},null,8,Qk),v("a",{href:c1,target:"_blank",rel:"noopener noreferrer",class:"text-muted-foreground underline"},$(u.$t("assetBrowser.providerCivitai")),1),c[1]||(c[1]=v("span",null,",",-1))]),v("span",e1,[v("img",{src:d1,alt:u.$t("assetBrowser.providerHuggingFace"),class:"w-4 h-4"},null,8,t1),v("a",{href:p1,target:"_blank",rel:"noopener noreferrer",class:"text-muted-foreground underline"},$(u.$t("assetBrowser.providerHuggingFace")),1)])])])]),v("div",a1,[v("div",o1,[R(b(ca),{modelValue:r.value,"onUpdate:modelValue":c[0]||(c[0]=p=>r.value=p),autofocus:"",placeholder:u.$t("assetBrowser.genericLinkPlaceholder"),class:"w-full border-0 bg-secondary-background p-4 pr-10","data-attr":"upload-model-step1-url-input"},null,8,["modelValue","placeholder"]),l.value?(C(),P("i",n1)):H("",!0)]),u.error?(C(),P("p",s1,$(u.error),1)):b(a).asyncModelUploadEnabled?H("",!0):(C(),P("p",r1,[R(d,{keypath:"assetBrowser.maxFileSize",tag:"span"},{size:W(()=>[v("span",i1,$(u.$t("assetBrowser.maxFileSizeValue")),1)]),_:1})]))])]),v("div",l1,$(u.$t("assetBrowser.uploadModelHelpFooterText")),1)])}}}),m1=f1,g1={class:"flex flex-col gap-6 text-sm text-muted-foreground"},h1={class:"flex flex-col gap-2"},v1={class:"m-0"},y1={class:"list-disc space-y-1 pl-5 mt-0"},w1={href:"https://civitai.com/models",target:"_blank",class:"text-muted-foreground underline"},b1={key:0},_1={class:"font-bold italic"},k1={class:"flex flex-col gap-2"},C1={class:"font-bold italic"},x1={class:"relative"},I1={key:0,class:"icon-[lucide--circle-check-big] absolute top-1/2 right-3 size-5 -translate-y-1/2 text-green-500"},S1={key:0,class:"text-sm text-error"},E1={href:"https://civitai.com/models/10706/luisap-z-image-and-qwen-pixel-art-refiner?modelVersionId=2225295",target:"_blank",class:"text-muted-foreground underline"},T1=J({__name:"UploadModelUrlInputCivitai",props:_t({error:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const{flags:t}=oo(),a=rt(e,"modelValue"),o=E(()=>{const s=a.value.trim();return s?hl(s,Hs):!1});return(s,r)=>{const i=Yi("i18n-t");return C(),P("div",g1,[v("div",h1,[v("p",v1,$(s.$t("assetBrowser.uploadModelDescription1")),1),v("ul",y1,[v("li",null,[R(i,{keypath:"assetBrowser.uploadModelDescription2",tag:"span"},{link:W(()=>[v("a",w1,$(s.$t("assetBrowser.uploadModelDescription2Link")),1)]),_:1})]),b(t).asyncModelUploadEnabled?H("",!0):(C(),P("li",b1,[R(i,{keypath:"assetBrowser.uploadModelDescription3",tag:"span"},{size:W(()=>[v("span",_1,$(s.$t("assetBrowser.maxFileSizeValue")),1)]),_:1})]))])]),v("div",k1,[R(i,{keypath:"assetBrowser.civitaiLinkLabel",tag:"label",class:"mb-0"},{download:W(()=>[v("span",C1,$(s.$t("assetBrowser.civitaiLinkLabelDownload")),1)]),_:1}),v("div",x1,[R(b(ca),{modelValue:a.value,"onUpdate:modelValue":r[0]||(r[0]=l=>a.value=l),autofocus:"",placeholder:s.$t("assetBrowser.civitaiLinkPlaceholder"),class:"w-full border-0 bg-secondary-background p-4 pr-10","data-attr":"upload-model-step1-url-input"},null,8,["modelValue","placeholder"]),o.value?(C(),P("i",I1)):H("",!0)]),s.error?(C(),P("p",S1,$(s.error),1)):(C(),X(i,{key:1,keypath:"assetBrowser.civitaiLinkExample",tag:"p",class:"text-sm"},{example:W(()=>[v("strong",null,$(s.$t("assetBrowser.civitaiLinkExampleStrong")),1)]),link:W(()=>[v("a",E1,$(s.$t("assetBrowser.civitaiLinkExampleUrl")),1)]),_:1}))])])}}}),A1=T1,M1="/tasks",P1=U.enum(["created","running","completed","failed"]),D1=U.object({success:U.boolean(),file_path:U.string().optional(),bytes_downloaded:U.number().optional(),content_type:U.string().optional(),hash:U.string().optional(),filename:U.string().optional(),asset_id:U.string().optional(),metadata:U.record(U.unknown()).optional(),error:U.string().optional()}),L1=U.object({id:U.string().uuid(),idempotency_key:U.string(),task_name:U.string(),payload:U.record(U.unknown()),status:P1,result:D1.optional(),error_message:U.string().optional(),create_time:U.string().datetime(),update_time:U.string().datetime(),started_at:U.string().datetime().optional(),completed_at:U.string().datetime().optional()});function O1(){async function e(t){const a=await oe.fetchApi(`${M1}/${t}`);if(!a.ok)throw a.status===404?new Error(`Task not found: ${t}`):new Error(`Failed to get task ${t}: ${a.status}`);const o=await a.json(),s=L1.safeParse(o);if(!s.success)throw new Error(Un(s.error).message);return s.data}return n(e,"getTask"),{getTask:e}}n(O1,"createTaskService");const N1=O1();var $1=1e4,R1=1e4;function B1(e,t,a){return{taskId:e,modelType:t,assetName:a,bytesTotal:0,bytesDownloaded:0,progress:0,status:"created",lastUpdate:Date.now()}}n(B1,"generateDownloadTrackingPlaceholder");const Ap=Je("assetDownload",()=>{const e=A(new Map),t=A(null),a=E(()=>Array.from(e.value.values())),o=E(()=>a.value.filter(g=>g.status==="created"||g.status==="running")),s=E(()=>a.value.filter(g=>g.status==="completed"||g.status==="failed")),r=E(()=>o.value.length>0),i=E(()=>e.value.size>0);function l(g,m,h){e.value.has(g)||e.value.set(g,B1(g,m,h))}n(l,"trackDownload");function u(g){const m=g.detail,h=e.value.get(m.task_id);if(h?.status==="completed"||h?.status==="failed")return;const y={taskId:m.task_id,assetId:m.asset_id,assetName:m.asset_name,bytesTotal:m.bytes_total,bytesDownloaded:m.bytes_downloaded,progress:m.progress,status:m.status,error:m.error,lastUpdate:Date.now(),modelType:h?.modelType};e.value.set(m.task_id,y),m.status==="completed"&&y.modelType&&(t.value={taskId:m.task_id,modelType:y.modelType,timestamp:Date.now()})}n(u,"handleAssetDownload");async function c(){const g=Date.now(),m=o.value.filter(y=>g-y.lastUpdate>=$1);if(m.length===0)return;async function h(y){try{const k=await N1.getTask(y.taskId);if(k.status==="completed"||k.status==="failed"){const S=k.result;u(new CustomEvent("asset_download",{detail:{task_id:y.taskId,asset_id:S?.asset_id??y.assetId,asset_name:S?.filename??y.assetName,bytes_total:y.bytesTotal,bytes_downloaded:S?.bytes_downloaded??y.bytesTotal,progress:k.status==="completed"?100:y.progress,status:k.status,error:k.error_message??S?.error}}))}}catch{}}n(h,"pollSingleDownload"),await Promise.all(m.map(h))}n(c,"pollStaleDownloads");const{pause:d,resume:p}=hg(()=>{c()},R1,{immediate:!1});be(r,g=>{g?p():d()},{immediate:!0}),oe.addEventListener("asset_download",u);function f(){for(const g of s.value)e.value.delete(g.taskId)}return n(f,"clearFinishedDownloads"),{activeDownloads:o,finishedDownloads:s,hasActiveDownloads:r,hasDownloads:i,downloadList:a,lastCompletedDownload:t,trackDownload:l,clearFinishedDownloads:f}});function Mp(e){return e?.[0]==="output"?"output":"input"}n(Mp,"getAssetType$1");function Pp(e,t){const a={promptId:e.promptId,nodeId:t.nodeId,subfolder:t.subfolder,executionTimeInSeconds:e.executionTimeInSeconds,format:t.format,create_time:e.createTime};return{id:e.promptId,name:t.filename,size:0,created_at:e.executionStartTimestamp?new Date(e.executionStartTimestamp).toISOString():new Date().toISOString(),tags:["output"],preview_url:t.url,user_metadata:a}}n(Pp,"mapTaskOutputToAssetItem");function F1(e,t,a="input"){return{id:`${a}-${t}-${e}`,name:e,size:0,created_at:new Date().toISOString(),tags:[a],preview_url:oe.apiURL(`/view?filename=${encodeURIComponent(e)}&type=${a}`)}}n(F1,"mapInputFileToAssetItem");var U1=100;async function W1(){const e=await fetch(oe.internalURL("/files/input"),{headers:{"Comfy-User":oe.user}});if(!e.ok)throw new Error("Failed to fetch input files");return(await e.json()).map((t,a)=>F1(t,a,"input"))}n(W1,"fetchInputFilesFromAPI");async function z1(){return await Zt.getAssetsByTag("input",!1,{limit:U1})}n(z1,"fetchInputFilesFromCloud");function V1(e){const t=[];for(const a of e){if(a.status!=="completed"||!a.preview_output)continue;const o=new _n(a);if(!o.previewOutput)continue;const s=Pp(o,o.previewOutput);s.user_metadata={...s.user_metadata,outputCount:a.outputs_count,allOutputs:o.previewableOutputs},t.push(s)}return t.sort((a,o)=>new Date(o.created_at).getTime()-new Date(a.created_at).getTime())}n(V1,"mapHistoryToAssets");var Lr=200,Or=1e3;const ao=Je("assets",()=>{const e=Ap(),t=en(),a=A(0),o=A(!0),s=A(!1),r=A([]),i=ja(new Set),{state:l,isLoading:u,error:c,execute:d}=Xo(qe?z1:W1,[],{immediate:!1,resetOnExecute:!1,onError:n(N=>{console.error("Error fetching input assets:",N)},"onError")}),p=n(async(N=!1)=>{N||(a.value=0,o.value=!0,r.value=[],i.clear());const M=await oe.getHistory(Lr,{offset:a.value}),O=V1(M);if(N)for(const L of O){if(i.has(L.id))continue;i.add(L.id);const F=new Date(L.created_at).getTime(),K=r.value.findIndex(j=>new Date(j.created_at).getTime()<F);K===-1?r.value.push(L):r.value.splice(K,0,L)}else r.value=O,O.forEach(L=>i.add(L.id));if(a.value+=Lr,o.value=M.length===Lr,r.value.length>Or){const L=r.value.slice(Or);r.value=r.value.slice(0,Or),L.forEach(F=>i.delete(F.id))}return r.value},"fetchHistoryAssets"),f=A([]),g=A(!1),m=A(null),h=n(async()=>{g.value=!0,m.value=null;try{await p(!1),f.value=r.value}catch(N){console.error("Error fetching history assets:",N),m.value=N,f.value.length||(f.value=[])}finally{g.value=!1}},"updateHistory"),y=n(async()=>{if(!(!o.value||s.value)){s.value=!0,m.value=null;try{await p(!0),f.value=r.value}catch(N){console.error("Error loading more history:",N),m.value=N,f.value.length||(f.value=[])}finally{s.value=!1}}},"loadMoreHistory"),k=E(()=>{const N=new Map;for(const M of l.value)M.asset_hash&&N.set(M.asset_hash,M);return N});function S(N){return k.value.get(N)?.name??N}n(S,"getInputName");const _=n(()=>{if(qe){const N=ja(new Map),M=ja(new Map),O=ja(new Map),L=ja(new Map);async function F(V,q){L.has(V)||L.set(V,Xo(q,[],{immediate:!1,resetOnExecute:!1,onError:n(ce=>{console.error(`Error fetching model assets for ${V}:`,ce)},"onError")}));const re=L.get(V);M.set(V,!0),O.set(V,null);try{await re.execute()}finally{M.set(V,re.isLoading.value)}const ae=re.state.value;return mg(N.get(V),ae)||N.set(V,ae),O.set(V,re.error.value instanceof Error?re.error.value:null),ae}n(F,"updateModelsForKey");async function K(V){return F(V,()=>Zt.getAssetsForNodeType(V))}n(K,"updateModelsForNodeType$1");async function j(V){return F(`tag:${V}`,()=>Zt.getAssetsByTag(V))}return n(j,"updateModelsForTag$1"),{modelAssetsByNodeType:N,modelLoadingByNodeType:M,modelErrorByNodeType:O,updateModelsForNodeType:K,updateModelsForTag:j}}return{modelAssetsByNodeType:ja(new Map),modelLoadingByNodeType:ja(new Map),modelErrorByNodeType:ja(new Map),updateModelsForNodeType:n(async()=>[],"updateModelsForNodeType"),updateModelsForTag:n(async()=>[],"updateModelsForTag")}},"getModelState"),{modelAssetsByNodeType:I,modelLoadingByNodeType:w,modelErrorByNodeType:x,updateModelsForNodeType:D,updateModelsForTag:T}=_();return Mt(()=>e.lastCompletedDownload,async N=>{const{modelType:M}=N,O=t.getAllNodeProviders(M).filter(K=>K.nodeDef?.name).map(K=>D(K.nodeDef.name).then(()=>K.nodeDef.name)),L=[T(M),T("models")],F=await Promise.allSettled([...O,...L]);for(const K of F)K.status==="rejected"&&console.error(`Failed to refresh model cache for provider: ${K.reason}`)}),{inputAssets:l,historyAssets:f,inputLoading:u,historyLoading:g,inputError:c,historyError:m,hasMoreHistory:o,isLoadingMore:s,updateInputs:d,updateHistory:h,loadMoreHistory:y,inputAssetsByFilename:k,getInputName:S,modelAssetsByNodeType:I,modelLoadingByNodeType:w,modelErrorByNodeType:x,updateModelsForNodeType:D,updateModelsForTag:T}});function G1(e){const{t}=Fe(),a=ao(),o=Ap(),s=en(),{flags:r}=oo(),i=A(1),l=A(!1),u=A(!1),c=A(),d=A(""),p=A({url:"",name:"",tags:[]}),f=A(),g=r.huggingfaceModelImportEnabled?[Hs,Tp]:[Hs],m=E(()=>{const D=p.value.url.trim();return D?g.find(T=>hl(D,T))??null:null});be(()=>p.value.url,()=>{d.value=""});const h=E(()=>p.value.url.trim().length>0),y=E(()=>!!f.value);async function k(){if(!h.value)return;let D=p.value.url.trim();try{D=new URL(encodeURI(D)).toString()}catch{}if(p.value.url=D,!m.value){d.value=t("assetBrowser.unsupportedUrlSource",{sources:g.map(T=>T.name).join(", ")});return}l.value=!0;try{const T=await Zt.getAssetMetadata(p.value.url);if(T.filename)try{T.filename=decodeURIComponent(T.filename)}catch{}if(T.name)try{T.name=decodeURIComponent(T.name)}catch{}if(p.value.metadata=T,p.value.name=T.filename||T.name||"",p.value.previewImage=T.preview_image,T.tags&&T.tags.length>0){p.value.tags=T.tags;const N=T.tags.find(M=>e.value.some(O=>O.value===M));N&&(f.value=N)}i.value=2}catch(T){console.error("Failed to retrieve metadata:",T),d.value=T instanceof Error?T.message:De("assetBrowser.uploadModelFailedToRetrieveMetadata","Failed to retrieve metadata. Please check the link and try again."),i.value=1}finally{l.value=!1}}n(k,"fetchMetadata");async function S(D){if(p.value.previewImage)try{const T=D.split(".")[0];let N="png";const M=p.value.previewImage.match(/^data:image\/([^;]+);/);return M&&(N=M[1]==="jpeg"?"jpg":M[1]),(await Zt.uploadAssetFromBase64({data:p.value.previewImage,name:`${T}_preview.${N}`,tags:["preview"]})).id}catch(T){console.error("Failed to upload preview image:",T);return}}n(S,"uploadPreviewImage");async function _(){if(!f.value)return;const D=s.getAllNodeProviders(f.value);(await Promise.allSettled(D.map(T=>a.updateModelsForNodeType(T.nodeDef.name)))).forEach((T,N)=>{T.status==="rejected"&&console.error(`Failed to refresh ${D[N].nodeDef.name}:`,T.reason)})}n(_,"refreshModelCaches");async function I(){if(!y.value)return!1;const D=m.value;if(!D)return d.value=t("assetBrowser.noValidSourceDetected"),!1;u.value=!0;try{const T=f.value?["models",f.value]:["models"],N=p.value.metadata?.filename||p.value.metadata?.name||"model",M=await S(N),O={source:D.type,source_url:p.value.url,model_type:f.value};if(r.asyncModelUploadEnabled){const L=await Zt.uploadAssetAsync({source_url:p.value.url,tags:T,user_metadata:O,preview_id:M});L.type==="async"&&L.task.status!=="completed"?(f.value&&o.trackDownload(L.task.task_id,f.value,N),c.value="processing"):(c.value="success",await _()),i.value=3}else await Zt.uploadAssetFromUrl({url:p.value.url,name:N,tags:T,user_metadata:O,preview_id:M}),c.value="success",await _(),i.value=3}catch(T){console.error("Failed to upload asset:",T),c.value="error",d.value=T instanceof Error?T.message:"Failed to upload model",i.value=3}finally{u.value=!1}return c.value!=="error"}n(I,"uploadModel");function w(){i.value>1&&(i.value=i.value-1)}n(w,"goToPreviousStep");function x(){i.value=1,l.value=!1,u.value=!1,c.value=void 0,d.value="",p.value={url:"",name:"",tags:[]},f.value=void 0}return n(x,"resetWizard"),{currentStep:i,isFetchingMetadata:l,isUploading:u,uploadStatus:c,uploadError:d,wizardData:p,selectedModelType:f,canFetchMetadata:h,canUploadModel:y,detectedSource:m,fetchMetadata:k,uploadModel:I,goToPreviousStep:w,resetWizard:x}}n(G1,"useUploadModelWizard");var H1={class:"upload-model-dialog flex flex-col gap-6 border-t border-border-default p-4 pt-6"},j1={class:"min-h-0 flex-auto basis-0 overflow-y-auto"},K1=J({__name:"UploadModelDialog",emits:["upload-success"],setup(e,{emit:t}){const{flags:a}=oo(),o=Ct(),{modelTypes:s,fetchModelTypes:r}=Ep(),i=t,{currentStep:l,isFetchingMetadata:u,isUploading:c,uploadStatus:d,uploadError:p,wizardData:f,selectedModelType:g,canFetchMetadata:m,canUploadModel:h,fetchMetadata:y,uploadModel:k,goToPreviousStep:S,resetWizard:_}=G1(s);async function I(){await y()}n(I,"handleFetchMetadata");async function w(){await k()&&i("upload-success")}n(w,"handleUploadModel");function x(){o.closeDialog({key:"upload-model"})}return n(x,"handleClose"),it(()=>{r()}),(D,T)=>(C(),P("div",H1,[v("div",j1,[b(l)===1&&b(a).huggingfaceModelImportEnabled?(C(),X(m1,{key:0,modelValue:b(f).url,"onUpdate:modelValue":T[0]||(T[0]=N=>b(f).url=N),error:b(p)},null,8,["modelValue","error"])):b(l)===1?(C(),X(A1,{key:1,modelValue:b(f).url,"onUpdate:modelValue":T[1]||(T[1]=N=>b(f).url=N),error:b(p)},null,8,["modelValue","error"])):b(l)===2?(C(),X(dk,{key:2,modelValue:b(g),"onUpdate:modelValue":T[2]||(T[2]=N=>ua(g)?g.value=N:null),metadata:b(f).metadata,"preview-image":b(f).previewImage},null,8,["modelValue","metadata","preview-image"])):b(l)===3&&b(d)!=null?(C(),X(Gk,{key:3,result:b(d),error:b(p),metadata:b(f).metadata,"model-type":b(g),"preview-image":b(f).previewImage},null,8,["result","error","metadata","model-type","preview-image"])):H("",!0)]),R(_k,{class:"flex-shrink-0","current-step":b(l),"is-fetching-metadata":b(u),"is-uploading":b(c),"can-fetch-metadata":b(m),"can-upload-model":b(h),"upload-status":b(d),onBack:b(S),onFetchMetadata:I,onUpload:w,onClose:x,onImportAnother:b(_)},null,8,["current-step","is-fetching-metadata","is-uploading","can-fetch-metadata","can-upload-model","upload-status","onBack","onImportAnother"])]))}}),Y1=ot(K1,[["__scopeId","data-v-f4fd265e"]]),q1=""+new URL("images/civitai.svg",import.meta.url).href,X1={class:"flex items-center gap-2 p-4 font-bold"},Z1={key:0,src:q1,class:"size-4"},J1={class:"rounded-full bg-white px-1.5 py-0 text-xxs font-inter font-semibold uppercase text-black"},Q1=J({__name:"UploadModelDialogHeader",setup(e){const{flags:t}=oo(),a=E(()=>t.huggingfaceModelImportEnabled?"assetBrowser.uploadModelGeneric":"assetBrowser.uploadModelFromCivitai");return(o,s)=>(C(),P("div",X1,[b(t).huggingfaceModelImportEnabled?H("",!0):(C(),P("img",Z1)),v("span",null,$(o.$t(a.value)),1),v("span",J1,$(o.$t("g.beta")),1)]))}}),e0=Q1,t0={},a0={class:"flex flex-1 flex-col items-center justify-center text-base text-muted-foreground"},o0={class:"m-0 max-w-md"};function n0(e,t){return C(),P("div",a0,[v("p",o0,$(e.$t("assetBrowser.upgradeFeatureDescription")),1)])}n(n0,"_sfc_render$4");var s0=ot(t0,[["render",n0]]),r0={class:"flex flex-wrap justify-end gap-2 w-full"},i0={href:"https://blog.comfy.org/p/comfy-cloud-new-features-and-pricing",target:"_blank",rel:"noopener noreferrer",class:"text-muted-foreground mr-auto underline flex items-center gap-2"},l0=J({__name:"UploadModelUpgradeModalFooter",emits:["close","subscribe"],setup(e,{emit:t}){const a=t;return(o,s)=>(C(),P("div",r0,[v("a",i0,[s[2]||(s[2]=v("i",{class:"icon-[lucide--external-link]"},null,-1)),v("span",null,$(o.$t("g.learnMore")),1)]),R(se,{variant:"textonly",onClick:s[0]||(s[0]=r=>a("close"))},{default:W(()=>[fe($(o.$t("g.close")),1)]),_:1}),R(se,{variant:"secondary",onClick:s[1]||(s[1]=r=>a("subscribe"))},{default:W(()=>[fe($(o.$t("subscription.required.subscribe")),1)]),_:1})]))}}),u0=l0,c0={class:"flex flex-col justify-between gap-10 p-4 border-t border-border-default w-auto max-w-[min(500px,90vw)]"},d0=J({__name:"UploadModelUpgradeModal",setup(e){const t=Ct(),{showSubscriptionDialog:a}=nn();function o(){t.closeDialog({key:"upload-model-upgrade"})}n(o,"handleClose");function s(){a()}return n(s,"handleSubscribe"),(r,i)=>(C(),P("div",c0,[R(s0),R(u0,{onClose:o,onSubscribe:s})]))}}),p0=d0,f0={},m0={class:"flex items-center gap-2 p-4 font-bold"};function g0(e,t){return C(),P("div",m0,[v("span",null,$(e.$t("assetBrowser.upgradeToUnlockFeature")),1)])}n(g0,"_sfc_render$3");var h0=ot(f0,[["render",g0]]);function v0(e){const t=Ct(),{flags:a}=oo(),o=E(()=>a.modelUploadButtonEnabled);function s(){a.privateModelsEnabled?t.showDialog({key:"upload-model",headerComponent:e0,component:Y1,props:{onUploadSuccess:n(async()=>{await e?.()},"onUploadSuccess")},dialogComponentProps:{pt:{header:"py-0! pl-0!",content:"p-0! overflow-y-hidden!"}}}):t.showDialog({key:"upload-model-upgrade",headerComponent:h0,component:p0,dialogComponentProps:{pt:{header:"py-0! pl-0!",content:"p-0! overflow-y-hidden!"}}})}return n(s,"showUploadDialog"),{isUploadButtonEnabled:o,showUploadDialog:s}}n(v0,"useModelUpload");var y0=new Set(["VAE","CLIP","GLIGEN"]);function w0(e){return e?e==="diffusion_models"?"Diffusion":e.split("_").map(t=>{const a=t.toUpperCase();if(y0.has(a))return a;const o=t.toLowerCase();return o.charAt(0).toUpperCase()+o.slice(1)}).join(" "):"Models"}n(w0,"formatCategoryLabel");var b0={class:"capitalize"},_0={class:"flex w-full items-center justify-between gap-2"},k0={class:"hidden md:inline"},C0=J({__name:"AssetBrowserModal",props:{nodeType:{},assetType:{},onSelect:{type:Function},onClose:{type:Function},showLeftPanel:{type:Boolean},title:{}},emits:["asset-select","close"],setup(e,{emit:t}){const{t:a}=Fe(),o=ao(),s=en(),r=Id(Ag),i=e,l=t;ya(pl,i.onClose??(()=>{}));const u=E(()=>i.nodeType?i.nodeType:i.assetType?`tag:${i.assetType}`:""),c=E(()=>o.modelAssetsByNodeType.get(u.value)??[]),d=E(()=>o.modelLoadingByNodeType.get(u.value)??!1),p=E(()=>d.value&&c.value.length===0);async function f(){return i.nodeType?await o.updateModelsForNodeType(i.nodeType):i.assetType?await o.updateModelsForTag(i.assetType):[]}n(f,"refreshAssets"),f();const{isUploadButtonEnabled:g,showUploadDialog:m}=v0(f),{searchQuery:h,selectedCategory:y,availableCategories:k,categoryFilteredAssets:S,filteredAssets:_,updateFilters:I}=J_(c),w=E(()=>{const O=(c.value??[]).map(L=>L.tags?.find(F=>F!=="models")).find(L=>typeof L=="string"&&L.length>0);if(O)return O;if(i.nodeType){const L=s.getCategoryForNodeType(i.nodeType);if(L)return L}return i.assetType?i.assetType:"models"}),x=E(()=>y.value!=="all"?y.value:w.value),D=E(()=>i.title?i.title:a("assetBrowser.allCategory",{category:w0(x.value)})),T=E(()=>i.showLeftPanel??!0);function N(){i.onClose?.(),l("close")}n(N,"handleClose");function M(O){l("asset-select",O),i.onSelect?.(O)}return n(M,"handleAssetSelectAndEmit"),(O,L)=>(C(),X(kp,{"data-component-id":"AssetBrowserModal",class:"size-full max-h-full max-w-full min-w-0","content-title":D.value,onClose:N},qo({header:W(()=>[v("div",_0,[R(Ao,{modelValue:b(h),"onUpdate:modelValue":L[1]||(L[1]=F=>ua(h)?h.value=F:null),autofocus:!0,size:"lg",placeholder:O.$t("g.searchPlaceholder"),class:"max-w-96"},null,8,["modelValue","placeholder"]),b(g)?(C(),X(se,{key:0,variant:"primary",size:b(r).md?"lg":"icon","data-attr":"upload-model-button",onClick:b(m)},{default:W(()=>[L[3]||(L[3]=v("i",{class:"icon-[lucide--folder-input]"},null,-1)),v("span",k0,$(O.$t("assetBrowser.uploadModel")),1)]),_:1},8,["size","onClick"])):H("",!0)])]),contentFilter:W(()=>[R(Kb,{assets:b(S),"all-assets":c.value,onFilterChange:b(I)},null,8,["assets","all-assets","onFilterChange"])]),content:W(()=>[R(j_,{assets:b(_),loading:p.value,onAssetSelect:M,onAssetDeleted:f},null,8,["assets","loading"])]),_:2},[T.value?{name:"leftPanel",fn:W(()=>[R(Cp,{modelValue:b(y),"onUpdate:modelValue":L[0]||(L[0]=F=>ua(y)?y.value=F:null),"data-component-id":"AssetBrowserModal-LeftSidePanel","nav-items":b(k)},{"header-icon":W(()=>L[2]||(L[2]=[v("div",{class:"icon-[lucide--folder] size-4"},null,-1)])),"header-title":W(()=>[v("span",b0,$(D.value),1)]),_:1},8,["modelValue","nav-items"])]),key:"0"}:void 0]),1032,["content-title"]))}}),Ou=C0,Nu={headless:!0,modal:!0,closable:!0,pt:{root:{class:"rounded-2xl overflow-hidden asset-browser-dialog"},header:{class:"!p-0 hidden"},content:{class:"!p-0 !m-0 h-full w-full"}}};const x0=n(()=>{const e=Ct(),t="global-asset-browser";async function a(s){const r=n(i=>{s.onAssetSelected?.(i),e.closeDialog({key:t})},"handleAssetSelected");e.showDialog({key:t,component:Ou,props:{nodeType:s.nodeType,inputName:s.inputName,currentValue:s.currentValue,onSelect:r,onClose:n(()=>e.closeDialog({key:t}),"onClose")},dialogComponentProps:Nu})}n(a,"show");async function o(s){const r=n(i=>{s.onAssetSelected?.(i),e.closeDialog({key:t})},"handleAssetSelected");e.showDialog({key:t,component:Ou,props:{showLeftPanel:!0,assetType:s.assetType,title:s.title,onSelect:r,onClose:n(()=>e.closeDialog({key:t}),"onClose")},dialogComponentProps:Nu})}return n(o,"browse"),{show:a,browse:o}},"useAssetBrowserDialog");var I0=5,S0=4096;async function E0(){if(qe){const e=await Pa().getAuthHeader();return{...e&&{headers:e}}}return{}}n(E0,"getAuthHeaders");var Ka=new Map,T0=n(e=>{const{route:t,query_params:a={},refresh:o=0}=e,s=Object.entries(a).sort(([r],[i])=>r.localeCompare(i)).map(([r,i])=>`${r}=${i}`).join("&");return[t,`r=${o}`,s].join(";")},"createCacheKey"),A0=n(e=>Math.min(1e3*Math.pow(2,e),512),"getBackoff"),$u=n(e=>e?.data&&e?.timestamp&&e.timestamp>0,"isInitialized"),M0=n((e,t)=>e?.timestamp&&Date.now()-e.timestamp>=t,"isStale"),P0=n(e=>e?.fetchPromise!==void 0,"isFetching"),D0=n(e=>e?.failed===!0,"isFailed"),L0=n(e=>e?.error&&e?.lastErrorTime&&Date.now()-e.lastErrorTime<A0(e.retryCount||0),"isBackingOff"),O0=n(async(e,t)=>{const{route:a,response_key:o,query_params:s,timeout:r=S0}=e,i=await E0(),l=await So.get(a,{params:s,signal:t.signal,timeout:r,...i});return o?l.data[o]:l.data},"fetchData");function N0(e){const{remoteConfig:t,defaultValue:a,node:o,widget:s}=e,{refresh:r=0,max_retries:i=I0}=t,l=r<=0,u=T0(t);let c=!1,d=!1;const p=n((D,T)=>{D.retryCount=0,D.lastErrorTime=0,D.error=null,D.timestamp=Date.now(),D.data=T??a},"setSuccess"),f=n((D,T)=>{D.retryCount=(D.retryCount||0)+1,D.lastErrorTime=Date.now(),D.error=T instanceof Error?T:new Error(String(T)),D.data??=a,D.fetchPromise=void 0,D.retryCount>=i&&g(D)},"setError"),g=n(D=>{Ka.set(u,{data:D.data??a,failed:!0})},"setFailed"),m=n(()=>!c&&$u(Ka.get(u)),"isFirstLoad"),h=n(D=>{c=!0,s.value=D[0],s.callback?.(s.value),o.graph?.setDirtyCanvas(!0)},"onFirstLoad"),y=n(async()=>{const D=Ka.get(u);if(D0(D)||$u(D)&&(l||!M0(D,r))||L0(D)||P0(D))return D.data;const T=D||{data:a};Ka.set(u,T);try{return T.controller=new AbortController,T.fetchPromise=O0(t,T.controller),p(T,await T.fetchPromise),T.data}catch(N){return f(T,N),T.data}finally{T.fetchPromise=void 0,T.controller=void 0}},"fetchValue"),k=n(()=>{if(t.control_after_refresh){const D=_();if(!Array.isArray(D))return;switch(t.control_after_refresh){case"first":s.value=D[0]??a;break;case"last":s.value=D.at(-1)??a;break}s.callback?.(s.value),o.graph?.setDirtyCanvas(!0)}},"onRefresh"),S=n(()=>{const D=Ka.get(u);D&&(D.fetchPromise&&D.controller?.abort(),Ka.delete(u))},"clearCachedValue");function _(){return Ka.get(u)?.data}n(_,"getCachedValue");function I(D){return y().then(T=>{m()&&h(T),d&&T!==a&&(k(),d=!1),D?.()}).catch(T=>{console.error(T)}),_()??a}n(I,"getValue"),s.refresh=function(){d=!0,S(),I()};function w(){o.addWidget("button","refresh","refresh",s.refresh)}n(w,"addRefreshButton");function x(){let D=!1;const T=n(()=>{D&&s.refresh&&s.refresh()},"handleExecutionSuccess"),N=o.addWidget("toggle","Auto-refresh after generation",!1,M=>{D=M},{serialize:!1});return oe.addEventListener("execution_success",T),o.onRemoved=Fa(o.onRemoved,function(){oe.removeEventListener("execution_success",T)}),N}return n(x,"addAutoRefreshToggle"),x(),{getCachedValue:_,getValue:I,refreshValue:s.refresh,addRefreshButton:w,getCacheEntry:n(()=>Ka.get(u),"getCacheEntry"),cacheKey:u}}n(N0,"useRemoteWidget");var $0=n(e=>{if(e.default)return e.default;if(e.options?.length)return e.options[0];if(e.remote)return"Loading..."},"getDefaultValue"),Dp={LoadImage:"image",LoadVideo:"video",LoadAudio:"audio"},R0={LoadImage:"widgets.uploadSelect.placeholderImage",LoadVideo:"widgets.uploadSelect.placeholderVideo",LoadAudio:"widgets.uploadSelect.placeholderAudio"},B0=n((e,t)=>{const a=A([]),o=new lr({node:e,name:t.name,component:Kw,inputSpec:t,options:{getValue:n(()=>a.value,"getValue"),setValue:n(s=>{a.value=s},"setValue")}});return ur(e,o),t.control_after_generate&&(o.linkedWidgets=Hn(e,o,"fixed",void 0,Co(t))),o},"addMultiSelectWidget"),F0=n((e,t,a)=>{const o=a??G("widgets.selectModel"),s=x0();async function r(l){if(!Eh(l))throw new Error(`Expected asset widget but received ${l.type}`);await s.show({nodeType:e.comfyClass||"",inputName:t.name,currentValue:l.value,onAssetSelected:n(u=>{const c=gl.safeParse(u);if(!c.success){console.error("Invalid asset item:",c.error.errors,"Received:",u);return}const d=c.data.user_metadata?.filename,p=k_.safeParse(d);if(!p.success){console.error("Invalid asset filename:",p.error.errors,"for asset:",c.data.id);return}const f=l.value;l.value=p.data,e.onWidgetChanged?.(l.name,p.data,f,l)},"onAssetSelected")})}n(r,"openModal");const i={openModal:r};return e.addWidget("asset",t.name,o,()=>{},i)},"createAssetBrowserWidget"),U0=n((e,t,a)=>{const o=ao(),s=e.addWidget("combo",t.name,a??"",()=>{},{values:[],getOptionLabel:n(i=>i?o.getInputName(i):G(R0[e.comfyClass??""]??"widgets.uploadSelect.placeholder"),"getOptionLabel")});o.inputAssets.length===0&&!o.inputLoading&&o.updateInputs().then(()=>{e.setDirtyCanvas(!0,!1)});const r=s.options;if(s.options=new Proxy(r,{get(i,l){return l!=="values"?i[l]:o.inputAssets.filter(u=>Ta(u.name)===Dp[e.comfyClass??""]).map(u=>u.asset_hash).filter(u=>!!u)}}),t.control_after_generate){if(!Bs(s))throw new Error(`Expected combo widget but received ${s.type}`);s.linkedWidgets=Hn(e,s,void 0,void 0,Co(t))}return s},"createInputMappingWidget"),W0=n((e,t)=>{const a=$0(t);if(qe){const s=Me().get("Comfy.Assets.UseAssetAPI"),r=Zt.isAssetBrowserEligible(e.comfyClass,t.name);if(s&&r)return F0(e,t,a);if(Dp[e.comfyClass??""])return U0(e,t,a)}const o=e.addWidget("combo",t.name,a,()=>{},{values:t.options??[]});if(t.remote){if(!Bs(o))throw new Error(`Expected combo widget but received ${o.type}`);const s=N0({remoteConfig:t.remote,defaultValue:a,node:e,widget:o});t.remote.refresh_button&&s.addRefreshButton();const r=o.options;o.options=new Proxy(r,{get(i,l){return l!=="values"?i[l]:s.getValue()}})}if(t.control_after_generate){if(!Bs(o))throw new Error(`Expected combo widget but received ${o.type}`);o.linkedWidgets=Hn(e,o,void 0,void 0,Co(t))}return o},"addComboWidget");const z0=n(()=>n((t,a)=>{if(!Fw(a))throw new Error(`Invalid input data: ${a}`);return a.multi_select?B0(t,a):W0(t,a)},"widgetConstructor"),"useComboWidget");function V0(e){const t=this.options.round;if(t){const a=this.options.precision??Math.max(0,-Math.floor(Math.log10(t))),o=Math.round(e/t)*t;this.value=ri(Number(o.toFixed(a)),this.options.min??-1/0,this.options.max??1/0)}else this.value=e}n(V0,"onFloatValueChange");const Lp=n(()=>n((t,a)=>{if(!$w(a))throw new Error(`Invalid input data: ${a}`);const o=Me(),s=!o.get("Comfy.DisableSliders"),r=a.display,i=s&&r=="slider"?"slider":r=="knob"?"knob":"number",l=a.step??.5,u=o.get("Comfy.FloatRoundingPrecision")||Math.max(0,-Math.floor(Math.log10(l))),c=!o.get("Comfy.DisableFloatRounding"),d=a.default??0,p=t.addWidget(i,a.name,d,V0,{min:a.min??0,max:a.max??2048,round:c&&u&&!a.round?Math.pow(10,-u):a.round,step:l*10,step2:l,precision:u});return a.control_after_generate&&(p.linkedWidgets=[bl(t,p,"fixed",void 0,void 0,Co(a))]),p},"widgetConstructor"),"useFloatWidget"),G0=n(()=>(e,t)=>{const{name:a,options:o={}}=t;return e.addWidget("galleria",a,o.images||[],()=>{},{serialize:!0,...o})},"useGalleriaWidget"),H0=n(()=>(e,t)=>{const{name:a,options:o={}}=t;return e.addWidget("imagecompare",a,["",""],()=>{},{serialize:!0,...o})},"useImageCompareWidget");function j0(e){return"button"in e&&e.button===1?!0:"buttons"in e&&typeof e.buttons=="number"?e.buttons===4:!1}n(j0,"isMiddlePointerInput");function vl(){const e=Me(),t=gt(),{getCanvas:a}=t,o=E(()=>e.get("Comfy.Canvas.NavigationMode")==="standard"),s=E(()=>!(t.canvas?.read_only??!1)),r=n(u=>{if(!u.target?.closest('[data-capture-wheel="true"]')){if(o.value&&(u.ctrlKey||u.metaKey)){l(u);return}if(!o.value){l(u);return}}},"handleWheel"),i=n(u=>{if(j0(u)){l(u);return}const c=a();if(!c)return;const d=c.read_only&&u.buttons===1,p=u.buttons===4;if(d||p){u.preventDefault(),u.stopPropagation(),l(u);return}},"handlePointer"),l=n(u=>{if(u.target?.closest('[data-capture-wheel="true"]'))return;const c=Z.canvas?.canvas;if(!c)return;if(u.preventDefault(),u.stopPropagation(),u instanceof WheelEvent){const{clientX:f,clientY:g,deltaX:m,deltaY:h,ctrlKey:y,metaKey:k,shiftKey:S}=u;c.dispatchEvent(new WheelEvent("wheel",{clientX:f,clientY:g,deltaX:m,deltaY:h,ctrlKey:y,metaKey:k,shiftKey:S}));return}const d=u.constructor,p=new d(u.type,u);c.dispatchEvent(p)},"forwardEventToCanvas");return{handleWheel:r,handlePointer:i,forwardEventToCanvas:l,shouldHandleNodePointerEvents:s}}n(vl,"useCanvasInteractions");const K0=n(e=>{if(!e.length||e.length===1)return!0;const t=e[0].naturalWidth/e[0].naturalHeight;for(let a=1;a<e.length;a++)if(t!=e[a].naturalWidth/e[a].naturalHeight)return!1;return!0},"is_all_same_aspect_ratio"),Y0=n((e,t,a,o=64)=>{const s=e/t;if(!s||isNaN(s))return{minHeight:0,minWidth:0};const r=a;return{minHeight:Math.max(r/s,o),minWidth:r}},"fitDimensionsToNodeWidth");var Ru="video-preview",q0={playsInline:!0,controls:!0,loop:!0},X0=8192,Z0=1,Nr=256,J0=n(()=>{const e=document.createElement("div");return e.classList.add("comfy-img-preview"),e},"createContainer"),Q0=n(e=>new Promise(t=>setTimeout(()=>t(null),e)),"createTimeout"),Op=n((e,t)=>{const{loadElement:a,onLoaded:o,onFailedLoading:s}=t,r=Gt(),i=n(async(c,d=0)=>{const p=await Promise.race([a(c),Q0(X0)]);return p===null&&d<Z0?i(c,d+1):p},"loadElementWithTimeout"),l=n(async c=>Promise.all(c.map(d=>i(d))),"loadElements");function u(c={}){if(e.isLoading)return;const d=r.getNodeImageUrls(e);d?.length&&(c?.block&&(e.isLoading=!0),l(d).then(p=>{const f=p.filter(g=>g!==null);f.length&&(o?.(f),e.graph?.setDirtyCanvas(!0))}).catch(()=>{s?.()}).finally(()=>{e.isLoading=!1}))}return n(u,"showPreview"),{showPreview:u}},"useNodePreview");const Np=n((e,t)=>(e.previewMediaType="image",Op(e,{loadElement:n(s=>new Promise(r=>{const i=new Image;i.onload=()=>r(i),i.onerror=()=>r(null),i.src=s}),"loadElement"),onLoaded:n(s=>{e.imageIndex=null,e.imgs=s,t?.()},"onLoaded"),onFailedLoading:n(()=>{e.imgs=void 0},"onFailedLoading")})),"useNodeImage"),$p=n((e,t)=>{e.previewMediaType="video";let a=Nr,o=Nr;const{handleWheel:s,handlePointer:r}=vl(),i=n(d=>{const{minHeight:p,minWidth:f}=Y0(d.videoWidth,d.videoHeight,e.size?.[0]||Nr);o=f,a=p},"setMinDimensions"),l=n(d=>new Promise(p=>{const f=document.createElement("video");Object.assign(f,q0),f.addEventListener("wheel",s),f.addEventListener("pointermove",r),f.addEventListener("pointerdown",r),f.onloadeddata=()=>{i(f),p(f)},f.onerror=()=>p(null),f.src=d}),"loadElement"),u=n(d=>{if(!e.widgets?.some(p=>p.name===Ru)){const p=e.addDOMWidget(Ru,"video",d,{canvasOnly:!0,hideOnZoom:!1});p.serialize=!1,p.computeLayoutSize=()=>({minHeight:a,minWidth:o})}},"addVideoDomWidget");return Op(e,{loadElement:l,onLoaded:n(d=>{const p=d[0];p&&(e.videoContainer||(e.videoContainer=J0(),u(e.videoContainer)),e.videoContainer.replaceChildren(p),t?.())},"onLoaded"),onFailedLoading:n(()=>{e.videoContainer=void 0},"onFailedLoading")})},"useNodeVideo"),eC=n((e,t)=>{const{onDragOver:a,onDrop:o,fileFilter:s=n(()=>!0,"fileFilter")}=t,r=n(d=>!!Array.from(d).find(p=>p.kind==="file"),"hasFiles"),i=n(d=>Array.from(d).filter(s),"filterFiles"),l=n(d=>i(d).length>0,"hasValidFiles"),u=n(d=>d?.dataTransfer?.items?a?.(d)??r(d.dataTransfer.items):!1,"isDraggingFiles"),c=n(d=>d?.dataTransfer?.files?l(d.dataTransfer.files):!1,"isDraggingValidFiles");e.onDragOver=u,e.onDragDrop=function(d){return c(d)?(o(i(d.dataTransfer.files)),!0):!1}},"useNodeDragAndDrop");function tC(e,t){const{accept:a,allow_batch:o=!1,fileFilter:s=n(()=>!0,"fileFilter"),onSelect:r}=t;let i=document.createElement("input");return i.type="file",i.accept=a??"*",i.multiple=o,i.onchange=()=>{if(i?.files?.length){const l=Array.from(i.files).filter(s);l.length&&r(l)}},e.onRemoved=Fa(e.onRemoved,()=>{i&&(i.onchange=null,i=null)}),{openFileSelection:n(()=>i?.click(),"openFileSelection")}}n(tC,"useNodeFileInput");const aC=n((e,t)=>{const{onPaste:a,fileFilter:o=n(()=>!0,"fileFilter"),allow_batch:s=!1}=t;e.pasteFiles=function(r){const i=Array.from(r).filter(o);return i.length?(a(s?i:i.slice(0,1)),!0):!1}},"useNodePaste");var oC=2e3,nC=n(async(e,t,a={})=>{const o=new FormData;o.append("image",e),t&&o.append("subfolder","pasted"),a.type&&o.append("type",a.type);const s=await oe.fetchApi("/upload/image",{method:"POST",body:o});if(s.status!==200){Oe().addAlert(s.status+" - "+s.statusText);return}const r=await s.json();return(a.type==="input"||!a.type&&!t)&&await ao().updateInputs(),r.subfolder?`${r.subfolder}/${r.name}`:r.name},"uploadFile");const sC=n((e,t)=>{const{fileFilter:a,onUploadComplete:o,allow_batch:s,accept:r}=t,i=n(d=>d.name==="image.png"&&d.lastModified-Date.now()<oC,"isPastedFile"),l=n(async d=>{try{const p=await nC(d,i(d),{type:t.folder});return p||void 0}catch(p){Oe().addAlert(String(p))}},"handleUpload"),u=n(async d=>{const p=(await Promise.all(d.map(l))).filter(f=>!!f);return p.length&&o(p),p},"handleUploadBatch");eC(e,{fileFilter:a,onDrop:u}),aC(e,{fileFilter:a,allow_batch:s,onPaste:u});const{openFileSelection:c}=tC(e,{fileFilter:a,allow_batch:s,accept:r,onSelect:u});return{openFileSelection:c,handleUpload:l}},"useNodeImageUpload");function rC(e,t){let a=t,o=e(t),s=!1;return{get:n(()=>(s&&(o=e(a)),o),"get"),set:n(r=>{s=!0,a=r},"set")}}n(rC,"useValueTransform");function iC(e){const t=e[1];return t!==void 0&&typeof t=="object"&&"imageInputName"in t&&typeof t.imageInputName=="string"}n(iC,"isImageUploadInput");var lC=n(e=>/\[(input|output|temp)\]/i.test(e),"hasAnnotation"),Bu=n((e,t="input")=>!lC(e)&&t!=="input"?` [${t}]`:"","createAnnotation"),Fu=n((e,t="")=>t?`${t}/${e}`:e,"createPath");function js(e,t={}){const{rootFolder:a="input",subfolder:o}=t;return typeof e=="string"?`${Fu(e,o)}${Bu(e,a)}`:`${Fu(e.filename??"",e.subfolder)}${e.type?Bu(e.type,a):""}`}n(js,"createAnnotatedPath");function yl(e){return e?e.previewMediaType==="image"||e.previewMediaType!=="video"&&!!e.imgs?.length:!1}n(yl,"isImageNode");function wl(e){return e?e.previewMediaType==="video"||!!e.videoContainer:!1}n(wl,"isVideoNode");function uC(e){return!!e&&e.previewMediaType==="audio"}n(uC,"isAudioNode");function cC(e,t){e.options||(e.options={values:[]}),e.options.values||(e.options.values=[]),e.options.values.includes(t)||e.options.values.push(t)}n(cC,"addToComboValues");const Rp=n(e=>e instanceof Jo,"isLGraphNode"),dC=n(e=>e instanceof Th,"isLGraphGroup"),pC=n(e=>e instanceof Md,"isReroute"),V8=n(e=>{const t=Be.filter(e,nh);if(Be.isEmpty(t))return null;const a=Be.map(t,o=>o.getColorOption());return Be.every(a,o=>Be.isEqual(o,Be.head(a)))?Be.head(a):null},"getItemsColorOption");function fC(e,t){for(const a of e)for(const o of a.widgets??[])o[t]?.()}n(fC,"executeWidgetsCallback");function Uu(e,t,a){const o=new Set(t.map(r=>r.name)),s=Object.values(e).filter(r=>o.has(r.name)||r.forceInput);return Be.sum(s.map(r=>r.control_after_generate||["seed","noise_seed"].includes(r.name)?2:1))===a?.length?Be.zip(s,a).filter(([r])=>!r?.forceInput).map(([r,i])=>i):a}n(Uu,"migrateWidgetsValues");function Bp(e){for(const t of e.nodes){for(const[a,o]of t.inputs.entries()){const s=o.link;if(!s)continue;const r=e.links.get(s);r&&(r.target_slot=a)}t.isSubgraphNode?.()&&t.subgraph&&Bp(t.subgraph)}}n(Bp,"fixLinkInputSlots");function mC(e){for(const t of e.nodes){t.inputs=t.inputs?.filter(Fp);for(const[a,o]of t.inputs?.entries()??[])if(o.link){const s=e.links.find(r=>r[0]===o.link);s&&(s[4]=a)}}Up(e.definitions?.subgraphs)}n(mC,"compressWidgetInputSlots");function Fp(e){return!(e.widget&&e.link===null&&!e.label)}n(Fp,"matchesLegacyApi");function Up(e,t=new WeakSet){if(e)for(const a of e){if(t.has(a))throw new Error("Infinite loop detected");if(t.add(a),a.nodes){for(const o of a.nodes)if(o.inputs=o.inputs?.filter(Fp),!!a.links){for(const[s,r]of o.inputs?.entries()??[])if(r.link){const i=a.links.find(l=>l.id===r.link);i&&(i.target_slot=s)}}}Up(a.definitions?.subgraphs,t)}}n(Up,"compressSubgraphWidgetInputSlots");function G8(e){return e&&e.type&&(e.type==="Load3D"||e.type==="Load3DAnimation")}n(G8,"isLoad3dNode");var gC="image/png,image/jpeg,image/webp",hC="video/webm,video/mp4",vC=n(e=>e.type.startsWith("image/"),"isImageFile"),yC=n(e=>e.type.startsWith("video/"),"isVideoFile"),wC=n((e,t)=>e.widgets.find(a=>a.name===t),"findFileComboWidget");const bC=n(()=>n((t,a,o)=>{if(!iC(o))throw new Error("Image upload widget requires imageInputName augmentation");const s=o[1],{imageInputName:r,allow_batch:i,image_folder:l="input"}=s,u=l,c=Gt(),d=!!s.animated_image_upload,p=!!s.video_upload,f=p?hC:gC,{showPreview:g}=p?$p(t):Np(t),m=p?yC:vC,h=wC(t,r),y=`${h.value}`,k=n(w=>js(w,{rootFolder:l}),"formatPath");Object.defineProperty(h,"value",rC(n(w=>w?Array.isArray(w)?i?w.map(k):k(w[0]):k(w):y,"transform"),y));const{openFileSelection:_}=sC(t,{allow_batch:i,fileFilter:m,accept:f,folder:u,onUploadComplete:n(w=>{w.forEach(D=>cC(h,D));const x=i?[...w]:w[0];h.value=x,h.callback?.(x)},"onUploadComplete")}),I=t.addWidget("button",a,"image",()=>_(),{serialize:!1,canvasOnly:!0});return I.label=G("g.choose_file_to_upload"),h.callback=function(){c.setNodeOutputs(t,h.value,{isAnimated:d}),t.graph?.setDirtyCanvas(!0)},requestAnimationFrame(()=>{c.setNodeOutputs(t,h.value,{isAnimated:d}),g({block:!1})}),{widget:I}},"widgetConstructor"),"useImageUploadWidget");function _C(e){const t=this.options.step2||1;if(t===1)this.value=Math.round(e);else{const a=(this.options.min??0)%t;this.value=Math.round((e-a)/t)*t+a}}n(_C,"onValueChange");const kC=n(()=>n((t,a)=>{if(!Nw(a))throw new Error(`Invalid input data: ${a}`);const o=!Me().get("Comfy.DisableSliders"),s=a.display,r=o&&s=="slider"?"slider":s=="knob"?"knob":"number",i=a.step??1,l=a.default??0,u=t.addWidget(r,a.name,l,_C,{min:a.min??0,max:a.max??2048,step:i*10,step2:i,precision:0});return(a.control_after_generate??["seed","noise_seed"].includes(a.name))&&(u.linkedWidgets=[bl(t,u,"randomize",void 0,void 0,Co(a))]),u},"widgetConstructor"),"useIntWidget");function CC(e,t,a){tu.configure({html:!1,breaks:!0,transformPastedText:!0});const o=new Wh({extensions:[Vh,tu,jh,Gh,Uh,zh,Hh],content:a.defaultVal,editable:!1}),s=o.options.element;s.classList.add("comfy-markdown");const r=document.createElement("textarea");s.append(r);const i=e.addDOMWidget(t,"MARKDOWN",s,{getValue(){return r.value},setValue(l){r.value=l,o.commands.setContent(l)}});return i.inputEl=s,i.options.minNodeSize=[400,200],s.addEventListener("dblclick",()=>{s.classList.add("editing"),setTimeout(()=>{r.focus()},0)}),r.addEventListener("blur",()=>{s.classList.remove("editing")}),r.addEventListener("change",()=>{o.commands.setContent(r.value),i.callback?.(i.value)}),s.addEventListener("keydown",l=>{l.stopPropagation()}),s.addEventListener("pointerdown",l=>{l.button===1&&Z.canvas.processMouseDown(l)}),s.addEventListener("pointermove",l=>{(l.buttons&4)===4&&Z.canvas.processMouseMove(l)}),s.addEventListener("pointerup",l=>{l.button===1&&Z.canvas.processMouseUp(l)}),i}n(CC,"addMarkdownWidget");const xC=n(()=>n((t,a)=>CC(t,a.name,{defaultVal:a.default??""}),"widgetConstructor"),"useMarkdownWidget");var IC=50;function SC(e,t,a){const o=document.createElement("textarea");o.className="comfy-multiline-input",o.value=a.defaultVal,o.placeholder=a.placeholder||t,o.spellcheck=Me().get("Comfy.TextareaWidget.Spellcheck");const s=e.addDOMWidget(t,"customtext",o,{getValue(){return o.value},setValue(r){o.value=r}});return s.inputEl=o,s.options.minNodeSize=[400,200],o.addEventListener("input",()=>{s.callback?.(s.value)}),o.addEventListener("pointerdown",r=>{r.button===1&&Z.canvas.processMouseDown(r)}),o.addEventListener("pointermove",r=>{(r.buttons&4)===4&&Z.canvas.processMouseMove(r)}),o.addEventListener("pointerup",r=>{r.button===1&&Z.canvas.processMouseUp(r)}),o.addEventListener("wheel",r=>{const i=Me().get("LiteGraph.Pointer.TrackpadGestures"),l=r.deltaX,u=r.deltaY,c=o.scrollHeight>o.clientHeight,d=Math.abs(l)>Math.abs(u);if(r.ctrlKey){r.preventDefault(),r.stopPropagation(),Z.canvas.processMouseWheel(r);return}if(i&&(Math.abs(l)>0||Math.abs(u)<IC)){r.preventDefault(),r.stopPropagation(),Z.canvas.processMouseWheel(r);return}if(d){r.preventDefault(),r.stopPropagation(),Z.canvas.processMouseWheel(r);return}if(c){r.stopPropagation();return}r.preventDefault(),Z.canvas.processMouseWheel(r)}),s}n(SC,"addMultilineWidget");const Wp=n(()=>n((t,a)=>{if(!Bw(a))throw new Error(`Invalid input data: ${a}`);const o=a.default??"",s=a.multiline?SC(t,a.name,{defaultVal:o,placeholder:a.placeholder}):t.addWidget("text",a.name,o,()=>{},{});return typeof a.dynamicPrompts=="boolean"&&(s.dynamicPrompts=a.dynamicPrompts),s},"widgetConstructor"),"useStringWidget"),EC=n(()=>(e,t)=>{const{name:a,options:o={}}=t;return e.addWidget("textarea",a,o.default||"",()=>{},{serialize:!0,rows:o.rows||5,cols:o.cols||50,...o})},"useTextareaWidget");var Wu=Wp(),TC=Lp(),AC=_p();function MC(e,t){let a;if(typeof t=="string")a=Wu(e,{type:"STRING",name:"UNKNOWN",multiline:t.length>20});else if(typeof t=="number")a=TC(e,{type:"FLOAT",name:"UNKNOWN"});else if(typeof t=="boolean")a=AC(e,{type:"BOOLEAN",name:"UNKNOWN"});else{a=Wu(e,{type:"STRING",name:"UNKNOWN",multiline:!0}),a.value=JSON.stringify(t);return}a.value=t}n(MC,"addWidgetFromValue");Jo.prototype.onConfigure=Fa(Jo.prototype.onConfigure,function(e){if(!(!this.has_errors||!e.widgets_values)){for(let t=0;t<e.widgets_values.length;t++){const a=e.widgets_values[t];MC(this,a)}this.serialize_widgets=!0}});var aa=n(e=>(t,a,o)=>{const s=e(t,ko(o,{name:a}));return{widget:s,minWidth:s.options.minNodeSize?.[0],minHeight:s.options.minNodeSize?.[1]}},"transformWidgetConstructorV2ToV1");function hi(){return Me().get("Comfy.WidgetControlMode")==="before"}n(hi,"controlValueRunBefore");function vi(e){hi()?e.label=G("g.control_before_generate"):e.label=G("g.control_after_generate")}n(vi,"updateControlWidgetLabel");const zp=Symbol();var zu=Symbol();function bl(e,t,a,o,s,r){let i=r?.[1]?.control_after_generate;return typeof i!="string"&&(i=s),Hn(e,t,a??"randomize",{addFilterList:!1,controlAfterGenerateName:i},r)[0]}n(bl,"addValueControlWidget");function Hn(e,t,a,o,s){a||(a="randomize"),o||(o={});const r=n((p,f)=>{let g=p;return o[f]?g=o[f]:typeof s?.[1]?.[p]=="string"?g=s?.[1]?.[p]:s?.[1]?.control_prefix&&(g=s?.[1]?.control_prefix+" "+g),g},"getName"),i=e.addWidget("combo",r("control_after_generate","controlAfterGenerateName"),a,function(){},{values:["fixed","increment","decrement","randomize"],serialize:!1,canvasOnly:!0});i.tooltip="Allows the linked widget to be changed automatically, for example randomizing the noise seed.",i[zp]=!0,vi(i),Object.defineProperty(i,"disabled",{get:n(()=>t.computedDisabled,"get")});const l=[i],u=Bs(t);let c;u&&i.options.values&&i.options.values.push("increment-wrap"),u&&o.addFilterList!==!1&&(c=e.addWidget("string",r("control_filter_list","controlFilterListName"),"",function(){},{serialize:!1}),vi(c),c.tooltip="Allows for filtering the list of values when changing the value via the control generate mode. Allows for RegEx matches in the format /abc/ to only filter to values containing 'abc'.",Object.defineProperty(c,"disabled",{get:n(()=>t.computedDisabled,"get")}),l.push(c));const d=n(()=>{var p=i.value;if(u&&p!=="fixed"){let f=t.options.values??[];const g=c?.value;if(g){let y;if(g.startsWith("/")&&g.endsWith("/"))try{const k=new RegExp(g.substring(1,g.length-1));y=n(S=>k.test(S),"check")}catch(k){console.error("Error constructing RegExp filter for node "+e.id,g,k)}if(!y){const k=g.toLocaleLowerCase();y=n(S=>S.toLocaleLowerCase().includes(k),"check")}f=f.filter(k=>y(k)),!f.length&&t.options.values?.length&&console.warn("Filter for node "+e.id+" has filtered out all items",g)}let m=f.indexOf(t.value),h=f.length;switch(p){case"increment":m+=1;break;case"increment-wrap":m+=1,m>=h&&(m=0);break;case"decrement":m-=1;break;case"randomize":m=Math.floor(Math.random()*h);break;default:break}if(m=Math.max(0,m),m=Math.min(h-1,m),m>=0){let y=f[m];t.value=y,t.callback?.(y)}}else{let{min:f=0,max:g=1,step2:m=1}=t.options;g=Math.min(0x4000000000000,g),f=Math.max(-0x4000000000000,f);let h=(g-f)/m;switch(p){case"fixed":break;case"increment":t.value+=m;break;case"decrement":t.value-=m;break;case"randomize":t.value=Math.floor(Math.random()*h)*m+f;break;default:break}t.value<f&&(t.value=f),t.value>g&&(t.value=g),t.callback?.(t.value)}},"applyWidgetControl");return i.beforeQueued=()=>{hi()&&i[zu]&&d(),i[zu]=!0},i.afterQueued=()=>{hi()||d()},l}n(Hn,"addValueControlWidgets");const _l={INT:aa(kC()),FLOAT:aa(Lp()),BOOLEAN:aa(_p()),STRING:aa(Wp()),MARKDOWN:aa(xC()),COMBO:aa(z0()),IMAGEUPLOAD:bC(),COLOR:aa(Hw()),IMAGECOMPARE:aa(H0()),BOUNDINGBOX:aa(Vw()),CHART:aa(Gw()),GALLERIA:aa(G0()),TEXTAREA:aa(EC()),...lw};function PC(e){return _l[e]!==void 0}n(PC,"isValidWidgetType");window.comfyAPI=window.comfyAPI||{};window.comfyAPI.widgets=window.comfyAPI.widgets||{};window.comfyAPI.widgets.updateControlWidgetLabel=vi;window.comfyAPI.widgets.IS_CONTROL_WIDGET=zp;window.comfyAPI.widgets.addValueControlWidget=bl;window.comfyAPI.widgets.addValueControlWidgets=Hn;window.comfyAPI.widgets.ComfyWidgets=_l;window.comfyAPI.widgets.isValidWidgetType=PC;const jn=Je("widget",()=>{const e=_l,t=A(new Map),a=E(()=>new Map([...t.value,...Object.entries(e)]));function o(r){const i=Array.isArray(r)?yy(r):r.type;return a.value.has(i)}n(o,"inputIsWidget");function s(r){for(const[i,l]of Object.entries(r))t.value.set(i,l)}return n(s,"registerCustomWidgets"),{widgets:a,inputIsWidget:o,registerCustomWidgets:s}});function Vp(e,t){return{subcategories:E(()=>{const a={};for(const o of e.value){let s=t.defaultSubcategory;for(const r of t.rules)if(typeof r.pattern=="string"?o.id.includes(r.pattern):r.pattern.test(o.id)){s=r.subcategory;break}a[s]||(a[s]=[]),a[s].push(o)}return a})}}n(Vp,"useCommandSubcategories");const DC={defaultSubcategory:"view",rules:[{pattern:"Zoom",subcategory:"view"},{pattern:"Fit",subcategory:"view"},{pattern:"Panel",subcategory:"panel-controls"},{pattern:"Sidebar",subcategory:"panel-controls"}]},LC={defaultSubcategory:"workflow",rules:[{pattern:"Workflow",subcategory:"workflow"},{pattern:"Node",subcategory:"node"},{pattern:"Queue",subcategory:"queue"}]};var OC={class:"shortcuts-list flex justify-center"},NC={class:"grid h-full w-[90%] grid-cols-1 gap-4 md:grid-cols-3 md:gap-24"},$C={class:"subcategory-title mb-4 text-xs font-bold tracking-wide text-text-secondary uppercase"},RC={class:"flex flex-col gap-1"},BC={class:"shortcut-info grow pr-4"},FC={class:"shortcut-name text-sm font-medium"},UC={class:"keybinding-display shrink-0"},WC=["aria-label"],zC=J({__name:"ShortcutsList",props:{subcategories:{}},setup(e){const{t}=Fe(),a=E(()=>{const r={};for(const[i,l]of Object.entries(e.subcategories))r[i]=l.filter(u=>!!u.keybinding);return r}),o=n(r=>({workflow:t("shortcuts.subcategories.workflow"),node:t("shortcuts.subcategories.node"),queue:t("shortcuts.subcategories.queue"),view:t("shortcuts.subcategories.view"),"panel-controls":t("shortcuts.subcategories.panelControls")})[r]||r,"getSubcategoryTitle"),s=n(r=>({Control:"Ctrl",Meta:"Cmd",ArrowUp:"↑",ArrowDown:"↓",ArrowLeft:"←",ArrowRight:"→",Backspace:"⌫",Delete:"⌦",Enter:"↵",Escape:"Esc",Tab:"⇥"," ":"Space"})[r]||r,"formatKey");return(r,i)=>(C(),P("div",OC,[v("div",NC,[(C(!0),P(Se,null,Ze(a.value,(l,u)=>(C(),P("div",{key:u,class:"flex flex-col"},[v("h3",$C,$(o(u)),1),v("div",RC,[(C(!0),P(Se,null,Ze(l,c=>(C(),P("div",{key:c.id,class:"shortcut-item flex items-center justify-between rounded py-2 transition-colors duration-200"},[v("div",BC,[v("div",FC,$(b(t)(`commands.${b(dt)(c.id)}.label`)),1)]),v("div",UC,[v("div",{class:"keybinding-combo flex gap-1","aria-label":`Keyboard shortcut: ${c.keybinding.combo.getKeySequences().join(" + ")}`},[(C(!0),P(Se,null,Ze(c.keybinding.combo.getKeySequences(),d=>(C(),P("span",{key:d,class:"key-badge min-w-6 rounded bg-muted-background px-2 py-1 text-center font-mono text-xs"},$(s(d)),1))),128))],8,WC)])]))),128))])]))),128))])]))}}),Gp=zC,VC={class:"flex h-full flex-col p-4"},GC={class:"min-h-0 flex-1 overflow-auto"},HC=J({__name:"EssentialsPanel",setup(e){const t=Pt(),a=E(()=>t.commands.filter(s=>s.category==="essentials")),{subcategories:o}=Vp(a,LC);return(s,r)=>(C(),P("div",VC,[v("div",GC,[R(Gp,{commands:a.value,subcategories:b(o)},null,8,["commands","subcategories"])])]))}}),jC=HC,KC={class:"flex h-full flex-col p-4"},YC={class:"min-h-0 flex-1 overflow-auto"},qC=J({__name:"ViewControlsPanel",setup(e){const t=Pt(),a=E(()=>t.commands.filter(s=>s.category==="view-controls")),{subcategories:o}=Vp(a,DC);return(s,r)=>(C(),P("div",KC,[v("div",YC,[R(Gp,{commands:a.value,subcategories:b(o)},null,8,["commands","subcategories"])])]))}}),XC=qC;const ZC=n(()=>{const{t:e}=Fe();return[{id:"shortcuts-essentials",title:e("shortcuts.essentials"),titleKey:"shortcuts.essentials",component:bt(jC),type:"vue",targetPanel:"shortcuts"},{id:"shortcuts-view-controls",title:e("shortcuts.viewControls"),titleKey:"shortcuts.viewControls",component:bt(XC),type:"vue",targetPanel:"shortcuts"}]},"useShortcutsTab");var JC=Kh(),QC=Yh();function ex(e){const t=new JC.FitAddon,a=bt(new QC.Terminal({convertEol:!0,theme:dh?{background:"#171717"}:void 0}));return a.loadAddon(t),a.attachCustomKeyEventHandler(o=>!(o.type==="keydown"&&(o.ctrlKey||o.metaKey)&&(o.key==="c"&&a.hasSelection()||o.key==="v"))),it(async()=>{e.value&&a.open(e.value)}),St(()=>{a.dispose()}),{terminal:a,useAutoSize({root:o,autoRows:s=!0,autoCols:r=!0,minCols:i=Number.NEGATIVE_INFINITY,minRows:l=Number.NEGATIVE_INFINITY,onResize:u}){const c=n(g=>g==null||isNaN(g)?(o.value?.clientHeight??80)/20:g,"ensureValidRows"),d=n(g=>g==null||isNaN(g)?(o.value?.clientWidth??80)/8:g,"ensureValidCols"),p=n(()=>{const g=t.proposeDimensions();a.resize(Math.max(r?d(g?.cols):a.cols,i),Math.max(s?c(g?.rows):a.rows,l)),u?.()},"resize"),f=new ResizeObserver(tr(p,25));return it(async()=>{o.value&&(f.observe(o.value),p())}),St(()=>{f.disconnect()}),{resize:p}}}}n(ex,"useTerminal");var tx={class:"p-terminal h-full w-full rounded-none p-2"},ax=J({__name:"BaseTerminal",emits:["created","unmounted"],setup(e,{emit:t}){const{t:a}=Fe(),o=t,s=A(),r=A(),i=A(!1),l=Xi(r),u=ex(s);o("created",u,A(r));const{terminal:c}=u;let d;const p=E(()=>i.value?a("serverStart.copySelectionTooltip"):a("serverStart.copyAllTooltip")),f=n(async()=>{const m=c.getSelection(),h=!m;h&&c.selectAll();const y=h?c.getSelection():m;y&&(await navigator.clipboard.writeText(y),h&&c.clearSelection())},"handleCopy"),g=n(m=>{m.preventDefault(),Qi()?.showContextMenu({type:"text"})},"showContextMenu");return Qa()&&At(s,"contextmenu",g),it(()=>{d=c.onSelectionChange(()=>{i.value=c.hasSelection()})}),St(()=>{d?.dispose(),o("unmounted")}),(m,h)=>{const y=ht("tooltip");return C(),P("div",{ref_key:"rootEl",ref:r,class:"relative h-full w-full overflow-hidden bg-neutral-900"},[v("div",tx,[v("div",{ref_key:"terminalEl",ref:s,class:"terminal-host h-full"},null,512)]),ze((C(),X(se,{variant:"secondary",size:"sm",class:pe(b(Pe)("absolute top-2 right-8 transition-opacity",{"opacity-0 pointer-events-none select-none":!b(l)})),"aria-label":p.value,onClick:f},{default:W(()=>h[0]||(h[0]=[v("i",{class:"pi pi-copy"},null,-1)])),_:1},8,["class","aria-label"])),[[y,{value:p.value,showDelay:300},void 0,{left:!0}]])],512)}}}),Hp=ot(ax,[["__scopeId","data-v-f7040d8a"]]),ox=J({__name:"CommandTerminal",setup(e){const t=n(({terminal:a,useAutoSize:o},s)=>{const r=Qi().Terminal;let i,l;o({root:s,autoRows:!0,autoCols:!0,onResize:n(async()=>{a.element?.offsetParent&&await r.resize(a.cols,a.rows)},"onResize")}),it(async()=>{i=a.onData(async c=>{await r.write(c)}),l=r.onOutput(c=>{a.write(c)});const u=await r.restore();setTimeout(()=>{u.buffer.length&&(a.resize(u.size.cols,u.size.rows),a.write(u.buffer.join("")))},500)}),St(()=>{i?.dispose(),l?.()})},"terminalCreated");return(a,o)=>(C(),X(Hp,{onCreated:t}))}}),nx=ot(ox,[["__scopeId","data-v-49782f06"]]),sx={class:"h-full w-full bg-transparent"},rx={key:0,class:"p-4 text-center"},ix=J({__name:"LogsTerminal",setup(e){const t=A(""),a=A(!0),o=n(({terminal:s,useAutoSize:r},i)=>{r({root:i,autoRows:!0,autoCols:!0,minCols:80});const l=n(p=>{s.write(p.map(f=>f.m).join(""))},"update"),u=n(p=>{l(p.detail.entries)},"logReceived"),c=n(async()=>{l((await oe.getRawLogs()).entries)},"loadLogEntries"),d=n(async()=>{const{clientId:p}=Vn(Ot());p.value||await ni(p).not.toBeNull(),await oe.subscribeLogs(!0),oe.addEventListener("logs",u)},"watchLogs");it(async()=>{try{await c()}catch(p){console.error("Error loading logs",p),t.value="Unable to load logs, please ensure you have updated your ComfyUI backend.";return}await d(),a.value=!1}),St(async()=>{oe.clientId&&await oe.subscribeLogs(!1),oe.removeEventListener("logs",u)})},"terminalCreated");return(s,r)=>(C(),P("div",sx,[t.value?(C(),P("p",rx,$(t.value),1)):a.value?(C(),X(b(Io),{key:1,class:"relative inset-0 z-10 flex h-full items-center justify-center"})):H("",!0),ze(R(Hp,{onCreated:o},null,512),[[_o,!a.value]])]))}}),lx=ot(ix,[["__scopeId","data-v-c03d3536"]]);const ux=n(()=>{const{t:e}=Fe();return{id:"logs-terminal",title:e("g.logs"),titleKey:"g.logs",component:bt(lx),type:"vue"}},"useLogsTerminalTab"),cx=n(()=>{const{t:e}=Fe();return{id:"command-terminal",title:e("g.terminal"),titleKey:"g.terminal",component:bt(nx),type:"vue"}},"useCommandTerminalTab"),jp=Je("bottomPanel",()=>{const e=A({terminal:{tabs:[],activeTabId:"",visible:!1},shortcuts:{tabs:[],activeTabId:"",visible:!1}}),t=A(null),a=E(()=>t.value?e.value[t.value]:null),o=E(()=>{const m=a.value;return m?m.tabs.find(h=>h.id===m.activeTabId)??null:null}),s=E({get:n(()=>!!t.value,"get"),set:n(m=>{m||(t.value=null)},"set")}),r=E(()=>a.value?.tabs??[]),i=E({get:n(()=>a.value?.activeTabId??"","get"),set:n(m=>{const h=a.value;h&&(h.activeTabId=m)},"set")}),l=n(m=>{const h=e.value[m];h.tabs.length!==0&&(t.value===m?t.value=null:(t.value=m,!h.activeTabId&&h.tabs.length>0&&(h.activeTabId=h.tabs[0].id)))},"togglePanel"),u=n(()=>{l("terminal")},"toggleBottomPanel"),c=n(m=>{const h=a.value;h&&(h.activeTabId=m)},"setActiveTab"),d=n(m=>{for(const[h,y]of Object.entries(e.value))if(y.tabs.find(k=>k.id===m)){t.value===h&&y.activeTabId===m?t.value=null:(t.value=h,y.activeTabId=m);return}},"toggleBottomPanelTab"),p=n(m=>{const h=m.targetPanel??"terminal",y=e.value[h];y.tabs=[...y.tabs,m],y.tabs.length===1&&(y.activeTabId=m.id);const k=m.title||m.titleKey||m.id;Pt().registerCommand({id:`Workspace.ToggleBottomPanelTab.${m.id}`,icon:"pi pi-list",label:`Toggle ${k} Bottom Panel`,category:"view-controls",function:n(()=>d(m.id),"function"),source:"System"})},"registerBottomPanelTab");return{panels:e,activePanel:t,togglePanel:l,bottomPanelVisible:s,toggleBottomPanel:u,bottomPanelTabs:r,activeBottomPanelTab:o,activeBottomPanelTabId:i,setActiveTab:c,toggleBottomPanelTab:d,registerBottomPanelTab:p,registerCoreBottomPanelTabs:n(()=>{p(ux()),Qa()&&p(cx()),ZC().forEach(p)},"registerCoreBottomPanelTabs"),registerExtensionBottomPanelTabs:n(m=>{m.bottomPanelTabs&&m.bottomPanelTabs.forEach(p)},"registerExtensionBottomPanelTabs")}}),Lt=n(()=>{const e=tl(),t=Me(),a=sl(),{wrapWithErrorHandling:o,wrapWithErrorHandlingAsync:s,toastErrorHandler:r}=ta();return{loadExtensions:n(async()=>{e.loadDisabledExtensionNames(t.get("Comfy.Extension.Disabled"));const d=await oe.getExtensions();await ut(()=>import("./core-IYu8XAIx.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]),import.meta.url),e.captureCoreExtensions(),await Promise.all(d.filter(p=>!p.includes("extensions/core")).map(async p=>{try{await ut(()=>import(oe.fileURL(p)),[],import.meta.url)}catch(f){console.error("Error loading extension",p,f)}}))},"loadExtensions"),registerExtension:n(d=>{e.registerExtension(d);const p=o(a.addDefaultKeybinding),f=o(t.addSetting);if(d.keybindings?.forEach(g=>{p(new ny(g))}),Pt().loadExtensionCommands(d),yp().loadExtensionMenuCommands(d),d.settings?.forEach(f),jp().registerExtensionBottomPanelTabs(d),d.getCustomWidgets&&(async()=>{if(d.getCustomWidgets){const g=await d.getCustomWidgets(Z);jn().registerCustomWidgets(g)}})(),d.onAuthUserResolved){const{onUserResolved:g}=Ko(),m=s(h=>d.onAuthUserResolved?.(h,Z),h=>{console.error("[Extension Auth Hook Error]",{extension:d.name,hook:"onAuthUserResolved",error:h}),r(h)});g(h=>{m(h)})}if(d.onAuthTokenRefreshed){const{onTokenRefreshed:g}=Ko(),m=s(()=>d.onAuthTokenRefreshed?.(),h=>{console.error("[Extension Auth Hook Error]",{extension:d.name,hook:"onAuthTokenRefreshed",error:h}),r(h)});g(()=>{m()})}if(d.onAuthUserLogout){const{onUserLogout:g}=Ko(),m=s(()=>d.onAuthUserLogout?.(),h=>{console.error("[Extension Auth Hook Error]",{extension:d.name,hook:"onAuthUserLogout",error:h}),r(h)});g(()=>{m()})}},"registerExtension"),invokeExtensions:n((d,...p)=>{const f=[];for(const g of e.enabledExtensions)if(d in g)try{f.push(g[d](...p,Z))}catch(m){console.error(`Error calling extension '${g.name}' method '${d}'`,{error:m},{extension:g},{args:p})}return f},"invokeExtensions"),invokeExtensionsAsync:n(async(d,...p)=>await Promise.all(e.enabledExtensions.map(async f=>{if(d in f)try{d==="setup"&&Dr.setCurrentExtension(f.name);const g=await f[d](...p,Z);return d==="setup"&&Dr.setCurrentExtension(null),g}catch(g){d==="setup"&&Dr.setCurrentExtension(null),console.error(`Error calling extension '${f.name}' method '${d}'`,{error:g},{extension:f},{args:p})}})),"invokeExtensionsAsync")}},"useExtensionService");var Mo=nd(Og(),1),dx=50,px=50,Vu=new Mo.default({maxSize:dx}),Gu=new Mo.default({maxSize:px}),Hu=null;function H8(e,t){return Rn.findByUrl(e,t)}n(H8,"findActiveIndex");async function j8(e){const t=String(e.promptId);if(Hu=t,!((e.outputsCount??0)>1))return[...e.previewableOutputs];const a=Vu.get(t);if(a)return[...a.previewableOutputs];try{const o=await e.loadFullOutputs();return Hu!==t?null:(Vu.set(t,o),[...o.previewableOutputs])}catch(o){return console.warn("Failed to load full outputs, using preview:",o),[...e.previewableOutputs]}}n(j8,"getOutputsForTask");async function Ks(e){const t=Gu.get(e);if(t)return t;try{const a=await oe.getJobDetail(e);return a&&Gu.set(e,a),a}catch(a){console.warn("Failed to fetch job detail:",a);return}}n(Ks,"getJobDetail");async function yi(e){return await Ld(await Ks(e))}n(yi,"getJobWorkflow");var so=(function(e){return e.Running="Running",e.Pending="Pending",e.Completed="Completed",e.Failed="Failed",e.Cancelled="Cancelled",e})(so||{}),Rn=class{static{n(this,"ResultItemImpl")}filename;subfolder;type;nodeId;mediaType;format;frame_rate;constructor(e){this.filename=e.filename??"",this.subfolder=e.subfolder??"",this.type=e.type??"",this.nodeId=e.nodeId,this.mediaType=e.mediaType,this.format=e.format,this.frame_rate=e.frame_rate}get urlParams(){const e=new URLSearchParams;return e.set("filename",this.filename),e.set("type",this.type),e.set("subfolder",this.subfolder),this.format&&e.set("format",this.format),this.frame_rate&&e.set("frame_rate",this.frame_rate.toString()),e}get vhsAdvancedPreviewUrl(){return oe.apiURL("/viewvideo?"+this.urlParams)}get url(){return oe.apiURL("/view?"+this.urlParams)}get urlWithTimestamp(){return`${this.url}&t=${+new Date}`}get isVhsFormat(){return!!this.format&&!!this.frame_rate}get htmlVideoType(){if(this.isWebm)return"video/webm";if(this.isMp4)return"video/mp4";if(this.isVhsFormat){if(this.format?.endsWith("webm"))return"video/webm";if(this.format?.endsWith("mp4"))return"video/mp4"}}get htmlAudioType(){if(this.isMp3)return"audio/mpeg";if(this.isWav)return"audio/wav";if(this.isOgg)return"audio/ogg";if(this.isFlac)return"audio/flac"}get isGif(){return this.filename.endsWith(".gif")}get isWebp(){return this.filename.endsWith(".webp")}get isWebm(){return this.filename.endsWith(".webm")}get isMp4(){return this.filename.endsWith(".mp4")}get isVideoBySuffix(){return this.isWebm||this.isMp4}get isImageBySuffix(){return this.isGif||this.isWebp}get isMp3(){return this.filename.endsWith(".mp3")}get isWav(){return this.filename.endsWith(".wav")}get isOgg(){return this.filename.endsWith(".ogg")}get isFlac(){return this.filename.endsWith(".flac")}get isAudioBySuffix(){return this.isMp3||this.isWav||this.isOgg||this.isFlac}get isVideo(){const e=this.mediaType==="video"||!!this.format?.startsWith("video/");return this.isVideoBySuffix||e&&!this.isImageBySuffix&&!this.isAudioBySuffix}get isImage(){return this.isImageBySuffix||this.mediaType==="images"&&!this.isVideoBySuffix&&!this.isAudioBySuffix}get isAudio(){const e=this.mediaType==="audio"||!!this.format?.startsWith("audio/");return this.isAudioBySuffix||e&&!this.isImageBySuffix&&!this.isVideoBySuffix}get is3D(){return Ta(this.filename)==="3D"}get supportsPreview(){return this.isImage||this.isVideo||this.isAudio||this.is3D}static filterPreviewable(e){return e.filter(t=>t.supportsPreview)}static findByUrl(e,t){if(!t)return 0;const a=e.findIndex(o=>o.url===t);return a>=0?a:0}},_n=class wi{static{n(this,"TaskItemImpl")}job;outputs;flatOutputs;constructor(t,a,o){this.job=t;const s=a??(t.preview_output?{[t.preview_output.nodeId]:{[t.preview_output.mediaType]:[t.preview_output]}}:{});this.outputs=Be.mapValues(s,r=>Be.omit(r,"animated")),this.flatOutputs=o??this.calculateFlatOutputs()}calculateFlatOutputs(){return this.outputs?Object.entries(this.outputs).flatMap(([t,a])=>Object.entries(a).flatMap(([o,s])=>s.map(r=>new Rn({...r,nodeId:t,mediaType:o})))):[]}get previewableOutputs(){return Rn.filterPreviewable(this.flatOutputs)}get previewOutput(){const t=this.previewableOutputs;return t.find(a=>a.type==="output")??t[0]}get taskType(){switch(this.job.status){case"in_progress":return"Running";case"pending":return"Pending";default:return"History"}}get apiTaskType(){switch(this.taskType){case"Running":case"Pending":return"queue";case"History":return"history"}}get key(){return this.promptId+this.displayStatus}get queueIndex(){return this.job.priority}get promptId(){return this.job.id}get outputsCount(){return this.job.outputs_count??void 0}get status(){return this.job.status}get errorMessage(){return this.job.execution_error?.exception_message??void 0}get executionError(){return this.job.execution_error??void 0}get workflowId(){return this.job.workflow_id??void 0}get createTime(){return this.job.create_time}get interrupted(){return this.job.status==="failed"&&this.job.execution_error?.exception_type==="InterruptProcessingException"}get isHistory(){return this.taskType==="History"}get isRunning(){return this.taskType==="Running"}get displayStatus(){switch(this.job.status){case"in_progress":return so.Running;case"pending":return so.Pending;case"completed":return so.Completed;case"failed":return so.Failed;case"cancelled":return so.Cancelled}}get executionStartTimestamp(){return this.job.execution_start_time??void 0}get executionEndTimestamp(){return this.job.execution_end_time??void 0}get executionTime(){if(!(!this.executionStartTimestamp||!this.executionEndTimestamp))return this.executionEndTimestamp-this.executionStartTimestamp}get executionTimeInSeconds(){return this.executionTime!==void 0?this.executionTime/1e3:void 0}async loadFullOutputs(){if(!this.isHistory)return this;const t=await Ks(this.promptId);return t?.outputs?new wi(this.job,t.outputs):this}async loadWorkflow(t){if(!this.isHistory)return;const a=await Ks(this.promptId),o=await Ld(a);if(!o)return;await t.loadGraphData(Et(o));const s=a?.outputs??this.outputs;if(!s)return;const r=Gt(),i=Et(s);for(const l in i)r.setNodeOutputsByExecutionId(l,i[l]);Lt().invokeExtensions("onNodeOutputsUpdated",t.nodeOutputs)}flatten(){return this.displayStatus!==so.Completed?[this]:this.flatOutputs.map((t,a)=>new wi({...this.job,id:`${this.promptId}-${a}`},{[t.nodeId]:{[t.mediaType]:[t]}},[t]))}};const kl=Je("queue",()=>{const e=Qt([]),t=Qt([]),a=Qt([]),o=A(64),s=A(!1),r=E(()=>[...t.value,...e.value,...a.value]),i=E(()=>r.value.flatMap(f=>f.flatten())),l=E(()=>a.value.length?a.value[0].queueIndex:-1),u=E(()=>t.value.length>0),c=n(async()=>{s.value=!0;try{const[f,g]=await Promise.all([oe.getQueue(),oe.getHistory(o.value)]);e.value=f.Running.map(_=>new _n(_)),t.value=f.Pending.map(_=>new _n(_));const m=Wt(a),h=[...t.value,...e.value],y=Ot();h.forEach(_=>{const I=String(_.promptId),w=_.workflowId;w&&I&&y.registerPromptWorkflowIdMapping(I,w)});const k=[...g].sort((_,I)=>I.create_time-_.create_time).slice(0,Wt(o)),S=new Map(m.map(_=>[_.promptId,_]));a.value=k.map(_=>{const I=S.get(_.id);return I?I.outputsCount!==(_.outputs_count??void 0)?new _n(_):I:new _n(_)})}finally{s.value=!1}},"update");return{runningTasks:e,pendingTasks:t,historyTasks:a,maxHistoryItems:o,isLoading:s,tasks:r,flatTasks:i,lastHistoryQueueIndex:l,hasPendingTasks:u,update:c,clear:n(async(f=["queue","history"])=>{f.length!==0&&(await Promise.all(f.map(g=>oe.clearItems(g))),await c())},"clear"),delete:n(async f=>{await oe.deleteItem(f.apiTaskType,f.promptId),await c()},"deleteTask")}}),K8=Je("queuePendingTaskCount",{state:n(()=>({count:0}),"state"),actions:{update(e){this.count=e.detail?.exec_info?.queue_remaining||0}}}),fx=Je("queueSettingsStore",{state:n(()=>({mode:"disabled",batchCount:1}),"state")}),Y8=Je("queueUIStore",()=>{const e=Me(),t=E({get:n(()=>e.get("Comfy.Queue.History.Expanded"),"get"),set:n(o=>e.set("Comfy.Queue.History.Expanded",o),"set")});function a(){t.value=!t.value}return n(a,"toggleOverlay"),{isOverlayExpanded:t,toggleOverlay:a}});var mx={class:"flex flex-col items-center"},gx=J({__name:"NoResultsPlaceholder",props:{class:{},icon:{},title:{},message:{},textClass:{},buttonLabel:{}},emits:["action"],setup(e){const t=e;return(a,o)=>(C(),P("div",{class:pe(["no-results-placeholder h-full p-8",t.class])},[R(b(ld),null,{content:W(()=>[v("div",mx,[v("i",{class:pe(a.icon),style:{"font-size":"3rem","margin-bottom":"1rem"}},null,2),v("h3",null,$(a.title),1),v("p",{class:pe([a.textClass,"text-center whitespace-pre-line"])},$(a.message),3),a.buttonLabel?(C(),X(se,{key:0,variant:"textonly",onClick:o[0]||(o[0]=s=>a.$emit("action"))},{default:W(()=>[fe($(a.buttonLabel),1)]),_:1})):H("",!0)])]),_:1})],2))}}),Va=ot(gx,[["__scopeId","data-v-f45f4900"]]),hx={key:0,class:"pointer-events-auto absolute top-0 left-0 z-10 flex w-full flex-col items-center gap-2 pt-2"},vx={class:"flex items-center justify-center gap-2"},yx={class:"flex w-full max-w-xs items-center gap-2 px-4"},wx={class:"min-w-16 text-xs text-base-foreground"},bx=J({__name:"AnimationControls",props:{animations:{},animationsModifiers:{},playing:{type:Boolean},playingModifiers:{},selectedSpeed:{},selectedSpeedModifiers:{},selectedAnimation:{},selectedAnimationModifiers:{},animationProgress:{default:0},animationProgressModifiers:{},animationDuration:{default:0},animationDurationModifiers:{}},emits:_t(["seek"],["update:animations","update:playing","update:selectedSpeed","update:selectedAnimation","update:animationProgress","update:animationDuration"]),setup(e,{emit:t}){const a=rt(e,"animations"),o=rt(e,"playing"),s=rt(e,"selectedSpeed"),r=rt(e,"selectedAnimation"),i=rt(e,"animationProgress"),l=rt(e,"animationDuration"),u=t,c=[{name:"0.1x",value:.1},{name:"0.5x",value:.5},{name:"1x",value:1},{name:"1.5x",value:1.5},{name:"2x",value:2}],d=E(()=>l.value?i.value/100*l.value:0);function p(m){const h=Math.floor(m/60),y=(m%60).toFixed(1);return h>0?`${h}:${y.padStart(4,"0")}`:`${y}s`}n(p,"formatTime");function f(){o.value=!o.value}n(f,"togglePlay");function g(m){if(!m)return;const h=m[0];i.value=h,u("seek",h)}return n(g,"handleSliderChange"),(m,h)=>a.value&&a.value.length>0?(C(),P("div",hx,[v("div",vx,[R(se,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":m.$t("g.playPause"),onClick:f},{default:W(()=>[v("i",{class:pe(["pi",o.value?"pi-pause":"pi-play","text-lg text-base-foreground"])},null,2)]),_:1},8,["aria-label"]),R(b(Aa),{modelValue:s.value,"onUpdate:modelValue":h[0]||(h[0]=y=>s.value=y),options:c,"option-label":"name","option-value":"value",class:"w-24"},null,8,["modelValue"]),R(b(Aa),{modelValue:r.value,"onUpdate:modelValue":h[1]||(h[1]=y=>r.value=y),options:a.value,"option-label":"name","option-value":"index",class:"w-32"},null,8,["modelValue","options"])]),v("div",yx,[R(qh,{"model-value":[i.value],min:0,max:100,step:.1,class:"flex-1","onUpdate:modelValue":g},null,8,["model-value"]),v("span",wx,$(p(d.value))+" / "+$(p(l.value)),1)])])):H("",!0)}}),_x=bx,kx={class:"space-y-4"},Cx={class:"space-y-4"},xx={key:0,class:"space-y-4"},Ix=J({__name:"ViewerCameraControls",props:{cameraType:{},cameraTypeModifiers:{},fov:{},fovModifiers:{}},emits:["update:cameraType","update:fov"],setup(e){const t=[{title:G("load3d.cameraType.perspective"),value:"perspective"},{title:G("load3d.cameraType.orthographic"),value:"orthographic"}],a=rt(e,"cameraType"),o=rt(e,"fov"),s=E(()=>a.value==="perspective");return(r,i)=>(C(),P("div",kx,[v("div",Cx,[v("label",null,$(b(G)("load3d.viewer.cameraType")),1),R(b(Aa),{modelValue:a.value,"onUpdate:modelValue":i[0]||(i[0]=l=>a.value=l),options:t,"option-label":"title","option-value":"value"},null,8,["modelValue"])]),s.value?(C(),P("div",xx,[v("label",null,$(b(G)("load3d.fov")),1),R(b(Bi),{modelValue:o.value,"onUpdate:modelValue":i[1]||(i[1]=l=>o.value=l),min:10,max:150,step:1,"aria-label":b(G)("load3d.fov")},null,8,["modelValue","aria-label"])])):H("",!0)]))}}),Sx=Ix,Ex={class:"space-y-4"},Tx=J({__name:"ViewerExportControls",emits:["exportModel"],setup(e,{emit:t}){const a=t,o=[{label:"GLB",value:"glb"},{label:"OBJ",value:"obj"},{label:"STL",value:"stl"}],s=A("obj"),r=n(i=>{a("exportModel",i)},"exportModel");return(i,l)=>(C(),P("div",Ex,[R(b(Aa),{modelValue:s.value,"onUpdate:modelValue":l[0]||(l[0]=u=>s.value=u),options:o,"option-label":"label","option-value":"value"},null,8,["modelValue"]),R(se,{variant:"muted-textonly",class:"rounded-full",onClick:l[1]||(l[1]=u=>r(s.value))},{default:W(()=>[fe($(i.$t("load3d.export")),1)]),_:1})]))}}),Ax=Tx,Mx={class:"space-y-4"},Px=J({__name:"ViewerLightControls",props:{lightIntensity:{},lightIntensityModifiers:{}},emits:["update:lightIntensity"],setup(e){const t=rt(e,"lightIntensity"),a=Me().get("Comfy.Load3D.LightIntensityMaximum"),o=Me().get("Comfy.Load3D.LightIntensityMinimum"),s=Me().get("Comfy.Load3D.LightAdjustmentIncrement");return(r,i)=>(C(),P("div",Mx,[v("label",null,$(r.$t("load3d.lightIntensity")),1),R(b(Bi),{modelValue:t.value,"onUpdate:modelValue":i[0]||(i[0]=l=>t.value=l),class:"w-full",min:b(o),max:b(a),step:b(s)},null,8,["modelValue","min","max","step"])]))}}),Dx=Px,Lx={class:"space-y-4"},Ox={key:0},Nx=J({__name:"ViewerModelControls",props:_t({hideMaterialMode:{type:Boolean,default:!1},isPlyModel:{type:Boolean,default:!1}},{upDirection:{},upDirectionModifiers:{},materialMode:{},materialModeModifiers:{}}),emits:["update:upDirection","update:materialMode"],setup(e){const t=rt(e,"upDirection"),a=rt(e,"materialMode"),o=[{label:G("load3d.upDirections.original"),value:"original"},{label:"-X",value:"-x"},{label:"+X",value:"+x"},{label:"-Y",value:"-y"},{label:"+Y",value:"+y"},{label:"-Z",value:"-z"},{label:"+Z",value:"+z"}],s=E(()=>{const r=[{label:G("load3d.materialModes.original"),value:"original"}];return e.isPlyModel&&r.push({label:G("load3d.materialModes.pointCloud"),value:"pointCloud"}),r.push({label:G("load3d.materialModes.normal"),value:"normal"},{label:G("load3d.materialModes.wireframe"),value:"wireframe"}),r});return(r,i)=>(C(),P("div",Lx,[v("div",null,[v("label",null,$(r.$t("load3d.upDirection")),1),R(b(Aa),{modelValue:t.value,"onUpdate:modelValue":i[0]||(i[0]=l=>t.value=l),options:o,"option-label":"label","option-value":"value"},null,8,["modelValue"])]),r.hideMaterialMode?H("",!0):(C(),P("div",Ox,[v("label",null,$(r.$t("load3d.materialMode")),1),R(b(Aa),{modelValue:a.value,"onUpdate:modelValue":i[1]||(i[1]=l=>a.value=l),options:s.value,"option-label":"label","option-value":"value"},null,8,["modelValue","options"])]))]))}}),$x=Nx,Rx={class:"space-y-4"},Bx={key:0},Fx={for:"showGrid",class:"pl-2"},Ux={key:1},Wx={key:2,class:"space-y-2"},zx={class:"flex gap-2"},Vx=J({__name:"ViewerSceneControls",props:_t({hasBackgroundImage:{type:Boolean},disableBackgroundUpload:{type:Boolean}},{backgroundColor:{},backgroundColorModifiers:{},showGrid:{type:Boolean},showGridModifiers:{},backgroundRenderMode:{},backgroundRenderModeModifiers:{}}),emits:_t(["updateBackgroundImage"],["update:backgroundColor","update:showGrid","update:backgroundRenderMode"]),setup(e,{emit:t}){const a=rt(e,"backgroundColor"),o=rt(e,"showGrid"),s=rt(e,"backgroundRenderMode"),r=t,i=A(null),l=n(()=>{i.value?.click()},"openImagePicker"),u=n(p=>{const f=p.target;f.files&&f.files[0]&&r("updateBackgroundImage",f.files[0]),f.value=""},"handleImageUpload"),c=n(()=>{r("updateBackgroundImage",null)},"removeBackgroundImage"),d=n(p=>{s.value=p},"setBackgroundRenderMode");return(p,f)=>(C(),P("div",Rx,[p.hasBackgroundImage?H("",!0):(C(),P("div",Bx,[v("label",null,$(p.$t("load3d.backgroundColor")),1),ze(v("input",{"onUpdate:modelValue":f[0]||(f[0]=g=>a.value=g),type:"color",class:"w-full"},null,512),[[io,a.value]])])),v("div",null,[R(b(Wi),{modelValue:o.value,"onUpdate:modelValue":f[1]||(f[1]=g=>o.value=g),"input-id":"showGrid",binary:"",name:"showGrid"},null,8,["modelValue"]),v("label",Fx,$(p.$t("load3d.showGrid")),1)]),!p.hasBackgroundImage&&!p.disableBackgroundUpload?(C(),P("div",Ux,[R(se,{variant:"secondary",class:"w-full",onClick:l},{default:W(()=>[f[4]||(f[4]=v("i",{class:"pi pi-image"},null,-1)),fe(" "+$(p.$t("load3d.uploadBackgroundImage")),1)]),_:1}),v("input",{ref_key:"imagePickerRef",ref:i,type:"file",accept:"image/*",class:"hidden",onChange:u},null,544)])):H("",!0),p.hasBackgroundImage?(C(),P("div",Wx,[v("div",zx,[R(se,{variant:s.value==="tiled"?"primary":"secondary",class:"flex-1",onClick:f[2]||(f[2]=g=>d("tiled"))},{default:W(()=>[f[5]||(f[5]=v("i",{class:"pi pi-th-large"},null,-1)),fe(" "+$(p.$t("load3d.tiledMode")),1)]),_:1},8,["variant"]),R(se,{variant:s.value==="panorama"?"primary":"secondary",class:"flex-1",onClick:f[3]||(f[3]=g=>d("panorama"))},{default:W(()=>[f[6]||(f[6]=v("i",{class:"pi pi-globe"},null,-1)),fe(" "+$(p.$t("load3d.panoramaMode")),1)]),_:1},8,["variant"])]),R(se,{variant:"secondary",class:"w-full",onClick:c},{default:W(()=>[f[7]||(f[7]=v("i",{class:"pi pi-times"},null,-1)),fe(" "+$(p.$t("load3d.removeBackgroundImage")),1)]),_:1})])):H("",!0)]))}}),Gx=Vx;const Kp=new Set([".gltf",".glb",".obj",".fbx",".stl",".spz",".splat",".ply",".ksplat"]);window.comfyAPI=window.comfyAPI||{};window.comfyAPI.interfaces=window.comfyAPI.interfaces||{};window.comfyAPI.interfaces.SUPPORTED_EXTENSIONS=Kp;function Hx(e){const t=A(!1),a=A(""),o=E(()=>Wt(e.disabled)??!1);function s(u){const c=u.name.toLowerCase(),d=c.substring(c.lastIndexOf("."));return Kp.has(d)}n(s,"isValidModelFile");function r(u){o.value||u.dataTransfer&&u.dataTransfer.types.includes("Files")&&(t.value=!0,u.dataTransfer.dropEffect="copy",a.value=G("load3d.dropToLoad"))}n(r,"handleDragOver");function i(){t.value=!1}n(i,"handleDragLeave");async function l(u){if(t.value=!1,o.value||!u.dataTransfer)return;const c=Array.from(u.dataTransfer.files);if(c.length===0)return;const d=c.find(s);d?await e.onModelDrop(d):Oe().addAlert(G("load3d.unsupportedFileType"))}return n(l,"handleDrop"),{isDragging:t,dragMessage:a,handleDragOver:r,handleDragLeave:i,handleDrop:l}}n(Hx,"useLoad3dDrag");var Yp=class{static{n(this,"AnimationManager")}currentAnimation=null;animationActions=[];animationClips=[];selectedAnimationIndex=0;isAnimationPlaying=!1;animationSpeed=1;eventManager;constructor(e){this.eventManager=e}init(){}dispose(){this.currentAnimation&&(this.animationActions.forEach(e=>{e.stop()}),this.currentAnimation=null),this.animationActions=[],this.animationClips=[],this.selectedAnimationIndex=0,this.isAnimationPlaying=!1,this.animationSpeed=1,this.eventManager.emitEvent("animationListChange",[])}setupModelAnimations(e,t){this.currentAnimation&&(this.currentAnimation.stopAllAction(),this.animationActions=[]);let a=[];e.animations?.length>0?a=e.animations:t&&"animations"in t&&Array.isArray(t.animations)&&(a=t.animations),a.length>0?(this.animationClips=a,this.currentAnimation=new ov(e),this.animationClips.length>0&&this.updateSelectedAnimation(0)):this.animationClips=[],this.updateAnimationList()}updateAnimationList(){let e=[];this.animationClips.length>0&&(e=this.animationClips.map((t,a)=>({name:t.name||`Animation ${a+1}`,index:a}))),this.eventManager.emitEvent("animationListChange",e)}setAnimationSpeed(e){this.animationSpeed=e,this.animationActions.forEach(t=>{t.setEffectiveTimeScale(e)})}updateSelectedAnimation(e){if(!this.currentAnimation||!this.animationClips||e>=this.animationClips.length){console.warn("Invalid animation update request");return}this.animationActions.forEach(o=>{o.stop()}),this.currentAnimation.stopAllAction(),this.animationActions=[],this.selectedAnimationIndex=e;const t=this.animationClips[e],a=this.currentAnimation.clipAction(t);a.setEffectiveTimeScale(this.animationSpeed),a.reset(),a.clampWhenFinished=!1,a.loop=Jh,this.isAnimationPlaying?a.play():(a.play(),a.paused=!0),this.animationActions=[a],this.eventManager.emitEvent("animationProgressChange",{progress:0,currentTime:0,duration:t.duration})}toggleAnimation(e){if(!this.currentAnimation||this.animationActions.length===0){console.warn("No animation to toggle");return}this.isAnimationPlaying=e??!this.isAnimationPlaying,this.animationActions.forEach(t=>{this.isAnimationPlaying?(t.paused=!1,(t.time===0||t.time===t.getClip().duration)&&t.reset()):t.paused=!0})}update(e){if(this.currentAnimation&&this.isAnimationPlaying&&(this.currentAnimation.update(e),this.animationActions.length>0)){const t=this.animationActions[0],a=t.getClip(),o=t.time/a.duration*100;this.eventManager.emitEvent("animationProgressChange",{progress:o,currentTime:t.time,duration:a.duration})}}getAnimationTime(){return this.animationActions.length===0?0:this.animationActions[0].time}getAnimationDuration(){return this.animationActions.length===0?0:this.animationActions[0].getClip().duration}setAnimationTime(e){if(this.animationActions.length===0)return;const t=this.getAnimationDuration(),a=Math.max(0,Math.min(e,t)),o=this.animationActions.map(s=>s.paused);this.animationActions.forEach(s=>{s.paused=!1,s.time=a}),this.currentAnimation&&(this.currentAnimation.setTime(a),this.currentAnimation.update(0)),this.animationActions.forEach((s,r)=>{s.paused=o[r]}),this.eventManager.emitEvent("animationProgressChange",{progress:a/t*100,currentTime:a,duration:t})}reset(){}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.AnimationManager=window.comfyAPI.AnimationManager||{};window.comfyAPI.AnimationManager.AnimationManager=Yp;var qp=class{static{n(this,"CameraManager")}perspectiveCamera;orthographicCamera;activeCamera;eventManager;controls=null;DEFAULT_DISTANCE=10;DEFAULT_LOOK_AT=0;DEFAULT_CAMERA={near:.01,far:1e4};DEFAULT_PERSPECTIVE_CAMERA={fov:35,aspect:1};DEFAULT_FRUSTUM_SIZE=10;DEFAULT_ORTHOGRAPHIC_CAMERA={left:-this.DEFAULT_FRUSTUM_SIZE/2,right:this.DEFAULT_FRUSTUM_SIZE/2,top:this.DEFAULT_FRUSTUM_SIZE/2,bottom:-this.DEFAULT_FRUSTUM_SIZE/2};constructor(e,t){this.eventManager=t,this.perspectiveCamera=new Ho(this.DEFAULT_PERSPECTIVE_CAMERA.fov,this.DEFAULT_PERSPECTIVE_CAMERA.aspect,this.DEFAULT_CAMERA.near,this.DEFAULT_CAMERA.far),this.orthographicCamera=new ka(this.DEFAULT_ORTHOGRAPHIC_CAMERA.left,this.DEFAULT_ORTHOGRAPHIC_CAMERA.right,this.DEFAULT_ORTHOGRAPHIC_CAMERA.top,this.DEFAULT_ORTHOGRAPHIC_CAMERA.bottom,this.DEFAULT_CAMERA.near,this.DEFAULT_CAMERA.far),this.reset(),this.activeCamera=this.perspectiveCamera}init(){}dispose(){}setControls(e){this.controls=e,this.controls&&this.controls.addEventListener("end",()=>{this.eventManager.emitEvent("cameraChanged",this.getCameraState())})}getCurrentCameraType(){return this.activeCamera===this.perspectiveCamera?"perspective":"orthographic"}toggleCamera(e){const t=this.activeCamera,a=t.position.clone(),o=t.rotation.clone(),s=this.controls?.target.clone()||new Ca,r=(t instanceof ka,t.zoom);if(!e)this.activeCamera=t===this.perspectiveCamera?this.orthographicCamera:this.perspectiveCamera;else if(this.activeCamera=e==="perspective"?this.perspectiveCamera:this.orthographicCamera,t===this.activeCamera)return;this.activeCamera.position.copy(a),this.activeCamera.rotation.copy(o),this.activeCamera instanceof ka?(this.activeCamera.zoom=r,this.activeCamera.updateProjectionMatrix()):this.activeCamera instanceof Ho&&(this.activeCamera.zoom=r,this.activeCamera.updateProjectionMatrix()),this.controls&&(this.controls.object=this.activeCamera,this.controls.target.copy(s),this.controls.update()),this.eventManager.emitEvent("cameraTypeChange",e)}setFOV(e){this.activeCamera===this.perspectiveCamera&&(this.perspectiveCamera.fov=e,this.perspectiveCamera.updateProjectionMatrix()),this.eventManager.emitEvent("fovChange",e)}getCameraState(){return{position:this.activeCamera.position.clone(),target:this.controls?.target.clone()||new Ca,zoom:this.activeCamera instanceof ka?this.activeCamera.zoom:this.activeCamera.zoom,cameraType:this.getCurrentCameraType()}}setCameraState(e){this.activeCamera.position.copy(e.position),this.controls?.target.copy(e.target),this.activeCamera instanceof ka?(this.activeCamera.zoom=e.zoom,this.activeCamera.updateProjectionMatrix()):this.activeCamera instanceof Ho&&(this.activeCamera.zoom=e.zoom,this.activeCamera.updateProjectionMatrix()),this.controls?.update()}handleResize(e,t){const a=e/t;this.updateAspectRatio(a)}updateAspectRatio(e){this.activeCamera===this.perspectiveCamera?(this.perspectiveCamera.aspect=e,this.perspectiveCamera.updateProjectionMatrix()):(this.orthographicCamera.left=-10*e/2,this.orthographicCamera.right=10*e/2,this.orthographicCamera.top=10/2,this.orthographicCamera.bottom=-10/2,this.orthographicCamera.updateProjectionMatrix())}setupForModel(e){const t=Math.max(e.x,e.z)*2,a=e.y*2;if(this.perspectiveCamera.position.set(t,a,t),this.orthographicCamera.position.set(t,a,t),this.activeCamera===this.perspectiveCamera)this.perspectiveCamera.lookAt(0,e.y/2,0),this.perspectiveCamera.updateProjectionMatrix();else{const o=Math.max(e.x,e.y,e.z)*2,s=this.perspectiveCamera.aspect;this.orthographicCamera.left=-o*s/2,this.orthographicCamera.right=o*s/2,this.orthographicCamera.top=o/2,this.orthographicCamera.bottom=-o/2,this.orthographicCamera.lookAt(0,e.y/2,0),this.orthographicCamera.updateProjectionMatrix()}this.controls?.target.set(0,e.y/2,0),this.controls?.update()}reset(){this.perspectiveCamera.position.set(this.DEFAULT_DISTANCE,this.DEFAULT_DISTANCE,this.DEFAULT_DISTANCE),this.orthographicCamera.position.set(this.DEFAULT_DISTANCE,this.DEFAULT_DISTANCE,this.DEFAULT_DISTANCE),this.perspectiveCamera.lookAt(this.DEFAULT_LOOK_AT,this.DEFAULT_LOOK_AT,this.DEFAULT_LOOK_AT),this.orthographicCamera.lookAt(this.DEFAULT_LOOK_AT,this.DEFAULT_LOOK_AT,this.DEFAULT_LOOK_AT),this.perspectiveCamera.updateProjectionMatrix(),this.orthographicCamera.updateProjectionMatrix()}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.CameraManager=window.comfyAPI.CameraManager||{};window.comfyAPI.CameraManager.CameraManager=qp;var Xp=class{static{n(this,"ControlsManager")}controls;eventManager;camera;constructor(e,t,a){this.eventManager=a,this.camera=t,this.controls=new lv(t,e.domElement.parentElement||e.domElement),this.controls.enableDamping=!0}init(){this.controls.addEventListener("end",()=>{const e={position:this.camera.position.clone(),target:this.controls.target.clone(),zoom:this.camera instanceof ka?this.camera.zoom:this.camera.zoom,cameraType:this.camera instanceof Ho?"perspective":"orthographic"};this.eventManager.emitEvent("cameraChanged",e)})}dispose(){this.controls.dispose()}handleResize(){}update(){this.controls.update()}updateCamera(e){const t=this.controls.object.position.clone(),a=this.controls.target.clone();this.camera=e,this.controls.object=e,this.controls.target=a,e.position.copy(t),this.controls.update()}reset(){this.controls.target.set(0,0,0),this.controls.update()}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.ControlsManager=window.comfyAPI.ControlsManager||{};window.comfyAPI.ControlsManager.ControlsManager=Xp;var Zp=class{static{n(this,"EventManager")}listeners={};addEventListener(e,t){this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push(t)}removeEventListener(e,t){this.listeners[e]&&(this.listeners[e]=this.listeners[e].filter(a=>a!==t))}emitEvent(e,t){this.listeners[e]&&this.listeners[e].forEach(a=>a(t))}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.EventManager=window.comfyAPI.EventManager||{};window.comfyAPI.EventManager.EventManager=Zp;var Jp=class{static{n(this,"LightingManager")}lights=[];currentIntensity=3;scene;eventManager;constructor(e,t){this.scene=e,this.eventManager=t}init(){this.setupLights()}dispose(){this.lights.forEach(e=>{this.scene.remove(e)}),this.lights=[]}setupLights(){const e=new ru(16777215,.5);this.scene.add(e),this.lights.push(e);const t=new Oo(16777215,.8);t.position.set(0,10,10),this.scene.add(t),this.lights.push(t);const a=new Oo(16777215,.5);a.position.set(0,10,-10),this.scene.add(a),this.lights.push(a);const o=new Oo(16777215,.3);o.position.set(-10,0,0),this.scene.add(o),this.lights.push(o);const s=new Oo(16777215,.3);s.position.set(10,0,0),this.scene.add(s),this.lights.push(s);const r=new Oo(16777215,.2);r.position.set(0,-10,0),this.scene.add(r),this.lights.push(r)}setLightIntensity(e){this.currentIntensity=e,this.lights.forEach(t=>{t instanceof Oo?t===this.lights[1]?t.intensity=e*.8:t===this.lights[2]?t.intensity=e*.5:t===this.lights[5]?t.intensity=e*.2:t.intensity=e*.3:t instanceof ru&&(t.intensity=e*.5)}),this.eventManager.emitEvent("lightIntensityChange",e)}reset(){}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.LightingManager=window.comfyAPI.LightingManager||{};window.comfyAPI.LightingManager.LightingManager=Jp;function jx(e){let t=0,a=0,o=!1,s=-1,r=-1,i=-1,l=-1,u=-1,c=-1,d=0;for(let p=0;p<e.length;p++){const f=e[p].trim();if(f.startsWith("element vertex"))t=parseInt(f.split(/\s+/)[2]);else if(f.startsWith("property")){const g=f.split(/\s+/),m=g[g.length-1];m==="x"?s=d:m==="y"?r=d:m==="z"?i=d:m==="red"?(o=!0,l=d):m==="green"?u=d:m==="blue"&&(c=d),d++}else if(f==="end_header"){a=p;break}}return t===0||s<0||r<0||i<0?null:{vertexCount:t,hasColor:o,propertyIndices:{x:s,y:r,z:i,red:l,green:u,blue:c},headerEndLine:a}}n(jx,"parsePLYHeader");function Kx(e,t){const{vertexCount:a,hasColor:o,propertyIndices:s,headerEndLine:r}=t,{x:i,y:l,z:u}=s,{red:c,green:d,blue:p}=s,f=new Float32Array(a*3),g=o?new Float32Array(a*3):null;let m=0;for(let h=r+1;h<e.length&&m<a;h++){const y=e[h].trim();if(!y)continue;const k=y.split(/\s+/);if(k.length<3)continue;const S=m*3;f[S]=parseFloat(k[i]),f[S+1]=parseFloat(k[l]),f[S+2]=parseFloat(k[u]),o&&g&&c>=0&&d>=0&&p>=0&&k.length>Math.max(c,d,p)&&(g[S]=parseInt(k[c])/255,g[S+1]=parseInt(k[d])/255,g[S+2]=parseInt(k[p])/255),m++}return{positions:f,colors:g,vertexCount:m}}n(Kx,"parsePLYVertices");function Qp(e){const t=new TextDecoder().decode(e).split(`
|
|
11
11
|
`),a=jx(t);return a?Kx(t,a):null}n(Qp,"parseASCIIPLY");function ef(e){return new TextDecoder().decode(e.slice(0,500)).includes("format ascii")}n(ef,"isPLYAsciiFormat");window.comfyAPI=window.comfyAPI||{};window.comfyAPI.ply=window.comfyAPI.ply||{};window.comfyAPI.ply.parseASCIIPLY=Qp;window.comfyAPI.ply.isPLYAsciiFormat=ef;var tf=class{static{n(this,"FastPLYLoader")}parse(e){const t=Qp(e);if(!t)throw new Error("Failed to parse PLY data");const a=new Ws;return a.setAttribute("position",new cu(t.positions,3)),t.colors&&a.setAttribute("color",new cu(t.colors,3)),a}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.FastPLYLoader=window.comfyAPI.FastPLYLoader||{};window.comfyAPI.FastPLYLoader.FastPLYLoader=tf;var af=class{static{n(this,"LoaderManager")}gltfLoader;objLoader;mtlLoader;fbxLoader;stlLoader;plyLoader;fastPlyLoader;modelManager;eventManager;currentLoadId=0;constructor(e,t){this.modelManager=e,this.eventManager=t,this.gltfLoader=new iv,this.objLoader=new dv,this.objLoader.setWorkerUrl(!0,new URL(nv,import.meta.url)),this.mtlLoader=new rv,this.fbxLoader=new gv,this.stlLoader=new yv,this.plyLoader=new mv,this.fastPlyLoader=new tf}init(){}dispose(){}async loadModel(e,t){const a=++this.currentLoadId;try{this.eventManager.emitEvent("modelLoadingStart",null),this.modelManager.clearModel(),this.modelManager.originalURL=e;let o;if(t)o=t.split(".").pop()?.toLowerCase(),this.modelManager.originalFileName=t.split("/").pop()?.split(".")[0]||"model";else{const r=new URLSearchParams(e.split("?")[1]).get("filename");o=r?.split(".").pop()?.toLowerCase(),r?this.modelManager.originalFileName=r.split(".")[0]||"model":this.modelManager.originalFileName="model"}if(!o){Oe().addAlert(G("toastMessages.couldNotDetermineFileType"));return}const s=await this.loadModelInternal(e,o);if(a!==this.currentLoadId)return;s&&await this.modelManager.setupModel(s),this.eventManager.emitEvent("modelLoadingEnd",null)}catch(o){a===this.currentLoadId&&(this.eventManager.emitEvent("modelLoadingEnd",null),console.error("Error loading model:",o),Oe().addAlert(G("toastMessages.errorLoadingModel")))}}async loadModelInternal(e,t){let a=null;const o=new URLSearchParams(e.split("?")[1]),s=o.get("filename");if(!s)return console.error("Missing filename in URL:",e),null;const r=o.get("type")==="output"?"output":"input",i=o.get("subfolder")??"",l="api/view?type="+r+"&subfolder="+encodeURIComponent(i)+"&filename=";switch(t){case"stl":this.stlLoader.setPath(l);const u=await this.stlLoader.loadAsync(s);this.modelManager.setOriginalModel(u),u.computeVertexNormals();const c=new qt(u,this.modelManager.standardMaterial),d=new Wo;d.add(c),a=d;break;case"fbx":this.fbxLoader.setPath(l);const p=await this.fbxLoader.loadAsync(s);this.modelManager.setOriginalModel(p),a=p,p.traverse(m=>{m instanceof qt&&(this.modelManager.originalMaterials.set(m,m.material),m instanceof zs&&(m.frustumCulled=!1))});break;case"obj":if(this.modelManager.materialMode==="original")try{this.mtlLoader.setPath(l);const m=s.replace(/\.obj$/,".mtl"),h=await this.mtlLoader.loadAsync(m);h.preload();const y=sv.addMaterialsFromMtlLoader(h);this.objLoader.setMaterials(y)}catch{}const f=l+encodeURIComponent(s);a=await this.objLoader.loadAsync(f),a.traverse(m=>{m instanceof qt&&this.modelManager.originalMaterials.set(m,m.material)});break;case"gltf":case"glb":this.gltfLoader.setPath(l);const g=await this.gltfLoader.loadAsync(s);this.modelManager.setOriginalModel(g),a=g.scene,g.scene.traverse(m=>{m instanceof qt&&(m.geometry.computeVertexNormals(),this.modelManager.originalMaterials.set(m,m.material),m instanceof zs&&(m.frustumCulled=!1))});break;case"ply":a=await this.loadPLY(l,s);break;case"spz":case"splat":case"ksplat":a=await this.loadSplat(l,s);break}return a}async fetchModelData(e,t){const a="/"+e.replace(/^api\//,"")+encodeURIComponent(t),o=await oe.fetchApi(a);if(!o.ok)throw new Error(`Failed to fetch model: ${o.status}`);return o.arrayBuffer()}async loadSplat(e,t){const a=new pi({fileBytes:await this.fetchModelData(e,t)});this.modelManager.setOriginalModel(a);const o=new Wo;return o.add(a),o}async loadPLY(e,t){const a=Me().get("Comfy.Load3D.PLYEngine");if(a==="sparkjs")return this.loadSplat(e,t);const o=await this.fetchModelData(e,t),s=ef(o);let r;s&&a==="fastply"?r=this.fastPlyLoader.parse(o):(this.plyLoader.setPath(e),r=this.plyLoader.parse(o)),this.modelManager.setOriginalModel(r),r.computeVertexNormals();const i=r.attributes.color!==void 0;if(this.modelManager.materialMode==="pointCloud"){if(r.computeBoundingSphere(),r.boundingSphere){const g=r.boundingSphere.center,m=r.boundingSphere.radius;if(r.translate(-g.x,-g.y,-g.z),m>0){const h=1/m;r.scale(h,h,h)}}const d=i?new Us({size:.005,vertexColors:!0,sizeAttenuation:!0}):new Us({size:.005,color:13421772,sizeAttenuation:!0}),p=new ui(r,d);this.modelManager.originalMaterials.set(p,d);const f=new Wo;return f.add(p),f}let l;i?l=new bn({vertexColors:!0,metalness:0,roughness:.5,side:2}):(l=this.modelManager.standardMaterial.clone(),l.side=2);const u=new qt(r,l);this.modelManager.originalMaterials.set(u,l);const c=new Wo;return c.add(u),c}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.LoaderManager=window.comfyAPI.LoaderManager||{};window.comfyAPI.LoaderManager.LoaderManager=af;var Es=class ga{static{n(this,"ModelExporter")}static detectFormatFromURL(t){try{const a=new URLSearchParams(t.split("?")[1]).get("filename");if(a)return a.split(".").pop()?.toLowerCase()||null}catch(a){console.error("Error parsing URL:",a)}return null}static canUseDirectURL(t,a){if(!t)return!1;const o=ga.detectFormatFromURL(t);return o?o.toLowerCase()===a.toLowerCase():!1}static async downloadFromURL(t,a){try{Ba(a,await(await fetch(t)).blob())}catch(o){throw console.error("Error downloading from URL:",o),Oe().addAlert(G("toastMessages.failedToDownloadFile")),o}}static async exportGLB(t,a="model.glb",o){if(o&&ga.canUseDirectURL(o,"glb"))return ga.downloadFromURL(o,a);const s=new uv;try{await new Promise(i=>setTimeout(i,50));const r=await new Promise((i,l)=>{s.parse(t,u=>{i(u)},u=>{l(u)},{binary:!0})});await new Promise(i=>setTimeout(i,50)),ga.saveArrayBuffer(r,a)}catch(r){throw console.error("Error exporting GLB:",r),Oe().addAlert(G("toastMessages.failedToExportModel",{format:"GLB"})),r}}static async exportOBJ(t,a="model.obj",o){if(o&&ga.canUseDirectURL(o,"obj"))return ga.downloadFromURL(o,a);const s=new hv;try{await new Promise(i=>setTimeout(i,50));const r=s.parse(t);await new Promise(i=>setTimeout(i,50)),ga.saveString(r,a)}catch(r){throw console.error("Error exporting OBJ:",r),Oe().addAlert(G("toastMessages.failedToExportModel",{format:"OBJ"})),r}}static async exportSTL(t,a="model.stl",o){if(o&&ga.canUseDirectURL(o,"stl"))return ga.downloadFromURL(o,a);const s=new pv;try{await new Promise(i=>setTimeout(i,50));const r=s.parse(t);await new Promise(i=>setTimeout(i,50)),ga.saveString(r,a)}catch(r){throw console.error("Error exporting STL:",r),Oe().addAlert(G("toastMessages.failedToExportModel",{format:"STL"})),r}}static saveArrayBuffer(t,a){Ba(a,new Blob([t],{type:"application/octet-stream"}))}static saveString(t,a){Ba(a,new Blob([t],{type:"text/plain"}))}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.ModelExporter=window.comfyAPI.ModelExporter||{};window.comfyAPI.ModelExporter.ModelExporter=Es;var of=class{static{n(this,"RecordingManager")}mediaRecorder=null;recordedChunks=[];isRecording=!1;recordingStream=null;recordingIndicator=null;scene;renderer;eventManager;recordingStartTime=0;recordingDuration=0;recordingCanvas=null;recordingContext=null;animationFrameId=null;constructor(e,t,a){this.scene=e,this.renderer=t,this.eventManager=a,this.setupRecordingIndicator()}setupRecordingIndicator(){const e=new al().load("data:image/svg+xml;base64,"+btoa(`<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
|
|
12
12
|
<circle cx="32" cy="32" r="24" fill="#4CAF50" opacity="0.8" />
|
|
13
13
|
<circle cx="32" cy="32" r="16" fill="#2E7D32" opacity="0.8" />
|
|
@@ -36,7 +36,7 @@ Negative prompt:`,a);if(i>-1){let I=function(O,L){return O?.widgets?.find(F=>F.n
|
|
|
36
36
|
A 100 100, 0, 0, 1, -50 50
|
|
37
37
|
M 30 50
|
|
38
38
|
A 20 20, 0, 0, 0, 70 50
|
|
39
|
-
A 20 20, 0, 0, 0, 30 50"></path></clipPath></defs><g clip-path="var(--shape)" stroke-width="4"><path d="M 50 0 A 50 50, 0, 0, 1, 50 100" fill="var(--type1, red)"></path><path d="M 50 100 A 50 50, 0, 0, 1, 50 0" fill="var(--type2, blue)"></path><path d="M50 0L50 100" stroke="var(--inner-stroke, black)"></path><path d="M50 2A48 48 0 0 1 50 98A48 48 0 0 1 50 2" fill="transparent" stroke="var(--outer-stroke, transparent)"></path></g>`,2)])])}n(mM,"render$1");var gM=bt({name:"comfy-node-slot2",render:mM});function pc(e){return e?`var(--color-datatype-${String(e).toUpperCase()}, #AAA)`:"#AAA"}n(pc,"getSlotColor");var hM=J({__name:"SlotConnectionDot",props:{slotData:{},class:{type:[Array,Object,String,Number,null,Boolean]},hasError:{type:Boolean},multi:{type:Boolean}},setup(e,{expose:t}){const a=e,o=hd("slot-el");function s(){return a.hasError?["var(--color-error)"]:a.slotData?[...new Set(`${a.slotData.type}`.split(",").map(pc))].slice(0,3):[pc()]}n(s,"getTypes");const r=s();t({slotElRef:o});const i=E(()=>Pe("bg-slate-300 rounded-full slot-dot","transition-all duration-150","border border-solid border-node-component-slot-dot-outline",a.multi?"w-3 h-6":"size-3 cursor-crosshair group-hover/slot:[--node-component-slot-dot-outline-opacity-mult:5] group-hover/slot:scale-125"));return(l,u)=>{const c=gM,d=pM;return C(),P("div",{class:pe(b(Pe)("after:absolute after:inset-y-0 after:w-5/2 relative size-6 flex items-center justify-center group/slot",a.class))},[b(r).length===1?(C(),P("div",{key:0,ref:"slot-el",style:nt({backgroundColor:b(r)[0]}),class:pe(i.value)},null,6)):(C(),P("div",{key:1,ref:"slot-el",style:nt({"--type1":b(r)[0],"--type2":b(r)[1],"--type3":b(r)[2]}),class:pe(i.value)},[b(r).length===2?(C(),X(c,{key:0,class:"size-full -translate-y-1/2"})):(C(),X(d,{key:1,class:"size-full -translate-y-1/2"}))],6))],2)}}}),Vf=hM,vM={key:0,class:"node-error p-1 text-xs text-red-500"},yM={class:"h-full flex items-center min-w-0"},wM=J({__name:"InputSlot",props:{nodeType:{},nodeId:{},slotData:{},index:{},connected:{type:Boolean},compatible:{type:Boolean},dotOnly:{type:Boolean},socketless:{type:Boolean}},setup(e){const t=e,a=Ot(),o=E(()=>{const k=a.lastNodeErrors?.[t.nodeId??""];if(!k)return!1;const S=t.slotData.name;return k.errors.some(_=>_.extra_info?.input_name===S)}),s=A(null),{toastErrorHandler:r}=ta(),{getInputSlotTooltip:i,createTooltipConfig:l}=yr(t.nodeType||""),u=E(()=>{const k=t.slotData.localized_name||t.slotData.name||"";return l(i(k)||`Input: ${k}`)});zn(k=>(s.value=k.message,r(k),!1));const{state:c}=Kn(),d=E(()=>ia(t.nodeId??"",t.index,!0)),p=E(()=>c.active?!c.compatible.get(d.value):!1),f=A(null),g=A(null);ar(()=>{g.value=f.value?.slotElRef||null}),Wf({nodeId:t.nodeId??"",index:t.index,type:"input",element:g});const{onClick:m,onDoubleClick:h,onPointerDown:y}=zf({nodeId:t.nodeId??"",index:t.index,type:"input"});return(k,S)=>{const _=ht("tooltip");return s.value?(C(),P("div",vM,"⚠️")):ze((C(),P("div",{key:1,class:pe(b(Pe)("lg-slot lg-slot--input flex items-center group rounded-r-lg m-0","cursor-crosshair",t.dotOnly?"lg-slot--dot-only":"pr-6",{"lg-slot--connected":t.connected,"lg-slot--compatible":t.compatible,"opacity-40":p.value},t.socketless&&"pointer-events-none invisible"))},[R(Vf,{ref_key:"connectionDotRef",ref:f,class:pe(b(Pe)("-translate-x-1/2 w-3",o.value&&"before:ring-2 before:ring-error before:ring-offset-0 before:size-4 before:absolute before:rounded-full before:pointer-events-none")),"slot-data":k.slotData,onClick:b(m),onDblclick:b(h),onPointerdown:b(y)},null,8,["class","slot-data","onClick","onDblclick","onPointerdown"]),v("div",yM,[k.dotOnly?H("",!0):(C(),P("span",{key:0,class:pe(b(Pe)("truncate text-node-component-slot-text",o.value&&"text-error font-medium"))},$(k.slotData.label||k.slotData.localized_name||k.slotData.name||`Input ${k.index}`),3))])],2)),[[_,u.value,void 0,{left:!0}]])}}}),Gf=wM,bM={key:0,class:"node-error p-1 text-xs text-red-500"},_M={class:"relative h-full flex items-center min-w-0"},kM={key:0,class:"truncate text-node-component-slot-text"},CM=J({__name:"OutputSlot",props:{nodeType:{},nodeId:{},slotData:{},index:{},connected:{type:Boolean},compatible:{type:Boolean},dotOnly:{type:Boolean}},setup(e){const t=e,a=A(null),{toastErrorHandler:o}=ta(),{getOutputSlotTooltip:s,createTooltipConfig:r}=yr(t.nodeType||""),i=E(()=>{const m=t.slotData.name||"";return r(s(t.index)||`Output: ${m}`)});zn(m=>(a.value=m.message,o(m),!1));const{state:l}=Kn(),u=E(()=>ia(t.nodeId??"",t.index,!1)),c=E(()=>l.active?!l.compatible.get(u.value):!1),d=E(()=>Pe("lg-slot lg-slot--output flex items-center justify-end group rounded-l-lg h-6","cursor-crosshair",t.dotOnly?"lg-slot--dot-only justify-center":"pl-6",{"lg-slot--connected":t.connected,"lg-slot--compatible":t.compatible,"opacity-40":c.value})),p=A(null),f=A(null);ar(()=>{f.value=p.value?.slotElRef||null}),Wf({nodeId:t.nodeId??"",index:t.index,type:"output",element:f});const{onPointerDown:g}=zf({nodeId:t.nodeId??"",index:t.index,type:"output"});return(m,h)=>{const y=ht("tooltip");return a.value?(C(),P("div",bM,"⚠️")):ze((C(),P("div",{key:1,class:pe(d.value)},[v("div",_M,[m.dotOnly?H("",!0):(C(),P("span",kM,$(m.slotData.localized_name||m.slotData.name||`Output ${m.index}`),1))]),R(Vf,{ref_key:"connectionDotRef",ref:p,class:"w-3 translate-x-1/2","slot-data":m.slotData,onPointerdown:b(g)},null,8,["slot-data","onPointerdown"])],2)),[[y,i.value,void 0,{right:!0}]])}}}),xM=CM,IM={key:0,class:"node-error p-2 text-sm text-red-500"},SM=J({__name:"NodeSlots",props:{nodeData:{},unified:{type:Boolean,default:!1}},setup(e){const t=E(()=>e.unified?KA(e.nodeData):[]),a=E(()=>[...jA(e.nodeData),...t.value]),o=E(()=>Pe(e.unified&&"absolute inset-0 items-center pointer-events-none opacity-0 z-30")),s=E(()=>Pe(e.unified&&"grid grid-cols-1 grid-rows-1 gap-0 [&>*]:row-span-full [&>*]:col-span-full place-items-center")),r=n((u,c)=>{if(!e.nodeData?.inputs)return c;const d=e.nodeData.inputs.findIndex(p=>p===u);return d!==-1?d:c},"getActualInputIndex"),i=A(null),{toastErrorHandler:l}=ta();return zn(u=>(i.value=u.message,l(u),!1)),(u,c)=>i.value?(C(),P("div",IM,$(b(De)("nodeErrors.slots","Node Slots Error")),1)):(C(),P("div",{key:1,class:pe(b(Pe)("flex justify-between min-w-0",o.value))},[a.value.length?(C(),P("div",{key:0,class:pe(b(Pe)("flex flex-col min-w-0",s.value))},[(C(!0),P(Se,null,Ze(a.value,(d,p)=>(C(),X(Gf,{key:`input-${p}`,"slot-data":d,"node-type":u.nodeData?.type||"","node-id":u.nodeData?.id!=null?String(u.nodeData.id):"",index:r(d,p)},null,8,["slot-data","node-type","node-id","index"]))),128))],2)):H("",!0),u.nodeData?.outputs?.length?(C(),P("div",{key:1,class:pe(b(Pe)("ml-auto flex flex-col min-w-0",s.value))},[(C(!0),P(Se,null,Ze(u.nodeData.outputs,(d,p)=>(C(),X(xM,{key:`output-${p}`,"slot-data":d,"node-type":u.nodeData?.type||"","node-id":u.nodeData?.id!=null?String(u.nodeData.id):"",index:p},null,8,["slot-data","node-type","node-id","index"]))),128))],2)):H("",!0)],2))}}),EM=SM;function TM(e={}){const{layoutSource:t=Ah.Vue}=e,a=Od();function o(s,r){a.setSource(r??t),a.bringNodeToFront(s)}return n(o,"bringNodeToFront"),{bringNodeToFront:o}}n(TM,"useNodeZIndex");var AM=J({__name:"WidgetDOM",props:{widget:{},nodeId:{}},setup(e){const t=e,a=A(),{canvas:o}=gt();return it(()=>{if(!a.value)return;const s=o?.graph?.getNodeById(t.nodeId)??void 0;if(!s)return;const r=s.widgets?.find(i=>i.name===t.widget.name);!r||!On(r)||a.value.replaceChildren(r.element)}),(s,r)=>(C(),P("div",{ref_key:"domEl",ref:a,onPointerdown:r[0]||(r[0]=Ve(()=>{},["stop"])),onPointermove:r[1]||(r[1]=Ve(()=>{},["stop"])),onPointerup:r[2]||(r[2]=Ve(()=>{},["stop"])),onMousedown:r[3]||(r[3]=Ve(()=>{},["stop"])),onMousemove:r[4]||(r[4]=Ve(()=>{},["stop"])),onMouseup:r[5]||(r[5]=Ve(()=>{},["stop"]))},null,544))}}),MM=AM,gn=2,PM=J({__name:"WidgetLegacy",props:{widget:{}},setup(e){const t=e,a=A(),o=A(20),s=gt().canvas;let r,i,l;it(()=>{r=s?.graph?.getNodeById(a.value.parentElement.attributes["node-id"].value)??void 0,r&&(i=r.widgets?.find(f=>f.name===t.widget.name),i&&(a.value.width*=gn,i.triggerDraw||(i.callback=Fa(i.callback,function(){this?.triggerDraw?.()})),i.triggerDraw=u,Gi(a.value.parentElement,u),be(()=>za().activePaletteId,u),l=new mh(a.value)))}),Wa(()=>{i&&(i.triggerDraw=()=>{})});function u(){if(!i||!r)return;const f=a.value.parentElement.clientWidth;let g=20;i.computedHeight?g=i.computedHeight:i.computeLayoutSize?g=i.computeLayoutSize(r).minHeight:i.computeSize&&(g=i.computeSize(f)[1]),o.value=g,r.canvasHeight=g,i.y=0,a.value.height=(g+2)*gn,a.value.width=f*gn;const m=a.value?.getContext("2d");m&&(m.scale(gn,gn),i.draw?.(m,r,f,1,g))}n(u,"draw");function c(f){!r||!i||!l||(Tn(f,r,s),l.down(f),i.mouse&&(l.onDrag=g=>i.mouse?.(g,[g.offsetX,g.offsetY],r)),s.processWidgetClick(f,r,i,l))}n(c,"handleDown");function d(f){!l||!r||(Tn(f,r,s),f.click_time=f.timeStamp-(l?.eDown?.timeStamp??0),l.up(f))}n(d,"handleUp");function p(f){!l||!r||(Tn(f,r,s),l.move(f))}return n(p,"handleMove"),(f,g)=>(C(),P("div",{class:"relative mx-[-12px] min-w-0 basis-0",style:nt({minHeight:`${o.value}px`})},[v("canvas",{ref_key:"canvasEl",ref:a,class:"absolute w-full cursor-crosshair",onPointerdown:Ve(c,["stop"]),onPointerup:Ve(d,["stop"]),onPointermove:Ve(p,["stop"])},null,544)],4))}}),DM=PM,LM=ft(()=>ut(()=>import("./WidgetButton-C38jCi-K.js"),__vite__mapDeps([31,2,3,4,17,18,16,32]),import.meta.url)),OM=ft(()=>ut(()=>import("./WidgetInputText-C2hSgXgj.js"),__vite__mapDeps([33,1,2,3,4,16,34,35,32]),import.meta.url)),fc=ft(()=>ut(()=>import("./WidgetInputNumber-BOKO36G3.js"),__vite__mapDeps([36,1,2,3,4,17,18,16,37,15,10,38,12,39,34,35,32,40]),import.meta.url)),NM=ft(()=>ut(()=>import("./WidgetToggleSwitch-Cr_gcxrn.js"),__vite__mapDeps([41,1,2,3,4,16,34,32]),import.meta.url)),$M=ft(()=>ut(()=>import("./WidgetSelect-DsJGH12l.js"),__vite__mapDeps([42,1,2,3,4,43,16,5,6,7,8,9,10,11,12,13,44,17,18,39,34,35,32,20,21,24,25]),import.meta.url)),RM=ft(()=>ut(()=>import("./WidgetColorPicker-BqD_P_fO.js"),__vite__mapDeps([45,1,2,3,4,16,34,35,13,32]),import.meta.url)),BM=ft(()=>ut(()=>import("./WidgetTextarea-DfQXNiz9.js"),__vite__mapDeps([46,1,2,3,4,16,35,32]),import.meta.url)),FM=ft(()=>ut(()=>import("./WidgetChart-W7Mx0ol0.js"),__vite__mapDeps([47,1,2,3,4]),import.meta.url)),UM=ft(()=>ut(()=>import("./WidgetImageCompare-DUdtG65y.js"),__vite__mapDeps([48,2,3,4]),import.meta.url)),WM=ft(()=>ut(()=>import("./WidgetGalleria-CnVS2r7z.js"),__vite__mapDeps([49,15,1,2,3,4,10,32,50]),import.meta.url)),zM=ft(()=>ut(()=>import("./WidgetMarkdown-BWek7AuF.js"),__vite__mapDeps([51,1,2,3,4,25]),import.meta.url)),VM=ft(()=>ut(()=>import("./WidgetLegacy-Bslv9wZZ.js"),__vite__mapDeps([52,1,2,3,4,5,6,7,8,9,10,11,12,13,17,18,16,20,21,24,25]),import.meta.url)),GM=ft(()=>ut(()=>import("./WidgetRecordAudio-Bzy8PIzN.js"),__vite__mapDeps([53,1,2,3,4,5,6,7,8,9,10,11,12,13,17,18,16,20,21,22,23,24,25]),import.meta.url)),HM=ft(()=>ut(()=>import("./AudioPreviewPlayer-BoEdyGI_.js"),__vite__mapDeps([54,1,2,3,4,5,6,7,8,9,10,11,12,13,17,18,16,20,21,55,15,22,56,57,24,25]),import.meta.url)),jM=ft(()=>ut(()=>import("./WidgetAudioUI-BDZxDx_r.js"),__vite__mapDeps([58,1,2,3,4,43,16,5,6,7,8,9,10,11,12,13,44,17,18,39,34,35,32,20,21,55,15,22,56,57,24,25]),import.meta.url)),KM=ft(()=>ut(()=>import("./Load3D-DHBmC_AU.js"),__vite__mapDeps([59,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,24,25]),import.meta.url)),YM=ft(()=>ut(()=>import("./WidgetImageCrop-CYRW7t2Q.js"),__vite__mapDeps([60,1,2,3,4,5,6,7,8,9,10,11,12,13,61,17,18,16,20,21,24,25]),import.meta.url)),qM=ft(()=>ut(()=>import("./WidgetBoundingBox-Drks44-Z.js"),__vite__mapDeps([62,2,3,4,61]),import.meta.url)),XM=[["button",{component:LM,aliases:["BUTTON"],essential:!1}],["string",{component:OM,aliases:["STRING","text"],essential:!1}],["int",{component:fc,aliases:["INT"],essential:!0}],["float",{component:fc,aliases:["FLOAT","number","slider"],essential:!0}],["boolean",{component:NM,aliases:["BOOLEAN","toggle"],essential:!0}],["combo",{component:$M,aliases:["COMBO","asset"],essential:!0}],["color",{component:RM,aliases:["COLOR"],essential:!1}],["textarea",{component:BM,aliases:["TEXTAREA","multiline","customtext"],essential:!1}],["chart",{component:FM,aliases:["CHART"],essential:!1}],["imagecompare",{component:UM,aliases:["IMAGECOMPARE"],essential:!1}],["galleria",{component:WM,aliases:["GALLERIA"],essential:!1}],["markdown",{component:zM,aliases:["MARKDOWN","progressText"],essential:!1}],["legacy",{component:VM,aliases:[],essential:!0}],["audiorecord",{component:GM,aliases:["AUDIO_RECORD","AUDIORECORD"],essential:!1}],["audioUI",{component:HM,aliases:["AUDIOUI","AUDIO_UI"],essential:!1}],["load3D",{component:KM,aliases:["LOAD_3D"],essential:!1}],["imagecrop",{component:YM,aliases:["IMAGECROP"],essential:!1}],["boundingbox",{component:qM,aliases:["BOUNDINGBOX"],essential:!1}]],ZM=n(()=>new Map([["audio",jM]]),"getComboWidgetAdditions"),Hf=new Map,jf=new Map;for(const[e,t]of XM){Hf.set(e,t);for(const a of t.aliases)jf.set(a,e)}var Kf=n(e=>jf.get(e)||e,"getCanonicalType");const JM=n((e,t)=>{if(e=="combo"){const o=ZM();if(o.has(t))return o.get(t)||null}const a=Kf(e);return Hf.get(a)?.component||null},"getComponent"),QM=n(e=>!e.options?.canvasOnly&&!!e.type,"shouldRenderAsVue");var eP=["textarea","markdown","load3D"];function tP(e){const t=Kf(e);return eP.includes(t)}n(tP,"shouldExpand");var aP={key:0,class:"node-error p-2 text-sm text-red-500"},oP={key:0,class:"lg-node-widget group col-span-full grid grid-cols-subgrid items-stretch"},nP=J({__name:"NodeWidgets",props:{nodeData:{}},setup(e){const{shouldHandleNodePointerEvents:t,forwardEventToCanvas:a}=vl(),{bringNodeToFront:o}=TM();function s(g){t.value||(g.stopPropagation(),a(g))}n(s,"handleWidgetPointerEvent");function r(){e.nodeData?.id!=null&&o(String(e.nodeData.id))}n(r,"handleBringToFront");const i=A(null),{toastErrorHandler:l}=ta();zn(g=>(i.value=g.message,l(g),!1));const u=E(()=>e.nodeData?.type||""),{getWidgetTooltip:c,createTooltipConfig:d}=yr(u.value),p=E(()=>{if(!e.nodeData?.widgets)return[];const{widgets:g}=e.nodeData,m=[];for(const h of g){let w=function(D){h.value=D,h.callback?.(D)};if(n(w,"updateHandler"),!QM(h))continue;const y=JM(h.type,h.name)||(h.isDOMWidget?MM:DM),{slotMetadata:k,options:S}=h,_=k?.linked?{...S,disabled:!0}:S,I={name:h.name,type:h.type,value:h.value,borderStyle:h.borderStyle,callback:h.callback,controlWidget:h.controlWidget,label:h.label,nodeType:h.nodeType,options:_,spec:h.spec},x=d(c(h));m.push({name:h.name,type:h.type,vueComponent:y,simplified:I,value:h.value,updateHandler:w,tooltipConfig:x,slotMetadata:k})}return m}),f=E(()=>{if(!e.nodeData?.widgets)return"";const g=new Set(Wt(p).map(m=>m.name));return e.nodeData.widgets.filter(m=>g.has(m.name)&&!m.options?.hidden).map(m=>tP(m.type)||m.hasLayoutSize?"auto":"min-content").join(" ")});return(g,m)=>{const h=ht("tooltip");return i.value?(C(),P("div",aP,$(b(De)("nodeErrors.widgets","Node Widgets Error")),1)):(C(),P("div",{key:1,class:pe(b(Pe)("lg-node-widgets grid grid-cols-[min-content_minmax(80px,max-content)_minmax(125px,auto)] flex-1 gap-y-1 pr-3",b(t)?"pointer-events-auto":"pointer-events-none")),style:nt({"grid-template-rows":f.value}),onPointerdownCapture:r,onPointerdown:s,onPointermove:s,onPointerup:s},[(C(!0),P(Se,null,Ze(p.value,(y,k)=>(C(),P(Se,{key:`widget-${k}-${y.name}`},[y.simplified.options?.hidden?H("",!0):(C(),P("div",oP,[v("div",{class:pe(b(Pe)("z-10 w-3 opacity-0 transition-opacity duration-150 group-hover:opacity-100 flex items-stretch",y.slotMetadata?.linked&&"opacity-100"))},[y.slotMetadata?(C(),X(Gf,{key:0,"slot-data":{name:y.name,type:y.type,boundingRect:[0,0,0,0]},"node-id":g.nodeData?.id!=null?String(g.nodeData.id):"",index:y.slotMetadata.index,socketless:y.simplified.spec?.socketless,"dot-only":""},null,8,["slot-data","node-id","index","socketless"])):H("",!0)],2),ze((C(),X(Wn(y.vueComponent),{modelValue:y.value,"onUpdate:modelValue":[S=>y.value=S,y.updateHandler],widget:y.simplified,"node-id":g.nodeData?.id!=null?String(g.nodeData.id):"","node-type":u.value,class:"col-span-2"},null,8,["modelValue","onUpdate:modelValue","widget","node-id","node-type"])),[[h,y.tooltipConfig,void 0,{left:!0}]])]))],64))),128))],38))}}}),sP=nP,rP=["data-node-id"],iP={class:"flex flex-col justify-center items-center relative pointer-events-none"},lP=["data-testid"],uP=J({__name:"LGraphNodePreview",props:{nodeDef:{},position:{default:"absolute"}},setup(e){const t=jn(),a=E(()=>{const o=Object.entries(e.nodeDef.inputs||{}).filter(([i,l])=>t.inputIsWidget(l)).map(([i,l])=>({name:i,type:l.widgetType||l.type,value:l.default!==void 0?l.default:l.type==="COMBO"&&Array.isArray(l.options)&&l.options.length>0?l.options[0]:"",options:{hidden:l.hidden,advanced:l.advanced,values:l.type==="COMBO"?l.options:void 0}})),s=Object.entries(e.nodeDef.inputs||{}).filter(([i,l])=>!t.inputIsWidget(l)).map(([i,l])=>({name:i,type:l.type,shape:l.isOptional?co.HollowCircle:void 0,boundingRect:[0,0,0,0],link:null})),r=(e.nodeDef.outputs||[]).map(i=>typeof i=="string"?{name:i,type:i,boundingRect:[0,0,0,0],links:[]}:{...i,boundingRect:[0,0,0,0],links:[]});return{id:`preview-${e.nodeDef.name}`,title:e.nodeDef.display_name||e.nodeDef.name,type:e.nodeDef.name,mode:0,selected:!1,executing:!1,widgets:o,inputs:s,outputs:r,flags:{collapsed:!1}}});return(o,s)=>(C(),P("div",{"data-node-id":a.value.id,class:pe(b(Pe)("bg-component-node-background lg-node pb-1 contain-style contain-layout w-[350px] rounded-2xl touch-none flex flex-col border-1 border-solid outline-transparent outline-2 border-node-stroke",o.position))},[v("div",iP,[R(HA,{"node-data":a.value},null,8,["node-data"])]),v("div",{class:"flex flex-1 flex-col gap-1 pb-2 pointer-events-none","data-testid":`node-body-${a.value.id}`},[R(EM,{"node-data":a.value},null,8,["node-data"]),a.value.widgets?.length?(C(),X(sP,{key:0,"node-data":a.value,class:"pointer-events-none"},null,8,["node-data"])):H("",!0)],8,lP)],10,rP))}}),cP=uP,dP={key:1,class:"_sb_node_preview bg-component-node-background"},pP={class:"_sb_table"},fP=["title"],mP={class:"_sb_preview_badge"},gP={class:"_sb_col"},hP={class:"_sb_col"},vP={class:"_sb_col"},yP=["innerHTML"],wP=J({__name:"NodePreview",props:{nodeDef:{},position:{default:"absolute"}},setup(e){const{shouldRenderVueNodes:t}=vr(),a=za(),o=E(()=>a.completedActivePalette.colors.litegraph_base),s=jn(),{description:r}=e.nodeDef,i=E(()=>r?zd(r):""),l=Object.values(e.nodeDef.inputs),u=e.nodeDef.outputs,c=l.filter(f=>!s.inputIsWidget(f)),d=l.filter(f=>s.inputIsWidget(f)),p=n((f,g=32)=>{let m;return typeof f=="object"&&f!==null||Array.isArray(f)?m=JSON.stringify(f):typeof f=="string"?m=f:m=String(f),Be.truncate(m,{length:g})},"truncateDefaultValue");return(f,g)=>b(t)?(C(),X(cP,{key:0,"node-def":f.nodeDef,position:f.position},null,8,["node-def","position"])):(C(),P("div",dP,[v("div",pP,[v("div",{class:"node_header mr-4 text-ellipsis",title:f.nodeDef.display_name,style:nt({backgroundColor:o.value.NODE_DEFAULT_COLOR,color:o.value.NODE_TITLE_COLOR})},[g[0]||(g[0]=v("div",{class:"_sb_dot headdot pr-3"},null,-1)),fe(" "+$(f.nodeDef.display_name),1)],12,fP),v("div",mP,$(f.$t("g.preview")),1),(C(!0),P(Se,null,Ze(b(Be).zip(b(c),b(u)),([m,h])=>(C(),P("div",{key:(m?.name||"")+(h?.index.toString()||""),class:"_sb_row slot_row"},[v("div",gP,[m?(C(),P("div",{key:0,class:pe(["_sb_dot",m.type])},null,2)):H("",!0)]),v("div",hP,$(m?m.name:""),1),g[1]||(g[1]=v("div",{class:"_sb_col middle-column"},null,-1)),v("div",{class:"_sb_col _sb_inherit",style:nt({color:o.value.NODE_TEXT_COLOR})},$(h?h.name:""),5),v("div",vP,[h?(C(),P("div",{key:0,class:pe(["_sb_dot",h.type])},null,2)):H("",!0)])]))),128)),(C(!0),P(Se,null,Ze(b(d),m=>(C(),P("div",{key:m.name,class:"_sb_row _long_field"},[g[2]||(g[2]=v("div",{class:"_sb_col _sb_arrow"},"◀",-1)),v("div",{class:"_sb_col",style:nt({color:o.value.WIDGET_SECONDARY_TEXT_COLOR})},$(m.name),5),g[3]||(g[3]=v("div",{class:"_sb_col middle-column"},null,-1)),v("div",{class:"_sb_col _sb_inherit",style:nt({color:o.value.WIDGET_TEXT_COLOR})},$(p(m.default)),5),g[4]||(g[4]=v("div",{class:"_sb_col _sb_arrow"},"▶",-1))]))),128))]),i.value?(C(),P("div",{key:0,class:"_sb_description",style:nt({color:o.value.WIDGET_SECONDARY_TEXT_COLOR,backgroundColor:o.value.WIDGET_BGCOLOR}),innerHTML:i.value},null,12,yP)):H("",!0)]))}}),wr=ot(wP,[["__scopeId","data-v-e348d541"]]),bP={class:"_content"},_P={class:"_footer"},kP=J({__name:"NodeSearchFilter",emits:["addFilter"],setup(e,{emit:t}){const a=E(()=>i.nodeSearchService.nodeFilters),o=A(),s=E(()=>o.value?.fuseSearch.data??[]),r=A(""),i=zt();it(()=>{o.value=i.nodeSearchService.nodeFilters[0],u()});const l=t,u=n(()=>{s.value.includes(r.value)||(r.value=s.value[0])},"updateSelectedFilterValue"),c=n(()=>{o.value&&l("addFilter",{filterDef:o.value,value:r.value})},"submit");return(d,p)=>(C(),P(Se,null,[v("div",bP,[R(b($i),{modelValue:o.value,"onUpdate:modelValue":p[0]||(p[0]=f=>o.value=f),class:"filter-type-select",options:a.value,"allow-empty":!1,"option-label":"name",onChange:u},null,8,["modelValue","options"]),R(b(Aa),{modelValue:r.value,"onUpdate:modelValue":p[1]||(p[1]=f=>r.value=f),class:"filter-value-select",options:s.value,filter:"","auto-filter-focus":""},null,8,["modelValue","options"])]),v("div",_P,[R(se,{type:"button",onClick:c},{default:W(()=>[fe($(d.$t("g.add")),1)]),_:1})])],64))}}),CP=ot(kP,[["__scopeId","data-v-96ed3454"]]);function Tl(e){return e.split("@")[0]}n(Tl,"normalizePackId");function Yf(e){return sg(e,(t,a)=>Tl(a))}n(Yf,"normalizePackKeys");function qf(e){const t=e?.split(".")||[];return t.length>=2&&t[0]==="custom_nodes"?Tl(t[1]):null}n(qf,"extractCustomNodeName");function xP(e){const t=Ji(e.python_module);if(t.type===to.Blueprint)return"";if(t.type===to.CustomNodes){const a=qf(e.python_module);if(a)return`/extensions/${a}/docs/`}return`/docs/${e.name}/`}n(xP,"getNodeHelpBaseUrl");var IP=class{static{n(this,"NodeHelpService")}async fetchNodeHelp(e,t){const a=Ji(e.python_module);return a.type===to.Blueprint?e.description||"":a.type===to.CustomNodes?this.fetchCustomNodeHelp(e,t):this.fetchCoreNodeHelp(e,t)}async fetchCustomNodeHelp(e,t){const a=qf(e.python_module);let o;if(!a)throw new Error("Invalid custom node module");const s=`/extensions/${a}/docs/${e.name}/${t}.md`,r=await this.tryFetchMarkdown(s);if(r.text)return r.text;o=r.errorText;const i=`/extensions/${a}/docs/${e.name}.md`,l=await this.tryFetchMarkdown(i);if(l.text)return l.text;throw o=l.errorText??o,new Error(o??"Help not found")}async fetchCoreNodeHelp(e,t){const a=`/docs/${e.name}/${t}.md`,o=await this.tryFetchMarkdown(a);if(!o.text)throw new Error(o.errorText??"Help not found");return o.text}async tryFetchMarkdown(e){const t=await fetch(oe.fileURL(e));if(!t.ok)return{text:null,errorText:t.statusText};const a=t.headers?.get?.("content-type")??"",o=await t.text();return a.includes("text/html")?{text:null,errorText:t.statusText}:{text:o}}};const SP=new IP;function EP(e){const{locale:t}=Fe(),a=A(""),o=A(!1),s=A(null);let r=null;const i=E(()=>{const u=Wt(e);return u?xP(u):""}),l=E(()=>zd(a.value,i.value));return be(()=>Wt(e),async u=>{if(a.value="",s.value=null,u){o.value=!0;const c=r=SP.fetchNodeHelp(u,t.value||"en");try{const d=await c;if(r!==c)return;a.value=d}catch(d){if(r!==c)return;s.value=d instanceof Error?d.message:String(d),a.value=u.description||""}finally{r===c&&(r=null,o.value=!1)}}},{immediate:!0}),{helpContent:a,isLoading:o,error:s,baseUrl:i,renderedHelpHtml:l}}n(EP,"useNodeHelpContent");var TP={class:"node-help-content mx-auto w-full"},AP=["innerHTML"],MP={key:2,class:"fallback-content space-y-6 text-sm"},PP={key:0},DP={key:1},LP={class:"overflow-x-auto"},OP={key:2},NP={class:"overflow-x-auto"},$P=J({__name:"NodeHelpContent",props:{node:{}},setup(e){const{renderedHelpHtml:t,isLoading:a,error:o}=EP(()=>e.node),s=E(()=>Object.values(e.node.inputs).map(i=>({name:i.name,type:i.type,tooltip:i.tooltip||""}))),r=E(()=>e.node.outputs.map(i=>({name:i.name,type:i.type,tooltip:i.tooltip||""})));return(i,l)=>(C(),P("div",TP,[b(a)?(C(),X(b(Io),{key:0,class:"m-auto","aria-label":i.$t("g.loading")},null,8,["aria-label"])):b(o)?(C(),P("div",MP,[i.node.description?(C(),P("p",PP,[v("strong",null,$(i.$t("g.description"))+":",1),fe(" "+$(i.node.description),1)])):H("",!0),s.value.length?(C(),P("div",DP,[v("p",null,[v("strong",null,$(i.$t("nodeHelpPage.inputs"))+":",1)]),v("table",LP,[v("thead",null,[v("tr",null,[v("th",null,$(i.$t("g.name")),1),v("th",null,$(i.$t("nodeHelpPage.type")),1),v("th",null,$(i.$t("g.description")),1)])]),v("tbody",null,[(C(!0),P(Se,null,Ze(s.value,u=>(C(),P("tr",{key:u.name},[v("td",null,[v("code",null,$(u.name),1)]),v("td",null,$(u.type),1),v("td",null,$(u.tooltip||"-"),1)]))),128))])])])):H("",!0),r.value.length?(C(),P("div",OP,[v("p",null,[v("strong",null,$(i.$t("nodeHelpPage.outputs"))+":",1)]),v("table",NP,[v("thead",null,[v("tr",null,[v("th",null,$(i.$t("g.name")),1),v("th",null,$(i.$t("nodeHelpPage.type")),1),v("th",null,$(i.$t("g.description")),1)])]),v("tbody",null,[(C(!0),P(Se,null,Ze(r.value,u=>(C(),P("tr",{key:u.name},[v("td",null,[v("code",null,$(u.name),1)]),v("td",null,$(u.type),1),v("td",null,$(u.tooltip||"-"),1)]))),128))])])])):H("",!0)])):(C(),P("div",{key:1,class:"markdown-content",innerHTML:b(t)},null,8,AP))]))}}),RP=ot($P,[["__scopeId","data-v-fdf10712"]]),BP={class:"flex h-full flex-col overflow-auto"},FP={class:"flex items-center border-b border-(--p-divider-color) px-3 py-2"},UP={class:"ml-2 font-semibold"},WP={class:"grow p-4"},zP=J({__name:"NodeHelpPage",props:{node:{}},emits:["close"],setup(e){return(t,a)=>{const o=ht("tooltip");return C(),P("div",BP,[v("div",FP,[ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":t.$t("g.back"),onClick:a[0]||(a[0]=s=>t.$emit("close"))},{default:W(()=>a[1]||(a[1]=[v("i",{class:"icon-[lucide--arrow-left] size-4"},null,-1)])),_:1},8,["aria-label"])),[[o,t.$t("g.back"),void 0,{bottom:!0}]]),v("span",UP,$(t.node.display_name),1)]),v("div",WP,[R(RP,{node:t.node},null,8,["node"])])])}}}),VP=zP,hn="Comfy.NodeLibrary.Bookmarks.V2";const rn=Je("nodeBookmark",()=>{const e=Me(),t=zt(),a=E(()=>e.get(hn)),o=E(()=>new Set(a.value)),s=E(()=>l(a.value)),r=n(_=>o.value.has(_.nodePath)||o.value.has(_.name),"isBookmarked"),i=n(async _=>{r(_)?(await c(_.nodePath),await c(_.name)):await u(_.name)},"toggleBookmark"),l=n(_=>Al(_.map(I=>{if(I.endsWith("/"))return P2(I);const w=I.split("/"),x=w.pop()??"",D=w.join("/"),T=t.nodeDefsByName[x];if(!T)return null;const N=Be.clone(T);return N.category=D,N}).filter(I=>I!==null)),"buildBookmarkTree"),u=n(async _=>{await e.set(hn,[...a.value,_])},"addBookmark"),c=n(async _=>{await e.set(hn,a.value.filter(I=>I!==_))},"deleteBookmark"),d=n(async(_,I)=>{const w=(_?_.nodePath:"")+I+"/";return await u(w),w},"addNewBookmarkFolder"),p=n(async(_,I)=>{if(!_.isDummyFolder)throw new Error("Cannot rename non-folder node");if(I.includes("/"))throw new Error('Folder name cannot contain "/"');const w=_.category.split("/").slice(0,-1).concat(I).join("/")+"/";if(w!==_.nodePath){if(a.value.some(x=>x.startsWith(w)))throw new Error(`Folder name "${w}" already exists`);await e.set(hn,a.value.map(x=>x.startsWith(_.nodePath)?x.replace(_.nodePath,w):x)),await y(_.nodePath,w)}},"renameBookmarkFolder"),f=n(async _=>{if(!_.isDummyFolder)throw new Error("Cannot delete non-folder node");await e.set(hn,a.value.filter(I=>I!==_.nodePath&&!I.startsWith(_.nodePath))),await h(_.nodePath)},"deleteBookmarkFolder"),g=E(()=>e.get("Comfy.NodeLibrary.BookmarksCustomization")),m=n(async(_,I)=>{const w={...g.value[_]||{},...I};w.icon===k&&delete w.icon,w.color===S&&delete w.color,Object.keys(w).length===0?await h(_):await e.set("Comfy.NodeLibrary.BookmarksCustomization",{...g.value,[_]:w})},"updateBookmarkCustomization"),h=n(async _=>{await e.set("Comfy.NodeLibrary.BookmarksCustomization",{...g.value,[_]:void 0})},"deleteBookmarkCustomization"),y=n(async(_,I)=>{const w={...g.value};w[_]&&(w[I]=w[_],delete w[_]),await e.set("Comfy.NodeLibrary.BookmarksCustomization",w)},"renameBookmarkCustomization"),k="pi-bookmark-fill",S="#a1a1aa";return{bookmarks:a,bookmarkedRoot:s,isBookmarked:r,toggleBookmark:i,addBookmark:u,addNewBookmarkFolder:d,renameBookmarkFolder:p,deleteBookmarkFolder:f,bookmarksCustomization:g,updateBookmarkCustomization:m,deleteBookmarkCustomization:h,renameBookmarkCustomization:y,defaultBookmarkIcon:k,defaultBookmarkColor:S}});var GP=J({__name:"NodeTreeLeaf",props:{node:{},openNodeHelp:{type:Function}},setup(e){const{t}=Fe(),a=e,o=E(()=>a.node.data),s=rn(),r=E(()=>s.isBookmarked(o.value)),i=Me(),l=E(()=>i.get("Comfy.Sidebar.Location")),u=n(async()=>{await s.toggleBookmark(o.value)},"toggleBookmark"),c=n(()=>{yt()?.trackUiButtonClicked({button_id:"node_library_help_button"}),a.openNodeHelp(o.value)},"onHelpClick"),d=n(async()=>{if(!a.node.data)throw new Error("Failed to edit subgraph blueprint lacking backing node data");await Ia().editBlueprint(a.node.data.name)},"editBlueprint"),p=A(null),f=E(()=>[{label:t("g.delete"),icon:"pi pi-trash",severity:"error",command:m}]);function g(x){o.value.name.startsWith(Ia().typePrefix)&&p.value?.show(x)}n(g,"handleContextMenu");function m(){a.node.data&&Ia().deleteBlueprint(a.node.data.name)}n(m,"deleteBlueprint");const h=A({position:"fixed",top:"0px",left:"0px",pointerEvents:"none",zIndex:1001}),y=n(async()=>{const x=S.value;if(!x)return;const D=x.getBoundingClientRect(),T=40;h.value.top=`${D.top}px`,h.value.left=l.value==="left"?`${D.right+T}px`:`${D.left-T}px`,h.value.transform=l.value==="right"?"translateX(-100%)":void 0},"handleNodeHover"),k=A(null),S=A(null),_=A(!1),I=n(async()=>{_.value=!0,await wa(),await y()},"handleMouseEnter"),w=n(()=>{_.value=!1},"handleMouseLeave");return it(()=>{S.value=k.value?.closest(".p-tree-node-content")??null,S.value?.addEventListener("mouseenter",I),S.value?.addEventListener("mouseleave",w)}),St(()=>{S.value?.removeEventListener("mouseenter",I),S.value?.removeEventListener("mouseleave",w)}),(x,D)=>{const T=ht("tooltip");return C(),P(Se,null,[v("div",{ref_key:"container",ref:k,class:"node-lib-node-container"},[R(xo,{node:x.node,onContextmenu:g},qo({"before-label":W(()=>[o.value.experimental?(C(),X(b(Mn),{key:0,value:x.$t("g.experimental"),severity:"primary"},null,8,["value"])):H("",!0),o.value.deprecated?(C(),X(b(Mn),{key:1,value:x.$t("g.deprecated"),severity:"danger"},null,8,["value"])):H("",!0)]),_:2},[o.value.name.startsWith(b(Ia)().typePrefix)?{name:"actions",fn:W(()=>[R(se,{variant:"destructive",size:"icon-sm","aria-label":x.$t("g.delete"),onClick:Ve(m,["stop"])},{default:W(()=>D[0]||(D[0]=[v("i",{class:"icon-[lucide--trash-2] size-3.5"},null,-1)])),_:1},8,["aria-label"]),R(se,{variant:"muted-textonly",size:"icon-sm","aria-label":x.$t("g.edit"),onClick:Ve(d,["stop"])},{default:W(()=>D[1]||(D[1]=[v("i",{class:"icon-[lucide--square-pen] size-3.5"},null,-1)])),_:1},8,["aria-label"])]),key:"0"}:{name:"actions",fn:W(()=>[R(se,{class:"bookmark-button",variant:"muted-textonly",size:"icon-sm","aria-label":x.$t("icon.bookmark"),onClick:Ve(u,["stop"])},{default:W(()=>[v("i",{class:pe(b(Pe)(r.value?"pi pi-bookmark-fill":"pi pi-bookmark","size-3.5"))},null,2)]),_:1},8,["aria-label"]),ze((C(),X(se,{class:"help-button",variant:"muted-textonly",size:"icon-sm","aria-label":x.$t("g.learnMore"),onClick:Ve(c,["stop"])},{default:W(()=>D[2]||(D[2]=[v("i",{class:"pi pi-question size-3.5"},null,-1)])),_:1},8,["aria-label"])),[[T,x.$t("g.learnMore"),void 0,{bottom:!0}]])]),key:"1"}]),1032,["node"]),_.value?(C(),X(bd,{key:0,to:"#node-library-node-preview-container"},[v("div",{class:"node-lib-node-preview",style:nt(h.value)},[R(wr,{"node-def":o.value},null,8,["node-def"])],4)])):H("",!0)],512),R(b(Ui),{ref_key:"menu",ref:p,model:f.value},null,8,["model"])],64)}}}),Xf=ot(GP,[["__scopeId","data-v-c8dc00f0"]]),mc="pi pi-sort";const Ti="category",Ai="original";var HP=class{static{n(this,"NodeOrganizationService")}groupingStrategies=[{id:"category",label:"sideToolbar.nodeLibraryTab.groupStrategies.category",icon:"pi pi-folder",description:"sideToolbar.nodeLibraryTab.groupStrategies.categoryDesc",getNodePath:n(e=>{const t=e.category||"";return[...t?t.split("/"):[],e.name]},"getNodePath")},{id:"module",label:"sideToolbar.nodeLibraryTab.groupStrategies.module",icon:"pi pi-box",description:"sideToolbar.nodeLibraryTab.groupStrategies.moduleDesc",getNodePath:n(e=>{const t=e.python_module||"";if(!t)return["unknown_module",e.name];const a=t.split(".");return a[0]==="nodes"?["core",e.name]:a[0]==="custom_nodes"?a.length>1?[a[1],e.name]:["custom_nodes",e.name]:[...a,e.name]},"getNodePath")},{id:"source",label:"sideToolbar.nodeLibraryTab.groupStrategies.source",icon:"pi pi-server",description:"sideToolbar.nodeLibraryTab.groupStrategies.sourceDesc",getNodePath:n(e=>e.api_node?["API nodes",e.name]:e.nodeSource.type===to.Core?["Core",e.name]:e.nodeSource.type===to.CustomNodes?["Custom nodes",e.name]:["Unknown",e.name],"getNodePath")}];sortingStrategies=[{id:"original",label:"sideToolbar.nodeLibraryTab.sortBy.original",icon:"pi pi-sort-alt",description:"sideToolbar.nodeLibraryTab.sortBy.originalDesc",compare:n(()=>0,"compare")},{id:"alphabetical",label:"sideToolbar.nodeLibraryTab.sortBy.alphabetical",icon:"pi pi-sort-alpha-down",description:"sideToolbar.nodeLibraryTab.sortBy.alphabeticalDesc",compare:n((e,t)=>(e.display_name??"").localeCompare(t.display_name??""),"compare")}];getGroupingStrategies(){return[...this.groupingStrategies]}getGroupingStrategy(e){return this.groupingStrategies.find(t=>t.id===e)}getSortingStrategies(){return[...this.sortingStrategies]}getSortingStrategy(e){return this.sortingStrategies.find(t=>t.id===e)}organizeNodes(e,t={}){const{groupBy:a=Ti,sortBy:o=Ai}=t,s=this.getGroupingStrategy(a),r=this.getSortingStrategy(o);if(!s)throw new Error(`Unknown grouping strategy: ${a}`);if(!r)throw new Error(`Unknown sorting strategy: ${o}`);const i=Al(r.id!=="original"?[...e].sort(r.compare):e,{pathExtractor:s.getNodePath});return o==="alphabetical"?Xs(i,{groupLeaf:!0}):i}getGroupingIcon(e){return this.getGroupingStrategy(e)?.icon||mc}getSortingIcon(e){return this.getSortingStrategy(e)?.icon||mc}};const vn=new HP,jP=Je("nodeHelp",()=>{const e=A(null),t=E(()=>e.value!==null);function a(s){e.value=s}n(a,"openHelp");function o(){e.value=null}return n(o,"closeHelp"),{currentHelpNode:e,isHelpOpen:t,openHelp:a,closeHelp:o}});var KP={class:"color-customization-selector-container flex flex-row items-center gap-2"},YP={key:1,class:"pi pi-palette text-lg"},qP=J({__name:"ColorCustomizationSelector",props:{modelValue:{},colorOptions:{},allowCustom:{type:Boolean,default:!0}},emits:["update:modelValue"],setup(e,{emit:t}){const a={name:"_custom",value:""},o=E(()=>[...e.colorOptions,...e.allowCustom?[a]:[]]),s=t,r=A(a),i=A("");return it(()=>{if(e.modelValue){const l=e.colorOptions.find(u=>u.value===e.modelValue);l?r.value=l:(r.value=a,i.value=e.modelValue.replace("#",""))}}),be(r,(l,u)=>{l.name==="_custom"?i.value=u.value.replace("#",""):s("update:modelValue",l.value)}),be(i,l=>{r.value.name==="_custom"&&s("update:modelValue",l?`#${l}`:null)}),(l,u)=>(C(),P("div",KP,[R(b($i),{modelValue:r.value,"onUpdate:modelValue":u[0]||(u[0]=c=>r.value=c),options:o.value,"option-label":"name","data-key":"value","allow-empty":!1},{option:W(c=>[c.option.name!=="_custom"?(C(),P("div",{key:0,style:nt({width:"20px",height:"20px",backgroundColor:c.option.value,borderRadius:"50%"})},null,4)):(C(),P("i",YP))]),_:1},8,["modelValue","options"]),r.value.name==="_custom"?(C(),X(b(id),{key:0,modelValue:i.value,"onUpdate:modelValue":u[1]||(u[1]=c=>i.value=c)},null,8,["modelValue"])):H("",!0)]))}}),XP=qP,ZP={class:"p-fluid"},JP={class:"field icon-field"},QP={for:"icon"},e2={class:"field color-field"},t2={for:"color"},a2=J({__name:"CustomizationDialog",props:{modelValue:{type:Boolean},initialIcon:{},initialColor:{}},emits:["update:modelValue","confirm"],setup(e,{emit:t}){const{t:a}=Fe(),o=e,s=t,r=E({get:n(()=>o.modelValue,"get"),set:n(h=>s("update:modelValue",h),"set")}),i=rn(),l=[{name:a("icon.bookmark"),value:i.defaultBookmarkIcon},{name:a("icon.folder"),value:"pi-folder"},{name:a("icon.star"),value:"pi-star"},{name:a("icon.heart"),value:"pi-heart"},{name:a("icon.file"),value:"pi-file"},{name:a("icon.inbox"),value:"pi-inbox"},{name:a("icon.box"),value:"pi-box"},{name:a("icon.briefcase"),value:"pi-briefcase"}],u=[{name:a("color.default"),value:i.defaultBookmarkColor},{name:a("color.blue"),value:"#007bff"},{name:a("color.green"),value:"#28a745"},{name:a("color.red"),value:"#dc3545"},{name:a("color.pink"),value:"#e83e8c"},{name:a("color.yellow"),value:"#ffc107"}],c=l.find(h=>h.value===i.defaultBookmarkIcon),d=A(c),p=A(o.initialColor||i.defaultBookmarkColor),f=n(()=>{d.value=l.find(h=>h.value===o.initialIcon)||c,p.value=o.initialColor||i.defaultBookmarkColor},"resetCustomization"),g=n(()=>{s("confirm",d.value.value,p.value),m()},"confirmCustomization"),m=n(()=>{r.value=!1},"closeDialog");return be(()=>o.modelValue,h=>{h&&f()},{immediate:!0}),(h,y)=>(C(),X(b(rd),{visible:r.value,"onUpdate:visible":y[2]||(y[2]=k=>r.value=k),header:h.$t("g.customizeFolder")},{footer:W(()=>[R(se,{variant:"textonly",onClick:f},{default:W(()=>[y[3]||(y[3]=v("i",{class:"pi pi-refresh"},null,-1)),fe(" "+$(h.$t("g.reset")),1)]),_:1}),R(se,{autofocus:"",onClick:g},{default:W(()=>[y[4]||(y[4]=v("i",{class:"pi pi-check"},null,-1)),fe(" "+$(h.$t("g.confirm")),1)]),_:1})]),default:W(()=>[v("div",ZP,[v("div",JP,[v("label",QP,$(h.$t("g.icon")),1),R(b($i),{modelValue:d.value,"onUpdate:modelValue":y[0]||(y[0]=k=>d.value=k),options:l,"option-label":"name","data-key":"value"},{option:W(k=>[v("i",{class:pe(["pi",k.option.value,"mr-2"]),style:nt({color:p.value})},null,6)]),_:1},8,["modelValue"])]),R(b(la)),v("div",e2,[v("label",t2,$(h.$t("g.color")),1),R(XP,{modelValue:p.value,"onUpdate:modelValue":y[1]||(y[1]=k=>p.value=k),"color-options":u},null,8,["modelValue"])])])]),_:1},8,["visible","header"]))}}),o2=ot(a2,[["__scopeId","data-v-254ef6c3"]]),n2=J({__name:"NodeTreeFolder",props:{node:{}},setup(e){const t=rn(),a=E(()=>{const d=e.node.data;return d?t.bookmarksCustomization[d.nodePath]:void 0}),o=A(null),s=A(null);let r=null;const i=A(null);it(()=>{o.value=i.value?.closest(".p-tree-node-content"),s.value=o.value.querySelector(":scope > .p-tree-node-icon"),l(),r=be(a,l,{deep:!0})});const l=n(()=>{s.value&&a.value&&(s.value.style.color=a.value.color??"")},"updateIconColor");St(()=>{r&&r()});const u=Ma(Nf),c=n(d=>{u&&(u.value[d.key]=!0)},"handleItemDrop");return(d,p)=>(C(),P("div",{ref_key:"container",ref:i,class:"node-lib-node-container"},[R(xo,{node:d.node,onItemDropped:c},null,8,["node"])],512))}}),s2=n2,r2=J({__name:"NodeBookmarkTreeExplorer",props:{filteredNodeDefs:{},openNodeHelp:{type:Function}},setup(e,{expose:t}){const a=ji().appContext,o=e,s=A({}),{expandNode:r,toggleNodeOnEvent:i}=hr(s),l=rn(),u=E(()=>{const S=n(_=>{if(_.leaf)return o.filteredNodeDefs.some(w=>w.name===_.data.name)?_:null;const I=_.children?.map(S).filter(w=>w!==null);return I&&I.length>0?{..._,children:I}:null},"filterTree");return o.filteredNodeDefs.length?S(l.bookmarkedRoot)||{key:"root",label:"Root",children:[]}:l.bookmarkedRoot});be(()=>o.filteredNodeDefs,async S=>{S.length&&(await wa(),r(u.value))});const{t:c}=Fe(),d=n(S=>[{label:c("g.customize"),icon:"pi pi-palette",command:n(()=>{if(!S.data)return;const _=l.bookmarksCustomization[S.data.nodePath];m.value=_?.icon||l.defaultBookmarkIcon,h.value=_?.color||l.defaultBookmarkColor,g.value=!0,y.value=S.data.nodePath},"command"),visible:!S?.leaf}],"extraMenuItems"),p=E(()=>{const S=n(_=>{const I=_.children?.map(S)?.sort((w,x)=>w.leaf===x.leaf?w.label.localeCompare(x.label):w.leaf?1:-1);return{key:_.key,label:_.leaf?_.data.display_name:_.label,leaf:_.leaf,data:_.data,getIcon(){if(this.leaf)return"pi pi-circle-fill";const w=l.bookmarksCustomization[_.data?.nodePath];return w?.icon?"pi "+w.icon:"pi pi-bookmark-fill"},children:I,draggable:_.leaf,async handleAddFolder(w){w!==""&&await l.addNewBookmarkFolder(this.data,w)},renderDragPreview(w){const x=kd(wr,{nodeDef:_.data});return x.appContext=a,Os(x,w),()=>{Os(null,w)}},droppable:!_.leaf,async handleDrop(w){const x=w.data.data;l.isBookmarked(x)&&await l.toggleBookmark(x);const D=_.data.category+"/"+x.name;await l.addBookmark(D)},handleClick(w){this.leaf?Tt().addNodeOnGraph(this.data):i(w,_)},contextMenuItems:d,..._.leaf?{}:{async handleRename(w){this.data&&this.data.isDummyFolder&&await l.renameBookmarkFolder(this.data,w)},async handleDelete(){await l.deleteBookmarkFolder(this.data)}}}},"fillNodeInfo");return S(u.value)}),f=A(null);t({addNewBookmarkFolder:n(()=>f.value?.addFolderCommand("root"),"addNewBookmarkFolder")});const g=A(!1),m=A(l.defaultBookmarkIcon),h=A(l.defaultBookmarkColor),y=A(""),k=n(async(S,_)=>{y.value&&await l.updateBookmarkCustomization(y.value,{icon:S,color:_})},"updateCustomization");return(S,_)=>(C(),P(Se,null,[R(fo,{ref_key:"treeExplorerRef",ref:f,class:"node-lib-bookmark-tree-explorer",root:p.value,"expanded-keys":s.value},{folder:W(({node:I})=>[R(s2,{node:I},null,8,["node"])]),node:W(({node:I})=>[R(Xf,{node:I,"open-node-help":o.openNodeHelp},null,8,["node","open-node-help"])]),_:1},8,["root","expanded-keys"]),R(o2,{modelValue:g.value,"onUpdate:modelValue":_[0]||(_[0]=I=>g.value=I),"initial-icon":m.value,"initial-color":h.value,onConfirm:k},null,8,["modelValue","initial-icon","initial-color"])],64))}}),i2=r2,l2={class:"h-full"},u2={class:"flex flex-col gap-1 p-2"},c2={class:"flex flex-col gap-1 p-2"},d2={class:"px-2 2xl:px-4"},p2=J({__name:"NodeLibrarySidebarTab",setup(e){const t=ji().appContext,a=zt(),o=rn(),s=jP(),r=Pt(),i=A({}),{expandNode:l,toggleNodeOnEvent:u}=hr(i),c=A(null),d=A();it(()=>{d.value?.focus()});const p=A(null),f=A(null),g=A(null),m=si("Comfy.NodeLibrary.GroupBy",Ti),h=si("Comfy.NodeLibrary.SortBy",Ai),y=A(""),{currentHelpNode:k,isHelpOpen:S}=Vn(s),{openHelp:_,closeHelp:I}=s,w=E(()=>vn.getGroupingStrategies().map(ae=>({id:ae.id,label:ae.label,icon:ae.icon}))),x=E(()=>vn.getSortingStrategies().map(ae=>({id:ae.id,label:ae.label,icon:ae.icon}))),D=E(()=>vn.getGroupingIcon(m.value)),T=E(()=>vn.getSortingIcon(h.value)),N=n(ae=>{m.value=ae,f.value?.hide()},"selectGrouping"),M=n(ae=>{h.value=ae,g.value?.hide()},"selectSorting"),O=n(()=>{m.value=Ti,h.value=Ai},"resetOrganization"),L=E(()=>{const ae=K.value.length>0?K.value:a.visibleNodeDefs;return vn.organizeNodes(ae,{groupBy:m.value,sortBy:h.value})}),F=E(()=>{const ae=n(ce=>{const ee=ce.children?.map(ae);return{key:ce.key,label:ce.leaf?ce.data.display_name:ce.label,leaf:ce.leaf,data:ce.data,getIcon(){if(this.leaf)return"pi pi-circle-fill"},children:ee,draggable:ce.leaf,renderDragPreview(ne){const B=kd(wr,{nodeDef:ce.data});return B.appContext=t,Os(B,ne),()=>{Os(null,ne)}},handleClick(ne){this.leaf?Tt().addNodeOnGraph(this.data):u(ne,this)}}},"fillNodeInfo");return ae(L.value)}),K=A([]),j=A([]),V=n(async ae=>{if(ae.length===0&&!j.value.length){K.value=[],i.value={};return}const ce=j.value.map(ee=>ee.filter);K.value=a.nodeSearchService.searchNode(ae,ce,{limit:64},{matchWildcards:!1}),await wa(),K.value.length>0&&l(L.value)},"handleSearch"),q=n(async ae=>{j.value.push({filter:ae,badge:ae.filterDef.invokeSequence.toUpperCase(),badgeClass:ae.filterDef.invokeSequence+"-badge",text:ae.value,id:+new Date}),await V(y.value)},"onAddFilter"),re=n(async ae=>{const ce=j.value.findIndex(ee=>ee===ae);ce!==-1&&j.value.splice(ce,1),await V(y.value)},"onRemoveFilter");return(ae,ce)=>{const ee=ht("tooltip");return C(),P(Se,null,[v("div",l2,[b(S)?(C(),X(VP,{key:1,node:b(k),onClose:b(I)},null,8,["node","onClose"])):(C(),X(mr,{key:0,title:ae.$t("sideToolbar.nodeLibrary")},{"tool-buttons":W(()=>[ze((C(),X(se,{class:"new-folder-button",variant:"muted-textonly",size:"icon","aria-label":ae.$t("g.newFolder"),onClick:ce[0]||(ce[0]=ne=>c.value?.addNewBookmarkFolder())},{default:W(()=>ce[7]||(ce[7]=[v("i",{class:"icon-[lucide--folder-plus] size-4"},null,-1)])),_:1},8,["aria-label"])),[[ee,ae.$t("g.newFolder"),void 0,{bottom:!0}]]),ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":ae.$t("sideToolbar.nodeLibraryTab.groupBy"),onClick:ce[1]||(ce[1]=ne=>f.value?.toggle(ne))},{default:W(()=>[v("i",{class:pe([D.value,"size-4"])},null,2)]),_:1},8,["aria-label"])),[[ee,ae.$t("sideToolbar.nodeLibraryTab.groupBy"),void 0,{bottom:!0}]]),ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":ae.$t("sideToolbar.nodeLibraryTab.sortMode"),onClick:ce[2]||(ce[2]=ne=>g.value?.toggle(ne))},{default:W(()=>[v("i",{class:pe([T.value,"size-4"])},null,2)]),_:1},8,["aria-label"])),[[ee,ae.$t("sideToolbar.nodeLibraryTab.sortMode"),void 0,{bottom:!0}]]),ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":ae.$t("sideToolbar.nodeLibraryTab.resetView"),onClick:O},{default:W(()=>ce[8]||(ce[8]=[v("i",{class:"icon-[lucide--filter-x] size-4"},null,-1)])),_:1},8,["aria-label"])),[[ee,ae.$t("sideToolbar.nodeLibraryTab.resetView"),void 0,{bottom:!0}]]),ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":ae.$t("menu.refresh"),onClick:ce[3]||(ce[3]=()=>b(r).execute("Comfy.RefreshNodeDefinitions"))},{default:W(()=>ce[9]||(ce[9]=[v("i",{class:"icon-[lucide--refresh-cw] size-4"},null,-1)])),_:1},8,["aria-label"])),[[ee,ae.$t("menu.refresh"),void 0,{bottom:!0}]]),R(b(mo),{ref_key:"groupingPopover",ref:f},{default:W(()=>[v("div",u2,[(C(!0),P(Se,null,Ze(w.value,ne=>(C(),X(se,{key:ne.id,variant:b(m)===ne.id?"primary":"textonly",class:"justify-start",onClick:n(B=>N(ne.id),"onClick")},{default:W(()=>[v("i",{class:pe([ne.icon,"size-4"])},null,2),fe(" "+$(ae.$t(ne.label)),1)]),_:2},1032,["variant","onClick"]))),128))])]),_:1},512),R(b(mo),{ref_key:"sortingPopover",ref:g},{default:W(()=>[v("div",c2,[(C(!0),P(Se,null,Ze(x.value,ne=>(C(),X(se,{key:ne.id,variant:b(h)===ne.id?"primary":"textonly",class:"justify-start",onClick:n(B=>M(ne.id),"onClick")},{default:W(()=>[v("i",{class:pe([ne.icon,"size-4"])},null,2),fe(" "+$(ae.$t(ne.label)),1)]),_:2},1032,["variant","onClick"]))),128))])]),_:1},512)]),header:W(()=>[v("div",d2,[R(Ao,{ref_key:"searchBoxRef",ref:d,"model-value":y.value,"onUpdate:modelValue":ce[4]||(ce[4]=ne=>y.value=ne),class:"node-lib-search-box",placeholder:ae.$t("g.searchNodes")+"...","filter-icon":"pi pi-filter",filters:j.value,onSearch:V,onShowFilter:ce[5]||(ce[5]=ne=>p.value?.toggle(ne)),onRemoveFilter:re},null,8,["model-value","placeholder","filters"]),R(b(mo),{ref_key:"searchFilter",ref:p,class:"ml-[-13px]"},{default:W(()=>[R(CP,{onAddFilter:q})]),_:1},512)])]),body:W(()=>[v("div",null,[R(i2,{ref_key:"nodeBookmarkTreeExplorerRef",ref:c,"filtered-node-defs":K.value,"open-node-help":b(_)},null,8,["filtered-node-defs","open-node-help"]),ze(R(b(la),{type:"dashed",class:"m-2"},null,512),[[_o,b(o).bookmarks.length>0]]),R(fo,{"expanded-keys":i.value,"onUpdate:expandedKeys":ce[6]||(ce[6]=ne=>i.value=ne),class:"node-lib-tree-explorer",root:F.value},{node:W(({node:ne})=>[R(Xf,{node:ne,"open-node-help":b(_)},null,8,["node","open-node-help"])]),_:1},8,["expanded-keys","root"])])]),_:1},8,["title"]))]),ce[10]||(ce[10]=v("div",{id:"node-library-node-preview-container"},null,-1))],64)}}}),f2=p2;const m2=n(()=>({id:"node-library",icon:"icon-[comfy--node]",title:"sideToolbar.nodeLibrary",tooltip:"sideToolbar.nodeLibrary",label:"sideToolbar.labels.nodes",component:bt(f2),type:"vue"}),"useNodeLibrarySidebarTab");var g2={class:"flex items-center"},h2={key:0,class:"mr-2 shrink-0"},v2={key:1,class:"ml-2 shrink-0"},y2=J({__name:"TextDivider",props:{text:{},position:{default:"left"},align:{default:"center"},type:{default:"solid"},layout:{default:"horizontal"}},setup(e){return(t,a)=>(C(),P("div",g2,[t.position==="left"?(C(),P("span",h2,$(t.text),1)):H("",!0),R(b(la),{align:t.align,type:t.type,layout:t.layout,class:"grow"},null,8,["align","type","layout"]),t.position==="right"?(C(),P("span",v2,$(t.text),1)):H("",!0)]))}}),Fr=y2,w2=J({__name:"WorkflowTreeLeaf",props:{node:{}},setup(e){const t=Nl(),a=E(()=>e.node.data&&t.isBookmarked(e.node.data.path)),o=n(async()=>{e.node.data&&await t.toggleBookmarked(e.node.data.path)},"handleBookmarkClick");return(s,r)=>(C(),X(xo,{node:s.node},{actions:W(()=>[R(se,{variant:"muted-textonly",size:"icon-sm","aria-label":s.$t("icon.bookmark"),onClick:Ve(o,["stop"])},{default:W(()=>[v("i",{class:pe([a.value?"pi pi-bookmark-fill":"pi pi-bookmark","size-3.5"])},null,2)]),_:1},8,["aria-label"])]),_:1},8,["node"]))}}),Ur=w2,b2={class:"px-2 2xl:px-4"},_2={key:0,class:"comfyui-workflows-panel"},k2={key:0,class:"comfyui-workflows-open"},C2={key:0},x2={class:"comfyui-workflows-bookmarks"},I2={class:"comfyui-workflows-browse"},S2={key:1,class:"comfyui-workflows-search-panel"},Ro=(function(e){return e.Open="Open",e.Bookmarks="Bookmarks",e.Browse="Browse",e})(Ro||{}),E2=J({__name:"WorkflowsSidebarTab",setup(e){const t=Me(),a=E(()=>t.get("Comfy.Workflow.WorkflowTabsPosition")),o=A(),s=A(""),r=E(()=>s.value.length>0),i=A([]),l=E(()=>S(i.value)),u=n(async N=>{if(N.length===0){i.value=[],g.value={};return}const M=N.toLocaleLowerCase();i.value=c.workflows.filter(O=>O.path.toLocaleLowerCase().includes(M)),await wa(),m(l.value)},"handleSearch"),c=wt(),d=_a(),p=Ra(),{t:f}=Fe(),g=A({}),{expandNode:m,toggleNodeOnEvent:h}=hr(g),y=A({}),k=n(async N=>{N&&await d.closeWorkflow(N,{warnIfUnsaved:!p.shiftDown})},"handleCloseWorkflow"),S=n(N=>yo(N,M=>M.key.split("/")),"buildWorkflowTree"),_=E(()=>Xs(S(c.persistedWorkflows),{groupLeaf:!0})),I=E(()=>yo(c.bookmarkedWorkflows,N=>[N.key])),w=E(()=>yo(c.openWorkflows,N=>[N.key])),x=n((N,M)=>{const O=N.children?.map(j=>x(j,M)),L=N.data;async function F(j){this.leaf?await d.openWorkflow(L):h(j,this)}n(F,"handleClick");const K=N.leaf?{handleClick:F,async handleRename(j){const V=M===Ro.Browse?L.directory+"/"+go(j):qa.basePath+go(j);await d.renameWorkflow(L,V)},handleDelete:L.isTemporary?void 0:async function(){await d.deleteWorkflow(L)},contextMenuItems(){return[{label:f("g.insert"),icon:"pi pi-file-export",command:n(async()=>{const j=N.data;await d.insertWorkflow(j)},"command")},{label:f("g.duplicate"),icon:"pi pi-file-export",command:n(async()=>{const j=N.data;await d.duplicateWorkflow(j)},"command")}]},draggable:!0}:{handleClick:F};return{key:N.key,label:N.label,leaf:N.leaf,data:N.data,children:O,...K}},"renderTreeNode"),D=E(()=>({[`root/${c.activeWorkflow?.key}`]:!0})),T=Nl();return it(async()=>{o.value?.focus(),await T.loadBookmarks()}),(N,M)=>{const O=ht("tooltip");return C(),P(Se,null,[R(mr,Ht({title:N.$t("sideToolbar.workflows")},N.$attrs,{class:"workflows-sidebar-tab"}),{"tool-buttons":W(()=>[ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":N.$t("g.refresh"),onClick:M[0]||(M[0]=L=>b(c).syncWorkflows())},{default:W(()=>M[6]||(M[6]=[v("i",{class:"icon-[lucide--refresh-cw] size-4"},null,-1)])),_:1},8,["aria-label"])),[[O,N.$t("g.refresh"),void 0,{bottom:!0}]])]),header:W(()=>[v("div",b2,[R(Ao,{ref_key:"searchBoxRef",ref:o,"model-value":s.value,"onUpdate:modelValue":M[1]||(M[1]=L=>s.value=L),class:"workflows-search-box",placeholder:N.$t("g.searchWorkflows")+"...",onSearch:u},null,8,["model-value","placeholder"])])]),body:W(()=>[r.value?(C(),P("div",S2,[R(fo,{"expanded-keys":g.value,"onUpdate:expandedKeys":M[5]||(M[5]=L=>g.value=L),root:x(l.value,Ro.Browse)},{node:W(({node:L})=>[R(Ur,{node:L},null,8,["node"])]),_:1},8,["expanded-keys","root"])])):(C(),P("div",_2,[a.value==="Sidebar"?(C(),P("div",k2,[R(Fr,{text:b(f)("sideToolbar.workflowTab.workflowTreeType.open"),type:"dashed",class:"ml-2"},null,8,["text"]),R(fo,{"expanded-keys":y.value,"onUpdate:expandedKeys":M[2]||(M[2]=L=>y.value=L),root:x(w.value,Ro.Open),"selection-keys":D.value},{node:W(({node:L})=>[R(xo,{node:L},{"before-label":W(({node:F})=>[F.data?.isModified||!F.data?.isPersisted?(C(),P("span",C2,"*")):H("",!0)]),actions:W(({node:F})=>[R(se,{class:"close-workflow-button",variant:b(p).shiftDown?"destructive":"textonly",size:"icon-sm","aria-label":N.$t("g.close"),onClick:Ve(K=>k(F.data),["stop"])},{default:W(()=>M[7]||(M[7]=[v("i",{class:"icon-[lucide--x] size-3"},null,-1)])),_:2},1032,["variant","aria-label","onClick"])]),_:2},1032,["node"])]),_:1},8,["expanded-keys","root","selection-keys"])])):H("",!0),ze(v("div",x2,[R(Fr,{text:b(f)("sideToolbar.workflowTab.workflowTreeType.bookmarks"),type:"dashed",class:"ml-2"},null,8,["text"]),R(fo,{"expanded-keys":y.value,"onUpdate:expandedKeys":M[3]||(M[3]=L=>y.value=L),root:x(I.value,Ro.Bookmarks),"selection-keys":D.value},{node:W(({node:L})=>[R(Ur,{node:L},null,8,["node"])]),_:1},8,["expanded-keys","root","selection-keys"])],512),[[_o,b(c).bookmarkedWorkflows.length>0]]),v("div",I2,[R(Fr,{text:b(f)("sideToolbar.workflowTab.workflowTreeType.browse"),type:"dashed",class:"ml-2"},null,8,["text"]),b(c).persistedWorkflows.length>0?(C(),X(fo,{key:0,"expanded-keys":g.value,"onUpdate:expandedKeys":M[4]||(M[4]=L=>g.value=L),root:x(_.value,Ro.Browse),"selection-keys":D.value},{node:W(({node:L})=>[R(Ur,{node:L},null,8,["node"])]),_:1},8,["expanded-keys","root","selection-keys"])):(C(),X(Va,{key:1,icon:"pi pi-folder",title:N.$t("g.empty"),message:N.$t("g.noWorkflowsFound")},null,8,["title","message"]))])]))]),_:1},16,["title"]),R(b(Vm))],64)}}}),T2=E2;const A2=n(()=>{const e=Me(),t=wt();return{id:"workflows",icon:"icon-[comfy--workflow]",iconBadge:n(()=>{if(e.get("Comfy.Workflow.WorkflowTabsPosition")!=="Sidebar")return null;const a=t.openWorkflows.length.toString();return a==="0"?null:a},"iconBadge"),title:"sideToolbar.workflows",tooltip:"sideToolbar.workflows",label:"sideToolbar.labels.workflows",component:bt(T2),type:"vue"}},"useWorkflowsSidebarTab"),M2=Je("sidebarTab",()=>{const e=A([]),t=A(null),a=E(()=>e.value.find(l=>l.id===t.value)??null),o=n(l=>{t.value=t.value===l?null:l},"toggleSidebarTab"),s=n(l=>{e.value=[...e.value,l];const u=n(()=>`Toggle ${Er(l.title)?G(l.title):l.title} Sidebar`,"labelFunction"),c=l.tooltip?Er(String(l.tooltip))?()=>G(String(l.tooltip)):String(l.tooltip):void 0,d=n(()=>{const p={"node-library":"sideToolbar.nodeLibrary","model-library":"sideToolbar.modelLibrary",workflows:"sideToolbar.workflows",assets:"sideToolbar.assets"}[l.id];return p&&Er(p)?G(p):l.title},"menubarLabelFunction");Pt().registerCommand({id:`Workspace.ToggleSidebarTab.${l.id}`,icon:typeof l.icon=="string"?l.icon:void 0,label:u,menubarLabel:d,tooltip:c,versionAdded:"1.3.9",category:"view-controls",function:n(async()=>{const p=Me(),f=Pt();if(l.id==="model-library"&&p.get("Comfy.Assets.UseAssetAPI")){await f.commands.find(g=>g.id==="Comfy.BrowseModelAssets")?.function?.();return}o(l.id)},"function"),active:n(()=>a.value?.id===l.id,"active"),source:"System"})},"registerSidebarTab");return{sidebarTabs:e,activeSidebarTabId:t,activeSidebarTab:a,toggleSidebarTab:o,registerSidebarTab:s,unregisterSidebarTab:n(l=>{const u=e.value.findIndex(c=>c.id===l);if(u!==-1){const c=e.value[u];c.type==="custom"&&c.destroy&&c.destroy();const d=[...e.value];d.splice(u,1),e.value=d}},"unregisterSidebarTab"),registerCoreSidebarTabs:n(()=>{s(NT()),s(m2()),s(IA()),s(A2());const l=yp();l.registerCommands(["View"],["Workspace.ToggleBottomPanel","Comfy.BrowseTemplates","Workspace.ToggleFocusMode","Comfy.ToggleCanvasInfo","Comfy.Canvas.ToggleMinimap","Comfy.Canvas.ToggleLinkVisibility"]),l.registerCommands(["View"],["Comfy.Canvas.ZoomIn","Comfy.Canvas.ZoomOut","Comfy.Canvas.FitView"])},"registerCoreSidebarTabs")}}),Ra=Je("workspace",()=>{const e=A(!1),t=A(!1),a=A(!1),o=E(()=>Oe()),s=E(()=>fx()),r=E(()=>({commands:Pt().commands,execute:Pt().execute})),i=E(()=>M2()),l=E(()=>({settings:Me().settingsById,get:n(I=>Me().get(I),"get"),set:n((I,w)=>Me().set(I,w),"set")})),u=E(()=>wt()),c=vp(),d=pt(),p=jp(),f=Pa(),g=Gn(),m=E(()=>f.currentUser),h=E(()=>g.isAuthenticated),y={isLoggedIn:E(()=>!!h.value||m.value!==null)};function k(I){i.value.registerSidebarTab(I)}n(k,"registerSidebarTab");function S(I){i.value.unregisterSidebarTab(I)}n(S,"unregisterSidebarTab");function _(){return i.value.sidebarTabs}return n(_,"getSidebarTabs"),{spinner:e,shiftDown:t,focusMode:a,toggleFocusMode:n(()=>{a.value=!a.value},"toggleFocusMode"),toast:o,queueSettings:s,command:r,sidebarTab:i,setting:l,workflow:u,colorPalette:c,dialog:d,bottomPanel:p,user:y,registerSidebarTab:k,unregisterSidebarTab:S,getSidebarTabs:_}}),_a=n(()=>{const e=Me(),t=wt(),a=Oe(),o=pt(),s=wm(),r=Ua();async function i(T){if(e.get("Comfy.PromptFilename")){let N=await o.prompt({title:G("workflowService.exportWorkflow"),message:G("workflowService.enterFilename")+":",defaultValue:T});return N?(N.toLowerCase().endsWith(".json")||(N+=".json"),N):null}return T}n(i,"getFilename");function l(T){if(!e.get("Comfy.EnableWorkflowViewRestore"))return;const{offset:N,scale:M}=Z.canvas.ds,[O,L]=N;T.extra??={},T.extra.ds={scale:M,offset:[O,L]}}n(l,"addViewRestore");const u=n(async(T,N)=>{const M=t.activeWorkflow;M?.path&&(T=M.filename);const O=await Z.graphToPrompt();l(O.workflow);const L=JSON.stringify(O[N],null,2),F=new Blob([L],{type:"application/json"}),K=await i(T);K&&Ba(K,F)},"exportWorkflow"),c=n(async T=>{const N=await T.promptSave();if(!N)return;const M=T.directory+"/"+go(N),O=t.getWorkflowByPath(M);if(O&&!O.isTemporary){if(await o.confirm({title:G("sideToolbar.workflowTab.confirmOverwriteTitle"),type:"overwrite",message:G("sideToolbar.workflowTab.confirmOverwrite"),itemList:[M]})!==!0)return;if(O.path===T.path){await d(T);return}if(!await k(O,!0))return}if(T.isTemporary)await y(T,M),await t.saveWorkflow(T);else{const L=t.saveAs(T,M);await m(L),await t.saveWorkflow(L)}},"saveWorkflowAs"),d=n(async T=>{T.isTemporary?await c(T):await t.saveWorkflow(T)},"saveWorkflow"),p=n(async()=>{await Z.loadGraphData(cr)},"loadDefaultWorkflow"),f=n(async()=>{await Z.loadGraphData(ip)},"loadBlankWorkflow"),g=n(async()=>{const T=t.activeWorkflow;T&&await m(T,{force:!0})},"reloadCurrentWorkflow"),m=n(async(T,N={force:!1})=>{if(t.isActive(T)&&!N.force)return;const M=!T.isLoaded;M&&await T.load(),await Z.loadGraphData(Et(T.activeState),!0,!0,T,{showMissingModelsDialog:M,showMissingNodesDialog:M,checkForRerouteMigration:!1})},"openWorkflow"),h=n(async(T,N={warnIfUnsaved:!0})=>{if(T.isModified&&N.warnIfUnsaved){const M=await o.confirm({title:G("sideToolbar.workflowTab.dirtyCloseTitle"),type:"dirtyClose",message:G("sideToolbar.workflowTab.dirtyClose"),itemList:[T.path],hint:N.hint});if(M===null)return!1;M===!0&&await d(T)}if(t.openWorkflows.length===1&&await p(),t.isActive(T)){const M=t.getMostRecentWorkflow();M?await m(M):await w()}return await t.closeWorkflow(T),!0},"closeWorkflow"),y=n(async(T,N)=>{await t.renameWorkflow(T,N)},"renameWorkflow"),k=n(async(T,N=!1)=>{let M=!e.get("Comfy.Workflow.ConfirmDelete")||N;return!M&&(M=await o.confirm({title:G("sideToolbar.workflowTab.confirmDeleteTitle"),type:"delete",message:G("sideToolbar.workflowTab.confirmDelete"),itemList:[T.path]}),!M)||t.isOpen(T)&&!await h(T,{warnIfUnsaved:!M})?!1:(await t.deleteWorkflow(T),N||a.add({severity:"info",summary:G("sideToolbar.workflowTab.deleted"),life:1e3}),!0)},"deleteWorkflow"),S=n(()=>{const T=Ra().workflow.activeWorkflow;T&&(T.changeTracker.store(),s.storeThumbnail(T),r.clear())},"beforeLoadNewGraph"),_=n(async(T,N)=>{const M=Ra().workflow;if((N.extra?.linearMode!==void 0||!N.nodes.length)&&(gt().linearMode=!!N.extra?.linearMode),T===null||typeof T=="string"){const L=T;if(L){const K=qa.basePath+go(L),j=M.getWorkflowByPath(K);if(j?.isPersisted&&!j.isLoaded){const V=await M.openWorkflow(j);V.changeTracker.reset(N),V.changeTracker.restore();return}}gt().linearMode&&(Z.rootGraph.extra??={},Z.rootGraph.extra.linearMode=!0);const F=M.createNewTemporary(L?go(L):void 0,N);await M.openWorkflow(F);return}const O=await M.openWorkflow(T);O.changeTracker.reset(N),O.changeTracker.restore()},"afterLoadNewGraph"),I=n(async(T,N={})=>{const M=Et((await T.load()).initialState),O=localStorage.getItem("litegrapheditor_clipboard"),L=new Cs(M),F=new va(document.createElement("canvas"),L,{skip_events:!0,skip_render:!0});F.selectItems(),F.copyToClipboard(),Z.canvas.pasteFromClipboard(N),O!==null&&localStorage.setItem("litegrapheditor_clipboard",O)},"insertWorkflow"),w=n(async()=>{const T=t.openedWorkflowIndexShift(1);T&&await m(T)},"loadNextOpenedWorkflow");return{exportWorkflow:u,saveWorkflowAs:c,saveWorkflow:d,loadDefaultWorkflow:p,loadBlankWorkflow:f,reloadCurrentWorkflow:g,openWorkflow:m,closeWorkflow:h,renameWorkflow:y,deleteWorkflow:k,insertWorkflow:I,loadNextOpenedWorkflow:w,loadPreviousOpenedWorkflow:n(async()=>{const T=t.openedWorkflowIndexShift(-1);T&&await m(T)},"loadPreviousOpenedWorkflow"),duplicateWorkflow:n(async T=>{const N=JSON.parse(JSON.stringify(T.activeState)),M=T.isPersisted?" (Copy)":"",O=T.filename.replace(/\s*\(\d+\)$/,"")+M;await Z.loadGraphData(N,!0,!0,O)},"duplicateWorkflow"),afterLoadNewGraph:_,beforeLoadNewGraph:S}},"useWorkflowService");async function gc(e){return await pt().confirm({title:G("subgraphStore.overwriteBlueprintTitle"),type:"overwriteBlueprint",message:G("subgraphStore.overwriteBlueprint"),itemList:[e]})}n(gc,"confirmOverwrite");const Ia=Je("subgraph",()=>{class e extends qa{static{n(this,"SubgraphBlueprint")}static basePath="subgraphs/";tintCanvasBg="#22227740";hasPromptedSave=!1;constructor(h,y=!1){super(h),this.hasPromptedSave=!y}validateSubgraph(){if(!this.activeState?.definitions)throw new Error("The root graph of a subgraph blueprint must consist of only a single subgraph node");const{subgraphs:h}=this.activeState.definitions,{nodes:y}=this.activeState;function k(I){return I&&h.some(w=>w.id===I.type)}if(n(k,"isSubgraphNode"),y.length==1&&k(y[0]))return;const S={};let _=!1;for(let I=0;I<y.length;I++){if(!_&&k(y[I])){_=!0;continue}S[y[I].id]={errors:[],class_type:y[I].type,dependent_outputs:[]}}throw Ot().lastNodeErrors=S,gt().getCanvas().draw(!0,!0),new Error("The root graph of a subgraph blueprint must consist of only a single subgraph node")}async save(){if(this.validateSubgraph(),!this.hasPromptedSave&&Me().get("Comfy.Workflow.WarnBlueprintOverwrite")){if(!await gc(this.filename))return this;this.hasPromptedSave=!0}const h=await super.save();return Ia().updateDef(await this.load()),h}async saveAs(h){this.validateSubgraph(),this.hasPromptedSave=!0;const y=await super.saveAs(h);return Ia().updateDef(await this.load()),y}async load({force:h=!1}={}){if(!h&&this.isLoaded)return await super.load({force:h});const y=await super.load({force:h}),k=y.activeState,S=(k.definitions?.subgraphs??[]).find(_=>_.id==k.nodes[0].type);if(!S)throw new Error("Loaded subgraph blueprint does not contain valid subgraph");return S.name=k.nodes[0].title=this.filename,y}async promptSave(){return await pt().prompt({title:G("subgraphStore.saveBlueprint"),message:G("subgraphStore.blueprintName")+":",defaultValue:this.filename})}unload(){}}const t={},a="SubgraphBlueprint.",o=A(new Map),s=gt(),r=E(()=>[...o.value.values()]);async function i(){async function m(S){S.path=e.basePath+S.path;const _=await new e(S,!0).load();wt().attachWorkflow(_),l(_)}n(m,"loadBlueprint");async function h(){async function S([I,w]){const x=new e({path:e.basePath+w.name+".json",modified:Date.now(),size:-1});x.originalContent=x.content=await w.data,x.filename=w.name,wt().attachWorkflow(x),l(await x.load(),{python_module:w.info.node_pack,display_name:w.name},I)}n(S,"loadGlobalBlueprint");const _=await oe.getGlobalSubgraphs();await Promise.allSettled(Object.entries(_).map(S))}n(h,"loadInstalledBlueprints");const y=(await oe.listUserDataFullInfo(e.basePath)).filter(S=>S.path.endsWith(".json")),k=(await Promise.allSettled([...y.map(m),h()])).filter(S=>"reason"in S).map(S=>S.reason);k.forEach(S=>console.error("Failed to load subgraph blueprint",S)),k.length>0&&Oe().add({severity:"error",summary:G("subgraphStore.loadFailure"),detail:k.length>3?`x${k.length}`:`${k}`,life:6e3})}n(i,"fetchSubgraphs");function l(m,h={},y=m.filename){const k=m.changeTracker.initialState.nodes[0];if(!k)throw new Error("Invalid Subgraph Blueprint");k.inputs??=[],k.outputs??=[];const S=Object.fromEntries(k.inputs.map(w=>[w.name,[`${w.type}`,void 0]]));let _="User generated subgraph blueprint";m.initialState.extra?.BlueprintDescription&&(_=`${m.initialState.extra.BlueprintDescription}`);const I=new wo({input:{required:S},output:k.outputs.map(w=>`${w.type}`),output_name:k.outputs.map(w=>w.name),name:a+y,display_name:y,description:_,category:"Subgraph Blueprints",output_node:!1,python_module:"blueprint",...h});o.value.set(y,I),t[y]=m}n(l,"registerNodeDef");async function u(){const m=s.getCanvas(),h=[...m.selectedItems][0];if(m.selectedItems.size!==1||!(h instanceof $a))throw new TypeError("Must have single SubgraphNode selected to publish");const{nodes:y=[],subgraphs:k=[]}=m._serializeItems([h]);if(y.length!=1)throw new TypeError("Must have single SubgraphNode selected to publish");const S={revision:0,last_node_id:h.id,last_link_id:0,nodes:y,links:[],version:.4,definitions:{subgraphs:k}},_=await pt().prompt({title:G("subgraphStore.saveBlueprint"),message:G("subgraphStore.blueprintName")+":",defaultValue:h.title});if(!_||o.value.has(_)&&!await gc(_))return;const I=new e({path:e.basePath+_+".json",size:-1,modified:Date.now()});I.originalContent=JSON.stringify(S);const w=await I.load();I.size=1,await I.save(),wt().attachWorkflow(w),l(w),Oe().add({severity:"success",summary:G("subgraphStore.publishSuccess"),detail:G("subgraphStore.publishSuccessMessage"),life:4e3})}n(u,"publishSubgraph");function c(m){l(m)}n(c,"updateDef");async function d(m){const h=m.slice(18);if(!(h in t))throw new Error("not yet loaded");wt().attachWorkflow(t[h]),await _a().openWorkflow(t[h]);const y=gt().getCanvas();y.graph&&"subgraph"in y.graph.nodes[0]&&y.setGraph(y.graph.nodes[0].subgraph)}n(d,"editBlueprint");function p(m){const h=m.slice(18);if(!(h in t))throw new Error("not yet loaded");return t[h].changeTracker.initialState}n(p,"getBlueprint");async function f(m){const h=m.slice(18);if(!(h in t))throw new Error("not yet loaded");await pt().confirm({title:G("subgraphStore.confirmDeleteTitle"),type:"delete",message:G("subgraphStore.confirmDelete"),itemList:[h]})&&(await t[h].delete(),delete t[h],o.value.delete(h))}n(f,"deleteBlueprint");function g(m){return m instanceof e}return n(g,"isSubgraphBlueprint"),{deleteBlueprint:f,editBlueprint:d,fetchSubgraphs:i,getBlueprint:p,isSubgraphBlueprint:g,publishSubgraph:u,subgraphBlueprints:r,typePrefix:a,updateDef:c}});var wo=class Zf{static{n(this,"ComfyNodeDefImpl")}name;display_name;category;python_module;description;help;deprecated;experimental;output_node;api_node;input;output;output_is_list;output_name;output_tooltips;input_order;inputs;outputs;hidden;nodeSource;static#e(t){const a=Be.cloneDeep(t);a.input??={};for(const[o,s]of Object.entries(a.input.required??{})){const r=s[1];r&&r.defaultInput&&console.warn(`Use of defaultInput on required input ${t.python_module}:${t.name}:${o} is deprecated. Please drop the defaultInput option.`)}for(const[o,s]of Object.entries(a.input.optional??{})){const r=s[1];r&&r.defaultInput&&(console.warn(`Use of defaultInput on optional input ${t.python_module}:${t.name}:${o} is deprecated. Please use forceInput instead.`),r.forceInput=!0)}return a}constructor(t){const a=Zf.#e(t);Object.assign(this,a),this.name=a.name,this.display_name=a.display_name,this.category=a.category,this.python_module=a.python_module,this.description=a.description,this.help=a.help??"",this.deprecated=a.deprecated??a.category==="",this.experimental=a.experimental??a.category.startsWith("_for_testing"),this.output_node=a.output_node,this.api_node=!!a.api_node,this.input=a.input??{},this.output=a.output??[],this.output_is_list=a.output_is_list,this.output_name=a.output_name,this.output_tooltips=a.output_tooltips,this.input_order=a.input_order;const o=Ey(a);this.inputs=o.inputs,this.outputs=o.outputs,this.hidden=o.hidden,this.nodeSource=Ji(a.python_module)}get nodePath(){return(this.category?this.category+"/":"")+this.name}get isDummyFolder(){return this.name===""}postProcessSearchScores(t){const a=D2().getNodeFrequencyByName(this.name);return[t[0],-a,...t.slice(1)]}get isCoreNode(){return this.nodeSource.type===to.Core}get nodeLifeCycleBadgeText(){return this.deprecated?"[DEPR]":this.experimental?"[BETA]":""}};const hc={PrimitiveNode:{name:"PrimitiveNode",display_name:"Primitive",category:"utils",input:{required:{},optional:{}},output:["*"],output_name:["connect to widget input"],output_is_list:[!1],output_node:!1,python_module:"nodes",description:"Primitive values like numbers, strings, and booleans."},Reroute:{name:"Reroute",display_name:"Reroute",category:"utils",input:{required:{"":["*",{}]},optional:{}},output:["*"],output_name:[""],output_is_list:[!1],output_node:!1,python_module:"nodes",description:"Reroute the connection to another node."},Note:{name:"Note",display_name:"Note",category:"utils",input:{required:{text:["STRING",{multiline:!0}]},optional:{}},output:[],output_name:[],output_is_list:[],output_node:!1,python_module:"nodes",description:"Node that add notes to your project"},MarkdownNote:{name:"MarkdownNote",display_name:"Markdown Note",category:"utils",input:{required:{text:["STRING",{multiline:!0}]},optional:{}},output:[],output_name:[],output_is_list:[],output_node:!1,python_module:"nodes",description:"Node that add notes to your project. Reformats text as markdown."}};function Al(e,t={}){const{pathExtractor:a}=t;return yo(e,a||n(s=>s.nodePath.split("/"),"defaultPathExtractor"))}n(Al,"buildNodeDefTree");function P2(e){return new wo({name:"",display_name:"",category:e.endsWith("/")?e.slice(0,-1):e,python_module:"nodes",description:"Dummy Folder Node (User should never see this string)",input:{},output:[],output_name:[],output_is_list:[],output_node:!1})}n(P2,"createDummyFolderNodeDef");const zt=Je("nodeDef",()=>{const e=A({}),t=A({}),a=A(!1),o=A(!1),s=A([]),r=E(()=>[...Ia().subgraphBlueprints,...Object.values(e.value)]),i=E(()=>{const k=new Set;for(const S of r.value){for(const _ of Object.values(S.inputs))k.add(_.type);for(const _ of S.outputs)k.add(_.type)}return k}),l=E(()=>r.value.filter(k=>s.value.every(S=>S.predicate(k)))),u=E(()=>new Ay(l.value)),c=E(()=>Al(l.value));function d(k){const S={},_={};for(const I of k){const w=I instanceof wo?I:new wo(I);S[I.name]=w,_[I.display_name]=w}e.value=S,t.value=_}n(d,"updateNodeDefs");function p(k){const S=new wo(k);e.value[k.name]=S,t.value[k.display_name]=S}n(p,"addNodeDef");function f(k){const S=k.constructor?.nodeData?.name??k.type;return S?e.value[S]??null:null}n(f,"fromLGraphNode");function g(k,S){if(!k.isSubgraphNode()){const D=f(k);return D?D.inputs[S]:void 0}const _=k.widgets?.find(D=>D.name===S);if(!_||!Yo(_))return;const{nodeId:I,widgetName:w}=_._overlay,x=k.subgraph.getNodeById(I);if(x)return g(x,w)}n(g,"getInputSpecForWidget");function m(k){s.value=[...s.value,k]}n(m,"registerNodeDefFilter");function h(k){s.value=s.value.filter(S=>S.id!==k)}n(h,"unregisterNodeDefFilter");function y(){m({id:"core.deprecated",name:"Hide Deprecated Nodes",description:"Hides nodes marked as deprecated unless explicitly enabled",predicate:n(k=>a.value||!k.deprecated,"predicate")}),m({id:"core.experimental",name:"Hide Experimental Nodes",description:"Hides nodes marked as experimental unless explicitly enabled",predicate:n(k=>o.value||!k.experimental,"predicate")}),m({id:"core.subgraph",name:"Hide Subgraph Nodes",description:"Temporarily hides subgraph nodes from node library and search",predicate:n(k=>!(k.category==="subgraph"&&k.python_module==="nodes"),"predicate")})}return n(y,"registerCoreNodeDefFilters"),y(),{nodeDefsByName:e,nodeDefsByDisplayName:t,showDeprecated:a,showExperimental:o,nodeDefFilters:s,nodeDefs:r,nodeDataTypes:i,visibleNodeDefs:l,nodeSearchService:u,nodeTree:c,updateNodeDefs:d,addNodeDef:p,fromLGraphNode:f,getInputSpecForWidget:g,registerNodeDefFilter:m,unregisterNodeDefFilter:h}}),D2=Je("nodeFrequency",()=>{const e=A(64),t=A({}),a=E(()=>Object.keys(t.value)),o=A(!1),s=n(async()=>{if(!o.value)try{t.value=(await So.get("assets/sorted-custom-node-map.json")).data,o.value=!0}catch(u){console.error("Error loading node frequencies:",u)}},"loadNodeFrequencies"),r=n(u=>i(u.name),"getNodeFrequency"),i=n(u=>t.value[u]??0,"getNodeFrequencyByName"),l=zt();return{nodeNamesByFrequency:a,topNodeDefs:E(()=>a.value.map(u=>l.nodeDefsByName[u]).filter(u=>u!==void 0).slice(0,e.value)),isLoaded:o,loadNodeFrequencies:s,getNodeFrequency:r,getNodeFrequencyByName:i}}),Ye={USER_SIGN_UP_OPENED:"app:user_sign_up_opened",USER_AUTH_COMPLETED:"app:user_auth_completed",USER_LOGGED_IN:"app:user_logged_in",RUN_BUTTON_CLICKED:"app:run_button_click",SUBSCRIPTION_REQUIRED_MODAL_OPENED:"app:subscription_required_modal_opened",SUBSCRIBE_NOW_BUTTON_CLICKED:"app:subscribe_now_button_clicked",MONTHLY_SUBSCRIPTION_SUCCEEDED:"app:monthly_subscription_succeeded",MONTHLY_SUBSCRIPTION_CANCELLED:"app:monthly_subscription_cancelled",ADD_API_CREDIT_BUTTON_CLICKED:"app:add_api_credit_button_clicked",API_CREDIT_TOPUP_BUTTON_PURCHASE_CLICKED:"app:api_credit_topup_button_purchase_clicked",API_CREDIT_TOPUP_SUCCEEDED:"app:api_credit_topup_succeeded",USER_SURVEY_OPENED:"app:user_survey_opened",USER_SURVEY_SUBMITTED:"app:user_survey_submitted",USER_EMAIL_VERIFY_OPENED:"app:user_email_verify_opened",USER_EMAIL_VERIFY_REQUESTED:"app:user_email_verify_requested",USER_EMAIL_VERIFY_COMPLETED:"app:user_email_verify_completed",TEMPLATE_WORKFLOW_OPENED:"app:template_workflow_opened",TEMPLATE_LIBRARY_OPENED:"app:template_library_opened",TEMPLATE_LIBRARY_CLOSED:"app:template_library_closed",WORKFLOW_IMPORTED:"app:workflow_imported",WORKFLOW_OPENED:"app:workflow_opened",PAGE_VISIBILITY_CHANGED:"app:page_visibility_changed",TAB_COUNT_TRACKING:"app:tab_count_tracking",NODE_SEARCH:"app:node_search",NODE_SEARCH_RESULT_SELECTED:"app:node_search_result_selected",TEMPLATE_FILTER_CHANGED:"app:template_filter_changed",SETTING_CHANGED:"app:setting_changed",HELP_CENTER_OPENED:"app:help_center_opened",HELP_RESOURCE_CLICKED:"app:help_resource_clicked",HELP_CENTER_CLOSED:"app:help_center_closed",WORKFLOW_CREATED:"app:workflow_created",EXECUTION_START:"execution_start",EXECUTION_ERROR:"execution_error",EXECUTION_SUCCESS:"execution_success",UI_BUTTON_CLICKED:"app:ui_button_clicked"};var L2=[{name:"Film / TV / Animation",userCount:2885,keywords:["film","tv","television","animation","animation studio","tv production","film production","story","anime","video","cinematography","visual effects","vfx","vfx artist","movie","cinema","documentary","documentary filmmaker","broadcast","streaming","production","director","filmmaker","post-production","editing"]},{name:"Marketing / Advertising / Social Media",userCount:1340,keywords:["marketing","advertising","youtube","tiktok","social media","content creation","influencer","brand","promotion","digital marketing","seo","campaigns","copywriting","growth","engagement"]},{name:"Software / IT / AI",userCount:1100,keywords:["software","software development","software engineer","it","ai","ai research","corporate ai research","ai research lab","tech company ai research","developer","app developer","consulting","tech","tech startup","programmer","data science","machine learning","coding","programming","web development","app development","saas"]},{name:"Product & Industrial Design",userCount:1050,keywords:["product design","industrial","manufacturing","3d rendering","product visualization","mechanical","automotive","cad","prototype","design engineering","invention"]},{name:"Fine Art / Contemporary Art",userCount:780,keywords:["fine art","art","illustration","contemporary","artist","painting","drawing","sculpture","gallery","canvas","digital art","mixed media","abstract","portrait"]},{name:"Education / Research",userCount:640,keywords:["education","student","teacher","research","university research","academic ai research","university ai research","ai research at university","learning","university","school","academic","professor","curriculum","training","instruction","pedagogy"]},{name:"Architecture / Engineering / Construction",userCount:420,keywords:["architecture","architecture firm","construction","engineering","civil","civil engineering","cad","building","structural","landscape","landscape architecture","interior design","real estate","planning","blueprints"]},{name:"Gaming / Interactive Media",userCount:410,keywords:["gaming","game dev","game development","indie game studio","vr development","roblox","interactive","interactive media","virtual world","vr","ar","metaverse","simulation","unity","unity developer","unreal","indie games"]},{name:"Photography / Videography",userCount:70,keywords:["photography","photo","videography","camera","image","portrait","wedding","commercial photo","stock photography","photojournalism","event photography"]},{name:"Fashion / Beauty / Retail",userCount:25,keywords:["fashion","fashion design","beauty","beauty industry","jewelry","jewelry design","custom jewelry design","retail","retail store","style","clothing","cosmetics","makeup","accessories","boutique"]},{name:"Music / Performing Arts",userCount:25,keywords:["music","music production","vj","dance","projection mapping","audio visual","concert","concert production","performance","theater","stage","live events"]},{name:"Healthcare / Medical / Life Science",userCount:30,keywords:["healthcare","medical","medical research","doctor","biotech","life science","pharmaceutical","clinical","clinical research","hospital","medicine","health"]},{name:"E-commerce / Print-on-Demand / Business",userCount:15,keywords:["ecommerce","e-commerce","print on demand","shop","business","commercial","startup","entrepreneur","sales","online store"]},{name:"Nonprofit / Government / Public Sector",userCount:15,keywords:["501c3","ngo","government","public service","policy","nonprofit","charity","civic","community","social impact"]},{name:"Adult / NSFW",userCount:10,keywords:["nsfw","nsfw content","adult","adult entertainment","erotic","explicit","xxx","porn"]}],O2=[{name:"Content Creation & Marketing",keywords:["content creation","social media","marketing","marketing campaigns","advertising","youtube","youtube thumbnail","youtube thumbnail generation","tiktok","instagram","thumbnails","posts","campaigns","brand content"]},{name:"Art & Illustration",keywords:["art","illustration","drawing","painting","concept art","creating concept art","character design","digital art","fantasy art","portraits"]},{name:"Product Visualization & Design",keywords:["product","product mockup","product mockup creation","visualization","prototype visualization","design","prototype","mockup","3d rendering","industrial design","product photos"]},{name:"Film & Video Production",keywords:["film","video","video editing","movie","movie production","animation","vfx","visual effects","storyboard","storyboard creation","cinematography","post production"]},{name:"Gaming & Interactive Media",keywords:["game","gaming","game asset generation","game assets","game development","game textures","interactive","vr","vr content creation","ar","virtual","simulation","metaverse","textures"]},{name:"Architecture & Construction",keywords:["architecture","architectural rendering","building","building visualization","construction","interior design","interior design mockups","landscape","real estate","real estate visualization","floor plans","renderings"]},{name:"Education & Training",keywords:["education","educational","educational content","training","training materials","learning","teaching","tutorial","tutorial creation","course","academic","academic projects","instructional","workshops"]},{name:"Research & Development",keywords:["research","research experiments","development","experiment","prototype","prototype testing","testing","analysis","study","innovation","innovation projects","r&d","scientific visualization"]},{name:"Personal & Hobby",keywords:["personal","personal art projects","hobby","hobby work","fun","fun experiments","experiment","learning","curiosity","explore","creative","creative exploration","side project"]},{name:"Photography & Image Processing",keywords:["photography","product photography","portrait photography","photo","photo editing","image","image enhancement","portrait","editing","enhancement","restoration","photo manipulation"]}],Jf={keys:["keywords"],threshold:.53,minMatchCharLength:5,includeScore:!0,includeMatches:!0,ignoreLocation:!0,findAllMatches:!0},N2=new Pn(L2,Jf),$2=new Pn(O2,Jf);function R2(e){if(!e||typeof e!="string"||e.toLowerCase().trim().match(/^(other|none|undefined|unknown|n\/a|not applicable|-|)$/))return"Other / Undefined";const t=N2.search(e);return t.length>0?t[0].item.name:`Uncategorized: ${e}`}n(R2,"normalizeIndustry");function B2(e){if(!e||typeof e!="string"||e.toLowerCase().trim().match(/^(other|none|undefined|unknown|n\/a|not applicable|-|)$/))return"Other / Undefined";const t=$2.search(e);return t.length>0?t[0].item.name:`Uncategorized: ${e}`}n(B2,"normalizeUseCase");function F2(e){const t={...e};return e.industry&&(t.industry_normalized=R2(e.industry),t.industry_raw=e.industry),e.useCase&&(t.useCase_normalized=B2(e.useCase),t.useCase_raw=e.useCase),t}n(F2,"normalizeSurveyResponses");var vc=[Ye.WORKFLOW_OPENED,Ye.PAGE_VISIBILITY_CHANGED,Ye.TAB_COUNT_TRACKING,Ye.NODE_SEARCH,Ye.NODE_SEARCH_RESULT_SELECTED,Ye.TEMPLATE_FILTER_CHANGED,Ye.SETTING_CHANGED,Ye.HELP_CENTER_OPENED,Ye.HELP_RESOURCE_CLICKED,Ye.HELP_CENTER_CLOSED,Ye.WORKFLOW_CREATED,Ye.UI_BUTTON_CLICKED],U2=new Set(Object.values(Ye)),W2=class{static{n(this,"MixpanelTelemetryProvider")}isEnabled=!0;mixpanel=null;eventQueue=[];isInitialized=!1;lastTriggerSource;disabledEvents=new Set(vc);constructor(){this.configureDisabledEvents(window.__CONFIG__??null),be(Eo,t=>{this.configureDisabledEvents(t)},{immediate:!0});const e=window.__CONFIG__?.mixpanel_token;if(e)try{ut(()=>import("./mixpanel.module-DaBZUFSE.js"),__vite__mapDeps([63,2,3,4]),import.meta.url).then(t=>{this.mixpanel=t.default,this.mixpanel.init(e,{debug:!1,track_pageview:!0,api_host:"https://mp.comfy.org",cross_subdomain_cookie:!0,persistence:"cookie",loaded:n(()=>{this.isInitialized=!0,this.flushEventQueue(),Ko().onUserResolved(a=>{this.mixpanel&&a.id&&this.mixpanel.identify(a.id)})},"loaded")})}).catch(t=>{console.error("Failed to load Mixpanel:",t),this.isEnabled=!1})}catch(t){console.error("Failed to initialize Mixpanel:",t),this.isEnabled=!1}else console.warn("Mixpanel token not provided in runtime config"),this.isEnabled=!1}flushEventQueue(){if(!(!this.isInitialized||!this.mixpanel))for(;this.eventQueue.length>0;){const e=this.eventQueue.shift();try{this.mixpanel.track(e.eventName,e.properties||{})}catch(t){console.error("Failed to track queued event:",t)}}}trackEvent(e,t){if(!this.isEnabled||this.disabledEvents.has(e))return;const a={eventName:e,properties:t};if(this.isInitialized&&this.mixpanel)try{this.mixpanel.track(e,t||{})}catch(o){console.error("Failed to track event:",o)}else this.eventQueue.push(a)}configureDisabledEvents(e){const t=e?.telemetry_disabled_events??vc;this.disabledEvents=this.buildEventSet(t)}buildEventSet(e){return new Set(e.filter(t=>U2.has(t)))}trackSignupOpened(){this.trackEvent(Ye.USER_SIGN_UP_OPENED)}trackAuth(e){this.trackEvent(Ye.USER_AUTH_COMPLETED,e)}trackUserLoggedIn(){this.trackEvent(Ye.USER_LOGGED_IN)}trackSubscription(e){const t=e==="modal_opened"?Ye.SUBSCRIPTION_REQUIRED_MODAL_OPENED:Ye.SUBSCRIBE_NOW_BUTTON_CLICKED;this.trackEvent(t)}trackAddApiCreditButtonClicked(){this.trackEvent(Ye.ADD_API_CREDIT_BUTTON_CLICKED)}trackMonthlySubscriptionSucceeded(){this.trackEvent(Ye.MONTHLY_SUBSCRIPTION_SUCCEEDED)}trackMonthlySubscriptionCancelled(){this.trackEvent(Ye.MONTHLY_SUBSCRIPTION_CANCELLED)}trackApiCreditTopupButtonPurchaseClicked(e){const t={credit_amount:e};this.trackEvent(Ye.API_CREDIT_TOPUP_BUTTON_PURCHASE_CLICKED,t)}trackApiCreditTopupSucceeded(){this.trackEvent(Ye.API_CREDIT_TOPUP_SUCCEEDED)}startTopupTracking(){iy()}checkForCompletedTopup(e){return ly(e)}clearTopupTracking(){Jd()}trackRunButton(e){const t=this.getExecutionContext(),a={subscribe_to_run:e?.subscribe_to_run||!1,workflow_type:t.is_template?"template":"custom",workflow_name:t.workflow_name??"untitled",custom_node_count:t.custom_node_count,total_node_count:t.total_node_count,subgraph_count:t.subgraph_count,has_api_nodes:t.has_api_nodes,api_node_names:t.api_node_names,trigger_source:e?.trigger_source};this.lastTriggerSource=e?.trigger_source,this.trackEvent(Ye.RUN_BUTTON_CLICKED,a)}trackSurvey(e,t){const a=e==="opened"?Ye.USER_SURVEY_OPENED:Ye.USER_SURVEY_SUBMITTED,o=t?F2(t):void 0;if(this.trackEvent(a,o),e==="submitted"&&o&&this.mixpanel)try{this.mixpanel.people.set(o)}catch(s){console.error("Failed to set survey user properties:",s)}}trackEmailVerification(e){let t;switch(e){case"opened":t=Ye.USER_EMAIL_VERIFY_OPENED;break;case"requested":t=Ye.USER_EMAIL_VERIFY_REQUESTED;break;case"completed":t=Ye.USER_EMAIL_VERIFY_COMPLETED;break}this.trackEvent(t)}trackTemplate(e){this.trackEvent(Ye.TEMPLATE_WORKFLOW_OPENED,e)}trackTemplateLibraryOpened(e){this.trackEvent(Ye.TEMPLATE_LIBRARY_OPENED,e)}trackTemplateLibraryClosed(e){this.trackEvent(Ye.TEMPLATE_LIBRARY_CLOSED,e)}trackWorkflowImported(e){this.trackEvent(Ye.WORKFLOW_IMPORTED,e)}trackWorkflowOpened(e){this.trackEvent(Ye.WORKFLOW_OPENED,e)}trackPageVisibilityChanged(e){this.trackEvent(Ye.PAGE_VISIBILITY_CHANGED,e)}trackTabCount(e){this.trackEvent(Ye.TAB_COUNT_TRACKING,e)}trackNodeSearch(e){this.trackEvent(Ye.NODE_SEARCH,e)}trackNodeSearchResultSelected(e){this.trackEvent(Ye.NODE_SEARCH_RESULT_SELECTED,e)}trackTemplateFilterChanged(e){this.trackEvent(Ye.TEMPLATE_FILTER_CHANGED,e)}trackHelpCenterOpened(e){this.trackEvent(Ye.HELP_CENTER_OPENED,e)}trackHelpResourceClicked(e){this.trackEvent(Ye.HELP_RESOURCE_CLICKED,e)}trackHelpCenterClosed(e){this.trackEvent(Ye.HELP_CENTER_CLOSED,e)}trackWorkflowCreated(e){this.trackEvent(Ye.WORKFLOW_CREATED,e)}trackWorkflowExecution(){const e={...this.getExecutionContext(),trigger_source:this.lastTriggerSource??"unknown"};this.trackEvent(Ye.EXECUTION_START,e),this.lastTriggerSource=void 0}trackExecutionError(e){this.trackEvent(Ye.EXECUTION_ERROR,e)}trackExecutionSuccess(e){this.trackEvent(Ye.EXECUTION_SUCCESS,e)}trackSettingChanged(e){this.trackEvent(Ye.SETTING_CHANGED,e)}trackUiButtonClicked(e){this.trackEvent(Ye.UI_BUTTON_CLICKED,e)}getExecutionContext(){const e=wt(),t=uy(),a=zt(),o=e.activeWorkflow,s=oh(Z.rootGraph,(r,i)=>{const l=a.nodeDefsByName[i.type],u=l?.nodeSource?.type===to.CustomNodes,c=l?.api_node===!0,d=i.isSubgraphNode?.()===!0;if(c){r.has_api_nodes=!0;const p=l?.name;p&&!r.api_node_names.includes(p)&&r.api_node_names.push(p)}return r.custom_node_count+=u?1:0,r.api_node_count+=c?1:0,r.subgraph_count+=d?1:0,r.total_node_count+=1,r},{custom_node_count:0,api_node_count:0,subgraph_count:0,total_node_count:0,has_api_nodes:!1,api_node_names:[]});if(o?.filename){if(t.knownTemplateNames.has(o.filename)){const r=t.getTemplateByName(o.filename),i=t.getEnglishMetadata(o.filename);return{is_template:!0,workflow_name:o.filename,template_source:r?.sourceModule,template_category:i?.category??r?.category,template_tags:i?.tags??r?.tags,template_models:i?.models??r?.models,template_use_case:i?.useCase??r?.useCase,template_license:i?.license??r?.license,...s}}return{is_template:!1,workflow_name:o.filename,...s}}return{is_template:!1,workflow_name:void 0,...s}}},Wr=null;function yt(){return Wr===null&&qe&&(Wr=new W2),Wr}n(yt,"useTelemetry");var z2=n((e,t)=>{const a=t.getNodeById(e);if(a?.isSubgraphNode())return a.subgraph},"subgraphNodeIdToSubgraph");function Qf(e,t,a=[]){if(t.length===1)return a;const o=t.shift();if(o===void 0)return a;const s=z2(o,e);if(!s){console.warn(`Subgraph not found: ${o}`);return}return a.push(s),Qf(s,t,a)}n(Qf,"getSubgraphsFromInstanceIds");function cs(e){const t=String(e);if(!t.includes(":"))return t;const a=t.split(":"),o=a[a.length-1],s=Qf(Z.rootGraph,a);if(s)return _s(s.at(-1).id,o)}n(cs,"executionIdToNodeLocatorId");const Ot=Je("execution",()=>{const e=wt(),t=gt(),a=A(null),o=A(null),s=A({}),r=A(null),i=A(null),l=A({}),u=A({}),c=A(new Map),d=A(new Set),p=n((de,he)=>{if(de===void 0)return he;const Te={...de};if(Te.state==="error")return Te;if(he.state==="running"){const Ge=he.max>0?he.value/he.max:0,We=Te.max>0?Te.value/Te.max:0;(Te.state!=="running"||We===0||Ge<We)&&(Te.value=he.value,Te.max=he.max),Te.state="running"}return Te},"mergeExecutionProgressStates"),f=E(()=>{const de={},he=l.value;for(const Te of Object.values(he)){const Ge=String(Te.display_node_id).split(":");for(let We=0;We<Ge.length;We++){const te=cs(Ge.slice(0,We+1).join(":"));te&&(de[te]=p(de[te],Te))}}return de}),g=E(()=>Object.entries(l.value).filter(([de,he])=>he.state==="running").map(([de,he])=>de)),m=E(()=>g.value[0]??null),h=E(()=>new Set(g.value.map(String))),y=E(()=>{if(!m.value)return null;const de=_.value?.workflow;if(!de)return null;const he=de.changeTracker?.activeState??null;return he?he.nodes.find(Te=>String(Te.id)===m.value)??null:null}),k=A(null),S=E(()=>k.value?k.value.value/k.value.max:null),_=E(()=>s.value[o.value??""]),I=E(()=>_.value?Object.values(_.value.nodes).length:0),w=E(()=>!o.value),x=E(()=>_.value?Object.values(_.value.nodes).filter(Boolean).length:0),D=E(()=>{if(!_.value)return 0;const de=I.value,he=x.value;return de>0?he/de:0}),T=E(()=>{const de=i.value;return de?cs(String(de.node_id)):null}),N=E(()=>{const de=T.value;if(!de)return null;const he=e.nodeLocatorIdToNodeId(de);return he!=null?String(he):null});function M(){oe.addEventListener("notification",ne),oe.addEventListener("execution_start",L),oe.addEventListener("execution_cached",F),oe.addEventListener("execution_interrupted",K),oe.addEventListener("execution_success",V),oe.addEventListener("executed",j),oe.addEventListener("executing",q),oe.addEventListener("progress",ae),oe.addEventListener("progress_state",re),oe.addEventListener("status",ce),oe.addEventListener("execution_error",ee),oe.addEventListener("progress_text",ge)}n(M,"bindExecutionEvents");function O(){oe.removeEventListener("notification",ne),oe.removeEventListener("execution_start",L),oe.removeEventListener("execution_cached",F),oe.removeEventListener("execution_interrupted",K),oe.removeEventListener("execution_success",V),oe.removeEventListener("executed",j),oe.removeEventListener("executing",q),oe.removeEventListener("progress",ae),oe.removeEventListener("progress_state",re),oe.removeEventListener("status",ce),oe.removeEventListener("execution_error",ee),oe.removeEventListener("progress_text",ge)}n(O,"unbindExecutionEvents");function L(de){i.value=null,o.value=de.detail.prompt_id,s.value[o.value]??={nodes:{}},B(o.value)}n(L,"handleExecutionStart");function F(de){if(_.value)for(const he of de.detail.nodes)_.value.nodes[he]=!0}n(F,"handleExecutionCached");function K(de){const he=de.detail.prompt_id;o.value&&B(o.value),Y(he)}n(K,"handleExecutionInterrupted");function j(de){_.value&&(_.value.nodes[de.detail.node]=!0)}n(j,"handleExecuted");function V(de){qe&&o.value&&yt()?.trackExecutionSuccess({jobId:o.value});const he=de.detail.prompt_id;Y(he)}n(V,"handleExecutionSuccess");function q(de){k.value=null,_.value&&typeof de.detail!="string"&&(o.value&&delete s.value[o.value],o.value=null)}n(q,"handleExecuting");function re(de){const{nodes:he,prompt_id:Te}=de.detail,Ge=u.value[Te]||{};for(const We in he)if(he[We].state==="running"&&!Ge[We]){const{revokePreviewsByExecutionId:te}=Gt();te(We)}if(u.value={...u.value,[Te]:he},l.value=he,m.value&&he[m.value]){const We=he[m.value];k.value={value:We.value,max:We.max,prompt_id:We.prompt_id,node:We.display_node_id||We.node_id}}}n(re,"handleProgressState");function ae(de){k.value=de.detail}n(ae,"handleProgress");function ce(){oe.clientId&&(a.value=oe.clientId,oe.removeEventListener("status",ce))}n(ce,"handleStatus");function ee(de){i.value=de.detail,qe&&yt()?.trackExecutionError({jobId:de.detail.prompt_id,nodeId:String(de.detail.node_id),nodeType:de.detail.node_type,error:de.detail.exception_message}),B(de.detail.prompt_id),Y(de.detail.prompt_id)}n(ee,"handleExecutionError");function ne(de){const he=de.detail,Te=he?.value||"",Ge=he?.id?he.id:"";if(Ge&&Te.includes("Waiting for a machine")){const We=new Set(d.value);We.add(Ge),d.value=We}}n(ne,"handleNotification");function B(de){if(!de||!d.value.has(de))return;const he=new Set(d.value);he.delete(de),d.value=he}n(B,"clearInitializationByPromptId");function z(de){return de?d.value.has(String(de)):!1}n(z,"isPromptInitializing");function Y(de){l.value={};const he=de??o.value??null;if(he){const Te={...u.value};delete Te[he],u.value=Te}o.value&&delete s.value[o.value],o.value=null,k.value=null}n(Y,"resetExecutionState");function ie(de){const he=String(de);return he.includes(":")?e.executionIdToCurrentId(he):he}n(ie,"getNodeIdIfExecuting");function ge(de){const{nodeId:he,text:Te}=de.detail;if(!Te||!he)return;const Ge=ie(he),We=t.getCanvas().graph?.getNodeById(Ge);We&&Hv().showTextPreview(We,Te)}n(ge,"handleProgressText");function Le({nodes:de,id:he,workflow:Te}){s.value[he]??={nodes:{}};const Ge=s.value[he];Ge.nodes={...de.reduce((te,le)=>(te[le]=!1,te),{}),...Ge.nodes},Ge.workflow=Te;const We=Te?.activeState?.id??Te?.initialState?.id;We&&c.value.set(String(he),String(We))}n(Le,"storePrompt");function _e(de,he){!de||!he||c.value.set(String(de),String(he))}n(_e,"registerPromptWorkflowIdMapping");const Q=n(de=>e.nodeLocatorIdToNodeExecutionId(de),"nodeLocatorIdToExecutionId"),ue=E(()=>{const de=[];for(const[he,Te]of Object.entries(u.value))Object.values(Te).some(Ge=>Ge.state==="running")&&de.push(he);return de}),we=E(()=>ue.value.length),Ce=E(()=>{if(!r.value)return{};const de={};for(const[he,Te]of Object.entries(r.value)){const Ge=cs(he);Ge&&(de[Ge]=Te)}return de}),xe=n(de=>Ce.value[de],"getNodeErrors"),Ue=n((de,he)=>{const Te=xe(de);return Te?Te.errors.some(Ge=>Ge.extra_info?.input_name===he):!1},"slotHasError");return be(r,()=>{if(Z.rootGraph&&(bs(Z.rootGraph,de=>{if(de.has_errors=!1,de.inputs)for(const he of de.inputs)he.hasErrors=!1}),!!r.value))for(const[de,he]of Object.entries(r.value)){const Te=Fs(Z.rootGraph,de);if(!Te)continue;if(Te.has_errors=!0,Te.inputs)for(const We of he.errors){const te=We.extra_info?.input_name;if(!te)continue;const le=Te.inputs.find(me=>me.name===te);le&&(le.hasErrors=!0)}const Ge=de.split(":");for(let We=Ge.length-1;We>0;We--){const te=Ge.slice(0,We).join(":"),le=Fs(Z.rootGraph,te);le&&(le.has_errors=!0)}}}),{isIdle:w,clientId:a,activePromptId:o,queuedPrompts:s,lastNodeErrors:r,lastExecutionError:i,lastExecutionErrorNodeId:N,executingNodeId:m,executingNodeIds:g,activePrompt:_,totalNodesToExecute:I,nodesExecuted:x,executionProgress:D,executingNode:y,executingNodeProgress:S,nodeProgressStates:l,nodeLocationProgressStates:f,nodeProgressStatesByPrompt:u,runningPromptIds:ue,runningWorkflowCount:we,initializingPromptIds:d,isPromptInitializing:z,bindExecutionEvents:M,unbindExecutionEvents:O,storePrompt:Le,registerPromptWorkflowIdMapping:_e,uniqueExecutingNodeIdStrings:h,_executingNodeProgress:k,executionIdToNodeLocatorId:cs,nodeLocatorIdToExecutionId:Q,promptIdToWorkflowId:c,getNodeErrors:xe,slotHasError:Ue}});var V2=400,yc=n((e,t,a)=>({images:e.map(o=>({type:t,...Ph(o)})),animated:e.map(o=>a&&(o.endsWith(".webp")||o.endsWith(".png")))}),"createOutputs");const Gt=Je("nodeOutput",()=>{const{nodeIdToNodeLocatorId:e,nodeToNodeLocatorId:t}=wt(),{executionIdToNodeLocatorId:a}=Ot(),o={},s=A([]);function r(M,O){o[M]?.stop();const{stop:L}=gd(()=>{delete o[M],O()},V2);o[M]={stop:L}}n(r,"scheduleRevoke");const i=A({}),l=A(Z.nodePreviewImages||{});function u(M){return Z.nodeOutputs[t(M)]}n(u,"getNodeOutputs");function c(M){return Z.nodePreviewImages[t(M)]}n(c,"getNodePreviews");const d=n((M,O)=>!(M.animatedImages||wl(M)||!O?.images?.length||O.images.some(L=>L.filename?.endsWith("svg"))),"isImageOutputs");function p(M,O){return d(M,O)?Z.getPreviewFormatParam():""}n(p,"getPreviewParam");function f(M){const O=c(M);if(O?.length)return O;const L=u(M);if(!L?.images?.length)return;const F=Z.getRandParam(),K=p(M,L);return L.images.map(j=>{const V=new URLSearchParams(j);return oe.apiURL(`/view?${V}${K}${F}`)})}n(f,"getNodeImageUrls");function g(M,O,L={}){if(O!=null){if(L.merge){const F=Z.nodeOutputs[M];if(F&&O){for(const K in O){const j=F[K],V=O[K];Array.isArray(j)&&Array.isArray(V)?F[K]=j.concat(V):F[K]=V}return}}Z.nodeOutputs[M]=O,i.value[M]=O}}n(g,"setOutputsByLocatorId");function m(M,O,{folder:L="input",isAnimated:F=!1}={}){if(!O||!M)return;const K=t(M);if(K)if(typeof O=="string")g(K,yc([O],L,F));else if(!Array.isArray(O))g(K,O);else{const j=yc(O,L,F);if(!j?.images?.length)return;g(K,j)}}n(m,"setNodeOutputs");function h(M,O,L={}){const F=a(M);F&&g(F,O,L)}n(h,"setNodeOutputsByExecutionId");function y(M,O){const L=a(M);L&&(o[L]&&(o[L].stop(),delete o[L]),s.value=O,Z.nodePreviewImages[L]=O,l.value[L]=O)}n(y,"setNodePreviewsByExecutionId");function k(M,O){const L=e(M);o[L]&&(o[L].stop(),delete o[L]),Z.nodePreviewImages[L]=O,l.value[L]=O}n(k,"setNodePreviewsByNodeId");function S(M){const O=a(M);O&&r(O,()=>_(O))}n(S,"revokePreviewsByExecutionId");function _(M){const O=Z.nodePreviewImages[M];if(O?.[Symbol.iterator]){for(const L of O)URL.revokeObjectURL(L);delete Z.nodePreviewImages[M],delete l.value[M]}}n(_,"revokePreviewsByLocatorId");function I(){for(const M of Object.keys(Z.nodePreviewImages)){const O=Z.nodePreviewImages[M];if(O?.[Symbol.iterator])for(const L of O)URL.revokeObjectURL(L)}Z.nodePreviewImages={},l.value={}}n(I,"revokeAllPreviews");function w(M){_((M.graph.isRootGraph?"":M.graph.id+":")+M.id);for(const O of M.subgraph.nodes)_(M.subgraph.id+O.id)}n(w,"revokeSubgraphPreviews");function x(M){const O=e(Number(M));if(!O)return!1;const L=!!Z.nodeOutputs[O];return delete Z.nodeOutputs[O],delete i.value[O],Z.nodePreviewImages[O]&&(delete Z.nodePreviewImages[O],delete l.value[O]),L}n(x,"removeNodeOutputs");function D(M){Z.nodeOutputs=M,i.value=M}n(D,"restoreOutputs");function T(M){if(!M.images?.length)return;const O=e(M.id);if(O){const L=Z.nodeOutputs[O];if(L){const F={...L,images:M.images};Z.nodeOutputs[O]=F,i.value[O]=F}}}n(T,"updateNodeImages");function N(){Z.nodeOutputs={},i.value={},I()}return n(N,"resetAllOutputsAndPreviews"),{getNodeOutputs:u,getNodeImageUrls:f,getNodePreviews:c,getPreviewParam:p,setNodeOutputs:m,setNodeOutputsByExecutionId:h,setNodePreviewsByExecutionId:y,setNodePreviewsByNodeId:k,updateNodeImages:T,revokePreviewsByExecutionId:S,revokeAllPreviews:I,revokeSubgraphPreviews:w,removeNodeOutputs:x,restoreOutputs:D,resetAllOutputsAndPreviews:N,nodeOutputs:i,nodePreviewImages:l,latestPreview:s}});function G2(){const{getSelectedNodes:e}=Hd(),t=gt(),a=wt(),o=Gt(),s=zt(),r=rn(),i=n(()=>{const f=t.getCanvas(),g=f.subgraph??f.graph;if(!g)return null;const m=g.convertToSubgraph(f.selectedItems);if(!m)return;const{node:h}=m;f.select(h),t.updateSelectedItems(),a.activeWorkflow?.changeTracker?.checkState()},"convertToSubgraph"),l=n((f,g)=>{const m=t.getCanvas(),h=m.subgraph??m.graph;if(h){for(const y of f)o.revokeSubgraphPreviews(y),h.unpackSubgraph(y,{skipMissingNodes:g});a.activeWorkflow?.changeTracker?.checkState()}},"doUnpack");return{convertToSubgraph:i,unpackSubgraph:n(()=>{const f=t.getCanvas();if(!(f.subgraph??f.graph))return;const g=Array.from(f.selectedItems).filter(m=>m instanceof $a);g.length!==0&&l(g,!0)},"unpackSubgraph"),addSubgraphToLibrary:n(async()=>{const f=Array.from(t.selectedItems);if(f.length===1){const h=f[0];if(Rp(h)){const y=s.fromLGraphNode(h);if(y){await r.addBookmark(y.nodePath);return}}}const g=e();if(g.length===0)return;if(!g.some(h=>h instanceof $a)){i();return}let m=0;for(const h of g)if(h instanceof $a){const y=s.fromLGraphNode(h);y&&(await r.addBookmark(y.nodePath),m++)}},"addSubgraphToLibrary"),isSubgraphSelected:n(()=>Array.from(t.selectedItems).some(f=>f instanceof $a),"isSubgraphSelected"),hasSelectableNodes:n(()=>e().length>0,"hasSelectableNodes")}}n(G2,"useSubgraphOperations");function H2(){function e(a){if(!a.imgs?.length||!a.widgets)return;const o=a.widgets.findIndex(s=>s.name===Ls);if(a.imgs[0].classList.value="block size-full object-contain",o>-1){const s=a.widgets[o];if(!On(s))return;s.element.replaceChildren(a.imgs[0])}else{const s=document.createElement("div");s.appendChild(a.imgs[0]);const r=a.addDOMWidget(Ls,"img",s,{hideOnZoom:!1});a.overIndex=0;const{handleWheel:i,handlePointer:l,forwardEventToCanvas:u}=vl();a.imgs[0].style.pointerEvents="none",s.addEventListener("wheel",i),s.addEventListener("pointermove",l),s.addEventListener("pointerup",l),s.addEventListener("pointerdown",c=>c.button!==2?l(c):u(c),!0),r.serialize=!1,r.serializeValue=()=>{}}}n(e,"showAnimatedPreview");function t(a){if(!a.widgets)return;const o=a.widgets.findIndex(s=>s.name===Ls);o>-1&&(a.widgets[o].onRemove?.(),a.widgets.splice(o,1))}return n(t,"removeAnimatedPreview"),{showAnimatedPreview:e,removeAnimatedPreview:t}}n(H2,"useNodeAnimatedImage");function Zs(e,t,a){let o=0,s=e[0].naturalWidth,r=e[0].naturalHeight;const i=e.length;let l,u,c,d,p;for(let f=1;f<=i;f++){const g=Math.ceil(i/f),m=t/f,h=a/g,y=m/s,k=h/r,S=Math.min(y,k,1),_=s*S,I=r*S,w=_*I*i;w>o&&(o=w,l=_,u=I,c=f,d=g,p=f*((m-_)/2))}return{cellWidth:l,cellHeight:u,cols:c,rows:d,shiftX:p}}n(Zs,"calculateImageGrid");function j2(e){const t=Ee("div.comfy-img-preview");let a,o=!0;function s(){let r=null,i=null;if(a){let l=t.clientHeight;o?(o=!1,l<190&&(l=190),t.style.setProperty("--comfy-widget-min-height",l.toString())):t.style.setProperty("--comfy-widget-min-height",null);const u=e.size[0];({cellWidth:r,cellHeight:i}=Zs(a,u-20,l)),r+="px",i+="px",t.style.setProperty("--comfy-img-preview-width",r),t.style.setProperty("--comfy-img-preview-height",i)}}return n(s,"updateSize"),{el:t,getCurrentImage(){return a?.[0]},updateImages(r){r!==a&&(a==null&&requestAnimationFrame(()=>{s()}),t.replaceChildren(...r),a=r,e.onResize?.(e.size),e.graph?.setDirtyCanvas(!0,!0))},getHeight(){s()},onDraw(){t.style.pointerEvents="all";const r=document.elementFromPoint(Z.canvas.mouse[0],Z.canvas.mouse[1]);t.style.pointerEvents="none",r&&(e.overIndex=a.indexOf(r))}}}n(j2,"createImageHost");window.comfyAPI=window.comfyAPI||{};window.comfyAPI.imagePreview=window.comfyAPI.imagePreview||{};window.comfyAPI.imagePreview.calculateImageGrid=Zs;window.comfyAPI.imagePreview.createImageHost=j2;var An=[],zr=!1;function wc(){zr||(zr=!0,queueMicrotask(()=>{const e=An;An=[],zr=!1;for(const t of e)t()}))}n(wc,"scheduleDeferredImageRender");var K2=n((e,t,a,o)=>{const s=gt().getCanvas(),r=s.graph_mouse;!s.pointer_is_down&&t.pointerDown&&(r[0]===t.pointerDown.pos[0]&&r[1]===t.pointerDown.pos[1]&&(t.imageIndex=t.pointerDown.index),t.pointerDown=null);const i=t.imgs??[];let{imageIndex:l}=t;const u=i.length;u===1&&!l&&(t.imageIndex=l=0);const c=Me().get("Comfy.Node.AllowImageSizeDraw"),d=c?15:0,p=t.size[0],f=o?o-d:0;if(l==null){let T,N,M,O,L;const F=K0(i);if(F)O=0,{cellWidth:T,cellHeight:N,cols:L,shiftX:M}=Zs(i,p,f);else{O=2;const j=i.reduce((q,re)=>Math.max(q,re.naturalWidth,re.naturalHeight),0),V=[];V.length=i.length,V[0]={naturalWidth:j,naturalHeight:j},{cellWidth:T,cellHeight:N,cols:L,shiftX:M}=Zs(V,p,f)}let K=!1;t.imageRects=[];for(let j=0;j<u;j++){const V=i[j],q=Math.floor(j/L),re=j%L,ae=re*T+M,ce=q*N+a;if(!K&&(K=Ne.isInsideRectangle(r[0],r[1],ae+t.pos[0],ce+t.pos[1],T,N),K)){t.overIndex=j;let ue=110;s.pointer_is_down&&((!t.pointerDown||t.pointerDown.index!==j)&&(t.pointerDown={index:j,pos:[...r]}),ue=125),e.filter=`contrast(${ue}%) brightness(${ue}%)`,s.canvas.style.cursor="pointer"}t.imageRects.push([ae,ce,T,N]);const ee=T/V.width,ne=N/V.height,B=Math.min(ee,ne),z=B*V.height,Y=q*N+a+(N-z)/2,ie=B*V.width,ge=re*T+M+(T-ie)/2,Le=e.getTransform(),_e=e.filter,Q={img:V,x:ge+O,y:Y+O,w:ie-O*2,h:z-O*2};An.push(()=>{e.save(),e.setTransform(Le),e.filter=_e,e.drawImage(Q.img,Q.x,Q.y,Q.w,Q.h),e.restore()}),wc(),F||(e.strokeStyle="#8F8F8F",e.lineWidth=1,e.strokeRect(ae+O,ce+O,T-O*2,N-O*2)),e.filter="none"}K||(t.pointerDown=null,t.overIndex=null);return}const g=i[l];let m=g.naturalWidth,h=g.naturalHeight;const y=p/m,k=f/h,S=Math.min(y,k,1);m*=S,h*=S;const _=(p-m)/2,I=(f-h)/2+a,w=e.getTransform();if(An.push(()=>{e.save(),e.setTransform(w),e.drawImage(g,_,I,m,h),e.restore()}),wc(),c){e.fillStyle=Ne.NODE_TEXT_COLOR,e.textAlign="center",e.font="10px sans-serif";const T=`${Math.round(g.naturalWidth)} × ${Math.round(g.naturalHeight)}`,N=I+h+10;e.fillText(T,_+m/2,N)}const x=n((T,N,M,O)=>{const L=Ne.isInsideRectangle(r[0],r[1],T+t.pos[0],N+t.pos[1],M,M);let F="#333",K="#fff",j=!1;return L&&(s.canvas.style.cursor="pointer",s.pointer_is_down?(F="#1e90ff",j=!0):(F="#eee",K="#000")),An.push(()=>{e.save(),e.setTransform(w),e.fillStyle=F,e.beginPath(),e.roundRect(T,N,M,M,[4]),e.fill(),e.fillStyle=K,e.font="12px Inter, sans-serif",e.textAlign="center",e.fillText(O,T+15,N+20),e.restore()}),j},"drawButton");if(!(u>1))return;const D=(t.imageIndex??0)+1;if(x(p-40,f+a-40,30,`${D}/${u}`)){const T=D>=u?0:D;(!t.pointerDown||t.pointerDown.index!==T)&&(t.pointerDown={index:T,pos:[...r]})}x(p-40,a+10,30,"x")&&(!t.pointerDown||t.pointerDown.index!==null)&&(t.pointerDown={index:null,pos:[...r]})},"renderPreview"),Y2=class extends Rd{static{n(this,"ImagePreviewWidget")}constructor(e,t,a){super({name:t,options:a,type:"custom",value:"",y:0},e),this.serialize=!1}drawWidget(e){K2(e,this.node,this.y,this.computedHeight)}onPointerDown(e,t){return e.onDragStart=()=>{const{canvas:a}=Z,{graph:o}=a;a.emitBeforeChange(),o?.beforeChange(),e.finally=()=>{a.isDragging=!1,o?.afterChange(),a.emitAfterChange()},a.processSelect(t,e.eDown),a.isDragging=!0},e.onDragEnd=a=>{const{canvas:o}=Z;(a.shiftKey||Ne.alwaysSnapToGrid)&&o.graph?.snapToGrid(o.selectedItems),o.setDirty(!0,!0)},!0}onClick(){}computeLayoutSize(){return{minHeight:220,minWidth:1}}};const q2=n(()=>n((t,a)=>t.addCustomWidget(new Y2(t,a.name,{serialize:!1,canvasOnly:!0})),"widgetConstructor"),"useImagePreviewWidget");var Vr="$$canvas-image-preview";function X2(){const e=q2();function t(o){o.imgs?.length&&(o.widgets?.find(s=>s.name===Vr)||e(o,{type:"IMAGE_PREVIEW",name:Vr}))}n(t,"showCanvasImagePreview");function a(o){if(!o.widgets)return;const s=o.widgets.findIndex(r=>r.name===Vr);s>-1&&(o.widgets[s].onRemove?.(),o.widgets.splice(s,1))}return n(a,"removeCanvasImagePreview"),{showCanvasImagePreview:t,removeCanvasImagePreview:a}}n(X2,"useNodeCanvasImagePreview");const Z2=Je("favoritedWidgets",()=>{const e=wt(),t=gt(),a=A([]);function o(_){return JSON.stringify([_.nodeLocatorId,_.widgetName])}n(o,"getFavoriteKey");function s(_){try{const[I,w]=JSON.parse(_);return!I||!w?null:{nodeLocatorId:I,widgetName:w}}catch{const I=_.indexOf(":");if(I===-1)return null;const w=_.slice(0,I),x=_.slice(I+1);return!w||!x?null:{nodeLocatorId:w,widgetName:x}}}n(s,"parseFavoriteKey");function r(_){return!_||!_.widgetName?null:"nodeLocatorId"in _&&_.nodeLocatorId?{nodeLocatorId:String(_.nodeLocatorId),widgetName:String(_.widgetName)}:"nodeId"in _&&_.nodeId!==void 0?{nodeLocatorId:e.nodeIdToNodeLocatorId(_.nodeId),widgetName:String(_.widgetName)}:null}n(r,"normalizeFavoritedId");function i(_,I){return{nodeLocatorId:e.nodeToNodeLocatorId(_),widgetName:I}}n(i,"createFavoriteId");function l(){const _=Z.rootGraph;if(!_){a.value=[];return}try{const I=_.extra?.favoritedWidgets;I?.favorites?a.value=I.favorites.map(w=>r(w)).filter(w=>w!==null).map(o):a.value=[]}catch(I){console.error("Failed to load favorited widgets from workflow:",I),a.value=[]}}n(l,"loadFromWorkflow");function u(){const _=Z.rootGraph;if(_)try{const I={favorites:a.value.map(s).filter(w=>w!==null)};_.extra??={},_.extra.favoritedWidgets=I,t.canvas?.setDirty(!0,!0)}catch(I){console.error("Failed to save favorited widgets to workflow:",I)}}n(u,"saveToWorkflow");function c(_){const I=Z.rootGraph;if(!I)return{..._,node:null,widget:null,label:`${_.widgetName} (graph not loaded)`};const w=Pd(I,_.nodeLocatorId);if(!w)return{..._,node:null,widget:null,label:`${_.widgetName} (node deleted)`};const x=w.widgets?.find(N=>N.name===_.widgetName);if(!x)return{..._,node:w,widget:null,label:`${_.widgetName} (widget not found)`};const D=w.title||w.type||"Node",T=x.label||x.name;return{..._,node:w,widget:x,label:`${D} / ${T}`}}n(c,"resolveWidget");const d=E(()=>a.value.map(s).filter(_=>_!==null).map(c)),p=E(()=>d.value.filter(_=>_.node!==null&&_.widget!==null));function f(_,I){return a.value.includes(o(i(_,I)))}n(f,"isFavorited");function g(_,I){const w=o(i(_,I));a.value.includes(w)||(a.value.push(w),u())}n(g,"addFavorite");function m(_,I){const w=o(i(_,I)),x=a.value.indexOf(w);x!==-1&&(a.value.splice(x,1),u())}n(m,"removeFavorite");function h(_,I){f(_,I)?m(_,I):g(_,I)}n(h,"toggleFavorite");function y(){a.value=[],u()}n(y,"clearFavorites");function k(){const _=p.value.map(x=>o({nodeLocatorId:x.nodeLocatorId,widgetName:x.widgetName})),I=new Set(_),w=a.value.filter(x=>I.has(x));w.length!==a.value.length&&(a.value=w,u())}n(k,"pruneInvalidFavorites");function S(_){a.value=_.map(I=>o({nodeLocatorId:I.nodeLocatorId,widgetName:I.widgetName})),u()}return n(S,"reorderFavorites"),be(()=>e.activeWorkflow?.path,()=>{l()},{immediate:!0}),{favoritedWidgets:d,validFavoritedWidgets:p,isFavorited:f,addFavorite:g,removeFavorite:m,toggleFavorite:h,clearFavorites:y,pruneInvalidFavorites:k,reorderFavorites:S}}),J2=Je("rightSidePanel",()=>{const e=Me(),t=E({get:n(()=>e.get("Comfy.RightSidePanel.IsOpen"),"get"),set:n(p=>e.set("Comfy.RightSidePanel.IsOpen",p),"set")}),a=A("parameters"),o=E(()=>a.value==="subgraph"),s=A(null),r=A("");function i(p){t.value=!0,p&&(a.value=p)}n(i,"openPanel");function l(){t.value=!1}n(l,"closePanel");function u(){t.value=!t.value}n(u,"togglePanel");function c(p){i("parameters"),s.value=p}n(c,"focusSection");function d(){s.value=null}return n(d,"clearFocusedSection"),{isOpen:t,activeTab:a,isEditingSubgraph:o,focusedSection:s,searchQuery:r,openPanel:i,closePanel:l,togglePanel:u,focusSection:c,clearFocusedSection:d}});function Q2(e,t){const a=[];if(!e.input_order)return Object.values(t);if(e.input_order.required)for(const s of e.input_order.required){const r=t[s];r&&!r.isOptional&&a.push(r)}if(e.input_order.optional)for(const s of e.input_order.optional){const r=t[s];r&&r.isOptional&&a.push(r)}const o=new Set(a.map(s=>s.name));for(const s of Object.values(t))o.has(s.name)||a.push(s);return a}n(Q2,"getOrderedInputSpecs");let Ut=(function(e){return e.Arc="arc",e.Rect="rect",e})({}),Qe=(function(e){return e.MaskPen="pen",e.PaintPen="rgbPaint",e.Eraser="eraser",e.MaskBucket="paintBucket",e.MaskColorFill="colorSelect",e})({});const em=[Qe.MaskPen,Qe.PaintPen,Qe.Eraser,Qe.MaskBucket,Qe.MaskColorFill];let na=(function(e){return e.SourceOver="source-over",e.DestinationOut="destination-out",e})({}),Xt=(function(e){return e.Black="black",e.White="white",e.Negative="negative",e})({}),bo=(function(e){return e.Simple="simple",e.HSL="hsl",e.LAB="lab",e})({});window.comfyAPI=window.comfyAPI||{};window.comfyAPI.types=window.comfyAPI.types||{};window.comfyAPI.types.BrushShape=Ut;window.comfyAPI.types.Tools=Qe;window.comfyAPI.types.allTools=em;window.comfyAPI.types.CompositionOperation=na;window.comfyAPI.types.MaskBlendMode=Xt;window.comfyAPI.types.ColorComparisonMethod=bo;function eD(e=20){const t=xt(),a=A([]),o=A(-1),s=A(!1),r=E(()=>a.value.length>1&&o.value>0),i=E(()=>a.value.length>1&&o.value<a.value.length-1),l=n(()=>{const{maskCtx:m,rgbCtx:h,imgCtx:y,maskCanvas:k,rgbCanvas:S,imgCanvas:_}=t;if(!m||!h||!y||!k||!S||!_){requestAnimationFrame(l);return}if(!k.width||!S.width||!_.width){requestAnimationFrame(l);return}a.value=[];const I=m.getImageData(0,0,k.width,k.height),w=h.getImageData(0,0,S.width,S.height),x=y.getImageData(0,0,_.width,_.height);a.value.push({mask:I,rgb:w,img:x}),o.value=0,s.value=!0},"saveInitialState"),u=n((m,h,y)=>{const{maskCtx:k,rgbCtx:S,imgCtx:_,maskCanvas:I,rgbCanvas:w,imgCanvas:x}=t;if(!k||!S||!_||!I||!w||!x)return;if(!s.value||o.value===-1){l();return}a.value=a.value.slice(0,o.value+1);let D,T,N;if(m&&h&&y?(D=m,T=h,N=y):(D=k.getImageData(0,0,I.width,I.height),T=S.getImageData(0,0,w.width,w.height),N=_.getImageData(0,0,x.width,x.height)),a.value.push({mask:D,rgb:T,img:N}),o.value++,a.value.length>e){const M=a.value.shift();M&&f(M),o.value--}},"saveState"),c=n(()=>{r.value&&(o.value--,p(a.value[o.value]))},"undo"),d=n(()=>{i.value&&(o.value++,p(a.value[o.value]))},"redo"),p=n(m=>{const{maskCtx:h,rgbCtx:y,imgCtx:k,maskCanvas:S,rgbCanvas:_,imgCanvas:I}=t;if(!h||!y||!k||!S||!_||!I)return;const w=m.mask,x=w.width,D=w.height;(S.width!==x||S.height!==D)&&(S.width=x,S.height=D,_.width=x,_.height=D,I.width=x,I.height=D),[{ctx:h,data:m.mask},{ctx:y,data:m.rgb},{ctx:k,data:m.img}].forEach(({ctx:T,data:N})=>{N instanceof ImageBitmap?(T.clearRect(0,0,N.width,N.height),T.drawImage(N,0,0)):T.putImageData(N,0,0)})},"restoreState"),f=n(m=>{m.mask instanceof ImageBitmap&&m.mask.close(),m.rgb instanceof ImageBitmap&&m.rgb.close(),m.img instanceof ImageBitmap&&m.img.close()},"cleanupState");return{canUndo:r,canRedo:i,currentStateIndex:o,saveInitialState:l,saveState:u,undo:c,redo:d,clearStates:n(()=>{a.value.forEach(f),a.value=[],o.value=-1,s.value=!1},"clearStates")}}n(eD,"useCanvasHistory");const xt=Je("maskEditor",()=>{const e=A({type:Ut.Arc,size:10,opacity:.7,hardness:1,stepSize:10}),t=A(Xt.Black),a=A("mask"),o=A("#FF0000"),s=A(Qe.MaskPen),r=A(!1),i=A(5),l=A(100),u=A(20),c=A(!1),d=A(bo.Simple),p=A(!1),f=A(!1),g=A(0),m=A(100),h=A(1),y=A(1),k=A({x:0,y:0}),S=A({x:0,y:0}),_=A(0),I=A(0),w=A(null),x=A(null),D=A(null),T=A(null),N=A(null),M=A(null),O=A(null),L=A(null),F=A(null),K=A(null),j=A(.8),V=A(!0),q=A(!1),re=A(!1),ae=eD(20),ce=A(null),ee=A(null),ne=A(!1),B=A(0),z=A(0),Y=A(null),ie=A(null);be(w,ye=>{ye&&(x.value=ye.getContext("2d",{willReadFrequently:!0}))}),be(D,ye=>{ye&&(T.value=ye.getContext("2d",{willReadFrequently:!0}))}),be(N,ye=>{ye&&(M.value=ye.getContext("2d",{willReadFrequently:!0}))});const ge=E(()=>ae.canUndo.value),Le=E(()=>ae.canRedo.value),_e=E(()=>{switch(t.value){case Xt.Black:return{r:0,g:0,b:0};case Xt.White:return{r:255,g:255,b:255};case Xt.Negative:return{r:255,g:255,b:255};default:return{r:0,g:0,b:0}}});function Q(ye){e.value.size=Be.clamp(ye,1,250)}n(Q,"setBrushSize");function ue(ye){e.value.opacity=Be.clamp(ye,0,1)}n(ue,"setBrushOpacity");function we(ye){e.value.hardness=Be.clamp(ye,0,1)}n(we,"setBrushHardness");function Ce(ye){e.value.stepSize=Be.clamp(ye,1,100)}n(Ce,"setBrushStepSize");function xe(){e.value.type=Ut.Arc,e.value.size=20,e.value.opacity=1,e.value.hardness=1,e.value.stepSize=5}n(xe,"resetBrushToDefault");function Ue(ye){i.value=Be.clamp(ye,0,255)}n(Ue,"setPaintBucketTolerance");function de(ye){l.value=Be.clamp(ye,0,100)}n(de,"setFillOpacity");function he(ye){u.value=Be.clamp(ye,0,255)}n(he,"setColorSelectTolerance");function Te(ye){g.value=Be.clamp(ye,0,255)}n(Te,"setMaskTolerance");function Ge(ye){m.value=Be.clamp(ye,0,100)}n(Ge,"setSelectionOpacity");function We(ye){h.value=Math.max(.1,Math.min(10,ye))}n(We,"setZoomRatio");function te(ye){k.value={...ye}}n(te,"setPanOffset");function le(ye){S.value={...ye}}n(le,"setCursorPoint");function me(){_.value++}n(me,"resetZoom");function ve(){I.value++}n(ve,"triggerClear");function Ie(ye){j.value=Be.clamp(ye,0,1)}n(Ie,"setMaskOpacity");function Ae(){e.value={type:Ut.Arc,size:10,opacity:.7,hardness:1,stepSize:5},t.value=Xt.Black,a.value="mask",o.value="#FF0000",s.value=Qe.MaskPen,r.value=!1,i.value=5,l.value=100,u.value=20,c.value=!1,d.value=bo.Simple,p.value=!1,f.value=!1,g.value=0,m.value=100,h.value=1,k.value={x:0,y:0},S.value={x:0,y:0},j.value=.8,ne.value=!1,B.value=0,z.value=0,Y.value=null,ie.value=null}return n(Ae,"resetState"),{brushSettings:e,maskBlendMode:t,activeLayer:a,rgbColor:o,currentTool:s,isAdjustingBrush:r,paintBucketTolerance:i,fillOpacity:l,colorSelectTolerance:u,colorSelectLivePreview:c,colorComparisonMethod:d,applyWholeImage:p,maskBoundary:f,maskTolerance:g,selectionOpacity:m,zoomRatio:h,displayZoomRatio:y,panOffset:k,cursorPoint:S,resetZoomTrigger:_,maskCanvas:w,maskCtx:x,rgbCanvas:D,rgbCtx:T,imgCanvas:N,imgCtx:M,canvasContainer:O,canvasBackground:L,pointerZone:F,image:K,maskOpacity:j,canUndo:ge,canRedo:Le,maskColor:_e,brushVisible:V,isPanning:q,brushPreviewGradientVisible:re,canvasHistory:ae,tgpuRoot:ce,gpuTexturesNeedRecreation:ne,gpuTextureWidth:B,gpuTextureHeight:z,pendingGPUMaskData:Y,pendingGPURgbData:ie,colorInput:ee,setBrushSize:Q,setBrushOpacity:ue,setBrushHardness:we,setBrushStepSize:Ce,resetBrushToDefault:xe,setPaintBucketTolerance:Ue,setFillOpacity:de,setColorSelectTolerance:he,setMaskTolerance:Te,setSelectionOpacity:Ge,setZoomRatio:We,setPanOffset:te,setCursorPoint:le,resetZoom:me,triggerClear:ve,clearTrigger:I,setMaskOpacity:Ie,resetState:Ae}});var ds=n((e,t,a,o)=>e[(a*o+t)*4+3],"getPixelAlpha"),yn=n((e,t,a,o)=>{const s=(a*o+t)*4;return{r:e[s],g:e[s+1],b:e[s+2]}},"getPixelColor"),Gr=n((e,t,a,o,s,r)=>{const i=(a*o+t)*4;e[i]=r.r,e[i+1]=r.g,e[i+2]=r.b,e[i+3]=s},"setPixel"),bc=n((e,t,a)=>{e/=255,t/=255,a/=255;const o=Math.max(e,t,a),s=Math.min(e,t,a);let r=0,i=0;const l=(o+s)/2;if(o!==s){const u=o-s;switch(i=l>.5?u/(2-o-s):u/(o+s),o){case e:r=(t-a)/u+(t<a?6:0);break;case t:r=(a-e)/u+2;break;case a:r=(e-t)/u+4;break}r/=6}return{h:r*360,s:i*100,l:l*100}},"rgbToHSL"),_c=n(e=>{let t=e.r/255,a=e.g/255,o=e.b/255;t=t>.04045?Math.pow((t+.055)/1.055,2.4):t/12.92,a=a>.04045?Math.pow((a+.055)/1.055,2.4):a/12.92,o=o>.04045?Math.pow((o+.055)/1.055,2.4):o/12.92,t*=100,a*=100,o*=100;const s=t*.4124+a*.3576+o*.1805,r=t*.2126+a*.7152+o*.0722,i=t*.0193+a*.1192+o*.9505,l=[s/95.047,r/100,i/108.883];for(let u=0;u<l.length;u++)l[u]=l[u]>.008856?Math.pow(l[u],1/3):7.787*l[u]+16/116;return{l:116*l[1]-16,a:500*(l[0]-l[1]),b:200*(l[1]-l[2])}},"rgbToLab"),kc=n((e,t,a)=>Math.sqrt(Math.pow(e.r-t.r,2)+Math.pow(e.g-t.g,2)+Math.pow(e.b-t.b,2))<=a,"isPixelInRangeSimple"),tD=n((e,t,a)=>{const o=bc(e.r,e.g,e.b),s=bc(t.r,t.g,t.b),r=Math.abs(o.h-s.h),i=Math.abs(o.s-s.s),l=Math.abs(o.l-s.l);return Math.sqrt(Math.pow(r/360*255,2)+Math.pow(i/100*255,2)+Math.pow(l/100*255,2))<=a},"isPixelInRangeHSL"),aD=n((e,t,a)=>{const o=_c(e),s=_c(t);return Math.sqrt(Math.pow(o.l-s.l,2)+Math.pow(o.a-s.a,2)+Math.pow(o.b-s.b,2))/100*255<=a},"isPixelInRangeLab"),Hr=n((e,t,a,o)=>{switch(o){case bo.Simple:return kc(e,t,a);case bo.HSL:return tD(e,t,a);case bo.LAB:return aD(e,t,a);default:return kc(e,t,a)}},"isPixelInRange");function tm(){const e=xt(),t=A(null),a=n(l=>{const u=e.maskCtx,c=e.maskCanvas;if(!u||!c)return;const d=Math.floor(l.x),p=Math.floor(l.y),f=c.width,g=c.height;if(d<0||d>=f||p<0||p>=g)return;const m=u.getImageData(0,0,f,g),h=m.data,y=ds(h,d,p,f),k=y!==255;if(y===-1)return;const S=e.maskColor,_=e.paintBucketTolerance,I=Math.floor(e.fillOpacity/100*255),w=[],x=new Uint8Array(f*g),D=n((T,N,M,O)=>T===-1?!1:O?T!==255&&Math.abs(T-N)<=M:T===255||Math.abs(T-N)<=M,"shouldProcessPixel");for(D(y,y,_,k)&&w.push([d,p]);w.length>0;){const[T,N]=w.pop(),M=N*f+T;if(x[M]||!D(ds(h,T,N,f),y,_,k))continue;x[M]=1,Gr(h,T,N,f,k?I:0,S);const O=n((L,F)=>{L<0||L>=f||F<0||F>=g||x[F*f+L]||D(ds(h,L,F,f),y,_,k)&&w.push([L,F])},"checkNeighbor");O(T-1,N),O(T+1,N),O(T,N-1),O(T,N+1)}u.putImageData(m,0,0),e.canvasHistory.saveState()},"paintBucketFill"),o=n(async l=>{const u=e.maskCtx,c=e.imgCtx,d=e.imgCanvas;if(!u||!c||!d)return;const p=d.width,f=d.height;t.value=l;const g=u.getImageData(0,0,p,f),m=g.data,h=c.getImageData(0,0,p,f).data,y=e.colorSelectTolerance,k=e.colorComparisonMethod,S=e.maskColor,_=Math.floor(e.selectionOpacity/100*255),I=e.applyWholeImage,w=e.maskBoundary,x=e.maskTolerance;if(I){const D=yn(h,Math.floor(l.x),Math.floor(l.y),p),T=1e4;for(let N=0;N<p*f;N+=T){const M=Math.min(N+T,p*f);for(let O=N;O<M;O++){const L=O%p,F=Math.floor(O/p);Hr(yn(h,L,F,p),D,y,k)&&Gr(m,L,F,p,_,S)}await new Promise(O=>setTimeout(O,0))}}else{const D=Math.floor(l.x),T=Math.floor(l.y);if(D<0||D>=p||T<0||T>=f)return;const N=yn(h,D,T,p),M=[],O=new Uint8Array(p*f);for(M.push([D,T]);M.length>0;){const[L,F]=M.pop(),K=F*p+L;if(O[K]||!Hr(yn(h,L,F,p),N,y,k))continue;O[K]=1,Gr(m,L,F,p,_,S);const j=n((V,q)=>{V<0||V>=p||q<0||q>=f||O[q*p+V]||Hr(yn(h,V,q,p),N,y,k)&&(w&&255-ds(m,V,q,p)<=x||M.push([V,q]))},"checkNeighbor");j(L-1,F),j(L+1,F),j(L,F-1),j(L,F+1)}}u.putImageData(g,0,0),e.canvasHistory.saveState()},"colorSelectFill"),s=n(()=>{const l=e.maskCtx,u=e.maskCanvas;if(!l||!u)return;const c=l.getImageData(0,0,u.width,u.height),d=c.data;let p=0,f=0,g=0;for(let m=0;m<d.length;m+=4)if(d[m+3]>0){p=d[m],f=d[m+1],g=d[m+2];break}for(let m=0;m<d.length;m+=4){const h=d[m+3];d[m+3]=255-h,h===0&&(d[m]=p,d[m+1]=f,d[m+2]=g)}l.putImageData(c,0,0),e.canvasHistory.saveState()},"invertMask"),r=n(()=>{const l=e.maskCtx,u=e.maskCanvas,c=e.rgbCtx,d=e.rgbCanvas;l&&u&&l.clearRect(0,0,u.width,u.height),c&&d&&c.clearRect(0,0,d.width,d.height),e.canvasHistory.saveState()},"clearMask"),i=n(()=>{t.value=null},"clearLastColorSelectPoint");return be([()=>e.colorSelectTolerance,()=>e.colorComparisonMethod,()=>e.selectionOpacity],async()=>{t.value&&e.colorSelectLivePreview&&e.canUndo&&(e.canvasHistory.undo(),await o(t.value))}),{paintBucketFill:a,colorSelectFill:o,clearLastColorSelectPoint:i,invertMask:s,clearMask:r}}n(tm,"useCanvasTools");function oD(){const e=xt(),t=n((c,d,p)=>{const f=d.width,g=d.height,m=c.getImageData(0,0,f,g),h=new ImageData(g,f),y=m.data,k=h.data;for(let S=0;S<g;S++)for(let _=0;_<f;_++){const I=(S*f+_)*4;let w,x;p?(w=g-1-S,x=_):(w=S,x=f-1-_);const D=(x*g+w)*4;k[D]=y[I],k[D+1]=y[I+1],k[D+2]=y[I+2],k[D+3]=y[I+3]}return h},"rotateCanvas"),a=n((c,d,p)=>{const f=d.width,g=d.height,m=c.getImageData(0,0,f,g),h=new ImageData(f,g),y=m.data,k=h.data;for(let S=0;S<g;S++)for(let _=0;_<f;_++){const I=(S*f+_)*4;let w,x;p?(w=f-1-_,x=S):(w=_,x=g-1-S);const D=(x*f+w)*4;k[D]=y[I],k[D+1]=y[I+1],k[D+2]=y[I+2],k[D+3]=y[I+3]}return h},"mirrorCanvas"),o=n(c=>{for(let d=0;d<c.length;d+=4){const p=c[d+3]/255;c[d]=Math.round(c[d]*p),c[d+1]=Math.round(c[d+1]*p),c[d+2]=Math.round(c[d+2]*p)}},"premultiplyData"),s=n(async(c,d)=>{if(!e.tgpuRoot||!e.maskCanvas||!e.rgbCanvas||!e.maskCtx||!e.rgbCtx)return;e.gpuTexturesNeedRecreation=!0,e.gpuTextureWidth=c,e.gpuTextureHeight=d;const p=e.maskCtx.getImageData(0,0,c,d),f=e.rgbCtx.getImageData(0,0,c,d),g=new Uint8ClampedArray(new ArrayBuffer(p.data.length)),m=new Uint8ClampedArray(new ArrayBuffer(f.data.length));if(g.set(p.data),m.set(f.data),g.buffer instanceof SharedArrayBuffer||m.buffer instanceof SharedArrayBuffer){console.error("[useCanvasTransform] SharedArrayBuffer detected, WebGPU writeTexture will fail");return}o(g),o(m),e.pendingGPUMaskData=g,e.pendingGPURgbData=m},"recreateGPUTextures");return{rotateClockwise:n(async()=>{const{maskCanvas:c,maskCtx:d,rgbCanvas:p,rgbCtx:f,imgCanvas:g,imgCtx:m}=e;if(!c||!d||!p||!f||!g||!m){console.error("[useCanvasTransform] Canvas contexts not ready");return}const h=c.width,y=c.height,k=t(d,c,!0),S=t(f,p,!0),_=t(m,g,!0);c.width=y,c.height=h,p.width=y,p.height=h,g.width=y,g.height=h,d.putImageData(k,0,0),f.putImageData(S,0,0),m.putImageData(_,0,0),e.tgpuRoot&&await s(y,h),e.canvasHistory.saveState(k,S,_)},"rotateClockwise"),rotateCounterclockwise:n(async()=>{const{maskCanvas:c,maskCtx:d,rgbCanvas:p,rgbCtx:f,imgCanvas:g,imgCtx:m}=e;if(!c||!d||!p||!f||!g||!m){console.error("[useCanvasTransform] Canvas contexts not ready");return}const h=c.width,y=c.height,k=t(d,c,!1),S=t(f,p,!1),_=t(m,g,!1);c.width=y,c.height=h,p.width=y,p.height=h,g.width=y,g.height=h,d.putImageData(k,0,0),f.putImageData(S,0,0),m.putImageData(_,0,0),e.tgpuRoot&&await s(y,h),e.canvasHistory.saveState(k,S,_)},"rotateCounterclockwise"),mirrorHorizontal:n(async()=>{const{maskCanvas:c,maskCtx:d,rgbCanvas:p,rgbCtx:f,imgCanvas:g,imgCtx:m}=e;if(!c||!d||!p||!f||!g||!m){console.error("[useCanvasTransform] Canvas contexts not ready");return}const h=a(d,c,!0),y=a(f,p,!0),k=a(m,g,!0);d.putImageData(h,0,0),f.putImageData(y,0,0),m.putImageData(k,0,0),e.tgpuRoot&&await s(c.width,c.height),e.canvasHistory.saveState(h,y,k)},"mirrorHorizontal"),mirrorVertical:n(async()=>{const{maskCanvas:c,maskCtx:d,rgbCanvas:p,rgbCtx:f,imgCanvas:g,imgCtx:m}=e;if(!c||!d||!p||!f||!g||!m){console.error("[useCanvasTransform] Canvas contexts not ready");return}const h=a(d,c,!1),y=a(f,p,!1),k=a(m,g,!1);d.putImageData(h,0,0),f.putImageData(y,0,0),m.putImageData(k,0,0),e.tgpuRoot&&await s(c.width,c.height),e.canvasHistory.saveState(h,y,k)},"mirrorVertical")}}n(oD,"useCanvasTransform");const br=Je("maskEditorData",()=>{const e=A(null),t=A(null),a=A(null),o=A(!1),s=A(null),r=E(()=>e.value!==null),i=E(()=>t.value!==null),l=E(()=>r.value&&!o.value);return{inputData:e,outputData:t,sourceNode:a,isLoading:o,loadError:s,hasValidInput:r,hasValidOutput:i,isReady:l,reset:n(()=>{e.value=null,t.value=null,a.value=null,o.value=!1,s.value=null},"reset"),setLoading:n((d,p)=>{o.value=d,p&&(s.value=p)},"setLoading")}});function nD(e){return{maskedImage:`clipspace-mask-${e}.png`,paint:`clipspace-paint-${e}.png`,paintedImage:`clipspace-painted-${e}.png`,paintedMaskedImage:`clipspace-painted-masked-${e}.png`}}n(nD,"imageLayerFilenamesByTimestamp");function sD(){const e=br(),t=xt(),a=Gt(),o=n(async()=>{const S=e.sourceNode;if(!S||!e.inputData)throw new Error("No source node or input data");try{const _=await s();e.outputData=_,await f(S,_),await c(_),g(S,_),Z.canvas.setDirty(!0)}catch(_){throw console.error("[MaskEditorSaver] Save failed:",_),_}},"save");async function s(){const S=t.maskCanvas,_=t.rgbCanvas,I=t.imgCanvas;if(!S||!_||!I)throw new Error("Canvas not initialized");const w=nD(Date.now()),[x,D,T,N]=await Promise.all([r(I,S,w.maskedImage),i(_,w.paint),l(I,_,w.paintedImage),u(I,_,S,w.paintedMaskedImage)]);return{maskedImage:x,paintLayer:D,paintedImage:T,paintedMaskedImage:N}}n(s,"prepareOutputData");async function r(S,_,I){const w=document.createElement("canvas");w.width=S.width,w.height=S.height;const x=w.getContext("2d");x.drawImage(S,0,0);const D=_.getContext("2d").getImageData(0,0,_.width,_.height),T=new Uint8ClampedArray(D.data.length);for(let M=0;M<D.data.length;M+=4)T[M]=0,T[M+1]=0,T[M+2]=0,T[M+3]=255-D.data[M+3];const N=x.getImageData(0,0,w.width,w.height);for(let M=0;M<N.data.length;M+=4)N.data[M+3]=T[M+3];return x.putImageData(N,0,0),{canvas:w,blob:await y(w),ref:k(I)}}n(r,"createMaskedImage");async function i(S,_){const I=h(S);return{canvas:I,blob:await y(I),ref:k(_)}}n(i,"createPaintLayer");async function l(S,_,I){const w=document.createElement("canvas");w.width=S.width,w.height=S.height;const x=w.getContext("2d");return x.drawImage(S,0,0),x.globalCompositeOperation="source-over",x.drawImage(_,0,0),{canvas:w,blob:await y(w),ref:k(I)}}n(l,"createPaintedImage");async function u(S,_,I,w){const x=document.createElement("canvas");x.width=S.width,x.height=S.height;const D=x.getContext("2d");D.drawImage(S,0,0),D.globalCompositeOperation="source-over",D.drawImage(_,0,0);const T=I.getContext("2d").getImageData(0,0,I.width,I.height),N=new Uint8ClampedArray(T.data.length);for(let O=0;O<T.data.length;O+=4)N[O]=0,N[O+1]=0,N[O+2]=0,N[O+3]=255-T.data[O+3];const M=D.getImageData(0,0,x.width,x.height);for(let O=0;O<M.data.length;O+=4)M.data[O+3]=N[O+3];return D.putImageData(M,0,0),{canvas:x,blob:await y(x),ref:k(w)}}n(u,"createPaintedMaskedImage");async function c(S){const _=e.inputData.sourceRef,I=await d(S.maskedImage,_),w=await p(S.paintLayer,_),x=await p(S.paintedImage,_),D=await d(S.paintedMaskedImage,x);S.maskedImage.ref=I,S.paintLayer.ref=w,S.paintedImage.ref=x,S.paintedMaskedImage.ref=D}n(c,"uploadAllLayers");async function d(S,_){const I=new FormData;I.append("image",S.blob,S.ref.filename),I.append("original_ref",JSON.stringify(_)),I.append("type","input"),I.append("subfolder","clipspace");const w=await oe.fetchApi("/upload/mask",{method:"POST",body:I});if(!w.ok)throw new Error(`Failed to upload mask: ${S.ref.filename}`);try{const x=await w.json();if(x?.name)return{filename:x.name,subfolder:x.subfolder||S.ref.subfolder,type:x.type||S.ref.type}}catch(x){console.warn("[MaskEditorSaver] Failed to parse upload response:",x)}return S.ref}n(d,"uploadMask");async function p(S,_){const I=new FormData;I.append("image",S.blob,S.ref.filename),I.append("original_ref",JSON.stringify(_)),I.append("type","input"),I.append("subfolder","clipspace");const w=await oe.fetchApi("/upload/image",{method:"POST",body:I});if(!w.ok)throw new Error(`Failed to upload image: ${S.ref.filename}`);try{const x=await w.json();if(x?.name)return{filename:x.name,subfolder:x.subfolder||S.ref.subfolder,type:x.type||S.ref.type}}catch(x){console.warn("[MaskEditorSaver] Failed to parse upload response:",x)}return S.ref}n(p,"uploadImage");async function f(S,_){S.imgs=[await m(_.paintedMaskedImage.canvas.toDataURL("image/png"))],Z.canvas.setDirty(!0)}n(f,"updateNodePreview");function g(S,_){const I=_.paintedMaskedImage.ref;S.images=[I];const w=S.widgets?.find(x=>x.name==="image");if(w){let x;if(qe?x=I.filename+(I.type?` [${I.type}]`:""):x=(I.subfolder?I.subfolder+"/":"")+I.filename+(I.type?` [${I.type}]`:""),w.value=x,S.properties&&(S.properties.image=x),S.widgets_values&&S.widgets){const D=S.widgets.indexOf(w);D>=0&&(S.widgets_values[D]=x)}w.callback?.(x)}a.updateNodeImages(S)}n(g,"updateNodeWithServerReferences");function m(S){return new Promise((_,I)=>{const w=new Image;w.crossOrigin="anonymous",w.onload=()=>_(w),w.onerror=x=>{console.error("[MaskEditorSaver] Failed to load image:",S,x),I(new Error(`Failed to load image: ${S}`))},w.src=S})}n(m,"loadImageFromUrl");function h(S){const _=document.createElement("canvas");return _.width=S.width,_.height=S.height,_.getContext("2d").drawImage(S,0,0),_}n(h,"cloneCanvas");function y(S){return new Promise((_,I)=>{S.toBlob(w=>{w?_(w):I(new Error("Failed to create blob from canvas"))},"image/png")})}n(y,"canvasToBlob");function k(S){return{filename:S,subfolder:"clipspace",type:"input"}}return n(k,"createFileRef"),{save:o}}n(sD,"useMaskEditorSaver");var rD={class:"flex w-full items-center justify-between gap-3"},iD={class:"flex items-center gap-3"},lD={class:"m-0 text-lg font-semibold"},uD={class:"flex items-center gap-4"},cD=["title"],dD=["title"],pD=["title"],fD=["title"],mD=["title"],gD=["title"],hD={class:"flex gap-3"},$o="flex h-7.5 w-12.5 items-center justify-center rounded-[10px] border border-border-default pointer-events-auto transition-colors duration-100 bg-comfy-menu-bg hover:bg-secondary-background-hover",Cc="h-7.5 w-15 rounded-[10px] border border-border-default text-current font-sans pointer-events-auto transition-colors duration-100 bg-comfy-menu-bg hover:bg-secondary-background-hover",vD=J({__name:"TopBarHeader",setup(e){const t=xt(),a=Ct(),o=tm(),s=oD(),r=sD(),i=A(G("g.save")),l=A(!0),u=n(()=>{t.canvasHistory.undo()},"onUndo"),c=n(()=>{t.canvasHistory.redo()},"onRedo"),d=n(async()=>{try{await s.rotateCounterclockwise()}catch(S){console.error("[TopBarHeader] Rotate left failed:",S)}},"onRotateLeft"),p=n(async()=>{try{await s.rotateClockwise()}catch(S){console.error("[TopBarHeader] Rotate right failed:",S)}},"onRotateRight"),f=n(async()=>{try{await s.mirrorHorizontal()}catch(S){console.error("[TopBarHeader] Mirror horizontal failed:",S)}},"onMirrorHorizontal"),g=n(async()=>{try{await s.mirrorVertical()}catch(S){console.error("[TopBarHeader] Mirror vertical failed:",S)}},"onMirrorVertical"),m=n(()=>{o.invertMask()},"onInvert"),h=n(()=>{o.clearMask(),t.triggerClear()},"onClear"),y=n(async()=>{i.value=G("g.saving"),l.value=!1;try{t.brushVisible=!1,await r.save(),a.closeDialog()}catch(S){console.error("[TopBarHeader] Save failed:",S),t.brushVisible=!0,i.value=G("g.save"),l.value=!0}},"handleSave"),k=n(()=>{a.closeDialog({key:"global-mask-editor"})},"handleCancel");return(S,_)=>(C(),P("div",rD,[v("div",iD,[v("h3",lD,$(b(G)("maskEditor.title")),1),v("div",uD,[v("button",{class:pe($o),title:b(G)("maskEditor.undo"),onClick:u},_[0]||(_[0]=[v("svg",{viewBox:"0 0 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-current"},[v("path",{d:"M8.77,12.18c-.25,0-.46-.2-.46-.46s.2-.46.46-.46c1.47,0,2.67-1.2,2.67-2.67,0-1.57-1.34-2.67-3.26-2.67h-3.98l1.43,1.43c.18.18.18.47,0,.64-.18.18-.47.18-.64,0l-2.21-2.21c-.18-.18-.18-.47,0-.64l2.21-2.21c.18-.18.47-.18.64,0,.18.18.18.47,0,.64l-1.43,1.43h3.98c2.45,0,4.17,1.47,4.17,3.58,0,1.97-1.61,3.58-3.58,3.58Z"})],-1)]),8,cD),v("button",{class:pe($o),title:b(G)("maskEditor.redo"),onClick:c},_[1]||(_[1]=[v("svg",{viewBox:"0 0 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-[var(--input-text)]"},[v("path",{class:"cls-1",d:"M6.23,12.18c-1.97,0-3.58-1.61-3.58-3.58,0-2.11,1.71-3.58,4.17-3.58h3.98l-1.43-1.43c-.18-.18-.18-.47,0-.64.18-.18.46-.18.64,0l2.21,2.21c.09.09.13.2.13.32s-.05.24-.13.32l-2.21,2.21c-.18.18-.47.18-.64,0-.18-.18-.18-.47,0-.64l1.43-1.43h-3.98c-1.92,0-3.26,1.1-3.26,2.67,0,1.47,1.2,2.67,2.67,2.67.25,0,.46.2.46.46s-.2.46-.46.46Z"})],-1)]),8,dD),_[6]||(_[6]=v("div",{class:"h-5 border-l border-border"},null,-1)),v("button",{class:pe($o),title:b(G)("maskEditor.rotateLeft"),onClick:d},_[2]||(_[2]=[v("svg",{viewBox:"-6 -7 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-[var(--input-text)]"},[v("path",{d:"m2.25-2.625c.3452 0 .625.2798.625.625v5c0 .3452-.2798.625-.625.625h-5c-.3452 0-.625-.2798-.625-.625v-5c0-.3452.2798-.625.625-.625h5zm1.25.625v5c0 .6904-.5596 1.25-1.25 1.25h-5c-.6904 0-1.25-.5596-1.25-1.25v-5c0-.6904.5596-1.25 1.25-1.25h5c.6904 0 1.25.5596 1.25 1.25zm-.1673-2.3757-.4419.4419-1.5246-1.5246 1.5416-1.5417.442.4419-.7871.7872h.9373c1.3807 0 2.5 1.1193 2.5 2.5h-.625c0-1.0355-.8395-1.875-1.875-1.875h-.9375l.7702.7702z"})],-1)]),8,pD),v("button",{class:pe($o),title:b(G)("maskEditor.rotateRight"),onClick:p},_[3]||(_[3]=[v("svg",{viewBox:"-9 -7 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-[var(--input-text)]"},[v("g",{transform:"scale(-1, 1)"},[v("path",{d:"m2.25-2.625c.3452 0 .625.2798.625.625v5c0 .3452-.2798.625-.625.625h-5c-.3452 0-.625-.2798-.625-.625v-5c0-.3452.2798-.625.625-.625h5zm1.25.625v5c0 .6904-.5596 1.25-1.25 1.25h-5c-.6904 0-1.25-.5596-1.25-1.25v-5c0-.6904.5596-1.25 1.25-1.25h5c.6904 0 1.25.5596 1.25 1.25zm-.1673-2.3757-.4419.4419-1.5246-1.5246 1.5416-1.5417.442.4419-.7871.7872h.9373c1.3807 0 2.5 1.1193 2.5 2.5h-.625c0-1.0355-.8395-1.875-1.875-1.875h-.9375l.7702.7702z"})])],-1)]),8,fD),v("button",{class:pe($o),title:b(G)("maskEditor.mirrorHorizontal"),onClick:f},_[4]||(_[4]=[v("svg",{viewBox:"0 0 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-[var(--input-text)]"},[v("path",{d:"M7.5,1.5c-.28,0-.5.22-.5.5v11c0,.28.22.5.5.5s.5-.22.5-.5v-11c0-.28-.22-.5-.5-.5Z"}),v("path",{d:"M3.5,4.5l-2,3,2,3v-6ZM11.5,4.5v6l2-3-2-3Z"})],-1)]),8,mD),v("button",{class:pe($o),title:b(G)("maskEditor.mirrorVertical"),onClick:g},_[5]||(_[5]=[v("svg",{viewBox:"0 0 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-[var(--input-text)]"},[v("path",{d:"M2,7.5c0-.28.22-.5.5-.5h11c.28,0,.5.22.5.5s-.22.5-.5.5h-11c-.28,0-.5-.22-.5-.5Z"}),v("path",{d:"M4.5,4.5l3-2,3,2h-6ZM4.5,10.5h6l-3,2-3-2Z"})],-1)]),8,gD),_[7]||(_[7]=v("div",{class:"h-5 w-px bg-[var(--p-form-field-border-color)]"},null,-1)),v("button",{class:pe(Cc),onClick:m},$(b(G)("maskEditor.invert")),1),v("button",{class:pe(Cc),onClick:h},$(b(G)("maskEditor.clear")),1)])]),v("div",hD,[R(se,{variant:"primary",disabled:!l.value,onClick:y},{default:W(()=>[_[8]||(_[8]=v("i",{class:"pi pi-check"},null,-1)),fe(" "+$(i.value),1)]),_:1},8,["disabled"]),R(se,{variant:"secondary",onClick:k},{default:W(()=>[_[9]||(_[9]=v("i",{class:"pi pi-times"},null,-1)),fe(" "+$(b(G)("g.cancel")),1)]),_:1})])]))}}),yD=vD;function am(){const e=xt(),t=n(async(r,i,l)=>{const u=e.maskColor;l.drawImage(r,0,0,i.width,i.height);const c=l.getImageData(0,0,i.width,i.height);for(let d=0;d<c.data.length;d+=4){const p=c.data[d+3];c.data[d]=u.r,c.data[d+1]=u.g,c.data[d+2]=u.b,c.data[d+3]=255-p}l.globalCompositeOperation="source-over",l.putImageData(c,0,0)},"prepareMask"),a=n(async(r,i,l)=>{const{imgCanvas:u,maskCanvas:c,rgbCanvas:d,imgCtx:p,maskCtx:f,rgbCtx:g}=e;if(!u||!c||!d||!p||!f||!g)throw new Error("Canvas elements or contexts not available");u.width=r.width,u.height=r.height,c.width=r.width,c.height=r.height,d.width=r.width,d.height=r.height,p.drawImage(r,0,0,r.width,r.height),l&&g.drawImage(l,0,0,l.width,l.height),await t(i,c,f)},"invalidateCanvas"),o=n(()=>{const r=e.canvasBackground;r&&(e.maskBlendMode===Xt.Black?r.style.backgroundColor="rgba(0,0,0,1)":(e.maskBlendMode===Xt.White||e.maskBlendMode===Xt.Negative)&&(r.style.backgroundColor="rgba(255,255,255,1)"))},"setCanvasBackground");return{invalidateCanvas:a,updateMaskColor:n(async()=>{const{maskCanvas:r,maskCtx:i,maskColor:l,maskBlendMode:u,maskOpacity:c}=e;if(!r||!i)return;u===Xt.Negative?(r.style.mixBlendMode="difference",r.style.opacity="1"):(r.style.mixBlendMode="initial",r.style.opacity=String(c)),i.fillStyle=`rgb(${l.r}, ${l.g}, ${l.b})`,o();const d=i.getImageData(0,0,r.width,r.height);for(let p=0;p<d.data.length;p+=4)d.data[p]=l.r,d.data[p+1]=l.g,d.data[p+2]=l.b;i.putImageData(d,0,0)},"updateMaskColor")}}n(am,"useCanvasManager");function wD(){const e=xt(),t=br(),a=am();return{loadImages:n(async()=>{const s=t.inputData;if(!s)throw new Error("No input data available in dataStore");const{imgCanvas:r,maskCanvas:i,rgbCanvas:l,imgCtx:u,maskCtx:c}=e;if(!r||!i||!l||!u||!c)throw new Error("Canvas elements or contexts not available");u.clearRect(0,0,r.width,r.height),c.clearRect(0,0,i.width,i.height);const d=s.baseLayer.image,p=s.maskLayer.image,f=s.paintLayer?.image;return i.width=d.width,i.height=d.height,l.width=d.width,l.height=d.height,e.image=d,await a.invalidateCanvas(d,p,f||null),await a.updateMaskColor(),d},"loadImages")}}n(wD,"useImageLoaderInternal");const bD=on(wD);function _D(){const e=xt(),t=A([]),a=n(u=>t.value.includes(u),"isKeyDown"),o=n(()=>{t.value=[]},"clearKeys"),s=n(u=>{if(t.value.includes(u.key)||t.value.push(u.key),u.key===" "){u.preventDefault();const c=document.activeElement;c&&c.blur&&c.blur()}if((u.ctrlKey||u.metaKey)&&!u.altKey){const c=u.key.toUpperCase();c==="Y"&&!u.shiftKey||c==="Z"&&u.shiftKey?e.canvasHistory.redo():c==="Z"&&!u.shiftKey&&e.canvasHistory.undo()}},"handleKeyDown"),r=n(u=>{t.value=t.value.filter(c=>c!==u.key)},"handleKeyUp");return{isKeyDown:a,addListeners:n(()=>{document.addEventListener("keydown",s),document.addEventListener("keyup",r),window.addEventListener("blur",o)},"addListeners"),removeListeners:n(()=>{document.removeEventListener("keydown",s),document.removeEventListener("keyup",r),window.removeEventListener("blur",o)},"removeListeners")}}n(_D,"useKeyboard");var xc="clipspace-painted-masked-";function kD(e){if(!e.startsWith(xc))return;const t=e.slice(25),a=parseInt(t.split(".")[0],10);return{maskedImage:`clipspace-mask-${a}.png`,paint:`clipspace-paint-${a}.png`,paintedImage:`clipspace-painted-${a}.png`,paintedMaskedImage:`${xc}${a}.png`}}n(kD,"imageLayerFilenamesIfApplicable");function jr(e){return{filename:e,subfolder:"clipspace",type:"input"}}n(jr,"toRef");function ps(e){const t=new URLSearchParams;t.set("filename",e.ref.filename),e.ref.subfolder&&t.set("subfolder",e.ref.subfolder),e.ref.type&&t.set("type",e.ref.type);const a=oe.apiURL("/view?"+t.toString()+Z.getPreviewFormatParam()+Z.getRandParam()),o=new Image;return o.crossOrigin="anonymous",o.src=a,o.src}n(ps,"mkFileUrl");function CD(){const e=br(),t=Gt(),a=n(async c=>{e.setLoading(!0);try{o(c);let d=s(c),p=r(d),f;if(c.widgets){const x=c.widgets.find(D=>D.name==="image");x&&(typeof x.value=="string"?f=x.value:typeof x.value=="object"&&x.value&&"filename"in x.value&&typeof x.value.filename=="string"&&(f=x.value.filename))}if(f&&!f.startsWith("$"))try{let x=f,D,T="input";const N=x.match(/ \[([^\]]+)\]$/);N&&(T=N[1],x=x.substring(0,x.length-N[0].length));const M=x.lastIndexOf("/");M!==-1&&(D=x.substring(0,M),x=x.substring(M+1)),p={filename:x,type:T,subfolder:D},d=ps({ref:p})}catch(x){console.warn("Failed to parse widget filename as ref",x)}const g=f||p.filename;let m;if(qe)try{const x=await oe.fetchApi(`/files/mask-layers?filename=${g}`);x.ok&&(m=await x.json())}catch{}let h=kD(p.filename);if(m){const x=m.painted_masked||m.painted;x&&(h={maskedImage:x,paint:m.paint||"",paintedImage:m.painted||"",paintedMaskedImage:m.painted_masked||x})}const y=h?.maskedImage?ps({ref:jr(h.maskedImage)}):d,k=h?.maskedImage?r(y):p;let S=null;m?.paint?S=ps({ref:jr(m.paint)}):h?.paint&&(S=ps({ref:jr(h.paint)}));const[_,I,w]=await Promise.all([i(y,"rgb"),i(y,"a"),S?u(S):Promise.resolve(void 0)]);e.inputData={baseLayer:_,maskLayer:I,paintLayer:w,sourceRef:k,nodeId:c.id},e.sourceNode=c,e.setLoading(!1)}catch(d){const p=d instanceof Error?d.message:"Failed to load from node";throw console.error("[MaskEditorLoader]",p,d),e.setLoading(!1,p),d}},"loadFromNode");function o(c){if(!c)throw new Error("Node is null or undefined");if(!(c.imgs?.length||c.previewMediaType==="image"))throw new Error("Node has no images")}n(o,"validateNode");function s(c){if(c.images?.[0]){const p=c.images[0],f=new URLSearchParams({filename:p.filename,type:p.type||"output",subfolder:p.subfolder||""});return oe.apiURL(`/view?${f.toString()}`)}const d=t.getNodeOutputs(c);if(d?.images?.[0]){const p=d.images[0];if(!p.filename)throw new Error("nodeOutputStore image missing filename");const f=new URLSearchParams;return f.set("filename",p.filename),f.set("type",p.type||"output"),f.set("subfolder",p.subfolder||""),oe.apiURL(`/view?${f.toString()}`)}if(c.imgs?.length){const p=c.imageIndex??0,f=c.imgs[p].src;if(f&&!f.startsWith("data:"))return f}throw new Error("Unable to get image URL from node")}n(s,"getNodeImageUrl");function r(c){try{const d=new URL(c),p=d.searchParams.get("filename");if(!p)throw new Error("Image URL missing filename parameter");return{filename:p,subfolder:d.searchParams.get("subfolder")||void 0,type:d.searchParams.get("type")||void 0}}catch{try{const p=new URL(c,window.location.origin),f=p.searchParams.get("filename");if(!f)throw new Error("Image URL missing filename parameter");return{filename:f,subfolder:p.searchParams.get("subfolder")||void 0,type:p.searchParams.get("type")||void 0}}catch{throw new Error(`Invalid image URL: ${c}`)}}}n(r,"parseImageRef");async function i(c,d){let p;try{p=new URL(c)}catch{p=new URL(c,window.location.origin)}d&&(p.searchParams.delete("channel"),p.searchParams.set("channel",d));const f=p.toString();return{image:await l(f),url:f}}n(i,"loadImageLayer");function l(c){return new Promise((d,p)=>{const f=new Image;f.crossOrigin="anonymous",f.onload=()=>d(f),f.onerror=()=>p(new Error(`Failed to load image: ${c}`)),f.src=c})}n(l,"loadImage");async function u(c){let d;try{d=new URL(c)}catch{d=new URL(c,window.location.origin)}const p=d.toString();return{image:await l(p),url:p}}return n(u,"loadPaintLayer"),{loadFromNode:a}}n(CD,"useMaskEditorLoader");function xD(){const e=xt(),t=300,a=A(0),o=A(!1),s=A(0),r=A({x:0,y:0}),i=A({x:0,y:0}),l=A(1),u=A(1),c=A({x:0,y:0}),d=A(null),p=A({x:0,y:0}),f=A(null),g=A(null),m=A(null),h=A(null),y=A(null),k=A(null),S=A(null),_=A(0),I=A(0),w=A({x:0,y:0}),x=A([]),D=n(z=>{const Y=z[0].clientX-z[1].clientX,ie=z[0].clientY-z[1].clientY;return Math.sqrt(Y*Y+ie*ie)},"getTouchDistance"),T=n(z=>({x:(z[0].clientX+z[1].clientX)/2,y:(z[0].clientY+z[1].clientY)/2}),"getTouchMidpoint"),N=n(z=>{const Y=z.x-c.value.x,ie=z.y-c.value.y;w.value={x:Y,y:ie},e.setCursorPoint({x:Y,y:ie})},"updateCursorPosition"),M=n(()=>{e.canvasHistory.undo()},"handleDoubleTap"),O=n(async()=>{if(!S.value?.width||!S.value?.height||!c.value||!l.value){console.warn("Missing required properties for pan/zoom");return}const z=S.value.width*l.value,Y=S.value.height*l.value;f.value||(f.value=e.canvasContainer),f.value&&(Object.assign(f.value.style,{width:`${z}px`,height:`${Y}px`,left:`${c.value.x}px`,top:`${c.value.y}px`}),m.value||(m.value=e.rgbCanvas),m.value&&((m.value.width!==S.value.width||m.value.height!==S.value.height)&&(m.value.width=S.value.width,m.value.height=S.value.height),m.value.style.width=`${z}px`,m.value.style.height=`${Y}px`),e.setPanOffset(c.value),e.setZoomRatio(l.value))},"invalidatePanZoom"),L=n(z=>{d.value={x:z.clientX,y:z.clientY},e.isPanning=!0,p.value={...c.value}},"handlePanStart"),F=n(async z=>{if(d.value===null)throw new Error("mouseDownPoint is null");const Y=d.value.x-z.clientX,ie=d.value.y-z.clientY;c.value={x:p.value.x-Y,y:p.value.y-ie},await O()},"handlePanMove"),K=n(async z=>{if(i.value===null){i.value={x:z.clientX,y:z.clientY};return}const Y=z.clientX-i.value.x,ie=z.clientY-i.value.y;c.value.x+=Y,c.value.y+=ie,await O(),i.value={x:z.clientX,y:z.clientY}},"handleSingleTouchPan"),j=n(z=>{if(z.preventDefault(),!(x.value.length>0))if(e.brushVisible=!1,z.touches.length===2){const Y=new Date().getTime();Y-a.value<t?(M(),a.value=0):(a.value=Y,o.value=!0,s.value=D(z.touches),r.value=T(z.touches))}else z.touches.length===1&&(i.value={x:z.touches[0].clientX,y:z.touches[0].clientY})},"handleTouchStart"),V=n(async z=>{if(z.preventDefault(),!(x.value.length>0))if(a.value=0,o.value&&z.touches.length===2){const Y=D(z.touches),ie=Y/s.value,ge=l.value;l.value=Math.max(.2,Math.min(10,l.value*ie));const Le=l.value,_e=T(z.touches);if(r.value){const xe=_e.x-r.value.x,Ue=_e.y-r.value.y;c.value.x+=xe,c.value.y+=Ue}if(g.value===null&&(g.value=e.maskCanvas),!g.value)return;const Q=g.value.getBoundingClientRect(),ue=_e.x-Q.left,we=_e.y-Q.top,Ce=Le/ge;c.value.x+=ue-ue*Ce,c.value.y+=we-we*Ce,await O(),s.value=Y,r.value=_e}else z.touches.length===1&&await K(z.touches[0])},"handleTouchMove"),q=n(z=>{z.preventDefault();const Y=z.touches[0];Y?i.value={x:Y.clientX,y:Y.clientY}:(o.value=!1,r.value={x:0,y:0})},"handleTouchEnd"),re=n(async z=>{const Y={x:z.clientX,y:z.clientY},ie=l.value,ge=z.deltaY<0?1.1:.9;l.value=Math.max(.2,Math.min(10,l.value*ge));const Le=l.value;if(g.value||(g.value=e.maskCanvas),!g.value)return;const _e=g.value.getBoundingClientRect(),Q=Y.x-_e.left,ue=Y.y-_e.top,we=Le/ie;c.value.x+=Q-Q*we,c.value.y+=ue-ue*we,await O();const Ce=g.value.clientWidth/_.value;u.value=Ce,e.displayZoomRatio=Ce,N(Y)},"zoom"),ae=n(()=>{const z=y.value?.getBoundingClientRect().width||64;return{sidePanelWidth:k.value?.getBoundingClientRect().width||220,toolPanelWidth:z}},"getPanelDimensions"),ce=n(async(z=500)=>{if(!S.value||!h.value)return;const Y=l.value,ie={...c.value},{sidePanelWidth:ge,toolPanelWidth:Le}=ae(),_e=h.value.clientWidth-ge-Le,Q=h.value.clientHeight,ue=_e/S.value.width,we=Q/S.value.height,Ce=Math.min(ue,we),xe=S.value.width/S.value.height;let Ue,de;const he={x:Le,y:0};we>ue?(Ue=_e,de=Ue/xe,he.y=(Q-de)/2):(de=Q,Ue=de*xe,he.x=(_e-Ue)/2+Le);const Te=performance.now(),Ge=n(async We=>{const te=We-Te,le=Math.min(te/z,1),me=1-Math.pow(1-le,3);l.value=Y+(Ce-Y)*me,c.value.x=ie.x+(he.x-ie.x)*me,c.value.y=ie.y+(he.y-ie.y)*me,await O(),e.displayZoomRatio=Y+(1-Y)*me,le<1&&requestAnimationFrame(Ge)},"animate");requestAnimationFrame(Ge),u.value=1},"smoothResetView"),ee=n(async(z,Y,ie,ge)=>{h.value=Y,y.value=ie||null,k.value=ge||null;const{sidePanelWidth:Le,toolPanelWidth:_e}=ae(),Q=Y.clientWidth-Le-_e,ue=Y.clientHeight,we=Q/z.width,Ce=ue/z.height,xe=z.width/z.height;let Ue,de;const he={x:_e,y:0};Ce>we?(Ue=Q,de=Ue/xe,he.y=(ue-de)/2):(de=ue,Ue=de*xe,he.x=(Q-Ue)/2+_e),S.value===null&&(S.value=z),_.value=Ue,I.value=de,l.value=Math.min(we,Ce),c.value=he,x.value=[],await O()},"initializeCanvasPanZoom");return be(()=>e.resetZoomTrigger,async()=>{u.value!==1&&await ce()}),{initializeCanvasPanZoom:ee,handlePanStart:L,handlePanMove:F,handleTouchStart:j,handleTouchMove:V,handleTouchEnd:q,updateCursorPosition:N,zoom:re,invalidatePanZoom:O,addPenPointerId:n(z=>{x.value.includes(z)||x.value.push(z)},"addPenPointerId"),removePenPointerId:n(z=>{const Y=x.value.indexOf(z);Y!==-1&&x.value.splice(Y,1)},"removePenPointerId")}}n(xD,"usePanAndZoom");function ID(){const e=xt();return{screenToCanvas:n(o=>{const s=b(e.pointerZone),r=b(e.canvasContainer),i=b(e.maskCanvas);if(!s||!r||!i)return console.warn("screenToCanvas called before elements are available"),{x:0,y:0};const l=s.getBoundingClientRect(),u=r.getBoundingClientRect(),c=i.getBoundingClientRect(),d=l.left+o.x,p=l.top+o.y,f=d-u.left,g=p-u.top,m=i.width/c.width,h=i.height/c.height;return{x:f*m,y:g*h}},"screenToCanvas"),canvasToScreen:n(o=>{const s=b(e.pointerZone),r=b(e.canvasContainer),i=b(e.maskCanvas);if(!s||!r||!i)return console.warn("canvasToScreen called before elements are available"),{x:0,y:0};const l=s.getBoundingClientRect(),u=r.getBoundingClientRect(),c=i.getBoundingClientRect(),d=c.width/i.width,p=c.height/i.height,f=o.x*d,g=o.y*p,m=u.left+f,h=u.top+g;return{x:m-l.left,y:h-l.top}},"canvasToScreen")}}n(ID,"useCoordinateTransformInternal");const om=on(ID);function SD(e,t,a,o,s){const i=n((y,k,S)=>{const _=Math.hypot(S.x-k.x,S.y-k.y);return y+Math.pow(_,.5)},"getT"),l=0,u=i(l,e,t),c=i(u,t,a),d=i(c,a,o),p=u+(c-u)*s,f=n((y,k,S,_,I)=>{if(Math.abs(_-S)<1e-4)return y;const w=(I-S)/(_-S);return ED(Ic(y,1-w),Ic(k,w))},"interp"),g=f(e,t,l,u,p),m=f(t,a,u,c,p),h=f(a,o,c,d,p);return f(f(g,m,l,c,p),f(m,h,u,d,p),u,c,p)}n(SD,"catmullRomSpline");function ED(e,t){return{x:e.x+t.x,y:e.y+t.y}}n(ED,"add");function Ic(e,t){return{x:e.x*t,y:e.y*t}}n(Ic,"mul");function nm(e,t,a){if(e.length===0)return{points:[],remainder:a};const o=[];let s=0,r=a;for(let i=0;i<e.length-1;i++){const l=e[i],u=e[i+1],c=u.x-l.x,d=u.y-l.y,p=Math.hypot(c,d);if(p<1e-4){for(;r<=s;)o.push(l),r+=t;continue}for(;r<=s+p;){const f=(r-s)/p,g=l.x+f*c,m=l.y+f*d;o.push({x:g,y:m}),r+=t}s+=p}return{points:o,remainder:r-s}}n(nm,"resampleSegment");const Ml=(globalThis.__TYPEGPU_AUTONAME__??(e=>e))(Ki({brushColor:Sd,brushOpacity:Zo,hardness:Zo,screenSize:qi,brushShape:Vg}),"BrushUniforms"),TD=(globalThis.__TYPEGPU_AUTONAME__??(e=>e))(Ki({pos:uo(0,qi),size:uo(1,Zo),pressure:uo(2,Zo)}),"StrokePoint");var sm=(globalThis.__TYPEGPU_AUTONAME__??(e=>e))(Ki({position:Mg.position,localUV:uo(0,qi),color:uo(1,Sd),opacity:uo(2,Zo),hardness:uo(3,Zo)}),"VertexOutput"),AD=`
|
|
39
|
+
A 20 20, 0, 0, 0, 30 50"></path></clipPath></defs><g clip-path="var(--shape)" stroke-width="4"><path d="M 50 0 A 50 50, 0, 0, 1, 50 100" fill="var(--type1, red)"></path><path d="M 50 100 A 50 50, 0, 0, 1, 50 0" fill="var(--type2, blue)"></path><path d="M50 0L50 100" stroke="var(--inner-stroke, black)"></path><path d="M50 2A48 48 0 0 1 50 98A48 48 0 0 1 50 2" fill="transparent" stroke="var(--outer-stroke, transparent)"></path></g>`,2)])])}n(mM,"render$1");var gM=bt({name:"comfy-node-slot2",render:mM});function pc(e){return e?`var(--color-datatype-${String(e).toUpperCase()}, #AAA)`:"#AAA"}n(pc,"getSlotColor");var hM=J({__name:"SlotConnectionDot",props:{slotData:{},class:{type:[Array,Object,String,Number,null,Boolean]},hasError:{type:Boolean},multi:{type:Boolean}},setup(e,{expose:t}){const a=e,o=hd("slot-el");function s(){return a.hasError?["var(--color-error)"]:a.slotData?[...new Set(`${a.slotData.type}`.split(",").map(pc))].slice(0,3):[pc()]}n(s,"getTypes");const r=s();t({slotElRef:o});const i=E(()=>Pe("bg-slate-300 rounded-full slot-dot","transition-all duration-150","border border-solid border-node-component-slot-dot-outline",a.multi?"w-3 h-6":"size-3 cursor-crosshair group-hover/slot:[--node-component-slot-dot-outline-opacity-mult:5] group-hover/slot:scale-125"));return(l,u)=>{const c=gM,d=pM;return C(),P("div",{class:pe(b(Pe)("after:absolute after:inset-y-0 after:w-5/2 relative size-6 flex items-center justify-center group/slot",a.class))},[b(r).length===1?(C(),P("div",{key:0,ref:"slot-el",style:nt({backgroundColor:b(r)[0]}),class:pe(i.value)},null,6)):(C(),P("div",{key:1,ref:"slot-el",style:nt({"--type1":b(r)[0],"--type2":b(r)[1],"--type3":b(r)[2]}),class:pe(i.value)},[b(r).length===2?(C(),X(c,{key:0,class:"size-full -translate-y-1/2"})):(C(),X(d,{key:1,class:"size-full -translate-y-1/2"}))],6))],2)}}}),Vf=hM,vM={key:0,class:"node-error p-1 text-xs text-red-500"},yM={class:"h-full flex items-center min-w-0"},wM=J({__name:"InputSlot",props:{nodeType:{},nodeId:{},slotData:{},index:{},connected:{type:Boolean},compatible:{type:Boolean},dotOnly:{type:Boolean},socketless:{type:Boolean}},setup(e){const t=e,a=Ot(),o=E(()=>{const k=a.lastNodeErrors?.[t.nodeId??""];if(!k)return!1;const S=t.slotData.name;return k.errors.some(_=>_.extra_info?.input_name===S)}),s=A(null),{toastErrorHandler:r}=ta(),{getInputSlotTooltip:i,createTooltipConfig:l}=yr(t.nodeType||""),u=E(()=>{const k=t.slotData.localized_name||t.slotData.name||"";return l(i(k)||`Input: ${k}`)});zn(k=>(s.value=k.message,r(k),!1));const{state:c}=Kn(),d=E(()=>ia(t.nodeId??"",t.index,!0)),p=E(()=>c.active?!c.compatible.get(d.value):!1),f=A(null),g=A(null);ar(()=>{g.value=f.value?.slotElRef||null}),Wf({nodeId:t.nodeId??"",index:t.index,type:"input",element:g});const{onClick:m,onDoubleClick:h,onPointerDown:y}=zf({nodeId:t.nodeId??"",index:t.index,type:"input"});return(k,S)=>{const _=ht("tooltip");return s.value?(C(),P("div",vM,"⚠️")):ze((C(),P("div",{key:1,class:pe(b(Pe)("lg-slot lg-slot--input flex items-center group rounded-r-lg m-0","cursor-crosshair",t.dotOnly?"lg-slot--dot-only":"pr-6",{"lg-slot--connected":t.connected,"lg-slot--compatible":t.compatible,"opacity-40":p.value},t.socketless&&"pointer-events-none invisible"))},[R(Vf,{ref_key:"connectionDotRef",ref:f,class:pe(b(Pe)("-translate-x-1/2 w-3",o.value&&"before:ring-2 before:ring-error before:ring-offset-0 before:size-4 before:absolute before:rounded-full before:pointer-events-none")),"slot-data":k.slotData,onClick:b(m),onDblclick:b(h),onPointerdown:b(y)},null,8,["class","slot-data","onClick","onDblclick","onPointerdown"]),v("div",yM,[k.dotOnly?H("",!0):(C(),P("span",{key:0,class:pe(b(Pe)("truncate text-node-component-slot-text",o.value&&"text-error font-medium"))},$(k.slotData.label||k.slotData.localized_name||k.slotData.name||`Input ${k.index}`),3))])],2)),[[_,u.value,void 0,{left:!0}]])}}}),Gf=wM,bM={key:0,class:"node-error p-1 text-xs text-red-500"},_M={class:"relative h-full flex items-center min-w-0"},kM={key:0,class:"truncate text-node-component-slot-text"},CM=J({__name:"OutputSlot",props:{nodeType:{},nodeId:{},slotData:{},index:{},connected:{type:Boolean},compatible:{type:Boolean},dotOnly:{type:Boolean}},setup(e){const t=e,a=A(null),{toastErrorHandler:o}=ta(),{getOutputSlotTooltip:s,createTooltipConfig:r}=yr(t.nodeType||""),i=E(()=>{const m=t.slotData.name||"";return r(s(t.index)||`Output: ${m}`)});zn(m=>(a.value=m.message,o(m),!1));const{state:l}=Kn(),u=E(()=>ia(t.nodeId??"",t.index,!1)),c=E(()=>l.active?!l.compatible.get(u.value):!1),d=E(()=>Pe("lg-slot lg-slot--output flex items-center justify-end group rounded-l-lg h-6","cursor-crosshair",t.dotOnly?"lg-slot--dot-only justify-center":"pl-6",{"lg-slot--connected":t.connected,"lg-slot--compatible":t.compatible,"opacity-40":c.value})),p=A(null),f=A(null);ar(()=>{f.value=p.value?.slotElRef||null}),Wf({nodeId:t.nodeId??"",index:t.index,type:"output",element:f});const{onPointerDown:g}=zf({nodeId:t.nodeId??"",index:t.index,type:"output"});return(m,h)=>{const y=ht("tooltip");return a.value?(C(),P("div",bM,"⚠️")):ze((C(),P("div",{key:1,class:pe(d.value)},[v("div",_M,[m.dotOnly?H("",!0):(C(),P("span",kM,$(m.slotData.localized_name||m.slotData.name||`Output ${m.index}`),1))]),R(Vf,{ref_key:"connectionDotRef",ref:p,class:"w-3 translate-x-1/2","slot-data":m.slotData,onPointerdown:b(g)},null,8,["slot-data","onPointerdown"])],2)),[[y,i.value,void 0,{right:!0}]])}}}),xM=CM,IM={key:0,class:"node-error p-2 text-sm text-red-500"},SM=J({__name:"NodeSlots",props:{nodeData:{},unified:{type:Boolean,default:!1}},setup(e){const t=E(()=>e.unified?KA(e.nodeData):[]),a=E(()=>[...jA(e.nodeData),...t.value]),o=E(()=>Pe(e.unified&&"absolute inset-0 items-center pointer-events-none opacity-0 z-30")),s=E(()=>Pe(e.unified&&"grid grid-cols-1 grid-rows-1 gap-0 [&>*]:row-span-full [&>*]:col-span-full place-items-center")),r=n((u,c)=>{if(!e.nodeData?.inputs)return c;const d=e.nodeData.inputs.findIndex(p=>p===u);return d!==-1?d:c},"getActualInputIndex"),i=A(null),{toastErrorHandler:l}=ta();return zn(u=>(i.value=u.message,l(u),!1)),(u,c)=>i.value?(C(),P("div",IM,$(b(De)("nodeErrors.slots","Node Slots Error")),1)):(C(),P("div",{key:1,class:pe(b(Pe)("flex justify-between min-w-0",o.value))},[a.value.length?(C(),P("div",{key:0,class:pe(b(Pe)("flex flex-col min-w-0",s.value))},[(C(!0),P(Se,null,Ze(a.value,(d,p)=>(C(),X(Gf,{key:`input-${p}`,"slot-data":d,"node-type":u.nodeData?.type||"","node-id":u.nodeData?.id!=null?String(u.nodeData.id):"",index:r(d,p)},null,8,["slot-data","node-type","node-id","index"]))),128))],2)):H("",!0),u.nodeData?.outputs?.length?(C(),P("div",{key:1,class:pe(b(Pe)("ml-auto flex flex-col min-w-0",s.value))},[(C(!0),P(Se,null,Ze(u.nodeData.outputs,(d,p)=>(C(),X(xM,{key:`output-${p}`,"slot-data":d,"node-type":u.nodeData?.type||"","node-id":u.nodeData?.id!=null?String(u.nodeData.id):"",index:p},null,8,["slot-data","node-type","node-id","index"]))),128))],2)):H("",!0)],2))}}),EM=SM;function TM(e={}){const{layoutSource:t=Ah.Vue}=e,a=Od();function o(s,r){a.setSource(r??t),a.bringNodeToFront(s)}return n(o,"bringNodeToFront"),{bringNodeToFront:o}}n(TM,"useNodeZIndex");var AM=J({__name:"WidgetDOM",props:{widget:{},nodeId:{}},setup(e){const t=e,a=A(),{canvas:o}=gt();return it(()=>{if(!a.value)return;const s=o?.graph?.getNodeById(t.nodeId)??void 0;if(!s)return;const r=s.widgets?.find(i=>i.name===t.widget.name);!r||!On(r)||a.value.replaceChildren(r.element)}),(s,r)=>(C(),P("div",{ref_key:"domEl",ref:a,onPointerdown:r[0]||(r[0]=Ve(()=>{},["stop"])),onPointermove:r[1]||(r[1]=Ve(()=>{},["stop"])),onPointerup:r[2]||(r[2]=Ve(()=>{},["stop"])),onMousedown:r[3]||(r[3]=Ve(()=>{},["stop"])),onMousemove:r[4]||(r[4]=Ve(()=>{},["stop"])),onMouseup:r[5]||(r[5]=Ve(()=>{},["stop"]))},null,544))}}),MM=AM,gn=2,PM=J({__name:"WidgetLegacy",props:{widget:{}},setup(e){const t=e,a=A(),o=A(20),s=gt().canvas;let r,i,l;it(()=>{r=s?.graph?.getNodeById(a.value.parentElement.attributes["node-id"].value)??void 0,r&&(i=r.widgets?.find(f=>f.name===t.widget.name),i&&(a.value.width*=gn,i.triggerDraw||(i.callback=Fa(i.callback,function(){this?.triggerDraw?.()})),i.triggerDraw=u,Gi(a.value.parentElement,u),be(()=>za().activePaletteId,u),l=new mh(a.value)))}),Wa(()=>{i&&(i.triggerDraw=()=>{})});function u(){if(!i||!r)return;const f=a.value.parentElement.clientWidth;let g=20;i.computedHeight?g=i.computedHeight:i.computeLayoutSize?g=i.computeLayoutSize(r).minHeight:i.computeSize&&(g=i.computeSize(f)[1]),o.value=g,r.canvasHeight=g,i.y=0,a.value.height=(g+2)*gn,a.value.width=f*gn;const m=a.value?.getContext("2d");m&&(m.scale(gn,gn),i.draw?.(m,r,f,1,g))}n(u,"draw");function c(f){!r||!i||!l||(Tn(f,r,s),l.down(f),i.mouse&&(l.onDrag=g=>i.mouse?.(g,[g.offsetX,g.offsetY],r)),s.processWidgetClick(f,r,i,l))}n(c,"handleDown");function d(f){!l||!r||(Tn(f,r,s),f.click_time=f.timeStamp-(l?.eDown?.timeStamp??0),l.up(f))}n(d,"handleUp");function p(f){!l||!r||(Tn(f,r,s),l.move(f))}return n(p,"handleMove"),(f,g)=>(C(),P("div",{class:"relative mx-[-12px] min-w-0 basis-0",style:nt({minHeight:`${o.value}px`})},[v("canvas",{ref_key:"canvasEl",ref:a,class:"absolute w-full cursor-crosshair",onPointerdown:Ve(c,["stop"]),onPointerup:Ve(d,["stop"]),onPointermove:Ve(p,["stop"])},null,544)],4))}}),DM=PM,LM=ft(()=>ut(()=>import("./WidgetButton-C38jCi-K.js"),__vite__mapDeps([31,2,3,4,17,18,16,32]),import.meta.url)),OM=ft(()=>ut(()=>import("./WidgetInputText-C2hSgXgj.js"),__vite__mapDeps([33,1,2,3,4,16,34,35,32]),import.meta.url)),fc=ft(()=>ut(()=>import("./WidgetInputNumber-BaClCNAC.js"),__vite__mapDeps([36,1,2,3,4,17,18,16,37,15,10,38,12,39,34,35,32,40]),import.meta.url)),NM=ft(()=>ut(()=>import("./WidgetToggleSwitch-Cr_gcxrn.js"),__vite__mapDeps([41,1,2,3,4,16,34,32]),import.meta.url)),$M=ft(()=>ut(()=>import("./WidgetSelect-DzZPpO_-.js"),__vite__mapDeps([42,1,2,3,4,43,16,5,6,7,8,9,10,11,12,13,44,17,18,39,34,35,32,20,21,24,25]),import.meta.url)),RM=ft(()=>ut(()=>import("./WidgetColorPicker-BqD_P_fO.js"),__vite__mapDeps([45,1,2,3,4,16,34,35,13,32]),import.meta.url)),BM=ft(()=>ut(()=>import("./WidgetTextarea-DfQXNiz9.js"),__vite__mapDeps([46,1,2,3,4,16,35,32]),import.meta.url)),FM=ft(()=>ut(()=>import("./WidgetChart-W7Mx0ol0.js"),__vite__mapDeps([47,1,2,3,4]),import.meta.url)),UM=ft(()=>ut(()=>import("./WidgetImageCompare-DUdtG65y.js"),__vite__mapDeps([48,2,3,4]),import.meta.url)),WM=ft(()=>ut(()=>import("./WidgetGalleria-CnVS2r7z.js"),__vite__mapDeps([49,15,1,2,3,4,10,32,50]),import.meta.url)),zM=ft(()=>ut(()=>import("./WidgetMarkdown-BWek7AuF.js"),__vite__mapDeps([51,1,2,3,4,25]),import.meta.url)),VM=ft(()=>ut(()=>import("./WidgetLegacy-B4nipUM9.js"),__vite__mapDeps([52,1,2,3,4,5,6,7,8,9,10,11,12,13,17,18,16,20,21,24,25]),import.meta.url)),GM=ft(()=>ut(()=>import("./WidgetRecordAudio-Nk8dH238.js"),__vite__mapDeps([53,1,2,3,4,5,6,7,8,9,10,11,12,13,17,18,16,20,21,22,23,24,25]),import.meta.url)),HM=ft(()=>ut(()=>import("./AudioPreviewPlayer-CkxKvcVf.js"),__vite__mapDeps([54,1,2,3,4,5,6,7,8,9,10,11,12,13,17,18,16,20,21,55,15,22,56,57,24,25]),import.meta.url)),jM=ft(()=>ut(()=>import("./WidgetAudioUI-Dw-r3Ews.js"),__vite__mapDeps([58,1,2,3,4,43,16,5,6,7,8,9,10,11,12,13,44,17,18,39,34,35,32,20,21,55,15,22,56,57,24,25]),import.meta.url)),KM=ft(()=>ut(()=>import("./Load3D-c9UwgGoI.js"),__vite__mapDeps([59,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,24,25]),import.meta.url)),YM=ft(()=>ut(()=>import("./WidgetImageCrop-kERy9g5I.js"),__vite__mapDeps([60,1,2,3,4,5,6,7,8,9,10,11,12,13,61,17,18,16,20,21,24,25]),import.meta.url)),qM=ft(()=>ut(()=>import("./WidgetBoundingBox-Drks44-Z.js"),__vite__mapDeps([62,2,3,4,61]),import.meta.url)),XM=[["button",{component:LM,aliases:["BUTTON"],essential:!1}],["string",{component:OM,aliases:["STRING","text"],essential:!1}],["int",{component:fc,aliases:["INT"],essential:!0}],["float",{component:fc,aliases:["FLOAT","number","slider"],essential:!0}],["boolean",{component:NM,aliases:["BOOLEAN","toggle"],essential:!0}],["combo",{component:$M,aliases:["COMBO","asset"],essential:!0}],["color",{component:RM,aliases:["COLOR"],essential:!1}],["textarea",{component:BM,aliases:["TEXTAREA","multiline","customtext"],essential:!1}],["chart",{component:FM,aliases:["CHART"],essential:!1}],["imagecompare",{component:UM,aliases:["IMAGECOMPARE"],essential:!1}],["galleria",{component:WM,aliases:["GALLERIA"],essential:!1}],["markdown",{component:zM,aliases:["MARKDOWN","progressText"],essential:!1}],["legacy",{component:VM,aliases:[],essential:!0}],["audiorecord",{component:GM,aliases:["AUDIO_RECORD","AUDIORECORD"],essential:!1}],["audioUI",{component:HM,aliases:["AUDIOUI","AUDIO_UI"],essential:!1}],["load3D",{component:KM,aliases:["LOAD_3D"],essential:!1}],["imagecrop",{component:YM,aliases:["IMAGECROP"],essential:!1}],["boundingbox",{component:qM,aliases:["BOUNDINGBOX"],essential:!1}]],ZM=n(()=>new Map([["audio",jM]]),"getComboWidgetAdditions"),Hf=new Map,jf=new Map;for(const[e,t]of XM){Hf.set(e,t);for(const a of t.aliases)jf.set(a,e)}var Kf=n(e=>jf.get(e)||e,"getCanonicalType");const JM=n((e,t)=>{if(e=="combo"){const o=ZM();if(o.has(t))return o.get(t)||null}const a=Kf(e);return Hf.get(a)?.component||null},"getComponent"),QM=n(e=>!e.options?.canvasOnly&&!!e.type,"shouldRenderAsVue");var eP=["textarea","markdown","load3D"];function tP(e){const t=Kf(e);return eP.includes(t)}n(tP,"shouldExpand");var aP={key:0,class:"node-error p-2 text-sm text-red-500"},oP={key:0,class:"lg-node-widget group col-span-full grid grid-cols-subgrid items-stretch"},nP=J({__name:"NodeWidgets",props:{nodeData:{}},setup(e){const{shouldHandleNodePointerEvents:t,forwardEventToCanvas:a}=vl(),{bringNodeToFront:o}=TM();function s(g){t.value||(g.stopPropagation(),a(g))}n(s,"handleWidgetPointerEvent");function r(){e.nodeData?.id!=null&&o(String(e.nodeData.id))}n(r,"handleBringToFront");const i=A(null),{toastErrorHandler:l}=ta();zn(g=>(i.value=g.message,l(g),!1));const u=E(()=>e.nodeData?.type||""),{getWidgetTooltip:c,createTooltipConfig:d}=yr(u.value),p=E(()=>{if(!e.nodeData?.widgets)return[];const{widgets:g}=e.nodeData,m=[];for(const h of g){let w=function(D){h.value=D,h.callback?.(D)};if(n(w,"updateHandler"),!QM(h))continue;const y=JM(h.type,h.name)||(h.isDOMWidget?MM:DM),{slotMetadata:k,options:S}=h,_=k?.linked?{...S,disabled:!0}:S,I={name:h.name,type:h.type,value:h.value,borderStyle:h.borderStyle,callback:h.callback,controlWidget:h.controlWidget,label:h.label,nodeType:h.nodeType,options:_,spec:h.spec},x=d(c(h));m.push({name:h.name,type:h.type,vueComponent:y,simplified:I,value:h.value,updateHandler:w,tooltipConfig:x,slotMetadata:k})}return m}),f=E(()=>{if(!e.nodeData?.widgets)return"";const g=new Set(Wt(p).map(m=>m.name));return e.nodeData.widgets.filter(m=>g.has(m.name)&&!m.options?.hidden).map(m=>tP(m.type)||m.hasLayoutSize?"auto":"min-content").join(" ")});return(g,m)=>{const h=ht("tooltip");return i.value?(C(),P("div",aP,$(b(De)("nodeErrors.widgets","Node Widgets Error")),1)):(C(),P("div",{key:1,class:pe(b(Pe)("lg-node-widgets grid grid-cols-[min-content_minmax(80px,max-content)_minmax(125px,auto)] flex-1 gap-y-1 pr-3",b(t)?"pointer-events-auto":"pointer-events-none")),style:nt({"grid-template-rows":f.value}),onPointerdownCapture:r,onPointerdown:s,onPointermove:s,onPointerup:s},[(C(!0),P(Se,null,Ze(p.value,(y,k)=>(C(),P(Se,{key:`widget-${k}-${y.name}`},[y.simplified.options?.hidden?H("",!0):(C(),P("div",oP,[v("div",{class:pe(b(Pe)("z-10 w-3 opacity-0 transition-opacity duration-150 group-hover:opacity-100 flex items-stretch",y.slotMetadata?.linked&&"opacity-100"))},[y.slotMetadata?(C(),X(Gf,{key:0,"slot-data":{name:y.name,type:y.type,boundingRect:[0,0,0,0]},"node-id":g.nodeData?.id!=null?String(g.nodeData.id):"",index:y.slotMetadata.index,socketless:y.simplified.spec?.socketless,"dot-only":""},null,8,["slot-data","node-id","index","socketless"])):H("",!0)],2),ze((C(),X(Wn(y.vueComponent),{modelValue:y.value,"onUpdate:modelValue":[S=>y.value=S,y.updateHandler],widget:y.simplified,"node-id":g.nodeData?.id!=null?String(g.nodeData.id):"","node-type":u.value,class:"col-span-2"},null,8,["modelValue","onUpdate:modelValue","widget","node-id","node-type"])),[[h,y.tooltipConfig,void 0,{left:!0}]])]))],64))),128))],38))}}}),sP=nP,rP=["data-node-id"],iP={class:"flex flex-col justify-center items-center relative pointer-events-none"},lP=["data-testid"],uP=J({__name:"LGraphNodePreview",props:{nodeDef:{},position:{default:"absolute"}},setup(e){const t=jn(),a=E(()=>{const o=Object.entries(e.nodeDef.inputs||{}).filter(([i,l])=>t.inputIsWidget(l)).map(([i,l])=>({name:i,type:l.widgetType||l.type,value:l.default!==void 0?l.default:l.type==="COMBO"&&Array.isArray(l.options)&&l.options.length>0?l.options[0]:"",options:{hidden:l.hidden,advanced:l.advanced,values:l.type==="COMBO"?l.options:void 0}})),s=Object.entries(e.nodeDef.inputs||{}).filter(([i,l])=>!t.inputIsWidget(l)).map(([i,l])=>({name:i,type:l.type,shape:l.isOptional?co.HollowCircle:void 0,boundingRect:[0,0,0,0],link:null})),r=(e.nodeDef.outputs||[]).map(i=>typeof i=="string"?{name:i,type:i,boundingRect:[0,0,0,0],links:[]}:{...i,boundingRect:[0,0,0,0],links:[]});return{id:`preview-${e.nodeDef.name}`,title:e.nodeDef.display_name||e.nodeDef.name,type:e.nodeDef.name,mode:0,selected:!1,executing:!1,widgets:o,inputs:s,outputs:r,flags:{collapsed:!1}}});return(o,s)=>(C(),P("div",{"data-node-id":a.value.id,class:pe(b(Pe)("bg-component-node-background lg-node pb-1 contain-style contain-layout w-[350px] rounded-2xl touch-none flex flex-col border-1 border-solid outline-transparent outline-2 border-node-stroke",o.position))},[v("div",iP,[R(HA,{"node-data":a.value},null,8,["node-data"])]),v("div",{class:"flex flex-1 flex-col gap-1 pb-2 pointer-events-none","data-testid":`node-body-${a.value.id}`},[R(EM,{"node-data":a.value},null,8,["node-data"]),a.value.widgets?.length?(C(),X(sP,{key:0,"node-data":a.value,class:"pointer-events-none"},null,8,["node-data"])):H("",!0)],8,lP)],10,rP))}}),cP=uP,dP={key:1,class:"_sb_node_preview bg-component-node-background"},pP={class:"_sb_table"},fP=["title"],mP={class:"_sb_preview_badge"},gP={class:"_sb_col"},hP={class:"_sb_col"},vP={class:"_sb_col"},yP=["innerHTML"],wP=J({__name:"NodePreview",props:{nodeDef:{},position:{default:"absolute"}},setup(e){const{shouldRenderVueNodes:t}=vr(),a=za(),o=E(()=>a.completedActivePalette.colors.litegraph_base),s=jn(),{description:r}=e.nodeDef,i=E(()=>r?zd(r):""),l=Object.values(e.nodeDef.inputs),u=e.nodeDef.outputs,c=l.filter(f=>!s.inputIsWidget(f)),d=l.filter(f=>s.inputIsWidget(f)),p=n((f,g=32)=>{let m;return typeof f=="object"&&f!==null||Array.isArray(f)?m=JSON.stringify(f):typeof f=="string"?m=f:m=String(f),Be.truncate(m,{length:g})},"truncateDefaultValue");return(f,g)=>b(t)?(C(),X(cP,{key:0,"node-def":f.nodeDef,position:f.position},null,8,["node-def","position"])):(C(),P("div",dP,[v("div",pP,[v("div",{class:"node_header mr-4 text-ellipsis",title:f.nodeDef.display_name,style:nt({backgroundColor:o.value.NODE_DEFAULT_COLOR,color:o.value.NODE_TITLE_COLOR})},[g[0]||(g[0]=v("div",{class:"_sb_dot headdot pr-3"},null,-1)),fe(" "+$(f.nodeDef.display_name),1)],12,fP),v("div",mP,$(f.$t("g.preview")),1),(C(!0),P(Se,null,Ze(b(Be).zip(b(c),b(u)),([m,h])=>(C(),P("div",{key:(m?.name||"")+(h?.index.toString()||""),class:"_sb_row slot_row"},[v("div",gP,[m?(C(),P("div",{key:0,class:pe(["_sb_dot",m.type])},null,2)):H("",!0)]),v("div",hP,$(m?m.name:""),1),g[1]||(g[1]=v("div",{class:"_sb_col middle-column"},null,-1)),v("div",{class:"_sb_col _sb_inherit",style:nt({color:o.value.NODE_TEXT_COLOR})},$(h?h.name:""),5),v("div",vP,[h?(C(),P("div",{key:0,class:pe(["_sb_dot",h.type])},null,2)):H("",!0)])]))),128)),(C(!0),P(Se,null,Ze(b(d),m=>(C(),P("div",{key:m.name,class:"_sb_row _long_field"},[g[2]||(g[2]=v("div",{class:"_sb_col _sb_arrow"},"◀",-1)),v("div",{class:"_sb_col",style:nt({color:o.value.WIDGET_SECONDARY_TEXT_COLOR})},$(m.name),5),g[3]||(g[3]=v("div",{class:"_sb_col middle-column"},null,-1)),v("div",{class:"_sb_col _sb_inherit",style:nt({color:o.value.WIDGET_TEXT_COLOR})},$(p(m.default)),5),g[4]||(g[4]=v("div",{class:"_sb_col _sb_arrow"},"▶",-1))]))),128))]),i.value?(C(),P("div",{key:0,class:"_sb_description",style:nt({color:o.value.WIDGET_SECONDARY_TEXT_COLOR,backgroundColor:o.value.WIDGET_BGCOLOR}),innerHTML:i.value},null,12,yP)):H("",!0)]))}}),wr=ot(wP,[["__scopeId","data-v-e348d541"]]),bP={class:"_content"},_P={class:"_footer"},kP=J({__name:"NodeSearchFilter",emits:["addFilter"],setup(e,{emit:t}){const a=E(()=>i.nodeSearchService.nodeFilters),o=A(),s=E(()=>o.value?.fuseSearch.data??[]),r=A(""),i=zt();it(()=>{o.value=i.nodeSearchService.nodeFilters[0],u()});const l=t,u=n(()=>{s.value.includes(r.value)||(r.value=s.value[0])},"updateSelectedFilterValue"),c=n(()=>{o.value&&l("addFilter",{filterDef:o.value,value:r.value})},"submit");return(d,p)=>(C(),P(Se,null,[v("div",bP,[R(b($i),{modelValue:o.value,"onUpdate:modelValue":p[0]||(p[0]=f=>o.value=f),class:"filter-type-select",options:a.value,"allow-empty":!1,"option-label":"name",onChange:u},null,8,["modelValue","options"]),R(b(Aa),{modelValue:r.value,"onUpdate:modelValue":p[1]||(p[1]=f=>r.value=f),class:"filter-value-select",options:s.value,filter:"","auto-filter-focus":""},null,8,["modelValue","options"])]),v("div",_P,[R(se,{type:"button",onClick:c},{default:W(()=>[fe($(d.$t("g.add")),1)]),_:1})])],64))}}),CP=ot(kP,[["__scopeId","data-v-96ed3454"]]);function Tl(e){return e.split("@")[0]}n(Tl,"normalizePackId");function Yf(e){return sg(e,(t,a)=>Tl(a))}n(Yf,"normalizePackKeys");function qf(e){const t=e?.split(".")||[];return t.length>=2&&t[0]==="custom_nodes"?Tl(t[1]):null}n(qf,"extractCustomNodeName");function xP(e){const t=Ji(e.python_module);if(t.type===to.Blueprint)return"";if(t.type===to.CustomNodes){const a=qf(e.python_module);if(a)return`/extensions/${a}/docs/`}return`/docs/${e.name}/`}n(xP,"getNodeHelpBaseUrl");var IP=class{static{n(this,"NodeHelpService")}async fetchNodeHelp(e,t){const a=Ji(e.python_module);return a.type===to.Blueprint?e.description||"":a.type===to.CustomNodes?this.fetchCustomNodeHelp(e,t):this.fetchCoreNodeHelp(e,t)}async fetchCustomNodeHelp(e,t){const a=qf(e.python_module);let o;if(!a)throw new Error("Invalid custom node module");const s=`/extensions/${a}/docs/${e.name}/${t}.md`,r=await this.tryFetchMarkdown(s);if(r.text)return r.text;o=r.errorText;const i=`/extensions/${a}/docs/${e.name}.md`,l=await this.tryFetchMarkdown(i);if(l.text)return l.text;throw o=l.errorText??o,new Error(o??"Help not found")}async fetchCoreNodeHelp(e,t){const a=`/docs/${e.name}/${t}.md`,o=await this.tryFetchMarkdown(a);if(!o.text)throw new Error(o.errorText??"Help not found");return o.text}async tryFetchMarkdown(e){const t=await fetch(oe.fileURL(e));if(!t.ok)return{text:null,errorText:t.statusText};const a=t.headers?.get?.("content-type")??"",o=await t.text();return a.includes("text/html")?{text:null,errorText:t.statusText}:{text:o}}};const SP=new IP;function EP(e){const{locale:t}=Fe(),a=A(""),o=A(!1),s=A(null);let r=null;const i=E(()=>{const u=Wt(e);return u?xP(u):""}),l=E(()=>zd(a.value,i.value));return be(()=>Wt(e),async u=>{if(a.value="",s.value=null,u){o.value=!0;const c=r=SP.fetchNodeHelp(u,t.value||"en");try{const d=await c;if(r!==c)return;a.value=d}catch(d){if(r!==c)return;s.value=d instanceof Error?d.message:String(d),a.value=u.description||""}finally{r===c&&(r=null,o.value=!1)}}},{immediate:!0}),{helpContent:a,isLoading:o,error:s,baseUrl:i,renderedHelpHtml:l}}n(EP,"useNodeHelpContent");var TP={class:"node-help-content mx-auto w-full"},AP=["innerHTML"],MP={key:2,class:"fallback-content space-y-6 text-sm"},PP={key:0},DP={key:1},LP={class:"overflow-x-auto"},OP={key:2},NP={class:"overflow-x-auto"},$P=J({__name:"NodeHelpContent",props:{node:{}},setup(e){const{renderedHelpHtml:t,isLoading:a,error:o}=EP(()=>e.node),s=E(()=>Object.values(e.node.inputs).map(i=>({name:i.name,type:i.type,tooltip:i.tooltip||""}))),r=E(()=>e.node.outputs.map(i=>({name:i.name,type:i.type,tooltip:i.tooltip||""})));return(i,l)=>(C(),P("div",TP,[b(a)?(C(),X(b(Io),{key:0,class:"m-auto","aria-label":i.$t("g.loading")},null,8,["aria-label"])):b(o)?(C(),P("div",MP,[i.node.description?(C(),P("p",PP,[v("strong",null,$(i.$t("g.description"))+":",1),fe(" "+$(i.node.description),1)])):H("",!0),s.value.length?(C(),P("div",DP,[v("p",null,[v("strong",null,$(i.$t("nodeHelpPage.inputs"))+":",1)]),v("table",LP,[v("thead",null,[v("tr",null,[v("th",null,$(i.$t("g.name")),1),v("th",null,$(i.$t("nodeHelpPage.type")),1),v("th",null,$(i.$t("g.description")),1)])]),v("tbody",null,[(C(!0),P(Se,null,Ze(s.value,u=>(C(),P("tr",{key:u.name},[v("td",null,[v("code",null,$(u.name),1)]),v("td",null,$(u.type),1),v("td",null,$(u.tooltip||"-"),1)]))),128))])])])):H("",!0),r.value.length?(C(),P("div",OP,[v("p",null,[v("strong",null,$(i.$t("nodeHelpPage.outputs"))+":",1)]),v("table",NP,[v("thead",null,[v("tr",null,[v("th",null,$(i.$t("g.name")),1),v("th",null,$(i.$t("nodeHelpPage.type")),1),v("th",null,$(i.$t("g.description")),1)])]),v("tbody",null,[(C(!0),P(Se,null,Ze(r.value,u=>(C(),P("tr",{key:u.name},[v("td",null,[v("code",null,$(u.name),1)]),v("td",null,$(u.type),1),v("td",null,$(u.tooltip||"-"),1)]))),128))])])])):H("",!0)])):(C(),P("div",{key:1,class:"markdown-content",innerHTML:b(t)},null,8,AP))]))}}),RP=ot($P,[["__scopeId","data-v-fdf10712"]]),BP={class:"flex h-full flex-col overflow-auto"},FP={class:"flex items-center border-b border-(--p-divider-color) px-3 py-2"},UP={class:"ml-2 font-semibold"},WP={class:"grow p-4"},zP=J({__name:"NodeHelpPage",props:{node:{}},emits:["close"],setup(e){return(t,a)=>{const o=ht("tooltip");return C(),P("div",BP,[v("div",FP,[ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":t.$t("g.back"),onClick:a[0]||(a[0]=s=>t.$emit("close"))},{default:W(()=>a[1]||(a[1]=[v("i",{class:"icon-[lucide--arrow-left] size-4"},null,-1)])),_:1},8,["aria-label"])),[[o,t.$t("g.back"),void 0,{bottom:!0}]]),v("span",UP,$(t.node.display_name),1)]),v("div",WP,[R(RP,{node:t.node},null,8,["node"])])])}}}),VP=zP,hn="Comfy.NodeLibrary.Bookmarks.V2";const rn=Je("nodeBookmark",()=>{const e=Me(),t=zt(),a=E(()=>e.get(hn)),o=E(()=>new Set(a.value)),s=E(()=>l(a.value)),r=n(_=>o.value.has(_.nodePath)||o.value.has(_.name),"isBookmarked"),i=n(async _=>{r(_)?(await c(_.nodePath),await c(_.name)):await u(_.name)},"toggleBookmark"),l=n(_=>Al(_.map(I=>{if(I.endsWith("/"))return P2(I);const w=I.split("/"),x=w.pop()??"",D=w.join("/"),T=t.nodeDefsByName[x];if(!T)return null;const N=Be.clone(T);return N.category=D,N}).filter(I=>I!==null)),"buildBookmarkTree"),u=n(async _=>{await e.set(hn,[...a.value,_])},"addBookmark"),c=n(async _=>{await e.set(hn,a.value.filter(I=>I!==_))},"deleteBookmark"),d=n(async(_,I)=>{const w=(_?_.nodePath:"")+I+"/";return await u(w),w},"addNewBookmarkFolder"),p=n(async(_,I)=>{if(!_.isDummyFolder)throw new Error("Cannot rename non-folder node");if(I.includes("/"))throw new Error('Folder name cannot contain "/"');const w=_.category.split("/").slice(0,-1).concat(I).join("/")+"/";if(w!==_.nodePath){if(a.value.some(x=>x.startsWith(w)))throw new Error(`Folder name "${w}" already exists`);await e.set(hn,a.value.map(x=>x.startsWith(_.nodePath)?x.replace(_.nodePath,w):x)),await y(_.nodePath,w)}},"renameBookmarkFolder"),f=n(async _=>{if(!_.isDummyFolder)throw new Error("Cannot delete non-folder node");await e.set(hn,a.value.filter(I=>I!==_.nodePath&&!I.startsWith(_.nodePath))),await h(_.nodePath)},"deleteBookmarkFolder"),g=E(()=>e.get("Comfy.NodeLibrary.BookmarksCustomization")),m=n(async(_,I)=>{const w={...g.value[_]||{},...I};w.icon===k&&delete w.icon,w.color===S&&delete w.color,Object.keys(w).length===0?await h(_):await e.set("Comfy.NodeLibrary.BookmarksCustomization",{...g.value,[_]:w})},"updateBookmarkCustomization"),h=n(async _=>{await e.set("Comfy.NodeLibrary.BookmarksCustomization",{...g.value,[_]:void 0})},"deleteBookmarkCustomization"),y=n(async(_,I)=>{const w={...g.value};w[_]&&(w[I]=w[_],delete w[_]),await e.set("Comfy.NodeLibrary.BookmarksCustomization",w)},"renameBookmarkCustomization"),k="pi-bookmark-fill",S="#a1a1aa";return{bookmarks:a,bookmarkedRoot:s,isBookmarked:r,toggleBookmark:i,addBookmark:u,addNewBookmarkFolder:d,renameBookmarkFolder:p,deleteBookmarkFolder:f,bookmarksCustomization:g,updateBookmarkCustomization:m,deleteBookmarkCustomization:h,renameBookmarkCustomization:y,defaultBookmarkIcon:k,defaultBookmarkColor:S}});var GP=J({__name:"NodeTreeLeaf",props:{node:{},openNodeHelp:{type:Function}},setup(e){const{t}=Fe(),a=e,o=E(()=>a.node.data),s=rn(),r=E(()=>s.isBookmarked(o.value)),i=Me(),l=E(()=>i.get("Comfy.Sidebar.Location")),u=n(async()=>{await s.toggleBookmark(o.value)},"toggleBookmark"),c=n(()=>{yt()?.trackUiButtonClicked({button_id:"node_library_help_button"}),a.openNodeHelp(o.value)},"onHelpClick"),d=n(async()=>{if(!a.node.data)throw new Error("Failed to edit subgraph blueprint lacking backing node data");await Ia().editBlueprint(a.node.data.name)},"editBlueprint"),p=A(null),f=E(()=>[{label:t("g.delete"),icon:"pi pi-trash",severity:"error",command:m}]);function g(x){o.value.name.startsWith(Ia().typePrefix)&&p.value?.show(x)}n(g,"handleContextMenu");function m(){a.node.data&&Ia().deleteBlueprint(a.node.data.name)}n(m,"deleteBlueprint");const h=A({position:"fixed",top:"0px",left:"0px",pointerEvents:"none",zIndex:1001}),y=n(async()=>{const x=S.value;if(!x)return;const D=x.getBoundingClientRect(),T=40;h.value.top=`${D.top}px`,h.value.left=l.value==="left"?`${D.right+T}px`:`${D.left-T}px`,h.value.transform=l.value==="right"?"translateX(-100%)":void 0},"handleNodeHover"),k=A(null),S=A(null),_=A(!1),I=n(async()=>{_.value=!0,await wa(),await y()},"handleMouseEnter"),w=n(()=>{_.value=!1},"handleMouseLeave");return it(()=>{S.value=k.value?.closest(".p-tree-node-content")??null,S.value?.addEventListener("mouseenter",I),S.value?.addEventListener("mouseleave",w)}),St(()=>{S.value?.removeEventListener("mouseenter",I),S.value?.removeEventListener("mouseleave",w)}),(x,D)=>{const T=ht("tooltip");return C(),P(Se,null,[v("div",{ref_key:"container",ref:k,class:"node-lib-node-container"},[R(xo,{node:x.node,onContextmenu:g},qo({"before-label":W(()=>[o.value.experimental?(C(),X(b(Mn),{key:0,value:x.$t("g.experimental"),severity:"primary"},null,8,["value"])):H("",!0),o.value.deprecated?(C(),X(b(Mn),{key:1,value:x.$t("g.deprecated"),severity:"danger"},null,8,["value"])):H("",!0)]),_:2},[o.value.name.startsWith(b(Ia)().typePrefix)?{name:"actions",fn:W(()=>[R(se,{variant:"destructive",size:"icon-sm","aria-label":x.$t("g.delete"),onClick:Ve(m,["stop"])},{default:W(()=>D[0]||(D[0]=[v("i",{class:"icon-[lucide--trash-2] size-3.5"},null,-1)])),_:1},8,["aria-label"]),R(se,{variant:"muted-textonly",size:"icon-sm","aria-label":x.$t("g.edit"),onClick:Ve(d,["stop"])},{default:W(()=>D[1]||(D[1]=[v("i",{class:"icon-[lucide--square-pen] size-3.5"},null,-1)])),_:1},8,["aria-label"])]),key:"0"}:{name:"actions",fn:W(()=>[R(se,{class:"bookmark-button",variant:"muted-textonly",size:"icon-sm","aria-label":x.$t("icon.bookmark"),onClick:Ve(u,["stop"])},{default:W(()=>[v("i",{class:pe(b(Pe)(r.value?"pi pi-bookmark-fill":"pi pi-bookmark","size-3.5"))},null,2)]),_:1},8,["aria-label"]),ze((C(),X(se,{class:"help-button",variant:"muted-textonly",size:"icon-sm","aria-label":x.$t("g.learnMore"),onClick:Ve(c,["stop"])},{default:W(()=>D[2]||(D[2]=[v("i",{class:"pi pi-question size-3.5"},null,-1)])),_:1},8,["aria-label"])),[[T,x.$t("g.learnMore"),void 0,{bottom:!0}]])]),key:"1"}]),1032,["node"]),_.value?(C(),X(bd,{key:0,to:"#node-library-node-preview-container"},[v("div",{class:"node-lib-node-preview",style:nt(h.value)},[R(wr,{"node-def":o.value},null,8,["node-def"])],4)])):H("",!0)],512),R(b(Ui),{ref_key:"menu",ref:p,model:f.value},null,8,["model"])],64)}}}),Xf=ot(GP,[["__scopeId","data-v-c8dc00f0"]]),mc="pi pi-sort";const Ti="category",Ai="original";var HP=class{static{n(this,"NodeOrganizationService")}groupingStrategies=[{id:"category",label:"sideToolbar.nodeLibraryTab.groupStrategies.category",icon:"pi pi-folder",description:"sideToolbar.nodeLibraryTab.groupStrategies.categoryDesc",getNodePath:n(e=>{const t=e.category||"";return[...t?t.split("/"):[],e.name]},"getNodePath")},{id:"module",label:"sideToolbar.nodeLibraryTab.groupStrategies.module",icon:"pi pi-box",description:"sideToolbar.nodeLibraryTab.groupStrategies.moduleDesc",getNodePath:n(e=>{const t=e.python_module||"";if(!t)return["unknown_module",e.name];const a=t.split(".");return a[0]==="nodes"?["core",e.name]:a[0]==="custom_nodes"?a.length>1?[a[1],e.name]:["custom_nodes",e.name]:[...a,e.name]},"getNodePath")},{id:"source",label:"sideToolbar.nodeLibraryTab.groupStrategies.source",icon:"pi pi-server",description:"sideToolbar.nodeLibraryTab.groupStrategies.sourceDesc",getNodePath:n(e=>e.api_node?["API nodes",e.name]:e.nodeSource.type===to.Core?["Core",e.name]:e.nodeSource.type===to.CustomNodes?["Custom nodes",e.name]:["Unknown",e.name],"getNodePath")}];sortingStrategies=[{id:"original",label:"sideToolbar.nodeLibraryTab.sortBy.original",icon:"pi pi-sort-alt",description:"sideToolbar.nodeLibraryTab.sortBy.originalDesc",compare:n(()=>0,"compare")},{id:"alphabetical",label:"sideToolbar.nodeLibraryTab.sortBy.alphabetical",icon:"pi pi-sort-alpha-down",description:"sideToolbar.nodeLibraryTab.sortBy.alphabeticalDesc",compare:n((e,t)=>(e.display_name??"").localeCompare(t.display_name??""),"compare")}];getGroupingStrategies(){return[...this.groupingStrategies]}getGroupingStrategy(e){return this.groupingStrategies.find(t=>t.id===e)}getSortingStrategies(){return[...this.sortingStrategies]}getSortingStrategy(e){return this.sortingStrategies.find(t=>t.id===e)}organizeNodes(e,t={}){const{groupBy:a=Ti,sortBy:o=Ai}=t,s=this.getGroupingStrategy(a),r=this.getSortingStrategy(o);if(!s)throw new Error(`Unknown grouping strategy: ${a}`);if(!r)throw new Error(`Unknown sorting strategy: ${o}`);const i=Al(r.id!=="original"?[...e].sort(r.compare):e,{pathExtractor:s.getNodePath});return o==="alphabetical"?Xs(i,{groupLeaf:!0}):i}getGroupingIcon(e){return this.getGroupingStrategy(e)?.icon||mc}getSortingIcon(e){return this.getSortingStrategy(e)?.icon||mc}};const vn=new HP,jP=Je("nodeHelp",()=>{const e=A(null),t=E(()=>e.value!==null);function a(s){e.value=s}n(a,"openHelp");function o(){e.value=null}return n(o,"closeHelp"),{currentHelpNode:e,isHelpOpen:t,openHelp:a,closeHelp:o}});var KP={class:"color-customization-selector-container flex flex-row items-center gap-2"},YP={key:1,class:"pi pi-palette text-lg"},qP=J({__name:"ColorCustomizationSelector",props:{modelValue:{},colorOptions:{},allowCustom:{type:Boolean,default:!0}},emits:["update:modelValue"],setup(e,{emit:t}){const a={name:"_custom",value:""},o=E(()=>[...e.colorOptions,...e.allowCustom?[a]:[]]),s=t,r=A(a),i=A("");return it(()=>{if(e.modelValue){const l=e.colorOptions.find(u=>u.value===e.modelValue);l?r.value=l:(r.value=a,i.value=e.modelValue.replace("#",""))}}),be(r,(l,u)=>{l.name==="_custom"?i.value=u.value.replace("#",""):s("update:modelValue",l.value)}),be(i,l=>{r.value.name==="_custom"&&s("update:modelValue",l?`#${l}`:null)}),(l,u)=>(C(),P("div",KP,[R(b($i),{modelValue:r.value,"onUpdate:modelValue":u[0]||(u[0]=c=>r.value=c),options:o.value,"option-label":"name","data-key":"value","allow-empty":!1},{option:W(c=>[c.option.name!=="_custom"?(C(),P("div",{key:0,style:nt({width:"20px",height:"20px",backgroundColor:c.option.value,borderRadius:"50%"})},null,4)):(C(),P("i",YP))]),_:1},8,["modelValue","options"]),r.value.name==="_custom"?(C(),X(b(id),{key:0,modelValue:i.value,"onUpdate:modelValue":u[1]||(u[1]=c=>i.value=c)},null,8,["modelValue"])):H("",!0)]))}}),XP=qP,ZP={class:"p-fluid"},JP={class:"field icon-field"},QP={for:"icon"},e2={class:"field color-field"},t2={for:"color"},a2=J({__name:"CustomizationDialog",props:{modelValue:{type:Boolean},initialIcon:{},initialColor:{}},emits:["update:modelValue","confirm"],setup(e,{emit:t}){const{t:a}=Fe(),o=e,s=t,r=E({get:n(()=>o.modelValue,"get"),set:n(h=>s("update:modelValue",h),"set")}),i=rn(),l=[{name:a("icon.bookmark"),value:i.defaultBookmarkIcon},{name:a("icon.folder"),value:"pi-folder"},{name:a("icon.star"),value:"pi-star"},{name:a("icon.heart"),value:"pi-heart"},{name:a("icon.file"),value:"pi-file"},{name:a("icon.inbox"),value:"pi-inbox"},{name:a("icon.box"),value:"pi-box"},{name:a("icon.briefcase"),value:"pi-briefcase"}],u=[{name:a("color.default"),value:i.defaultBookmarkColor},{name:a("color.blue"),value:"#007bff"},{name:a("color.green"),value:"#28a745"},{name:a("color.red"),value:"#dc3545"},{name:a("color.pink"),value:"#e83e8c"},{name:a("color.yellow"),value:"#ffc107"}],c=l.find(h=>h.value===i.defaultBookmarkIcon),d=A(c),p=A(o.initialColor||i.defaultBookmarkColor),f=n(()=>{d.value=l.find(h=>h.value===o.initialIcon)||c,p.value=o.initialColor||i.defaultBookmarkColor},"resetCustomization"),g=n(()=>{s("confirm",d.value.value,p.value),m()},"confirmCustomization"),m=n(()=>{r.value=!1},"closeDialog");return be(()=>o.modelValue,h=>{h&&f()},{immediate:!0}),(h,y)=>(C(),X(b(rd),{visible:r.value,"onUpdate:visible":y[2]||(y[2]=k=>r.value=k),header:h.$t("g.customizeFolder")},{footer:W(()=>[R(se,{variant:"textonly",onClick:f},{default:W(()=>[y[3]||(y[3]=v("i",{class:"pi pi-refresh"},null,-1)),fe(" "+$(h.$t("g.reset")),1)]),_:1}),R(se,{autofocus:"",onClick:g},{default:W(()=>[y[4]||(y[4]=v("i",{class:"pi pi-check"},null,-1)),fe(" "+$(h.$t("g.confirm")),1)]),_:1})]),default:W(()=>[v("div",ZP,[v("div",JP,[v("label",QP,$(h.$t("g.icon")),1),R(b($i),{modelValue:d.value,"onUpdate:modelValue":y[0]||(y[0]=k=>d.value=k),options:l,"option-label":"name","data-key":"value"},{option:W(k=>[v("i",{class:pe(["pi",k.option.value,"mr-2"]),style:nt({color:p.value})},null,6)]),_:1},8,["modelValue"])]),R(b(la)),v("div",e2,[v("label",t2,$(h.$t("g.color")),1),R(XP,{modelValue:p.value,"onUpdate:modelValue":y[1]||(y[1]=k=>p.value=k),"color-options":u},null,8,["modelValue"])])])]),_:1},8,["visible","header"]))}}),o2=ot(a2,[["__scopeId","data-v-254ef6c3"]]),n2=J({__name:"NodeTreeFolder",props:{node:{}},setup(e){const t=rn(),a=E(()=>{const d=e.node.data;return d?t.bookmarksCustomization[d.nodePath]:void 0}),o=A(null),s=A(null);let r=null;const i=A(null);it(()=>{o.value=i.value?.closest(".p-tree-node-content"),s.value=o.value.querySelector(":scope > .p-tree-node-icon"),l(),r=be(a,l,{deep:!0})});const l=n(()=>{s.value&&a.value&&(s.value.style.color=a.value.color??"")},"updateIconColor");St(()=>{r&&r()});const u=Ma(Nf),c=n(d=>{u&&(u.value[d.key]=!0)},"handleItemDrop");return(d,p)=>(C(),P("div",{ref_key:"container",ref:i,class:"node-lib-node-container"},[R(xo,{node:d.node,onItemDropped:c},null,8,["node"])],512))}}),s2=n2,r2=J({__name:"NodeBookmarkTreeExplorer",props:{filteredNodeDefs:{},openNodeHelp:{type:Function}},setup(e,{expose:t}){const a=ji().appContext,o=e,s=A({}),{expandNode:r,toggleNodeOnEvent:i}=hr(s),l=rn(),u=E(()=>{const S=n(_=>{if(_.leaf)return o.filteredNodeDefs.some(w=>w.name===_.data.name)?_:null;const I=_.children?.map(S).filter(w=>w!==null);return I&&I.length>0?{..._,children:I}:null},"filterTree");return o.filteredNodeDefs.length?S(l.bookmarkedRoot)||{key:"root",label:"Root",children:[]}:l.bookmarkedRoot});be(()=>o.filteredNodeDefs,async S=>{S.length&&(await wa(),r(u.value))});const{t:c}=Fe(),d=n(S=>[{label:c("g.customize"),icon:"pi pi-palette",command:n(()=>{if(!S.data)return;const _=l.bookmarksCustomization[S.data.nodePath];m.value=_?.icon||l.defaultBookmarkIcon,h.value=_?.color||l.defaultBookmarkColor,g.value=!0,y.value=S.data.nodePath},"command"),visible:!S?.leaf}],"extraMenuItems"),p=E(()=>{const S=n(_=>{const I=_.children?.map(S)?.sort((w,x)=>w.leaf===x.leaf?w.label.localeCompare(x.label):w.leaf?1:-1);return{key:_.key,label:_.leaf?_.data.display_name:_.label,leaf:_.leaf,data:_.data,getIcon(){if(this.leaf)return"pi pi-circle-fill";const w=l.bookmarksCustomization[_.data?.nodePath];return w?.icon?"pi "+w.icon:"pi pi-bookmark-fill"},children:I,draggable:_.leaf,async handleAddFolder(w){w!==""&&await l.addNewBookmarkFolder(this.data,w)},renderDragPreview(w){const x=kd(wr,{nodeDef:_.data});return x.appContext=a,Os(x,w),()=>{Os(null,w)}},droppable:!_.leaf,async handleDrop(w){const x=w.data.data;l.isBookmarked(x)&&await l.toggleBookmark(x);const D=_.data.category+"/"+x.name;await l.addBookmark(D)},handleClick(w){this.leaf?Tt().addNodeOnGraph(this.data):i(w,_)},contextMenuItems:d,..._.leaf?{}:{async handleRename(w){this.data&&this.data.isDummyFolder&&await l.renameBookmarkFolder(this.data,w)},async handleDelete(){await l.deleteBookmarkFolder(this.data)}}}},"fillNodeInfo");return S(u.value)}),f=A(null);t({addNewBookmarkFolder:n(()=>f.value?.addFolderCommand("root"),"addNewBookmarkFolder")});const g=A(!1),m=A(l.defaultBookmarkIcon),h=A(l.defaultBookmarkColor),y=A(""),k=n(async(S,_)=>{y.value&&await l.updateBookmarkCustomization(y.value,{icon:S,color:_})},"updateCustomization");return(S,_)=>(C(),P(Se,null,[R(fo,{ref_key:"treeExplorerRef",ref:f,class:"node-lib-bookmark-tree-explorer",root:p.value,"expanded-keys":s.value},{folder:W(({node:I})=>[R(s2,{node:I},null,8,["node"])]),node:W(({node:I})=>[R(Xf,{node:I,"open-node-help":o.openNodeHelp},null,8,["node","open-node-help"])]),_:1},8,["root","expanded-keys"]),R(o2,{modelValue:g.value,"onUpdate:modelValue":_[0]||(_[0]=I=>g.value=I),"initial-icon":m.value,"initial-color":h.value,onConfirm:k},null,8,["modelValue","initial-icon","initial-color"])],64))}}),i2=r2,l2={class:"h-full"},u2={class:"flex flex-col gap-1 p-2"},c2={class:"flex flex-col gap-1 p-2"},d2={class:"px-2 2xl:px-4"},p2=J({__name:"NodeLibrarySidebarTab",setup(e){const t=ji().appContext,a=zt(),o=rn(),s=jP(),r=Pt(),i=A({}),{expandNode:l,toggleNodeOnEvent:u}=hr(i),c=A(null),d=A();it(()=>{d.value?.focus()});const p=A(null),f=A(null),g=A(null),m=si("Comfy.NodeLibrary.GroupBy",Ti),h=si("Comfy.NodeLibrary.SortBy",Ai),y=A(""),{currentHelpNode:k,isHelpOpen:S}=Vn(s),{openHelp:_,closeHelp:I}=s,w=E(()=>vn.getGroupingStrategies().map(ae=>({id:ae.id,label:ae.label,icon:ae.icon}))),x=E(()=>vn.getSortingStrategies().map(ae=>({id:ae.id,label:ae.label,icon:ae.icon}))),D=E(()=>vn.getGroupingIcon(m.value)),T=E(()=>vn.getSortingIcon(h.value)),N=n(ae=>{m.value=ae,f.value?.hide()},"selectGrouping"),M=n(ae=>{h.value=ae,g.value?.hide()},"selectSorting"),O=n(()=>{m.value=Ti,h.value=Ai},"resetOrganization"),L=E(()=>{const ae=K.value.length>0?K.value:a.visibleNodeDefs;return vn.organizeNodes(ae,{groupBy:m.value,sortBy:h.value})}),F=E(()=>{const ae=n(ce=>{const ee=ce.children?.map(ae);return{key:ce.key,label:ce.leaf?ce.data.display_name:ce.label,leaf:ce.leaf,data:ce.data,getIcon(){if(this.leaf)return"pi pi-circle-fill"},children:ee,draggable:ce.leaf,renderDragPreview(ne){const B=kd(wr,{nodeDef:ce.data});return B.appContext=t,Os(B,ne),()=>{Os(null,ne)}},handleClick(ne){this.leaf?Tt().addNodeOnGraph(this.data):u(ne,this)}}},"fillNodeInfo");return ae(L.value)}),K=A([]),j=A([]),V=n(async ae=>{if(ae.length===0&&!j.value.length){K.value=[],i.value={};return}const ce=j.value.map(ee=>ee.filter);K.value=a.nodeSearchService.searchNode(ae,ce,{limit:64},{matchWildcards:!1}),await wa(),K.value.length>0&&l(L.value)},"handleSearch"),q=n(async ae=>{j.value.push({filter:ae,badge:ae.filterDef.invokeSequence.toUpperCase(),badgeClass:ae.filterDef.invokeSequence+"-badge",text:ae.value,id:+new Date}),await V(y.value)},"onAddFilter"),re=n(async ae=>{const ce=j.value.findIndex(ee=>ee===ae);ce!==-1&&j.value.splice(ce,1),await V(y.value)},"onRemoveFilter");return(ae,ce)=>{const ee=ht("tooltip");return C(),P(Se,null,[v("div",l2,[b(S)?(C(),X(VP,{key:1,node:b(k),onClose:b(I)},null,8,["node","onClose"])):(C(),X(mr,{key:0,title:ae.$t("sideToolbar.nodeLibrary")},{"tool-buttons":W(()=>[ze((C(),X(se,{class:"new-folder-button",variant:"muted-textonly",size:"icon","aria-label":ae.$t("g.newFolder"),onClick:ce[0]||(ce[0]=ne=>c.value?.addNewBookmarkFolder())},{default:W(()=>ce[7]||(ce[7]=[v("i",{class:"icon-[lucide--folder-plus] size-4"},null,-1)])),_:1},8,["aria-label"])),[[ee,ae.$t("g.newFolder"),void 0,{bottom:!0}]]),ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":ae.$t("sideToolbar.nodeLibraryTab.groupBy"),onClick:ce[1]||(ce[1]=ne=>f.value?.toggle(ne))},{default:W(()=>[v("i",{class:pe([D.value,"size-4"])},null,2)]),_:1},8,["aria-label"])),[[ee,ae.$t("sideToolbar.nodeLibraryTab.groupBy"),void 0,{bottom:!0}]]),ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":ae.$t("sideToolbar.nodeLibraryTab.sortMode"),onClick:ce[2]||(ce[2]=ne=>g.value?.toggle(ne))},{default:W(()=>[v("i",{class:pe([T.value,"size-4"])},null,2)]),_:1},8,["aria-label"])),[[ee,ae.$t("sideToolbar.nodeLibraryTab.sortMode"),void 0,{bottom:!0}]]),ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":ae.$t("sideToolbar.nodeLibraryTab.resetView"),onClick:O},{default:W(()=>ce[8]||(ce[8]=[v("i",{class:"icon-[lucide--filter-x] size-4"},null,-1)])),_:1},8,["aria-label"])),[[ee,ae.$t("sideToolbar.nodeLibraryTab.resetView"),void 0,{bottom:!0}]]),ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":ae.$t("menu.refresh"),onClick:ce[3]||(ce[3]=()=>b(r).execute("Comfy.RefreshNodeDefinitions"))},{default:W(()=>ce[9]||(ce[9]=[v("i",{class:"icon-[lucide--refresh-cw] size-4"},null,-1)])),_:1},8,["aria-label"])),[[ee,ae.$t("menu.refresh"),void 0,{bottom:!0}]]),R(b(mo),{ref_key:"groupingPopover",ref:f},{default:W(()=>[v("div",u2,[(C(!0),P(Se,null,Ze(w.value,ne=>(C(),X(se,{key:ne.id,variant:b(m)===ne.id?"primary":"textonly",class:"justify-start",onClick:n(B=>N(ne.id),"onClick")},{default:W(()=>[v("i",{class:pe([ne.icon,"size-4"])},null,2),fe(" "+$(ae.$t(ne.label)),1)]),_:2},1032,["variant","onClick"]))),128))])]),_:1},512),R(b(mo),{ref_key:"sortingPopover",ref:g},{default:W(()=>[v("div",c2,[(C(!0),P(Se,null,Ze(x.value,ne=>(C(),X(se,{key:ne.id,variant:b(h)===ne.id?"primary":"textonly",class:"justify-start",onClick:n(B=>M(ne.id),"onClick")},{default:W(()=>[v("i",{class:pe([ne.icon,"size-4"])},null,2),fe(" "+$(ae.$t(ne.label)),1)]),_:2},1032,["variant","onClick"]))),128))])]),_:1},512)]),header:W(()=>[v("div",d2,[R(Ao,{ref_key:"searchBoxRef",ref:d,"model-value":y.value,"onUpdate:modelValue":ce[4]||(ce[4]=ne=>y.value=ne),class:"node-lib-search-box",placeholder:ae.$t("g.searchNodes")+"...","filter-icon":"pi pi-filter",filters:j.value,onSearch:V,onShowFilter:ce[5]||(ce[5]=ne=>p.value?.toggle(ne)),onRemoveFilter:re},null,8,["model-value","placeholder","filters"]),R(b(mo),{ref_key:"searchFilter",ref:p,class:"ml-[-13px]"},{default:W(()=>[R(CP,{onAddFilter:q})]),_:1},512)])]),body:W(()=>[v("div",null,[R(i2,{ref_key:"nodeBookmarkTreeExplorerRef",ref:c,"filtered-node-defs":K.value,"open-node-help":b(_)},null,8,["filtered-node-defs","open-node-help"]),ze(R(b(la),{type:"dashed",class:"m-2"},null,512),[[_o,b(o).bookmarks.length>0]]),R(fo,{"expanded-keys":i.value,"onUpdate:expandedKeys":ce[6]||(ce[6]=ne=>i.value=ne),class:"node-lib-tree-explorer",root:F.value},{node:W(({node:ne})=>[R(Xf,{node:ne,"open-node-help":b(_)},null,8,["node","open-node-help"])]),_:1},8,["expanded-keys","root"])])]),_:1},8,["title"]))]),ce[10]||(ce[10]=v("div",{id:"node-library-node-preview-container"},null,-1))],64)}}}),f2=p2;const m2=n(()=>({id:"node-library",icon:"icon-[comfy--node]",title:"sideToolbar.nodeLibrary",tooltip:"sideToolbar.nodeLibrary",label:"sideToolbar.labels.nodes",component:bt(f2),type:"vue"}),"useNodeLibrarySidebarTab");var g2={class:"flex items-center"},h2={key:0,class:"mr-2 shrink-0"},v2={key:1,class:"ml-2 shrink-0"},y2=J({__name:"TextDivider",props:{text:{},position:{default:"left"},align:{default:"center"},type:{default:"solid"},layout:{default:"horizontal"}},setup(e){return(t,a)=>(C(),P("div",g2,[t.position==="left"?(C(),P("span",h2,$(t.text),1)):H("",!0),R(b(la),{align:t.align,type:t.type,layout:t.layout,class:"grow"},null,8,["align","type","layout"]),t.position==="right"?(C(),P("span",v2,$(t.text),1)):H("",!0)]))}}),Fr=y2,w2=J({__name:"WorkflowTreeLeaf",props:{node:{}},setup(e){const t=Nl(),a=E(()=>e.node.data&&t.isBookmarked(e.node.data.path)),o=n(async()=>{e.node.data&&await t.toggleBookmarked(e.node.data.path)},"handleBookmarkClick");return(s,r)=>(C(),X(xo,{node:s.node},{actions:W(()=>[R(se,{variant:"muted-textonly",size:"icon-sm","aria-label":s.$t("icon.bookmark"),onClick:Ve(o,["stop"])},{default:W(()=>[v("i",{class:pe([a.value?"pi pi-bookmark-fill":"pi pi-bookmark","size-3.5"])},null,2)]),_:1},8,["aria-label"])]),_:1},8,["node"]))}}),Ur=w2,b2={class:"px-2 2xl:px-4"},_2={key:0,class:"comfyui-workflows-panel"},k2={key:0,class:"comfyui-workflows-open"},C2={key:0},x2={class:"comfyui-workflows-bookmarks"},I2={class:"comfyui-workflows-browse"},S2={key:1,class:"comfyui-workflows-search-panel"},Ro=(function(e){return e.Open="Open",e.Bookmarks="Bookmarks",e.Browse="Browse",e})(Ro||{}),E2=J({__name:"WorkflowsSidebarTab",setup(e){const t=Me(),a=E(()=>t.get("Comfy.Workflow.WorkflowTabsPosition")),o=A(),s=A(""),r=E(()=>s.value.length>0),i=A([]),l=E(()=>S(i.value)),u=n(async N=>{if(N.length===0){i.value=[],g.value={};return}const M=N.toLocaleLowerCase();i.value=c.workflows.filter(O=>O.path.toLocaleLowerCase().includes(M)),await wa(),m(l.value)},"handleSearch"),c=wt(),d=_a(),p=Ra(),{t:f}=Fe(),g=A({}),{expandNode:m,toggleNodeOnEvent:h}=hr(g),y=A({}),k=n(async N=>{N&&await d.closeWorkflow(N,{warnIfUnsaved:!p.shiftDown})},"handleCloseWorkflow"),S=n(N=>yo(N,M=>M.key.split("/")),"buildWorkflowTree"),_=E(()=>Xs(S(c.persistedWorkflows),{groupLeaf:!0})),I=E(()=>yo(c.bookmarkedWorkflows,N=>[N.key])),w=E(()=>yo(c.openWorkflows,N=>[N.key])),x=n((N,M)=>{const O=N.children?.map(j=>x(j,M)),L=N.data;async function F(j){this.leaf?await d.openWorkflow(L):h(j,this)}n(F,"handleClick");const K=N.leaf?{handleClick:F,async handleRename(j){const V=M===Ro.Browse?L.directory+"/"+go(j):qa.basePath+go(j);await d.renameWorkflow(L,V)},handleDelete:L.isTemporary?void 0:async function(){await d.deleteWorkflow(L)},contextMenuItems(){return[{label:f("g.insert"),icon:"pi pi-file-export",command:n(async()=>{const j=N.data;await d.insertWorkflow(j)},"command")},{label:f("g.duplicate"),icon:"pi pi-file-export",command:n(async()=>{const j=N.data;await d.duplicateWorkflow(j)},"command")}]},draggable:!0}:{handleClick:F};return{key:N.key,label:N.label,leaf:N.leaf,data:N.data,children:O,...K}},"renderTreeNode"),D=E(()=>({[`root/${c.activeWorkflow?.key}`]:!0})),T=Nl();return it(async()=>{o.value?.focus(),await T.loadBookmarks()}),(N,M)=>{const O=ht("tooltip");return C(),P(Se,null,[R(mr,Ht({title:N.$t("sideToolbar.workflows")},N.$attrs,{class:"workflows-sidebar-tab"}),{"tool-buttons":W(()=>[ze((C(),X(se,{variant:"muted-textonly",size:"icon","aria-label":N.$t("g.refresh"),onClick:M[0]||(M[0]=L=>b(c).syncWorkflows())},{default:W(()=>M[6]||(M[6]=[v("i",{class:"icon-[lucide--refresh-cw] size-4"},null,-1)])),_:1},8,["aria-label"])),[[O,N.$t("g.refresh"),void 0,{bottom:!0}]])]),header:W(()=>[v("div",b2,[R(Ao,{ref_key:"searchBoxRef",ref:o,"model-value":s.value,"onUpdate:modelValue":M[1]||(M[1]=L=>s.value=L),class:"workflows-search-box",placeholder:N.$t("g.searchWorkflows")+"...",onSearch:u},null,8,["model-value","placeholder"])])]),body:W(()=>[r.value?(C(),P("div",S2,[R(fo,{"expanded-keys":g.value,"onUpdate:expandedKeys":M[5]||(M[5]=L=>g.value=L),root:x(l.value,Ro.Browse)},{node:W(({node:L})=>[R(Ur,{node:L},null,8,["node"])]),_:1},8,["expanded-keys","root"])])):(C(),P("div",_2,[a.value==="Sidebar"?(C(),P("div",k2,[R(Fr,{text:b(f)("sideToolbar.workflowTab.workflowTreeType.open"),type:"dashed",class:"ml-2"},null,8,["text"]),R(fo,{"expanded-keys":y.value,"onUpdate:expandedKeys":M[2]||(M[2]=L=>y.value=L),root:x(w.value,Ro.Open),"selection-keys":D.value},{node:W(({node:L})=>[R(xo,{node:L},{"before-label":W(({node:F})=>[F.data?.isModified||!F.data?.isPersisted?(C(),P("span",C2,"*")):H("",!0)]),actions:W(({node:F})=>[R(se,{class:"close-workflow-button",variant:b(p).shiftDown?"destructive":"textonly",size:"icon-sm","aria-label":N.$t("g.close"),onClick:Ve(K=>k(F.data),["stop"])},{default:W(()=>M[7]||(M[7]=[v("i",{class:"icon-[lucide--x] size-3"},null,-1)])),_:2},1032,["variant","aria-label","onClick"])]),_:2},1032,["node"])]),_:1},8,["expanded-keys","root","selection-keys"])])):H("",!0),ze(v("div",x2,[R(Fr,{text:b(f)("sideToolbar.workflowTab.workflowTreeType.bookmarks"),type:"dashed",class:"ml-2"},null,8,["text"]),R(fo,{"expanded-keys":y.value,"onUpdate:expandedKeys":M[3]||(M[3]=L=>y.value=L),root:x(I.value,Ro.Bookmarks),"selection-keys":D.value},{node:W(({node:L})=>[R(Ur,{node:L},null,8,["node"])]),_:1},8,["expanded-keys","root","selection-keys"])],512),[[_o,b(c).bookmarkedWorkflows.length>0]]),v("div",I2,[R(Fr,{text:b(f)("sideToolbar.workflowTab.workflowTreeType.browse"),type:"dashed",class:"ml-2"},null,8,["text"]),b(c).persistedWorkflows.length>0?(C(),X(fo,{key:0,"expanded-keys":g.value,"onUpdate:expandedKeys":M[4]||(M[4]=L=>g.value=L),root:x(_.value,Ro.Browse),"selection-keys":D.value},{node:W(({node:L})=>[R(Ur,{node:L},null,8,["node"])]),_:1},8,["expanded-keys","root","selection-keys"])):(C(),X(Va,{key:1,icon:"pi pi-folder",title:N.$t("g.empty"),message:N.$t("g.noWorkflowsFound")},null,8,["title","message"]))])]))]),_:1},16,["title"]),R(b(Vm))],64)}}}),T2=E2;const A2=n(()=>{const e=Me(),t=wt();return{id:"workflows",icon:"icon-[comfy--workflow]",iconBadge:n(()=>{if(e.get("Comfy.Workflow.WorkflowTabsPosition")!=="Sidebar")return null;const a=t.openWorkflows.length.toString();return a==="0"?null:a},"iconBadge"),title:"sideToolbar.workflows",tooltip:"sideToolbar.workflows",label:"sideToolbar.labels.workflows",component:bt(T2),type:"vue"}},"useWorkflowsSidebarTab"),M2=Je("sidebarTab",()=>{const e=A([]),t=A(null),a=E(()=>e.value.find(l=>l.id===t.value)??null),o=n(l=>{t.value=t.value===l?null:l},"toggleSidebarTab"),s=n(l=>{e.value=[...e.value,l];const u=n(()=>`Toggle ${Er(l.title)?G(l.title):l.title} Sidebar`,"labelFunction"),c=l.tooltip?Er(String(l.tooltip))?()=>G(String(l.tooltip)):String(l.tooltip):void 0,d=n(()=>{const p={"node-library":"sideToolbar.nodeLibrary","model-library":"sideToolbar.modelLibrary",workflows:"sideToolbar.workflows",assets:"sideToolbar.assets"}[l.id];return p&&Er(p)?G(p):l.title},"menubarLabelFunction");Pt().registerCommand({id:`Workspace.ToggleSidebarTab.${l.id}`,icon:typeof l.icon=="string"?l.icon:void 0,label:u,menubarLabel:d,tooltip:c,versionAdded:"1.3.9",category:"view-controls",function:n(async()=>{const p=Me(),f=Pt();if(l.id==="model-library"&&p.get("Comfy.Assets.UseAssetAPI")){await f.commands.find(g=>g.id==="Comfy.BrowseModelAssets")?.function?.();return}o(l.id)},"function"),active:n(()=>a.value?.id===l.id,"active"),source:"System"})},"registerSidebarTab");return{sidebarTabs:e,activeSidebarTabId:t,activeSidebarTab:a,toggleSidebarTab:o,registerSidebarTab:s,unregisterSidebarTab:n(l=>{const u=e.value.findIndex(c=>c.id===l);if(u!==-1){const c=e.value[u];c.type==="custom"&&c.destroy&&c.destroy();const d=[...e.value];d.splice(u,1),e.value=d}},"unregisterSidebarTab"),registerCoreSidebarTabs:n(()=>{s(NT()),s(m2()),s(IA()),s(A2());const l=yp();l.registerCommands(["View"],["Workspace.ToggleBottomPanel","Comfy.BrowseTemplates","Workspace.ToggleFocusMode","Comfy.ToggleCanvasInfo","Comfy.Canvas.ToggleMinimap","Comfy.Canvas.ToggleLinkVisibility"]),l.registerCommands(["View"],["Comfy.Canvas.ZoomIn","Comfy.Canvas.ZoomOut","Comfy.Canvas.FitView"])},"registerCoreSidebarTabs")}}),Ra=Je("workspace",()=>{const e=A(!1),t=A(!1),a=A(!1),o=E(()=>Oe()),s=E(()=>fx()),r=E(()=>({commands:Pt().commands,execute:Pt().execute})),i=E(()=>M2()),l=E(()=>({settings:Me().settingsById,get:n(I=>Me().get(I),"get"),set:n((I,w)=>Me().set(I,w),"set")})),u=E(()=>wt()),c=vp(),d=pt(),p=jp(),f=Pa(),g=Gn(),m=E(()=>f.currentUser),h=E(()=>g.isAuthenticated),y={isLoggedIn:E(()=>!!h.value||m.value!==null)};function k(I){i.value.registerSidebarTab(I)}n(k,"registerSidebarTab");function S(I){i.value.unregisterSidebarTab(I)}n(S,"unregisterSidebarTab");function _(){return i.value.sidebarTabs}return n(_,"getSidebarTabs"),{spinner:e,shiftDown:t,focusMode:a,toggleFocusMode:n(()=>{a.value=!a.value},"toggleFocusMode"),toast:o,queueSettings:s,command:r,sidebarTab:i,setting:l,workflow:u,colorPalette:c,dialog:d,bottomPanel:p,user:y,registerSidebarTab:k,unregisterSidebarTab:S,getSidebarTabs:_}}),_a=n(()=>{const e=Me(),t=wt(),a=Oe(),o=pt(),s=wm(),r=Ua();async function i(T){if(e.get("Comfy.PromptFilename")){let N=await o.prompt({title:G("workflowService.exportWorkflow"),message:G("workflowService.enterFilename")+":",defaultValue:T});return N?(N.toLowerCase().endsWith(".json")||(N+=".json"),N):null}return T}n(i,"getFilename");function l(T){if(!e.get("Comfy.EnableWorkflowViewRestore"))return;const{offset:N,scale:M}=Z.canvas.ds,[O,L]=N;T.extra??={},T.extra.ds={scale:M,offset:[O,L]}}n(l,"addViewRestore");const u=n(async(T,N)=>{const M=t.activeWorkflow;M?.path&&(T=M.filename);const O=await Z.graphToPrompt();l(O.workflow);const L=JSON.stringify(O[N],null,2),F=new Blob([L],{type:"application/json"}),K=await i(T);K&&Ba(K,F)},"exportWorkflow"),c=n(async T=>{const N=await T.promptSave();if(!N)return;const M=T.directory+"/"+go(N),O=t.getWorkflowByPath(M);if(O&&!O.isTemporary){if(await o.confirm({title:G("sideToolbar.workflowTab.confirmOverwriteTitle"),type:"overwrite",message:G("sideToolbar.workflowTab.confirmOverwrite"),itemList:[M]})!==!0)return;if(O.path===T.path){await d(T);return}if(!await k(O,!0))return}if(T.isTemporary)await y(T,M),await t.saveWorkflow(T);else{const L=t.saveAs(T,M);await m(L),await t.saveWorkflow(L)}},"saveWorkflowAs"),d=n(async T=>{T.isTemporary?await c(T):await t.saveWorkflow(T)},"saveWorkflow"),p=n(async()=>{await Z.loadGraphData(cr)},"loadDefaultWorkflow"),f=n(async()=>{await Z.loadGraphData(ip)},"loadBlankWorkflow"),g=n(async()=>{const T=t.activeWorkflow;T&&await m(T,{force:!0})},"reloadCurrentWorkflow"),m=n(async(T,N={force:!1})=>{if(t.isActive(T)&&!N.force)return;const M=!T.isLoaded;M&&await T.load(),await Z.loadGraphData(Et(T.activeState),!0,!0,T,{showMissingModelsDialog:M,showMissingNodesDialog:M,checkForRerouteMigration:!1})},"openWorkflow"),h=n(async(T,N={warnIfUnsaved:!0})=>{if(T.isModified&&N.warnIfUnsaved){const M=await o.confirm({title:G("sideToolbar.workflowTab.dirtyCloseTitle"),type:"dirtyClose",message:G("sideToolbar.workflowTab.dirtyClose"),itemList:[T.path],hint:N.hint});if(M===null)return!1;M===!0&&await d(T)}if(t.openWorkflows.length===1&&await p(),t.isActive(T)){const M=t.getMostRecentWorkflow();M?await m(M):await w()}return await t.closeWorkflow(T),!0},"closeWorkflow"),y=n(async(T,N)=>{await t.renameWorkflow(T,N)},"renameWorkflow"),k=n(async(T,N=!1)=>{let M=!e.get("Comfy.Workflow.ConfirmDelete")||N;return!M&&(M=await o.confirm({title:G("sideToolbar.workflowTab.confirmDeleteTitle"),type:"delete",message:G("sideToolbar.workflowTab.confirmDelete"),itemList:[T.path]}),!M)||t.isOpen(T)&&!await h(T,{warnIfUnsaved:!M})?!1:(await t.deleteWorkflow(T),N||a.add({severity:"info",summary:G("sideToolbar.workflowTab.deleted"),life:1e3}),!0)},"deleteWorkflow"),S=n(()=>{const T=Ra().workflow.activeWorkflow;T&&(T.changeTracker.store(),s.storeThumbnail(T),r.clear())},"beforeLoadNewGraph"),_=n(async(T,N)=>{const M=Ra().workflow;if((N.extra?.linearMode!==void 0||!N.nodes.length)&&(gt().linearMode=!!N.extra?.linearMode),T===null||typeof T=="string"){const L=T;if(L){const K=qa.basePath+go(L),j=M.getWorkflowByPath(K);if(j?.isPersisted&&!j.isLoaded){const V=await M.openWorkflow(j);V.changeTracker.reset(N),V.changeTracker.restore();return}}gt().linearMode&&(Z.rootGraph.extra??={},Z.rootGraph.extra.linearMode=!0);const F=M.createNewTemporary(L?go(L):void 0,N);await M.openWorkflow(F);return}const O=await M.openWorkflow(T);O.changeTracker.reset(N),O.changeTracker.restore()},"afterLoadNewGraph"),I=n(async(T,N={})=>{const M=Et((await T.load()).initialState),O=localStorage.getItem("litegrapheditor_clipboard"),L=new Cs(M),F=new va(document.createElement("canvas"),L,{skip_events:!0,skip_render:!0});F.selectItems(),F.copyToClipboard(),Z.canvas.pasteFromClipboard(N),O!==null&&localStorage.setItem("litegrapheditor_clipboard",O)},"insertWorkflow"),w=n(async()=>{const T=t.openedWorkflowIndexShift(1);T&&await m(T)},"loadNextOpenedWorkflow");return{exportWorkflow:u,saveWorkflowAs:c,saveWorkflow:d,loadDefaultWorkflow:p,loadBlankWorkflow:f,reloadCurrentWorkflow:g,openWorkflow:m,closeWorkflow:h,renameWorkflow:y,deleteWorkflow:k,insertWorkflow:I,loadNextOpenedWorkflow:w,loadPreviousOpenedWorkflow:n(async()=>{const T=t.openedWorkflowIndexShift(-1);T&&await m(T)},"loadPreviousOpenedWorkflow"),duplicateWorkflow:n(async T=>{const N=JSON.parse(JSON.stringify(T.activeState)),M=T.isPersisted?" (Copy)":"",O=T.filename.replace(/\s*\(\d+\)$/,"")+M;await Z.loadGraphData(N,!0,!0,O)},"duplicateWorkflow"),afterLoadNewGraph:_,beforeLoadNewGraph:S}},"useWorkflowService");async function gc(e){return await pt().confirm({title:G("subgraphStore.overwriteBlueprintTitle"),type:"overwriteBlueprint",message:G("subgraphStore.overwriteBlueprint"),itemList:[e]})}n(gc,"confirmOverwrite");const Ia=Je("subgraph",()=>{class e extends qa{static{n(this,"SubgraphBlueprint")}static basePath="subgraphs/";tintCanvasBg="#22227740";hasPromptedSave=!1;constructor(h,y=!1){super(h),this.hasPromptedSave=!y}validateSubgraph(){if(!this.activeState?.definitions)throw new Error("The root graph of a subgraph blueprint must consist of only a single subgraph node");const{subgraphs:h}=this.activeState.definitions,{nodes:y}=this.activeState;function k(I){return I&&h.some(w=>w.id===I.type)}if(n(k,"isSubgraphNode"),y.length==1&&k(y[0]))return;const S={};let _=!1;for(let I=0;I<y.length;I++){if(!_&&k(y[I])){_=!0;continue}S[y[I].id]={errors:[],class_type:y[I].type,dependent_outputs:[]}}throw Ot().lastNodeErrors=S,gt().getCanvas().draw(!0,!0),new Error("The root graph of a subgraph blueprint must consist of only a single subgraph node")}async save(){if(this.validateSubgraph(),!this.hasPromptedSave&&Me().get("Comfy.Workflow.WarnBlueprintOverwrite")){if(!await gc(this.filename))return this;this.hasPromptedSave=!0}const h=await super.save();return Ia().updateDef(await this.load()),h}async saveAs(h){this.validateSubgraph(),this.hasPromptedSave=!0;const y=await super.saveAs(h);return Ia().updateDef(await this.load()),y}async load({force:h=!1}={}){if(!h&&this.isLoaded)return await super.load({force:h});const y=await super.load({force:h}),k=y.activeState,S=(k.definitions?.subgraphs??[]).find(_=>_.id==k.nodes[0].type);if(!S)throw new Error("Loaded subgraph blueprint does not contain valid subgraph");return S.name=k.nodes[0].title=this.filename,y}async promptSave(){return await pt().prompt({title:G("subgraphStore.saveBlueprint"),message:G("subgraphStore.blueprintName")+":",defaultValue:this.filename})}unload(){}}const t={},a="SubgraphBlueprint.",o=A(new Map),s=gt(),r=E(()=>[...o.value.values()]);async function i(){async function m(S){S.path=e.basePath+S.path;const _=await new e(S,!0).load();wt().attachWorkflow(_),l(_)}n(m,"loadBlueprint");async function h(){async function S([I,w]){const x=new e({path:e.basePath+w.name+".json",modified:Date.now(),size:-1});x.originalContent=x.content=await w.data,x.filename=w.name,wt().attachWorkflow(x),l(await x.load(),{python_module:w.info.node_pack,display_name:w.name},I)}n(S,"loadGlobalBlueprint");const _=await oe.getGlobalSubgraphs();await Promise.allSettled(Object.entries(_).map(S))}n(h,"loadInstalledBlueprints");const y=(await oe.listUserDataFullInfo(e.basePath)).filter(S=>S.path.endsWith(".json")),k=(await Promise.allSettled([...y.map(m),h()])).filter(S=>"reason"in S).map(S=>S.reason);k.forEach(S=>console.error("Failed to load subgraph blueprint",S)),k.length>0&&Oe().add({severity:"error",summary:G("subgraphStore.loadFailure"),detail:k.length>3?`x${k.length}`:`${k}`,life:6e3})}n(i,"fetchSubgraphs");function l(m,h={},y=m.filename){const k=m.changeTracker.initialState.nodes[0];if(!k)throw new Error("Invalid Subgraph Blueprint");k.inputs??=[],k.outputs??=[];const S=Object.fromEntries(k.inputs.map(w=>[w.name,[`${w.type}`,void 0]]));let _="User generated subgraph blueprint";m.initialState.extra?.BlueprintDescription&&(_=`${m.initialState.extra.BlueprintDescription}`);const I=new wo({input:{required:S},output:k.outputs.map(w=>`${w.type}`),output_name:k.outputs.map(w=>w.name),name:a+y,display_name:y,description:_,category:"Subgraph Blueprints",output_node:!1,python_module:"blueprint",...h});o.value.set(y,I),t[y]=m}n(l,"registerNodeDef");async function u(){const m=s.getCanvas(),h=[...m.selectedItems][0];if(m.selectedItems.size!==1||!(h instanceof $a))throw new TypeError("Must have single SubgraphNode selected to publish");const{nodes:y=[],subgraphs:k=[]}=m._serializeItems([h]);if(y.length!=1)throw new TypeError("Must have single SubgraphNode selected to publish");const S={revision:0,last_node_id:h.id,last_link_id:0,nodes:y,links:[],version:.4,definitions:{subgraphs:k}},_=await pt().prompt({title:G("subgraphStore.saveBlueprint"),message:G("subgraphStore.blueprintName")+":",defaultValue:h.title});if(!_||o.value.has(_)&&!await gc(_))return;const I=new e({path:e.basePath+_+".json",size:-1,modified:Date.now()});I.originalContent=JSON.stringify(S);const w=await I.load();I.size=1,await I.save(),wt().attachWorkflow(w),l(w),Oe().add({severity:"success",summary:G("subgraphStore.publishSuccess"),detail:G("subgraphStore.publishSuccessMessage"),life:4e3})}n(u,"publishSubgraph");function c(m){l(m)}n(c,"updateDef");async function d(m){const h=m.slice(18);if(!(h in t))throw new Error("not yet loaded");wt().attachWorkflow(t[h]),await _a().openWorkflow(t[h]);const y=gt().getCanvas();y.graph&&"subgraph"in y.graph.nodes[0]&&y.setGraph(y.graph.nodes[0].subgraph)}n(d,"editBlueprint");function p(m){const h=m.slice(18);if(!(h in t))throw new Error("not yet loaded");return t[h].changeTracker.initialState}n(p,"getBlueprint");async function f(m){const h=m.slice(18);if(!(h in t))throw new Error("not yet loaded");await pt().confirm({title:G("subgraphStore.confirmDeleteTitle"),type:"delete",message:G("subgraphStore.confirmDelete"),itemList:[h]})&&(await t[h].delete(),delete t[h],o.value.delete(h))}n(f,"deleteBlueprint");function g(m){return m instanceof e}return n(g,"isSubgraphBlueprint"),{deleteBlueprint:f,editBlueprint:d,fetchSubgraphs:i,getBlueprint:p,isSubgraphBlueprint:g,publishSubgraph:u,subgraphBlueprints:r,typePrefix:a,updateDef:c}});var wo=class Zf{static{n(this,"ComfyNodeDefImpl")}name;display_name;category;python_module;description;help;deprecated;experimental;output_node;api_node;input;output;output_is_list;output_name;output_tooltips;input_order;inputs;outputs;hidden;nodeSource;static#e(t){const a=Be.cloneDeep(t);a.input??={};for(const[o,s]of Object.entries(a.input.required??{})){const r=s[1];r&&r.defaultInput&&console.warn(`Use of defaultInput on required input ${t.python_module}:${t.name}:${o} is deprecated. Please drop the defaultInput option.`)}for(const[o,s]of Object.entries(a.input.optional??{})){const r=s[1];r&&r.defaultInput&&(console.warn(`Use of defaultInput on optional input ${t.python_module}:${t.name}:${o} is deprecated. Please use forceInput instead.`),r.forceInput=!0)}return a}constructor(t){const a=Zf.#e(t);Object.assign(this,a),this.name=a.name,this.display_name=a.display_name,this.category=a.category,this.python_module=a.python_module,this.description=a.description,this.help=a.help??"",this.deprecated=a.deprecated??a.category==="",this.experimental=a.experimental??a.category.startsWith("_for_testing"),this.output_node=a.output_node,this.api_node=!!a.api_node,this.input=a.input??{},this.output=a.output??[],this.output_is_list=a.output_is_list,this.output_name=a.output_name,this.output_tooltips=a.output_tooltips,this.input_order=a.input_order;const o=Ey(a);this.inputs=o.inputs,this.outputs=o.outputs,this.hidden=o.hidden,this.nodeSource=Ji(a.python_module)}get nodePath(){return(this.category?this.category+"/":"")+this.name}get isDummyFolder(){return this.name===""}postProcessSearchScores(t){const a=D2().getNodeFrequencyByName(this.name);return[t[0],-a,...t.slice(1)]}get isCoreNode(){return this.nodeSource.type===to.Core}get nodeLifeCycleBadgeText(){return this.deprecated?"[DEPR]":this.experimental?"[BETA]":""}};const hc={PrimitiveNode:{name:"PrimitiveNode",display_name:"Primitive",category:"utils",input:{required:{},optional:{}},output:["*"],output_name:["connect to widget input"],output_is_list:[!1],output_node:!1,python_module:"nodes",description:"Primitive values like numbers, strings, and booleans."},Reroute:{name:"Reroute",display_name:"Reroute",category:"utils",input:{required:{"":["*",{}]},optional:{}},output:["*"],output_name:[""],output_is_list:[!1],output_node:!1,python_module:"nodes",description:"Reroute the connection to another node."},Note:{name:"Note",display_name:"Note",category:"utils",input:{required:{text:["STRING",{multiline:!0}]},optional:{}},output:[],output_name:[],output_is_list:[],output_node:!1,python_module:"nodes",description:"Node that add notes to your project"},MarkdownNote:{name:"MarkdownNote",display_name:"Markdown Note",category:"utils",input:{required:{text:["STRING",{multiline:!0}]},optional:{}},output:[],output_name:[],output_is_list:[],output_node:!1,python_module:"nodes",description:"Node that add notes to your project. Reformats text as markdown."}};function Al(e,t={}){const{pathExtractor:a}=t;return yo(e,a||n(s=>s.nodePath.split("/"),"defaultPathExtractor"))}n(Al,"buildNodeDefTree");function P2(e){return new wo({name:"",display_name:"",category:e.endsWith("/")?e.slice(0,-1):e,python_module:"nodes",description:"Dummy Folder Node (User should never see this string)",input:{},output:[],output_name:[],output_is_list:[],output_node:!1})}n(P2,"createDummyFolderNodeDef");const zt=Je("nodeDef",()=>{const e=A({}),t=A({}),a=A(!1),o=A(!1),s=A([]),r=E(()=>[...Ia().subgraphBlueprints,...Object.values(e.value)]),i=E(()=>{const k=new Set;for(const S of r.value){for(const _ of Object.values(S.inputs))k.add(_.type);for(const _ of S.outputs)k.add(_.type)}return k}),l=E(()=>r.value.filter(k=>s.value.every(S=>S.predicate(k)))),u=E(()=>new Ay(l.value)),c=E(()=>Al(l.value));function d(k){const S={},_={};for(const I of k){const w=I instanceof wo?I:new wo(I);S[I.name]=w,_[I.display_name]=w}e.value=S,t.value=_}n(d,"updateNodeDefs");function p(k){const S=new wo(k);e.value[k.name]=S,t.value[k.display_name]=S}n(p,"addNodeDef");function f(k){const S=k.constructor?.nodeData?.name??k.type;return S?e.value[S]??null:null}n(f,"fromLGraphNode");function g(k,S){if(!k.isSubgraphNode()){const D=f(k);return D?D.inputs[S]:void 0}const _=k.widgets?.find(D=>D.name===S);if(!_||!Yo(_))return;const{nodeId:I,widgetName:w}=_._overlay,x=k.subgraph.getNodeById(I);if(x)return g(x,w)}n(g,"getInputSpecForWidget");function m(k){s.value=[...s.value,k]}n(m,"registerNodeDefFilter");function h(k){s.value=s.value.filter(S=>S.id!==k)}n(h,"unregisterNodeDefFilter");function y(){m({id:"core.deprecated",name:"Hide Deprecated Nodes",description:"Hides nodes marked as deprecated unless explicitly enabled",predicate:n(k=>a.value||!k.deprecated,"predicate")}),m({id:"core.experimental",name:"Hide Experimental Nodes",description:"Hides nodes marked as experimental unless explicitly enabled",predicate:n(k=>o.value||!k.experimental,"predicate")}),m({id:"core.subgraph",name:"Hide Subgraph Nodes",description:"Temporarily hides subgraph nodes from node library and search",predicate:n(k=>!(k.category==="subgraph"&&k.python_module==="nodes"),"predicate")})}return n(y,"registerCoreNodeDefFilters"),y(),{nodeDefsByName:e,nodeDefsByDisplayName:t,showDeprecated:a,showExperimental:o,nodeDefFilters:s,nodeDefs:r,nodeDataTypes:i,visibleNodeDefs:l,nodeSearchService:u,nodeTree:c,updateNodeDefs:d,addNodeDef:p,fromLGraphNode:f,getInputSpecForWidget:g,registerNodeDefFilter:m,unregisterNodeDefFilter:h}}),D2=Je("nodeFrequency",()=>{const e=A(64),t=A({}),a=E(()=>Object.keys(t.value)),o=A(!1),s=n(async()=>{if(!o.value)try{t.value=(await So.get("assets/sorted-custom-node-map.json")).data,o.value=!0}catch(u){console.error("Error loading node frequencies:",u)}},"loadNodeFrequencies"),r=n(u=>i(u.name),"getNodeFrequency"),i=n(u=>t.value[u]??0,"getNodeFrequencyByName"),l=zt();return{nodeNamesByFrequency:a,topNodeDefs:E(()=>a.value.map(u=>l.nodeDefsByName[u]).filter(u=>u!==void 0).slice(0,e.value)),isLoaded:o,loadNodeFrequencies:s,getNodeFrequency:r,getNodeFrequencyByName:i}}),Ye={USER_SIGN_UP_OPENED:"app:user_sign_up_opened",USER_AUTH_COMPLETED:"app:user_auth_completed",USER_LOGGED_IN:"app:user_logged_in",RUN_BUTTON_CLICKED:"app:run_button_click",SUBSCRIPTION_REQUIRED_MODAL_OPENED:"app:subscription_required_modal_opened",SUBSCRIBE_NOW_BUTTON_CLICKED:"app:subscribe_now_button_clicked",MONTHLY_SUBSCRIPTION_SUCCEEDED:"app:monthly_subscription_succeeded",MONTHLY_SUBSCRIPTION_CANCELLED:"app:monthly_subscription_cancelled",ADD_API_CREDIT_BUTTON_CLICKED:"app:add_api_credit_button_clicked",API_CREDIT_TOPUP_BUTTON_PURCHASE_CLICKED:"app:api_credit_topup_button_purchase_clicked",API_CREDIT_TOPUP_SUCCEEDED:"app:api_credit_topup_succeeded",USER_SURVEY_OPENED:"app:user_survey_opened",USER_SURVEY_SUBMITTED:"app:user_survey_submitted",USER_EMAIL_VERIFY_OPENED:"app:user_email_verify_opened",USER_EMAIL_VERIFY_REQUESTED:"app:user_email_verify_requested",USER_EMAIL_VERIFY_COMPLETED:"app:user_email_verify_completed",TEMPLATE_WORKFLOW_OPENED:"app:template_workflow_opened",TEMPLATE_LIBRARY_OPENED:"app:template_library_opened",TEMPLATE_LIBRARY_CLOSED:"app:template_library_closed",WORKFLOW_IMPORTED:"app:workflow_imported",WORKFLOW_OPENED:"app:workflow_opened",PAGE_VISIBILITY_CHANGED:"app:page_visibility_changed",TAB_COUNT_TRACKING:"app:tab_count_tracking",NODE_SEARCH:"app:node_search",NODE_SEARCH_RESULT_SELECTED:"app:node_search_result_selected",TEMPLATE_FILTER_CHANGED:"app:template_filter_changed",SETTING_CHANGED:"app:setting_changed",HELP_CENTER_OPENED:"app:help_center_opened",HELP_RESOURCE_CLICKED:"app:help_resource_clicked",HELP_CENTER_CLOSED:"app:help_center_closed",WORKFLOW_CREATED:"app:workflow_created",EXECUTION_START:"execution_start",EXECUTION_ERROR:"execution_error",EXECUTION_SUCCESS:"execution_success",UI_BUTTON_CLICKED:"app:ui_button_clicked"};var L2=[{name:"Film / TV / Animation",userCount:2885,keywords:["film","tv","television","animation","animation studio","tv production","film production","story","anime","video","cinematography","visual effects","vfx","vfx artist","movie","cinema","documentary","documentary filmmaker","broadcast","streaming","production","director","filmmaker","post-production","editing"]},{name:"Marketing / Advertising / Social Media",userCount:1340,keywords:["marketing","advertising","youtube","tiktok","social media","content creation","influencer","brand","promotion","digital marketing","seo","campaigns","copywriting","growth","engagement"]},{name:"Software / IT / AI",userCount:1100,keywords:["software","software development","software engineer","it","ai","ai research","corporate ai research","ai research lab","tech company ai research","developer","app developer","consulting","tech","tech startup","programmer","data science","machine learning","coding","programming","web development","app development","saas"]},{name:"Product & Industrial Design",userCount:1050,keywords:["product design","industrial","manufacturing","3d rendering","product visualization","mechanical","automotive","cad","prototype","design engineering","invention"]},{name:"Fine Art / Contemporary Art",userCount:780,keywords:["fine art","art","illustration","contemporary","artist","painting","drawing","sculpture","gallery","canvas","digital art","mixed media","abstract","portrait"]},{name:"Education / Research",userCount:640,keywords:["education","student","teacher","research","university research","academic ai research","university ai research","ai research at university","learning","university","school","academic","professor","curriculum","training","instruction","pedagogy"]},{name:"Architecture / Engineering / Construction",userCount:420,keywords:["architecture","architecture firm","construction","engineering","civil","civil engineering","cad","building","structural","landscape","landscape architecture","interior design","real estate","planning","blueprints"]},{name:"Gaming / Interactive Media",userCount:410,keywords:["gaming","game dev","game development","indie game studio","vr development","roblox","interactive","interactive media","virtual world","vr","ar","metaverse","simulation","unity","unity developer","unreal","indie games"]},{name:"Photography / Videography",userCount:70,keywords:["photography","photo","videography","camera","image","portrait","wedding","commercial photo","stock photography","photojournalism","event photography"]},{name:"Fashion / Beauty / Retail",userCount:25,keywords:["fashion","fashion design","beauty","beauty industry","jewelry","jewelry design","custom jewelry design","retail","retail store","style","clothing","cosmetics","makeup","accessories","boutique"]},{name:"Music / Performing Arts",userCount:25,keywords:["music","music production","vj","dance","projection mapping","audio visual","concert","concert production","performance","theater","stage","live events"]},{name:"Healthcare / Medical / Life Science",userCount:30,keywords:["healthcare","medical","medical research","doctor","biotech","life science","pharmaceutical","clinical","clinical research","hospital","medicine","health"]},{name:"E-commerce / Print-on-Demand / Business",userCount:15,keywords:["ecommerce","e-commerce","print on demand","shop","business","commercial","startup","entrepreneur","sales","online store"]},{name:"Nonprofit / Government / Public Sector",userCount:15,keywords:["501c3","ngo","government","public service","policy","nonprofit","charity","civic","community","social impact"]},{name:"Adult / NSFW",userCount:10,keywords:["nsfw","nsfw content","adult","adult entertainment","erotic","explicit","xxx","porn"]}],O2=[{name:"Content Creation & Marketing",keywords:["content creation","social media","marketing","marketing campaigns","advertising","youtube","youtube thumbnail","youtube thumbnail generation","tiktok","instagram","thumbnails","posts","campaigns","brand content"]},{name:"Art & Illustration",keywords:["art","illustration","drawing","painting","concept art","creating concept art","character design","digital art","fantasy art","portraits"]},{name:"Product Visualization & Design",keywords:["product","product mockup","product mockup creation","visualization","prototype visualization","design","prototype","mockup","3d rendering","industrial design","product photos"]},{name:"Film & Video Production",keywords:["film","video","video editing","movie","movie production","animation","vfx","visual effects","storyboard","storyboard creation","cinematography","post production"]},{name:"Gaming & Interactive Media",keywords:["game","gaming","game asset generation","game assets","game development","game textures","interactive","vr","vr content creation","ar","virtual","simulation","metaverse","textures"]},{name:"Architecture & Construction",keywords:["architecture","architectural rendering","building","building visualization","construction","interior design","interior design mockups","landscape","real estate","real estate visualization","floor plans","renderings"]},{name:"Education & Training",keywords:["education","educational","educational content","training","training materials","learning","teaching","tutorial","tutorial creation","course","academic","academic projects","instructional","workshops"]},{name:"Research & Development",keywords:["research","research experiments","development","experiment","prototype","prototype testing","testing","analysis","study","innovation","innovation projects","r&d","scientific visualization"]},{name:"Personal & Hobby",keywords:["personal","personal art projects","hobby","hobby work","fun","fun experiments","experiment","learning","curiosity","explore","creative","creative exploration","side project"]},{name:"Photography & Image Processing",keywords:["photography","product photography","portrait photography","photo","photo editing","image","image enhancement","portrait","editing","enhancement","restoration","photo manipulation"]}],Jf={keys:["keywords"],threshold:.53,minMatchCharLength:5,includeScore:!0,includeMatches:!0,ignoreLocation:!0,findAllMatches:!0},N2=new Pn(L2,Jf),$2=new Pn(O2,Jf);function R2(e){if(!e||typeof e!="string"||e.toLowerCase().trim().match(/^(other|none|undefined|unknown|n\/a|not applicable|-|)$/))return"Other / Undefined";const t=N2.search(e);return t.length>0?t[0].item.name:`Uncategorized: ${e}`}n(R2,"normalizeIndustry");function B2(e){if(!e||typeof e!="string"||e.toLowerCase().trim().match(/^(other|none|undefined|unknown|n\/a|not applicable|-|)$/))return"Other / Undefined";const t=$2.search(e);return t.length>0?t[0].item.name:`Uncategorized: ${e}`}n(B2,"normalizeUseCase");function F2(e){const t={...e};return e.industry&&(t.industry_normalized=R2(e.industry),t.industry_raw=e.industry),e.useCase&&(t.useCase_normalized=B2(e.useCase),t.useCase_raw=e.useCase),t}n(F2,"normalizeSurveyResponses");var vc=[Ye.WORKFLOW_OPENED,Ye.PAGE_VISIBILITY_CHANGED,Ye.TAB_COUNT_TRACKING,Ye.NODE_SEARCH,Ye.NODE_SEARCH_RESULT_SELECTED,Ye.TEMPLATE_FILTER_CHANGED,Ye.SETTING_CHANGED,Ye.HELP_CENTER_OPENED,Ye.HELP_RESOURCE_CLICKED,Ye.HELP_CENTER_CLOSED,Ye.WORKFLOW_CREATED,Ye.UI_BUTTON_CLICKED],U2=new Set(Object.values(Ye)),W2=class{static{n(this,"MixpanelTelemetryProvider")}isEnabled=!0;mixpanel=null;eventQueue=[];isInitialized=!1;lastTriggerSource;disabledEvents=new Set(vc);constructor(){this.configureDisabledEvents(window.__CONFIG__??null),be(Eo,t=>{this.configureDisabledEvents(t)},{immediate:!0});const e=window.__CONFIG__?.mixpanel_token;if(e)try{ut(()=>import("./mixpanel.module-DaBZUFSE.js"),__vite__mapDeps([63,2,3,4]),import.meta.url).then(t=>{this.mixpanel=t.default,this.mixpanel.init(e,{debug:!1,track_pageview:!0,api_host:"https://mp.comfy.org",cross_subdomain_cookie:!0,persistence:"cookie",loaded:n(()=>{this.isInitialized=!0,this.flushEventQueue(),Ko().onUserResolved(a=>{this.mixpanel&&a.id&&this.mixpanel.identify(a.id)})},"loaded")})}).catch(t=>{console.error("Failed to load Mixpanel:",t),this.isEnabled=!1})}catch(t){console.error("Failed to initialize Mixpanel:",t),this.isEnabled=!1}else console.warn("Mixpanel token not provided in runtime config"),this.isEnabled=!1}flushEventQueue(){if(!(!this.isInitialized||!this.mixpanel))for(;this.eventQueue.length>0;){const e=this.eventQueue.shift();try{this.mixpanel.track(e.eventName,e.properties||{})}catch(t){console.error("Failed to track queued event:",t)}}}trackEvent(e,t){if(!this.isEnabled||this.disabledEvents.has(e))return;const a={eventName:e,properties:t};if(this.isInitialized&&this.mixpanel)try{this.mixpanel.track(e,t||{})}catch(o){console.error("Failed to track event:",o)}else this.eventQueue.push(a)}configureDisabledEvents(e){const t=e?.telemetry_disabled_events??vc;this.disabledEvents=this.buildEventSet(t)}buildEventSet(e){return new Set(e.filter(t=>U2.has(t)))}trackSignupOpened(){this.trackEvent(Ye.USER_SIGN_UP_OPENED)}trackAuth(e){this.trackEvent(Ye.USER_AUTH_COMPLETED,e)}trackUserLoggedIn(){this.trackEvent(Ye.USER_LOGGED_IN)}trackSubscription(e){const t=e==="modal_opened"?Ye.SUBSCRIPTION_REQUIRED_MODAL_OPENED:Ye.SUBSCRIBE_NOW_BUTTON_CLICKED;this.trackEvent(t)}trackAddApiCreditButtonClicked(){this.trackEvent(Ye.ADD_API_CREDIT_BUTTON_CLICKED)}trackMonthlySubscriptionSucceeded(){this.trackEvent(Ye.MONTHLY_SUBSCRIPTION_SUCCEEDED)}trackMonthlySubscriptionCancelled(){this.trackEvent(Ye.MONTHLY_SUBSCRIPTION_CANCELLED)}trackApiCreditTopupButtonPurchaseClicked(e){const t={credit_amount:e};this.trackEvent(Ye.API_CREDIT_TOPUP_BUTTON_PURCHASE_CLICKED,t)}trackApiCreditTopupSucceeded(){this.trackEvent(Ye.API_CREDIT_TOPUP_SUCCEEDED)}startTopupTracking(){iy()}checkForCompletedTopup(e){return ly(e)}clearTopupTracking(){Jd()}trackRunButton(e){const t=this.getExecutionContext(),a={subscribe_to_run:e?.subscribe_to_run||!1,workflow_type:t.is_template?"template":"custom",workflow_name:t.workflow_name??"untitled",custom_node_count:t.custom_node_count,total_node_count:t.total_node_count,subgraph_count:t.subgraph_count,has_api_nodes:t.has_api_nodes,api_node_names:t.api_node_names,trigger_source:e?.trigger_source};this.lastTriggerSource=e?.trigger_source,this.trackEvent(Ye.RUN_BUTTON_CLICKED,a)}trackSurvey(e,t){const a=e==="opened"?Ye.USER_SURVEY_OPENED:Ye.USER_SURVEY_SUBMITTED,o=t?F2(t):void 0;if(this.trackEvent(a,o),e==="submitted"&&o&&this.mixpanel)try{this.mixpanel.people.set(o)}catch(s){console.error("Failed to set survey user properties:",s)}}trackEmailVerification(e){let t;switch(e){case"opened":t=Ye.USER_EMAIL_VERIFY_OPENED;break;case"requested":t=Ye.USER_EMAIL_VERIFY_REQUESTED;break;case"completed":t=Ye.USER_EMAIL_VERIFY_COMPLETED;break}this.trackEvent(t)}trackTemplate(e){this.trackEvent(Ye.TEMPLATE_WORKFLOW_OPENED,e)}trackTemplateLibraryOpened(e){this.trackEvent(Ye.TEMPLATE_LIBRARY_OPENED,e)}trackTemplateLibraryClosed(e){this.trackEvent(Ye.TEMPLATE_LIBRARY_CLOSED,e)}trackWorkflowImported(e){this.trackEvent(Ye.WORKFLOW_IMPORTED,e)}trackWorkflowOpened(e){this.trackEvent(Ye.WORKFLOW_OPENED,e)}trackPageVisibilityChanged(e){this.trackEvent(Ye.PAGE_VISIBILITY_CHANGED,e)}trackTabCount(e){this.trackEvent(Ye.TAB_COUNT_TRACKING,e)}trackNodeSearch(e){this.trackEvent(Ye.NODE_SEARCH,e)}trackNodeSearchResultSelected(e){this.trackEvent(Ye.NODE_SEARCH_RESULT_SELECTED,e)}trackTemplateFilterChanged(e){this.trackEvent(Ye.TEMPLATE_FILTER_CHANGED,e)}trackHelpCenterOpened(e){this.trackEvent(Ye.HELP_CENTER_OPENED,e)}trackHelpResourceClicked(e){this.trackEvent(Ye.HELP_RESOURCE_CLICKED,e)}trackHelpCenterClosed(e){this.trackEvent(Ye.HELP_CENTER_CLOSED,e)}trackWorkflowCreated(e){this.trackEvent(Ye.WORKFLOW_CREATED,e)}trackWorkflowExecution(){const e={...this.getExecutionContext(),trigger_source:this.lastTriggerSource??"unknown"};this.trackEvent(Ye.EXECUTION_START,e),this.lastTriggerSource=void 0}trackExecutionError(e){this.trackEvent(Ye.EXECUTION_ERROR,e)}trackExecutionSuccess(e){this.trackEvent(Ye.EXECUTION_SUCCESS,e)}trackSettingChanged(e){this.trackEvent(Ye.SETTING_CHANGED,e)}trackUiButtonClicked(e){this.trackEvent(Ye.UI_BUTTON_CLICKED,e)}getExecutionContext(){const e=wt(),t=uy(),a=zt(),o=e.activeWorkflow,s=oh(Z.rootGraph,(r,i)=>{const l=a.nodeDefsByName[i.type],u=l?.nodeSource?.type===to.CustomNodes,c=l?.api_node===!0,d=i.isSubgraphNode?.()===!0;if(c){r.has_api_nodes=!0;const p=l?.name;p&&!r.api_node_names.includes(p)&&r.api_node_names.push(p)}return r.custom_node_count+=u?1:0,r.api_node_count+=c?1:0,r.subgraph_count+=d?1:0,r.total_node_count+=1,r},{custom_node_count:0,api_node_count:0,subgraph_count:0,total_node_count:0,has_api_nodes:!1,api_node_names:[]});if(o?.filename){if(t.knownTemplateNames.has(o.filename)){const r=t.getTemplateByName(o.filename),i=t.getEnglishMetadata(o.filename);return{is_template:!0,workflow_name:o.filename,template_source:r?.sourceModule,template_category:i?.category??r?.category,template_tags:i?.tags??r?.tags,template_models:i?.models??r?.models,template_use_case:i?.useCase??r?.useCase,template_license:i?.license??r?.license,...s}}return{is_template:!1,workflow_name:o.filename,...s}}return{is_template:!1,workflow_name:void 0,...s}}},Wr=null;function yt(){return Wr===null&&qe&&(Wr=new W2),Wr}n(yt,"useTelemetry");var z2=n((e,t)=>{const a=t.getNodeById(e);if(a?.isSubgraphNode())return a.subgraph},"subgraphNodeIdToSubgraph");function Qf(e,t,a=[]){if(t.length===1)return a;const o=t.shift();if(o===void 0)return a;const s=z2(o,e);if(!s){console.warn(`Subgraph not found: ${o}`);return}return a.push(s),Qf(s,t,a)}n(Qf,"getSubgraphsFromInstanceIds");function cs(e){const t=String(e);if(!t.includes(":"))return t;const a=t.split(":"),o=a[a.length-1],s=Qf(Z.rootGraph,a);if(s)return _s(s.at(-1).id,o)}n(cs,"executionIdToNodeLocatorId");const Ot=Je("execution",()=>{const e=wt(),t=gt(),a=A(null),o=A(null),s=A({}),r=A(null),i=A(null),l=A({}),u=A({}),c=A(new Map),d=A(new Set),p=n((de,he)=>{if(de===void 0)return he;const Te={...de};if(Te.state==="error")return Te;if(he.state==="running"){const Ge=he.max>0?he.value/he.max:0,We=Te.max>0?Te.value/Te.max:0;(Te.state!=="running"||We===0||Ge<We)&&(Te.value=he.value,Te.max=he.max),Te.state="running"}return Te},"mergeExecutionProgressStates"),f=E(()=>{const de={},he=l.value;for(const Te of Object.values(he)){const Ge=String(Te.display_node_id).split(":");for(let We=0;We<Ge.length;We++){const te=cs(Ge.slice(0,We+1).join(":"));te&&(de[te]=p(de[te],Te))}}return de}),g=E(()=>Object.entries(l.value).filter(([de,he])=>he.state==="running").map(([de,he])=>de)),m=E(()=>g.value[0]??null),h=E(()=>new Set(g.value.map(String))),y=E(()=>{if(!m.value)return null;const de=_.value?.workflow;if(!de)return null;const he=de.changeTracker?.activeState??null;return he?he.nodes.find(Te=>String(Te.id)===m.value)??null:null}),k=A(null),S=E(()=>k.value?k.value.value/k.value.max:null),_=E(()=>s.value[o.value??""]),I=E(()=>_.value?Object.values(_.value.nodes).length:0),w=E(()=>!o.value),x=E(()=>_.value?Object.values(_.value.nodes).filter(Boolean).length:0),D=E(()=>{if(!_.value)return 0;const de=I.value,he=x.value;return de>0?he/de:0}),T=E(()=>{const de=i.value;return de?cs(String(de.node_id)):null}),N=E(()=>{const de=T.value;if(!de)return null;const he=e.nodeLocatorIdToNodeId(de);return he!=null?String(he):null});function M(){oe.addEventListener("notification",ne),oe.addEventListener("execution_start",L),oe.addEventListener("execution_cached",F),oe.addEventListener("execution_interrupted",K),oe.addEventListener("execution_success",V),oe.addEventListener("executed",j),oe.addEventListener("executing",q),oe.addEventListener("progress",ae),oe.addEventListener("progress_state",re),oe.addEventListener("status",ce),oe.addEventListener("execution_error",ee),oe.addEventListener("progress_text",ge)}n(M,"bindExecutionEvents");function O(){oe.removeEventListener("notification",ne),oe.removeEventListener("execution_start",L),oe.removeEventListener("execution_cached",F),oe.removeEventListener("execution_interrupted",K),oe.removeEventListener("execution_success",V),oe.removeEventListener("executed",j),oe.removeEventListener("executing",q),oe.removeEventListener("progress",ae),oe.removeEventListener("progress_state",re),oe.removeEventListener("status",ce),oe.removeEventListener("execution_error",ee),oe.removeEventListener("progress_text",ge)}n(O,"unbindExecutionEvents");function L(de){i.value=null,o.value=de.detail.prompt_id,s.value[o.value]??={nodes:{}},B(o.value)}n(L,"handleExecutionStart");function F(de){if(_.value)for(const he of de.detail.nodes)_.value.nodes[he]=!0}n(F,"handleExecutionCached");function K(de){const he=de.detail.prompt_id;o.value&&B(o.value),Y(he)}n(K,"handleExecutionInterrupted");function j(de){_.value&&(_.value.nodes[de.detail.node]=!0)}n(j,"handleExecuted");function V(de){qe&&o.value&&yt()?.trackExecutionSuccess({jobId:o.value});const he=de.detail.prompt_id;Y(he)}n(V,"handleExecutionSuccess");function q(de){k.value=null,_.value&&typeof de.detail!="string"&&(o.value&&delete s.value[o.value],o.value=null)}n(q,"handleExecuting");function re(de){const{nodes:he,prompt_id:Te}=de.detail,Ge=u.value[Te]||{};for(const We in he)if(he[We].state==="running"&&!Ge[We]){const{revokePreviewsByExecutionId:te}=Gt();te(We)}if(u.value={...u.value,[Te]:he},l.value=he,m.value&&he[m.value]){const We=he[m.value];k.value={value:We.value,max:We.max,prompt_id:We.prompt_id,node:We.display_node_id||We.node_id}}}n(re,"handleProgressState");function ae(de){k.value=de.detail}n(ae,"handleProgress");function ce(){oe.clientId&&(a.value=oe.clientId,oe.removeEventListener("status",ce))}n(ce,"handleStatus");function ee(de){i.value=de.detail,qe&&yt()?.trackExecutionError({jobId:de.detail.prompt_id,nodeId:String(de.detail.node_id),nodeType:de.detail.node_type,error:de.detail.exception_message}),B(de.detail.prompt_id),Y(de.detail.prompt_id)}n(ee,"handleExecutionError");function ne(de){const he=de.detail,Te=he?.value||"",Ge=he?.id?he.id:"";if(Ge&&Te.includes("Waiting for a machine")){const We=new Set(d.value);We.add(Ge),d.value=We}}n(ne,"handleNotification");function B(de){if(!de||!d.value.has(de))return;const he=new Set(d.value);he.delete(de),d.value=he}n(B,"clearInitializationByPromptId");function z(de){return de?d.value.has(String(de)):!1}n(z,"isPromptInitializing");function Y(de){l.value={};const he=de??o.value??null;if(he){const Te={...u.value};delete Te[he],u.value=Te}o.value&&delete s.value[o.value],o.value=null,k.value=null}n(Y,"resetExecutionState");function ie(de){const he=String(de);return he.includes(":")?e.executionIdToCurrentId(he):he}n(ie,"getNodeIdIfExecuting");function ge(de){const{nodeId:he,text:Te}=de.detail;if(!Te||!he)return;const Ge=ie(he),We=t.getCanvas().graph?.getNodeById(Ge);We&&Hv().showTextPreview(We,Te)}n(ge,"handleProgressText");function Le({nodes:de,id:he,workflow:Te}){s.value[he]??={nodes:{}};const Ge=s.value[he];Ge.nodes={...de.reduce((te,le)=>(te[le]=!1,te),{}),...Ge.nodes},Ge.workflow=Te;const We=Te?.activeState?.id??Te?.initialState?.id;We&&c.value.set(String(he),String(We))}n(Le,"storePrompt");function _e(de,he){!de||!he||c.value.set(String(de),String(he))}n(_e,"registerPromptWorkflowIdMapping");const Q=n(de=>e.nodeLocatorIdToNodeExecutionId(de),"nodeLocatorIdToExecutionId"),ue=E(()=>{const de=[];for(const[he,Te]of Object.entries(u.value))Object.values(Te).some(Ge=>Ge.state==="running")&&de.push(he);return de}),we=E(()=>ue.value.length),Ce=E(()=>{if(!r.value)return{};const de={};for(const[he,Te]of Object.entries(r.value)){const Ge=cs(he);Ge&&(de[Ge]=Te)}return de}),xe=n(de=>Ce.value[de],"getNodeErrors"),Ue=n((de,he)=>{const Te=xe(de);return Te?Te.errors.some(Ge=>Ge.extra_info?.input_name===he):!1},"slotHasError");return be(r,()=>{if(Z.rootGraph&&(bs(Z.rootGraph,de=>{if(de.has_errors=!1,de.inputs)for(const he of de.inputs)he.hasErrors=!1}),!!r.value))for(const[de,he]of Object.entries(r.value)){const Te=Fs(Z.rootGraph,de);if(!Te)continue;if(Te.has_errors=!0,Te.inputs)for(const We of he.errors){const te=We.extra_info?.input_name;if(!te)continue;const le=Te.inputs.find(me=>me.name===te);le&&(le.hasErrors=!0)}const Ge=de.split(":");for(let We=Ge.length-1;We>0;We--){const te=Ge.slice(0,We).join(":"),le=Fs(Z.rootGraph,te);le&&(le.has_errors=!0)}}}),{isIdle:w,clientId:a,activePromptId:o,queuedPrompts:s,lastNodeErrors:r,lastExecutionError:i,lastExecutionErrorNodeId:N,executingNodeId:m,executingNodeIds:g,activePrompt:_,totalNodesToExecute:I,nodesExecuted:x,executionProgress:D,executingNode:y,executingNodeProgress:S,nodeProgressStates:l,nodeLocationProgressStates:f,nodeProgressStatesByPrompt:u,runningPromptIds:ue,runningWorkflowCount:we,initializingPromptIds:d,isPromptInitializing:z,bindExecutionEvents:M,unbindExecutionEvents:O,storePrompt:Le,registerPromptWorkflowIdMapping:_e,uniqueExecutingNodeIdStrings:h,_executingNodeProgress:k,executionIdToNodeLocatorId:cs,nodeLocatorIdToExecutionId:Q,promptIdToWorkflowId:c,getNodeErrors:xe,slotHasError:Ue}});var V2=400,yc=n((e,t,a)=>({images:e.map(o=>({type:t,...Ph(o)})),animated:e.map(o=>a&&(o.endsWith(".webp")||o.endsWith(".png")))}),"createOutputs");const Gt=Je("nodeOutput",()=>{const{nodeIdToNodeLocatorId:e,nodeToNodeLocatorId:t}=wt(),{executionIdToNodeLocatorId:a}=Ot(),o={},s=A([]);function r(M,O){o[M]?.stop();const{stop:L}=gd(()=>{delete o[M],O()},V2);o[M]={stop:L}}n(r,"scheduleRevoke");const i=A({}),l=A(Z.nodePreviewImages||{});function u(M){return Z.nodeOutputs[t(M)]}n(u,"getNodeOutputs");function c(M){return Z.nodePreviewImages[t(M)]}n(c,"getNodePreviews");const d=n((M,O)=>!(M.animatedImages||wl(M)||!O?.images?.length||O.images.some(L=>L.filename?.endsWith("svg"))),"isImageOutputs");function p(M,O){return d(M,O)?Z.getPreviewFormatParam():""}n(p,"getPreviewParam");function f(M){const O=c(M);if(O?.length)return O;const L=u(M);if(!L?.images?.length)return;const F=Z.getRandParam(),K=p(M,L);return L.images.map(j=>{const V=new URLSearchParams(j);return oe.apiURL(`/view?${V}${K}${F}`)})}n(f,"getNodeImageUrls");function g(M,O,L={}){if(O!=null){if(L.merge){const F=Z.nodeOutputs[M];if(F&&O){for(const K in O){const j=F[K],V=O[K];Array.isArray(j)&&Array.isArray(V)?F[K]=j.concat(V):F[K]=V}return}}Z.nodeOutputs[M]=O,i.value[M]=O}}n(g,"setOutputsByLocatorId");function m(M,O,{folder:L="input",isAnimated:F=!1}={}){if(!O||!M)return;const K=t(M);if(K)if(typeof O=="string")g(K,yc([O],L,F));else if(!Array.isArray(O))g(K,O);else{const j=yc(O,L,F);if(!j?.images?.length)return;g(K,j)}}n(m,"setNodeOutputs");function h(M,O,L={}){const F=a(M);F&&g(F,O,L)}n(h,"setNodeOutputsByExecutionId");function y(M,O){const L=a(M);L&&(o[L]&&(o[L].stop(),delete o[L]),s.value=O,Z.nodePreviewImages[L]=O,l.value[L]=O)}n(y,"setNodePreviewsByExecutionId");function k(M,O){const L=e(M);o[L]&&(o[L].stop(),delete o[L]),Z.nodePreviewImages[L]=O,l.value[L]=O}n(k,"setNodePreviewsByNodeId");function S(M){const O=a(M);O&&r(O,()=>_(O))}n(S,"revokePreviewsByExecutionId");function _(M){const O=Z.nodePreviewImages[M];if(O?.[Symbol.iterator]){for(const L of O)URL.revokeObjectURL(L);delete Z.nodePreviewImages[M],delete l.value[M]}}n(_,"revokePreviewsByLocatorId");function I(){for(const M of Object.keys(Z.nodePreviewImages)){const O=Z.nodePreviewImages[M];if(O?.[Symbol.iterator])for(const L of O)URL.revokeObjectURL(L)}Z.nodePreviewImages={},l.value={}}n(I,"revokeAllPreviews");function w(M){_((M.graph.isRootGraph?"":M.graph.id+":")+M.id);for(const O of M.subgraph.nodes)_(M.subgraph.id+O.id)}n(w,"revokeSubgraphPreviews");function x(M){const O=e(Number(M));if(!O)return!1;const L=!!Z.nodeOutputs[O];return delete Z.nodeOutputs[O],delete i.value[O],Z.nodePreviewImages[O]&&(delete Z.nodePreviewImages[O],delete l.value[O]),L}n(x,"removeNodeOutputs");function D(M){Z.nodeOutputs=M,i.value=M}n(D,"restoreOutputs");function T(M){if(!M.images?.length)return;const O=e(M.id);if(O){const L=Z.nodeOutputs[O];if(L){const F={...L,images:M.images};Z.nodeOutputs[O]=F,i.value[O]=F}}}n(T,"updateNodeImages");function N(){Z.nodeOutputs={},i.value={},I()}return n(N,"resetAllOutputsAndPreviews"),{getNodeOutputs:u,getNodeImageUrls:f,getNodePreviews:c,getPreviewParam:p,setNodeOutputs:m,setNodeOutputsByExecutionId:h,setNodePreviewsByExecutionId:y,setNodePreviewsByNodeId:k,updateNodeImages:T,revokePreviewsByExecutionId:S,revokeAllPreviews:I,revokeSubgraphPreviews:w,removeNodeOutputs:x,restoreOutputs:D,resetAllOutputsAndPreviews:N,nodeOutputs:i,nodePreviewImages:l,latestPreview:s}});function G2(){const{getSelectedNodes:e}=Hd(),t=gt(),a=wt(),o=Gt(),s=zt(),r=rn(),i=n(()=>{const f=t.getCanvas(),g=f.subgraph??f.graph;if(!g)return null;const m=g.convertToSubgraph(f.selectedItems);if(!m)return;const{node:h}=m;f.select(h),t.updateSelectedItems(),a.activeWorkflow?.changeTracker?.checkState()},"convertToSubgraph"),l=n((f,g)=>{const m=t.getCanvas(),h=m.subgraph??m.graph;if(h){for(const y of f)o.revokeSubgraphPreviews(y),h.unpackSubgraph(y,{skipMissingNodes:g});a.activeWorkflow?.changeTracker?.checkState()}},"doUnpack");return{convertToSubgraph:i,unpackSubgraph:n(()=>{const f=t.getCanvas();if(!(f.subgraph??f.graph))return;const g=Array.from(f.selectedItems).filter(m=>m instanceof $a);g.length!==0&&l(g,!0)},"unpackSubgraph"),addSubgraphToLibrary:n(async()=>{const f=Array.from(t.selectedItems);if(f.length===1){const h=f[0];if(Rp(h)){const y=s.fromLGraphNode(h);if(y){await r.addBookmark(y.nodePath);return}}}const g=e();if(g.length===0)return;if(!g.some(h=>h instanceof $a)){i();return}let m=0;for(const h of g)if(h instanceof $a){const y=s.fromLGraphNode(h);y&&(await r.addBookmark(y.nodePath),m++)}},"addSubgraphToLibrary"),isSubgraphSelected:n(()=>Array.from(t.selectedItems).some(f=>f instanceof $a),"isSubgraphSelected"),hasSelectableNodes:n(()=>e().length>0,"hasSelectableNodes")}}n(G2,"useSubgraphOperations");function H2(){function e(a){if(!a.imgs?.length||!a.widgets)return;const o=a.widgets.findIndex(s=>s.name===Ls);if(a.imgs[0].classList.value="block size-full object-contain",o>-1){const s=a.widgets[o];if(!On(s))return;s.element.replaceChildren(a.imgs[0])}else{const s=document.createElement("div");s.appendChild(a.imgs[0]);const r=a.addDOMWidget(Ls,"img",s,{hideOnZoom:!1});a.overIndex=0;const{handleWheel:i,handlePointer:l,forwardEventToCanvas:u}=vl();a.imgs[0].style.pointerEvents="none",s.addEventListener("wheel",i),s.addEventListener("pointermove",l),s.addEventListener("pointerup",l),s.addEventListener("pointerdown",c=>c.button!==2?l(c):u(c),!0),r.serialize=!1,r.serializeValue=()=>{}}}n(e,"showAnimatedPreview");function t(a){if(!a.widgets)return;const o=a.widgets.findIndex(s=>s.name===Ls);o>-1&&(a.widgets[o].onRemove?.(),a.widgets.splice(o,1))}return n(t,"removeAnimatedPreview"),{showAnimatedPreview:e,removeAnimatedPreview:t}}n(H2,"useNodeAnimatedImage");function Zs(e,t,a){let o=0,s=e[0].naturalWidth,r=e[0].naturalHeight;const i=e.length;let l,u,c,d,p;for(let f=1;f<=i;f++){const g=Math.ceil(i/f),m=t/f,h=a/g,y=m/s,k=h/r,S=Math.min(y,k,1),_=s*S,I=r*S,w=_*I*i;w>o&&(o=w,l=_,u=I,c=f,d=g,p=f*((m-_)/2))}return{cellWidth:l,cellHeight:u,cols:c,rows:d,shiftX:p}}n(Zs,"calculateImageGrid");function j2(e){const t=Ee("div.comfy-img-preview");let a,o=!0;function s(){let r=null,i=null;if(a){let l=t.clientHeight;o?(o=!1,l<190&&(l=190),t.style.setProperty("--comfy-widget-min-height",l.toString())):t.style.setProperty("--comfy-widget-min-height",null);const u=e.size[0];({cellWidth:r,cellHeight:i}=Zs(a,u-20,l)),r+="px",i+="px",t.style.setProperty("--comfy-img-preview-width",r),t.style.setProperty("--comfy-img-preview-height",i)}}return n(s,"updateSize"),{el:t,getCurrentImage(){return a?.[0]},updateImages(r){r!==a&&(a==null&&requestAnimationFrame(()=>{s()}),t.replaceChildren(...r),a=r,e.onResize?.(e.size),e.graph?.setDirtyCanvas(!0,!0))},getHeight(){s()},onDraw(){t.style.pointerEvents="all";const r=document.elementFromPoint(Z.canvas.mouse[0],Z.canvas.mouse[1]);t.style.pointerEvents="none",r&&(e.overIndex=a.indexOf(r))}}}n(j2,"createImageHost");window.comfyAPI=window.comfyAPI||{};window.comfyAPI.imagePreview=window.comfyAPI.imagePreview||{};window.comfyAPI.imagePreview.calculateImageGrid=Zs;window.comfyAPI.imagePreview.createImageHost=j2;var An=[],zr=!1;function wc(){zr||(zr=!0,queueMicrotask(()=>{const e=An;An=[],zr=!1;for(const t of e)t()}))}n(wc,"scheduleDeferredImageRender");var K2=n((e,t,a,o)=>{const s=gt().getCanvas(),r=s.graph_mouse;!s.pointer_is_down&&t.pointerDown&&(r[0]===t.pointerDown.pos[0]&&r[1]===t.pointerDown.pos[1]&&(t.imageIndex=t.pointerDown.index),t.pointerDown=null);const i=t.imgs??[];let{imageIndex:l}=t;const u=i.length;u===1&&!l&&(t.imageIndex=l=0);const c=Me().get("Comfy.Node.AllowImageSizeDraw"),d=c?15:0,p=t.size[0],f=o?o-d:0;if(l==null){let T,N,M,O,L;const F=K0(i);if(F)O=0,{cellWidth:T,cellHeight:N,cols:L,shiftX:M}=Zs(i,p,f);else{O=2;const j=i.reduce((q,re)=>Math.max(q,re.naturalWidth,re.naturalHeight),0),V=[];V.length=i.length,V[0]={naturalWidth:j,naturalHeight:j},{cellWidth:T,cellHeight:N,cols:L,shiftX:M}=Zs(V,p,f)}let K=!1;t.imageRects=[];for(let j=0;j<u;j++){const V=i[j],q=Math.floor(j/L),re=j%L,ae=re*T+M,ce=q*N+a;if(!K&&(K=Ne.isInsideRectangle(r[0],r[1],ae+t.pos[0],ce+t.pos[1],T,N),K)){t.overIndex=j;let ue=110;s.pointer_is_down&&((!t.pointerDown||t.pointerDown.index!==j)&&(t.pointerDown={index:j,pos:[...r]}),ue=125),e.filter=`contrast(${ue}%) brightness(${ue}%)`,s.canvas.style.cursor="pointer"}t.imageRects.push([ae,ce,T,N]);const ee=T/V.width,ne=N/V.height,B=Math.min(ee,ne),z=B*V.height,Y=q*N+a+(N-z)/2,ie=B*V.width,ge=re*T+M+(T-ie)/2,Le=e.getTransform(),_e=e.filter,Q={img:V,x:ge+O,y:Y+O,w:ie-O*2,h:z-O*2};An.push(()=>{e.save(),e.setTransform(Le),e.filter=_e,e.drawImage(Q.img,Q.x,Q.y,Q.w,Q.h),e.restore()}),wc(),F||(e.strokeStyle="#8F8F8F",e.lineWidth=1,e.strokeRect(ae+O,ce+O,T-O*2,N-O*2)),e.filter="none"}K||(t.pointerDown=null,t.overIndex=null);return}const g=i[l];let m=g.naturalWidth,h=g.naturalHeight;const y=p/m,k=f/h,S=Math.min(y,k,1);m*=S,h*=S;const _=(p-m)/2,I=(f-h)/2+a,w=e.getTransform();if(An.push(()=>{e.save(),e.setTransform(w),e.drawImage(g,_,I,m,h),e.restore()}),wc(),c){e.fillStyle=Ne.NODE_TEXT_COLOR,e.textAlign="center",e.font="10px sans-serif";const T=`${Math.round(g.naturalWidth)} × ${Math.round(g.naturalHeight)}`,N=I+h+10;e.fillText(T,_+m/2,N)}const x=n((T,N,M,O)=>{const L=Ne.isInsideRectangle(r[0],r[1],T+t.pos[0],N+t.pos[1],M,M);let F="#333",K="#fff",j=!1;return L&&(s.canvas.style.cursor="pointer",s.pointer_is_down?(F="#1e90ff",j=!0):(F="#eee",K="#000")),An.push(()=>{e.save(),e.setTransform(w),e.fillStyle=F,e.beginPath(),e.roundRect(T,N,M,M,[4]),e.fill(),e.fillStyle=K,e.font="12px Inter, sans-serif",e.textAlign="center",e.fillText(O,T+15,N+20),e.restore()}),j},"drawButton");if(!(u>1))return;const D=(t.imageIndex??0)+1;if(x(p-40,f+a-40,30,`${D}/${u}`)){const T=D>=u?0:D;(!t.pointerDown||t.pointerDown.index!==T)&&(t.pointerDown={index:T,pos:[...r]})}x(p-40,a+10,30,"x")&&(!t.pointerDown||t.pointerDown.index!==null)&&(t.pointerDown={index:null,pos:[...r]})},"renderPreview"),Y2=class extends Rd{static{n(this,"ImagePreviewWidget")}constructor(e,t,a){super({name:t,options:a,type:"custom",value:"",y:0},e),this.serialize=!1}drawWidget(e){K2(e,this.node,this.y,this.computedHeight)}onPointerDown(e,t){return e.onDragStart=()=>{const{canvas:a}=Z,{graph:o}=a;a.emitBeforeChange(),o?.beforeChange(),e.finally=()=>{a.isDragging=!1,o?.afterChange(),a.emitAfterChange()},a.processSelect(t,e.eDown),a.isDragging=!0},e.onDragEnd=a=>{const{canvas:o}=Z;(a.shiftKey||Ne.alwaysSnapToGrid)&&o.graph?.snapToGrid(o.selectedItems),o.setDirty(!0,!0)},!0}onClick(){}computeLayoutSize(){return{minHeight:220,minWidth:1}}};const q2=n(()=>n((t,a)=>t.addCustomWidget(new Y2(t,a.name,{serialize:!1,canvasOnly:!0})),"widgetConstructor"),"useImagePreviewWidget");var Vr="$$canvas-image-preview";function X2(){const e=q2();function t(o){o.imgs?.length&&(o.widgets?.find(s=>s.name===Vr)||e(o,{type:"IMAGE_PREVIEW",name:Vr}))}n(t,"showCanvasImagePreview");function a(o){if(!o.widgets)return;const s=o.widgets.findIndex(r=>r.name===Vr);s>-1&&(o.widgets[s].onRemove?.(),o.widgets.splice(s,1))}return n(a,"removeCanvasImagePreview"),{showCanvasImagePreview:t,removeCanvasImagePreview:a}}n(X2,"useNodeCanvasImagePreview");const Z2=Je("favoritedWidgets",()=>{const e=wt(),t=gt(),a=A([]);function o(_){return JSON.stringify([_.nodeLocatorId,_.widgetName])}n(o,"getFavoriteKey");function s(_){try{const[I,w]=JSON.parse(_);return!I||!w?null:{nodeLocatorId:I,widgetName:w}}catch{const I=_.indexOf(":");if(I===-1)return null;const w=_.slice(0,I),x=_.slice(I+1);return!w||!x?null:{nodeLocatorId:w,widgetName:x}}}n(s,"parseFavoriteKey");function r(_){return!_||!_.widgetName?null:"nodeLocatorId"in _&&_.nodeLocatorId?{nodeLocatorId:String(_.nodeLocatorId),widgetName:String(_.widgetName)}:"nodeId"in _&&_.nodeId!==void 0?{nodeLocatorId:e.nodeIdToNodeLocatorId(_.nodeId),widgetName:String(_.widgetName)}:null}n(r,"normalizeFavoritedId");function i(_,I){return{nodeLocatorId:e.nodeToNodeLocatorId(_),widgetName:I}}n(i,"createFavoriteId");function l(){const _=Z.rootGraph;if(!_){a.value=[];return}try{const I=_.extra?.favoritedWidgets;I?.favorites?a.value=I.favorites.map(w=>r(w)).filter(w=>w!==null).map(o):a.value=[]}catch(I){console.error("Failed to load favorited widgets from workflow:",I),a.value=[]}}n(l,"loadFromWorkflow");function u(){const _=Z.rootGraph;if(_)try{const I={favorites:a.value.map(s).filter(w=>w!==null)};_.extra??={},_.extra.favoritedWidgets=I,t.canvas?.setDirty(!0,!0)}catch(I){console.error("Failed to save favorited widgets to workflow:",I)}}n(u,"saveToWorkflow");function c(_){const I=Z.rootGraph;if(!I)return{..._,node:null,widget:null,label:`${_.widgetName} (graph not loaded)`};const w=Pd(I,_.nodeLocatorId);if(!w)return{..._,node:null,widget:null,label:`${_.widgetName} (node deleted)`};const x=w.widgets?.find(N=>N.name===_.widgetName);if(!x)return{..._,node:w,widget:null,label:`${_.widgetName} (widget not found)`};const D=w.title||w.type||"Node",T=x.label||x.name;return{..._,node:w,widget:x,label:`${D} / ${T}`}}n(c,"resolveWidget");const d=E(()=>a.value.map(s).filter(_=>_!==null).map(c)),p=E(()=>d.value.filter(_=>_.node!==null&&_.widget!==null));function f(_,I){return a.value.includes(o(i(_,I)))}n(f,"isFavorited");function g(_,I){const w=o(i(_,I));a.value.includes(w)||(a.value.push(w),u())}n(g,"addFavorite");function m(_,I){const w=o(i(_,I)),x=a.value.indexOf(w);x!==-1&&(a.value.splice(x,1),u())}n(m,"removeFavorite");function h(_,I){f(_,I)?m(_,I):g(_,I)}n(h,"toggleFavorite");function y(){a.value=[],u()}n(y,"clearFavorites");function k(){const _=p.value.map(x=>o({nodeLocatorId:x.nodeLocatorId,widgetName:x.widgetName})),I=new Set(_),w=a.value.filter(x=>I.has(x));w.length!==a.value.length&&(a.value=w,u())}n(k,"pruneInvalidFavorites");function S(_){a.value=_.map(I=>o({nodeLocatorId:I.nodeLocatorId,widgetName:I.widgetName})),u()}return n(S,"reorderFavorites"),be(()=>e.activeWorkflow?.path,()=>{l()},{immediate:!0}),{favoritedWidgets:d,validFavoritedWidgets:p,isFavorited:f,addFavorite:g,removeFavorite:m,toggleFavorite:h,clearFavorites:y,pruneInvalidFavorites:k,reorderFavorites:S}}),J2=Je("rightSidePanel",()=>{const e=Me(),t=E({get:n(()=>e.get("Comfy.RightSidePanel.IsOpen"),"get"),set:n(p=>e.set("Comfy.RightSidePanel.IsOpen",p),"set")}),a=A("parameters"),o=E(()=>a.value==="subgraph"),s=A(null),r=A("");function i(p){t.value=!0,p&&(a.value=p)}n(i,"openPanel");function l(){t.value=!1}n(l,"closePanel");function u(){t.value=!t.value}n(u,"togglePanel");function c(p){i("parameters"),s.value=p}n(c,"focusSection");function d(){s.value=null}return n(d,"clearFocusedSection"),{isOpen:t,activeTab:a,isEditingSubgraph:o,focusedSection:s,searchQuery:r,openPanel:i,closePanel:l,togglePanel:u,focusSection:c,clearFocusedSection:d}});function Q2(e,t){const a=[];if(!e.input_order)return Object.values(t);if(e.input_order.required)for(const s of e.input_order.required){const r=t[s];r&&!r.isOptional&&a.push(r)}if(e.input_order.optional)for(const s of e.input_order.optional){const r=t[s];r&&r.isOptional&&a.push(r)}const o=new Set(a.map(s=>s.name));for(const s of Object.values(t))o.has(s.name)||a.push(s);return a}n(Q2,"getOrderedInputSpecs");let Ut=(function(e){return e.Arc="arc",e.Rect="rect",e})({}),Qe=(function(e){return e.MaskPen="pen",e.PaintPen="rgbPaint",e.Eraser="eraser",e.MaskBucket="paintBucket",e.MaskColorFill="colorSelect",e})({});const em=[Qe.MaskPen,Qe.PaintPen,Qe.Eraser,Qe.MaskBucket,Qe.MaskColorFill];let na=(function(e){return e.SourceOver="source-over",e.DestinationOut="destination-out",e})({}),Xt=(function(e){return e.Black="black",e.White="white",e.Negative="negative",e})({}),bo=(function(e){return e.Simple="simple",e.HSL="hsl",e.LAB="lab",e})({});window.comfyAPI=window.comfyAPI||{};window.comfyAPI.types=window.comfyAPI.types||{};window.comfyAPI.types.BrushShape=Ut;window.comfyAPI.types.Tools=Qe;window.comfyAPI.types.allTools=em;window.comfyAPI.types.CompositionOperation=na;window.comfyAPI.types.MaskBlendMode=Xt;window.comfyAPI.types.ColorComparisonMethod=bo;function eD(e=20){const t=xt(),a=A([]),o=A(-1),s=A(!1),r=E(()=>a.value.length>1&&o.value>0),i=E(()=>a.value.length>1&&o.value<a.value.length-1),l=n(()=>{const{maskCtx:m,rgbCtx:h,imgCtx:y,maskCanvas:k,rgbCanvas:S,imgCanvas:_}=t;if(!m||!h||!y||!k||!S||!_){requestAnimationFrame(l);return}if(!k.width||!S.width||!_.width){requestAnimationFrame(l);return}a.value=[];const I=m.getImageData(0,0,k.width,k.height),w=h.getImageData(0,0,S.width,S.height),x=y.getImageData(0,0,_.width,_.height);a.value.push({mask:I,rgb:w,img:x}),o.value=0,s.value=!0},"saveInitialState"),u=n((m,h,y)=>{const{maskCtx:k,rgbCtx:S,imgCtx:_,maskCanvas:I,rgbCanvas:w,imgCanvas:x}=t;if(!k||!S||!_||!I||!w||!x)return;if(!s.value||o.value===-1){l();return}a.value=a.value.slice(0,o.value+1);let D,T,N;if(m&&h&&y?(D=m,T=h,N=y):(D=k.getImageData(0,0,I.width,I.height),T=S.getImageData(0,0,w.width,w.height),N=_.getImageData(0,0,x.width,x.height)),a.value.push({mask:D,rgb:T,img:N}),o.value++,a.value.length>e){const M=a.value.shift();M&&f(M),o.value--}},"saveState"),c=n(()=>{r.value&&(o.value--,p(a.value[o.value]))},"undo"),d=n(()=>{i.value&&(o.value++,p(a.value[o.value]))},"redo"),p=n(m=>{const{maskCtx:h,rgbCtx:y,imgCtx:k,maskCanvas:S,rgbCanvas:_,imgCanvas:I}=t;if(!h||!y||!k||!S||!_||!I)return;const w=m.mask,x=w.width,D=w.height;(S.width!==x||S.height!==D)&&(S.width=x,S.height=D,_.width=x,_.height=D,I.width=x,I.height=D),[{ctx:h,data:m.mask},{ctx:y,data:m.rgb},{ctx:k,data:m.img}].forEach(({ctx:T,data:N})=>{N instanceof ImageBitmap?(T.clearRect(0,0,N.width,N.height),T.drawImage(N,0,0)):T.putImageData(N,0,0)})},"restoreState"),f=n(m=>{m.mask instanceof ImageBitmap&&m.mask.close(),m.rgb instanceof ImageBitmap&&m.rgb.close(),m.img instanceof ImageBitmap&&m.img.close()},"cleanupState");return{canUndo:r,canRedo:i,currentStateIndex:o,saveInitialState:l,saveState:u,undo:c,redo:d,clearStates:n(()=>{a.value.forEach(f),a.value=[],o.value=-1,s.value=!1},"clearStates")}}n(eD,"useCanvasHistory");const xt=Je("maskEditor",()=>{const e=A({type:Ut.Arc,size:10,opacity:.7,hardness:1,stepSize:10}),t=A(Xt.Black),a=A("mask"),o=A("#FF0000"),s=A(Qe.MaskPen),r=A(!1),i=A(5),l=A(100),u=A(20),c=A(!1),d=A(bo.Simple),p=A(!1),f=A(!1),g=A(0),m=A(100),h=A(1),y=A(1),k=A({x:0,y:0}),S=A({x:0,y:0}),_=A(0),I=A(0),w=A(null),x=A(null),D=A(null),T=A(null),N=A(null),M=A(null),O=A(null),L=A(null),F=A(null),K=A(null),j=A(.8),V=A(!0),q=A(!1),re=A(!1),ae=eD(20),ce=A(null),ee=A(null),ne=A(!1),B=A(0),z=A(0),Y=A(null),ie=A(null);be(w,ye=>{ye&&(x.value=ye.getContext("2d",{willReadFrequently:!0}))}),be(D,ye=>{ye&&(T.value=ye.getContext("2d",{willReadFrequently:!0}))}),be(N,ye=>{ye&&(M.value=ye.getContext("2d",{willReadFrequently:!0}))});const ge=E(()=>ae.canUndo.value),Le=E(()=>ae.canRedo.value),_e=E(()=>{switch(t.value){case Xt.Black:return{r:0,g:0,b:0};case Xt.White:return{r:255,g:255,b:255};case Xt.Negative:return{r:255,g:255,b:255};default:return{r:0,g:0,b:0}}});function Q(ye){e.value.size=Be.clamp(ye,1,250)}n(Q,"setBrushSize");function ue(ye){e.value.opacity=Be.clamp(ye,0,1)}n(ue,"setBrushOpacity");function we(ye){e.value.hardness=Be.clamp(ye,0,1)}n(we,"setBrushHardness");function Ce(ye){e.value.stepSize=Be.clamp(ye,1,100)}n(Ce,"setBrushStepSize");function xe(){e.value.type=Ut.Arc,e.value.size=20,e.value.opacity=1,e.value.hardness=1,e.value.stepSize=5}n(xe,"resetBrushToDefault");function Ue(ye){i.value=Be.clamp(ye,0,255)}n(Ue,"setPaintBucketTolerance");function de(ye){l.value=Be.clamp(ye,0,100)}n(de,"setFillOpacity");function he(ye){u.value=Be.clamp(ye,0,255)}n(he,"setColorSelectTolerance");function Te(ye){g.value=Be.clamp(ye,0,255)}n(Te,"setMaskTolerance");function Ge(ye){m.value=Be.clamp(ye,0,100)}n(Ge,"setSelectionOpacity");function We(ye){h.value=Math.max(.1,Math.min(10,ye))}n(We,"setZoomRatio");function te(ye){k.value={...ye}}n(te,"setPanOffset");function le(ye){S.value={...ye}}n(le,"setCursorPoint");function me(){_.value++}n(me,"resetZoom");function ve(){I.value++}n(ve,"triggerClear");function Ie(ye){j.value=Be.clamp(ye,0,1)}n(Ie,"setMaskOpacity");function Ae(){e.value={type:Ut.Arc,size:10,opacity:.7,hardness:1,stepSize:5},t.value=Xt.Black,a.value="mask",o.value="#FF0000",s.value=Qe.MaskPen,r.value=!1,i.value=5,l.value=100,u.value=20,c.value=!1,d.value=bo.Simple,p.value=!1,f.value=!1,g.value=0,m.value=100,h.value=1,k.value={x:0,y:0},S.value={x:0,y:0},j.value=.8,ne.value=!1,B.value=0,z.value=0,Y.value=null,ie.value=null}return n(Ae,"resetState"),{brushSettings:e,maskBlendMode:t,activeLayer:a,rgbColor:o,currentTool:s,isAdjustingBrush:r,paintBucketTolerance:i,fillOpacity:l,colorSelectTolerance:u,colorSelectLivePreview:c,colorComparisonMethod:d,applyWholeImage:p,maskBoundary:f,maskTolerance:g,selectionOpacity:m,zoomRatio:h,displayZoomRatio:y,panOffset:k,cursorPoint:S,resetZoomTrigger:_,maskCanvas:w,maskCtx:x,rgbCanvas:D,rgbCtx:T,imgCanvas:N,imgCtx:M,canvasContainer:O,canvasBackground:L,pointerZone:F,image:K,maskOpacity:j,canUndo:ge,canRedo:Le,maskColor:_e,brushVisible:V,isPanning:q,brushPreviewGradientVisible:re,canvasHistory:ae,tgpuRoot:ce,gpuTexturesNeedRecreation:ne,gpuTextureWidth:B,gpuTextureHeight:z,pendingGPUMaskData:Y,pendingGPURgbData:ie,colorInput:ee,setBrushSize:Q,setBrushOpacity:ue,setBrushHardness:we,setBrushStepSize:Ce,resetBrushToDefault:xe,setPaintBucketTolerance:Ue,setFillOpacity:de,setColorSelectTolerance:he,setMaskTolerance:Te,setSelectionOpacity:Ge,setZoomRatio:We,setPanOffset:te,setCursorPoint:le,resetZoom:me,triggerClear:ve,clearTrigger:I,setMaskOpacity:Ie,resetState:Ae}});var ds=n((e,t,a,o)=>e[(a*o+t)*4+3],"getPixelAlpha"),yn=n((e,t,a,o)=>{const s=(a*o+t)*4;return{r:e[s],g:e[s+1],b:e[s+2]}},"getPixelColor"),Gr=n((e,t,a,o,s,r)=>{const i=(a*o+t)*4;e[i]=r.r,e[i+1]=r.g,e[i+2]=r.b,e[i+3]=s},"setPixel"),bc=n((e,t,a)=>{e/=255,t/=255,a/=255;const o=Math.max(e,t,a),s=Math.min(e,t,a);let r=0,i=0;const l=(o+s)/2;if(o!==s){const u=o-s;switch(i=l>.5?u/(2-o-s):u/(o+s),o){case e:r=(t-a)/u+(t<a?6:0);break;case t:r=(a-e)/u+2;break;case a:r=(e-t)/u+4;break}r/=6}return{h:r*360,s:i*100,l:l*100}},"rgbToHSL"),_c=n(e=>{let t=e.r/255,a=e.g/255,o=e.b/255;t=t>.04045?Math.pow((t+.055)/1.055,2.4):t/12.92,a=a>.04045?Math.pow((a+.055)/1.055,2.4):a/12.92,o=o>.04045?Math.pow((o+.055)/1.055,2.4):o/12.92,t*=100,a*=100,o*=100;const s=t*.4124+a*.3576+o*.1805,r=t*.2126+a*.7152+o*.0722,i=t*.0193+a*.1192+o*.9505,l=[s/95.047,r/100,i/108.883];for(let u=0;u<l.length;u++)l[u]=l[u]>.008856?Math.pow(l[u],1/3):7.787*l[u]+16/116;return{l:116*l[1]-16,a:500*(l[0]-l[1]),b:200*(l[1]-l[2])}},"rgbToLab"),kc=n((e,t,a)=>Math.sqrt(Math.pow(e.r-t.r,2)+Math.pow(e.g-t.g,2)+Math.pow(e.b-t.b,2))<=a,"isPixelInRangeSimple"),tD=n((e,t,a)=>{const o=bc(e.r,e.g,e.b),s=bc(t.r,t.g,t.b),r=Math.abs(o.h-s.h),i=Math.abs(o.s-s.s),l=Math.abs(o.l-s.l);return Math.sqrt(Math.pow(r/360*255,2)+Math.pow(i/100*255,2)+Math.pow(l/100*255,2))<=a},"isPixelInRangeHSL"),aD=n((e,t,a)=>{const o=_c(e),s=_c(t);return Math.sqrt(Math.pow(o.l-s.l,2)+Math.pow(o.a-s.a,2)+Math.pow(o.b-s.b,2))/100*255<=a},"isPixelInRangeLab"),Hr=n((e,t,a,o)=>{switch(o){case bo.Simple:return kc(e,t,a);case bo.HSL:return tD(e,t,a);case bo.LAB:return aD(e,t,a);default:return kc(e,t,a)}},"isPixelInRange");function tm(){const e=xt(),t=A(null),a=n(l=>{const u=e.maskCtx,c=e.maskCanvas;if(!u||!c)return;const d=Math.floor(l.x),p=Math.floor(l.y),f=c.width,g=c.height;if(d<0||d>=f||p<0||p>=g)return;const m=u.getImageData(0,0,f,g),h=m.data,y=ds(h,d,p,f),k=y!==255;if(y===-1)return;const S=e.maskColor,_=e.paintBucketTolerance,I=Math.floor(e.fillOpacity/100*255),w=[],x=new Uint8Array(f*g),D=n((T,N,M,O)=>T===-1?!1:O?T!==255&&Math.abs(T-N)<=M:T===255||Math.abs(T-N)<=M,"shouldProcessPixel");for(D(y,y,_,k)&&w.push([d,p]);w.length>0;){const[T,N]=w.pop(),M=N*f+T;if(x[M]||!D(ds(h,T,N,f),y,_,k))continue;x[M]=1,Gr(h,T,N,f,k?I:0,S);const O=n((L,F)=>{L<0||L>=f||F<0||F>=g||x[F*f+L]||D(ds(h,L,F,f),y,_,k)&&w.push([L,F])},"checkNeighbor");O(T-1,N),O(T+1,N),O(T,N-1),O(T,N+1)}u.putImageData(m,0,0),e.canvasHistory.saveState()},"paintBucketFill"),o=n(async l=>{const u=e.maskCtx,c=e.imgCtx,d=e.imgCanvas;if(!u||!c||!d)return;const p=d.width,f=d.height;t.value=l;const g=u.getImageData(0,0,p,f),m=g.data,h=c.getImageData(0,0,p,f).data,y=e.colorSelectTolerance,k=e.colorComparisonMethod,S=e.maskColor,_=Math.floor(e.selectionOpacity/100*255),I=e.applyWholeImage,w=e.maskBoundary,x=e.maskTolerance;if(I){const D=yn(h,Math.floor(l.x),Math.floor(l.y),p),T=1e4;for(let N=0;N<p*f;N+=T){const M=Math.min(N+T,p*f);for(let O=N;O<M;O++){const L=O%p,F=Math.floor(O/p);Hr(yn(h,L,F,p),D,y,k)&&Gr(m,L,F,p,_,S)}await new Promise(O=>setTimeout(O,0))}}else{const D=Math.floor(l.x),T=Math.floor(l.y);if(D<0||D>=p||T<0||T>=f)return;const N=yn(h,D,T,p),M=[],O=new Uint8Array(p*f);for(M.push([D,T]);M.length>0;){const[L,F]=M.pop(),K=F*p+L;if(O[K]||!Hr(yn(h,L,F,p),N,y,k))continue;O[K]=1,Gr(m,L,F,p,_,S);const j=n((V,q)=>{V<0||V>=p||q<0||q>=f||O[q*p+V]||Hr(yn(h,V,q,p),N,y,k)&&(w&&255-ds(m,V,q,p)<=x||M.push([V,q]))},"checkNeighbor");j(L-1,F),j(L+1,F),j(L,F-1),j(L,F+1)}}u.putImageData(g,0,0),e.canvasHistory.saveState()},"colorSelectFill"),s=n(()=>{const l=e.maskCtx,u=e.maskCanvas;if(!l||!u)return;const c=l.getImageData(0,0,u.width,u.height),d=c.data;let p=0,f=0,g=0;for(let m=0;m<d.length;m+=4)if(d[m+3]>0){p=d[m],f=d[m+1],g=d[m+2];break}for(let m=0;m<d.length;m+=4){const h=d[m+3];d[m+3]=255-h,h===0&&(d[m]=p,d[m+1]=f,d[m+2]=g)}l.putImageData(c,0,0),e.canvasHistory.saveState()},"invertMask"),r=n(()=>{const l=e.maskCtx,u=e.maskCanvas,c=e.rgbCtx,d=e.rgbCanvas;l&&u&&l.clearRect(0,0,u.width,u.height),c&&d&&c.clearRect(0,0,d.width,d.height),e.canvasHistory.saveState()},"clearMask"),i=n(()=>{t.value=null},"clearLastColorSelectPoint");return be([()=>e.colorSelectTolerance,()=>e.colorComparisonMethod,()=>e.selectionOpacity],async()=>{t.value&&e.colorSelectLivePreview&&e.canUndo&&(e.canvasHistory.undo(),await o(t.value))}),{paintBucketFill:a,colorSelectFill:o,clearLastColorSelectPoint:i,invertMask:s,clearMask:r}}n(tm,"useCanvasTools");function oD(){const e=xt(),t=n((c,d,p)=>{const f=d.width,g=d.height,m=c.getImageData(0,0,f,g),h=new ImageData(g,f),y=m.data,k=h.data;for(let S=0;S<g;S++)for(let _=0;_<f;_++){const I=(S*f+_)*4;let w,x;p?(w=g-1-S,x=_):(w=S,x=f-1-_);const D=(x*g+w)*4;k[D]=y[I],k[D+1]=y[I+1],k[D+2]=y[I+2],k[D+3]=y[I+3]}return h},"rotateCanvas"),a=n((c,d,p)=>{const f=d.width,g=d.height,m=c.getImageData(0,0,f,g),h=new ImageData(f,g),y=m.data,k=h.data;for(let S=0;S<g;S++)for(let _=0;_<f;_++){const I=(S*f+_)*4;let w,x;p?(w=f-1-_,x=S):(w=_,x=g-1-S);const D=(x*f+w)*4;k[D]=y[I],k[D+1]=y[I+1],k[D+2]=y[I+2],k[D+3]=y[I+3]}return h},"mirrorCanvas"),o=n(c=>{for(let d=0;d<c.length;d+=4){const p=c[d+3]/255;c[d]=Math.round(c[d]*p),c[d+1]=Math.round(c[d+1]*p),c[d+2]=Math.round(c[d+2]*p)}},"premultiplyData"),s=n(async(c,d)=>{if(!e.tgpuRoot||!e.maskCanvas||!e.rgbCanvas||!e.maskCtx||!e.rgbCtx)return;e.gpuTexturesNeedRecreation=!0,e.gpuTextureWidth=c,e.gpuTextureHeight=d;const p=e.maskCtx.getImageData(0,0,c,d),f=e.rgbCtx.getImageData(0,0,c,d),g=new Uint8ClampedArray(new ArrayBuffer(p.data.length)),m=new Uint8ClampedArray(new ArrayBuffer(f.data.length));if(g.set(p.data),m.set(f.data),g.buffer instanceof SharedArrayBuffer||m.buffer instanceof SharedArrayBuffer){console.error("[useCanvasTransform] SharedArrayBuffer detected, WebGPU writeTexture will fail");return}o(g),o(m),e.pendingGPUMaskData=g,e.pendingGPURgbData=m},"recreateGPUTextures");return{rotateClockwise:n(async()=>{const{maskCanvas:c,maskCtx:d,rgbCanvas:p,rgbCtx:f,imgCanvas:g,imgCtx:m}=e;if(!c||!d||!p||!f||!g||!m){console.error("[useCanvasTransform] Canvas contexts not ready");return}const h=c.width,y=c.height,k=t(d,c,!0),S=t(f,p,!0),_=t(m,g,!0);c.width=y,c.height=h,p.width=y,p.height=h,g.width=y,g.height=h,d.putImageData(k,0,0),f.putImageData(S,0,0),m.putImageData(_,0,0),e.tgpuRoot&&await s(y,h),e.canvasHistory.saveState(k,S,_)},"rotateClockwise"),rotateCounterclockwise:n(async()=>{const{maskCanvas:c,maskCtx:d,rgbCanvas:p,rgbCtx:f,imgCanvas:g,imgCtx:m}=e;if(!c||!d||!p||!f||!g||!m){console.error("[useCanvasTransform] Canvas contexts not ready");return}const h=c.width,y=c.height,k=t(d,c,!1),S=t(f,p,!1),_=t(m,g,!1);c.width=y,c.height=h,p.width=y,p.height=h,g.width=y,g.height=h,d.putImageData(k,0,0),f.putImageData(S,0,0),m.putImageData(_,0,0),e.tgpuRoot&&await s(y,h),e.canvasHistory.saveState(k,S,_)},"rotateCounterclockwise"),mirrorHorizontal:n(async()=>{const{maskCanvas:c,maskCtx:d,rgbCanvas:p,rgbCtx:f,imgCanvas:g,imgCtx:m}=e;if(!c||!d||!p||!f||!g||!m){console.error("[useCanvasTransform] Canvas contexts not ready");return}const h=a(d,c,!0),y=a(f,p,!0),k=a(m,g,!0);d.putImageData(h,0,0),f.putImageData(y,0,0),m.putImageData(k,0,0),e.tgpuRoot&&await s(c.width,c.height),e.canvasHistory.saveState(h,y,k)},"mirrorHorizontal"),mirrorVertical:n(async()=>{const{maskCanvas:c,maskCtx:d,rgbCanvas:p,rgbCtx:f,imgCanvas:g,imgCtx:m}=e;if(!c||!d||!p||!f||!g||!m){console.error("[useCanvasTransform] Canvas contexts not ready");return}const h=a(d,c,!1),y=a(f,p,!1),k=a(m,g,!1);d.putImageData(h,0,0),f.putImageData(y,0,0),m.putImageData(k,0,0),e.tgpuRoot&&await s(c.width,c.height),e.canvasHistory.saveState(h,y,k)},"mirrorVertical")}}n(oD,"useCanvasTransform");const br=Je("maskEditorData",()=>{const e=A(null),t=A(null),a=A(null),o=A(!1),s=A(null),r=E(()=>e.value!==null),i=E(()=>t.value!==null),l=E(()=>r.value&&!o.value);return{inputData:e,outputData:t,sourceNode:a,isLoading:o,loadError:s,hasValidInput:r,hasValidOutput:i,isReady:l,reset:n(()=>{e.value=null,t.value=null,a.value=null,o.value=!1,s.value=null},"reset"),setLoading:n((d,p)=>{o.value=d,p&&(s.value=p)},"setLoading")}});function nD(e){return{maskedImage:`clipspace-mask-${e}.png`,paint:`clipspace-paint-${e}.png`,paintedImage:`clipspace-painted-${e}.png`,paintedMaskedImage:`clipspace-painted-masked-${e}.png`}}n(nD,"imageLayerFilenamesByTimestamp");function sD(){const e=br(),t=xt(),a=Gt(),o=n(async()=>{const S=e.sourceNode;if(!S||!e.inputData)throw new Error("No source node or input data");try{const _=await s();e.outputData=_,await f(S,_),await c(_),g(S,_),Z.canvas.setDirty(!0)}catch(_){throw console.error("[MaskEditorSaver] Save failed:",_),_}},"save");async function s(){const S=t.maskCanvas,_=t.rgbCanvas,I=t.imgCanvas;if(!S||!_||!I)throw new Error("Canvas not initialized");const w=nD(Date.now()),[x,D,T,N]=await Promise.all([r(I,S,w.maskedImage),i(_,w.paint),l(I,_,w.paintedImage),u(I,_,S,w.paintedMaskedImage)]);return{maskedImage:x,paintLayer:D,paintedImage:T,paintedMaskedImage:N}}n(s,"prepareOutputData");async function r(S,_,I){const w=document.createElement("canvas");w.width=S.width,w.height=S.height;const x=w.getContext("2d");x.drawImage(S,0,0);const D=_.getContext("2d").getImageData(0,0,_.width,_.height),T=new Uint8ClampedArray(D.data.length);for(let M=0;M<D.data.length;M+=4)T[M]=0,T[M+1]=0,T[M+2]=0,T[M+3]=255-D.data[M+3];const N=x.getImageData(0,0,w.width,w.height);for(let M=0;M<N.data.length;M+=4)N.data[M+3]=T[M+3];return x.putImageData(N,0,0),{canvas:w,blob:await y(w),ref:k(I)}}n(r,"createMaskedImage");async function i(S,_){const I=h(S);return{canvas:I,blob:await y(I),ref:k(_)}}n(i,"createPaintLayer");async function l(S,_,I){const w=document.createElement("canvas");w.width=S.width,w.height=S.height;const x=w.getContext("2d");return x.drawImage(S,0,0),x.globalCompositeOperation="source-over",x.drawImage(_,0,0),{canvas:w,blob:await y(w),ref:k(I)}}n(l,"createPaintedImage");async function u(S,_,I,w){const x=document.createElement("canvas");x.width=S.width,x.height=S.height;const D=x.getContext("2d");D.drawImage(S,0,0),D.globalCompositeOperation="source-over",D.drawImage(_,0,0);const T=I.getContext("2d").getImageData(0,0,I.width,I.height),N=new Uint8ClampedArray(T.data.length);for(let O=0;O<T.data.length;O+=4)N[O]=0,N[O+1]=0,N[O+2]=0,N[O+3]=255-T.data[O+3];const M=D.getImageData(0,0,x.width,x.height);for(let O=0;O<M.data.length;O+=4)M.data[O+3]=N[O+3];return D.putImageData(M,0,0),{canvas:x,blob:await y(x),ref:k(w)}}n(u,"createPaintedMaskedImage");async function c(S){const _=e.inputData.sourceRef,I=await d(S.maskedImage,_),w=await p(S.paintLayer,_),x=await p(S.paintedImage,_),D=await d(S.paintedMaskedImage,x);S.maskedImage.ref=I,S.paintLayer.ref=w,S.paintedImage.ref=x,S.paintedMaskedImage.ref=D}n(c,"uploadAllLayers");async function d(S,_){const I=new FormData;I.append("image",S.blob,S.ref.filename),I.append("original_ref",JSON.stringify(_)),I.append("type","input"),I.append("subfolder","clipspace");const w=await oe.fetchApi("/upload/mask",{method:"POST",body:I});if(!w.ok)throw new Error(`Failed to upload mask: ${S.ref.filename}`);try{const x=await w.json();if(x?.name)return{filename:x.name,subfolder:x.subfolder||S.ref.subfolder,type:x.type||S.ref.type}}catch(x){console.warn("[MaskEditorSaver] Failed to parse upload response:",x)}return S.ref}n(d,"uploadMask");async function p(S,_){const I=new FormData;I.append("image",S.blob,S.ref.filename),I.append("original_ref",JSON.stringify(_)),I.append("type","input"),I.append("subfolder","clipspace");const w=await oe.fetchApi("/upload/image",{method:"POST",body:I});if(!w.ok)throw new Error(`Failed to upload image: ${S.ref.filename}`);try{const x=await w.json();if(x?.name)return{filename:x.name,subfolder:x.subfolder||S.ref.subfolder,type:x.type||S.ref.type}}catch(x){console.warn("[MaskEditorSaver] Failed to parse upload response:",x)}return S.ref}n(p,"uploadImage");async function f(S,_){S.imgs=[await m(_.paintedMaskedImage.canvas.toDataURL("image/png"))],Z.canvas.setDirty(!0)}n(f,"updateNodePreview");function g(S,_){const I=_.paintedMaskedImage.ref;S.images=[I];const w=S.widgets?.find(x=>x.name==="image");if(w){let x;if(qe?x=I.filename+(I.type?` [${I.type}]`:""):x=(I.subfolder?I.subfolder+"/":"")+I.filename+(I.type?` [${I.type}]`:""),w.value=x,S.properties&&(S.properties.image=x),S.widgets_values&&S.widgets){const D=S.widgets.indexOf(w);D>=0&&(S.widgets_values[D]=x)}w.callback?.(x)}a.updateNodeImages(S)}n(g,"updateNodeWithServerReferences");function m(S){return new Promise((_,I)=>{const w=new Image;w.crossOrigin="anonymous",w.onload=()=>_(w),w.onerror=x=>{console.error("[MaskEditorSaver] Failed to load image:",S,x),I(new Error(`Failed to load image: ${S}`))},w.src=S})}n(m,"loadImageFromUrl");function h(S){const _=document.createElement("canvas");return _.width=S.width,_.height=S.height,_.getContext("2d").drawImage(S,0,0),_}n(h,"cloneCanvas");function y(S){return new Promise((_,I)=>{S.toBlob(w=>{w?_(w):I(new Error("Failed to create blob from canvas"))},"image/png")})}n(y,"canvasToBlob");function k(S){return{filename:S,subfolder:"clipspace",type:"input"}}return n(k,"createFileRef"),{save:o}}n(sD,"useMaskEditorSaver");var rD={class:"flex w-full items-center justify-between gap-3"},iD={class:"flex items-center gap-3"},lD={class:"m-0 text-lg font-semibold"},uD={class:"flex items-center gap-4"},cD=["title"],dD=["title"],pD=["title"],fD=["title"],mD=["title"],gD=["title"],hD={class:"flex gap-3"},$o="flex h-7.5 w-12.5 items-center justify-center rounded-[10px] border border-border-default pointer-events-auto transition-colors duration-100 bg-comfy-menu-bg hover:bg-secondary-background-hover",Cc="h-7.5 w-15 rounded-[10px] border border-border-default text-current font-sans pointer-events-auto transition-colors duration-100 bg-comfy-menu-bg hover:bg-secondary-background-hover",vD=J({__name:"TopBarHeader",setup(e){const t=xt(),a=Ct(),o=tm(),s=oD(),r=sD(),i=A(G("g.save")),l=A(!0),u=n(()=>{t.canvasHistory.undo()},"onUndo"),c=n(()=>{t.canvasHistory.redo()},"onRedo"),d=n(async()=>{try{await s.rotateCounterclockwise()}catch(S){console.error("[TopBarHeader] Rotate left failed:",S)}},"onRotateLeft"),p=n(async()=>{try{await s.rotateClockwise()}catch(S){console.error("[TopBarHeader] Rotate right failed:",S)}},"onRotateRight"),f=n(async()=>{try{await s.mirrorHorizontal()}catch(S){console.error("[TopBarHeader] Mirror horizontal failed:",S)}},"onMirrorHorizontal"),g=n(async()=>{try{await s.mirrorVertical()}catch(S){console.error("[TopBarHeader] Mirror vertical failed:",S)}},"onMirrorVertical"),m=n(()=>{o.invertMask()},"onInvert"),h=n(()=>{o.clearMask(),t.triggerClear()},"onClear"),y=n(async()=>{i.value=G("g.saving"),l.value=!1;try{t.brushVisible=!1,await r.save(),a.closeDialog()}catch(S){console.error("[TopBarHeader] Save failed:",S),t.brushVisible=!0,i.value=G("g.save"),l.value=!0}},"handleSave"),k=n(()=>{a.closeDialog({key:"global-mask-editor"})},"handleCancel");return(S,_)=>(C(),P("div",rD,[v("div",iD,[v("h3",lD,$(b(G)("maskEditor.title")),1),v("div",uD,[v("button",{class:pe($o),title:b(G)("maskEditor.undo"),onClick:u},_[0]||(_[0]=[v("svg",{viewBox:"0 0 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-current"},[v("path",{d:"M8.77,12.18c-.25,0-.46-.2-.46-.46s.2-.46.46-.46c1.47,0,2.67-1.2,2.67-2.67,0-1.57-1.34-2.67-3.26-2.67h-3.98l1.43,1.43c.18.18.18.47,0,.64-.18.18-.47.18-.64,0l-2.21-2.21c-.18-.18-.18-.47,0-.64l2.21-2.21c.18-.18.47-.18.64,0,.18.18.18.47,0,.64l-1.43,1.43h3.98c2.45,0,4.17,1.47,4.17,3.58,0,1.97-1.61,3.58-3.58,3.58Z"})],-1)]),8,cD),v("button",{class:pe($o),title:b(G)("maskEditor.redo"),onClick:c},_[1]||(_[1]=[v("svg",{viewBox:"0 0 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-[var(--input-text)]"},[v("path",{class:"cls-1",d:"M6.23,12.18c-1.97,0-3.58-1.61-3.58-3.58,0-2.11,1.71-3.58,4.17-3.58h3.98l-1.43-1.43c-.18-.18-.18-.47,0-.64.18-.18.46-.18.64,0l2.21,2.21c.09.09.13.2.13.32s-.05.24-.13.32l-2.21,2.21c-.18.18-.47.18-.64,0-.18-.18-.18-.47,0-.64l1.43-1.43h-3.98c-1.92,0-3.26,1.1-3.26,2.67,0,1.47,1.2,2.67,2.67,2.67.25,0,.46.2.46.46s-.2.46-.46.46Z"})],-1)]),8,dD),_[6]||(_[6]=v("div",{class:"h-5 border-l border-border"},null,-1)),v("button",{class:pe($o),title:b(G)("maskEditor.rotateLeft"),onClick:d},_[2]||(_[2]=[v("svg",{viewBox:"-6 -7 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-[var(--input-text)]"},[v("path",{d:"m2.25-2.625c.3452 0 .625.2798.625.625v5c0 .3452-.2798.625-.625.625h-5c-.3452 0-.625-.2798-.625-.625v-5c0-.3452.2798-.625.625-.625h5zm1.25.625v5c0 .6904-.5596 1.25-1.25 1.25h-5c-.6904 0-1.25-.5596-1.25-1.25v-5c0-.6904.5596-1.25 1.25-1.25h5c.6904 0 1.25.5596 1.25 1.25zm-.1673-2.3757-.4419.4419-1.5246-1.5246 1.5416-1.5417.442.4419-.7871.7872h.9373c1.3807 0 2.5 1.1193 2.5 2.5h-.625c0-1.0355-.8395-1.875-1.875-1.875h-.9375l.7702.7702z"})],-1)]),8,pD),v("button",{class:pe($o),title:b(G)("maskEditor.rotateRight"),onClick:p},_[3]||(_[3]=[v("svg",{viewBox:"-9 -7 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-[var(--input-text)]"},[v("g",{transform:"scale(-1, 1)"},[v("path",{d:"m2.25-2.625c.3452 0 .625.2798.625.625v5c0 .3452-.2798.625-.625.625h-5c-.3452 0-.625-.2798-.625-.625v-5c0-.3452.2798-.625.625-.625h5zm1.25.625v5c0 .6904-.5596 1.25-1.25 1.25h-5c-.6904 0-1.25-.5596-1.25-1.25v-5c0-.6904.5596-1.25 1.25-1.25h5c.6904 0 1.25.5596 1.25 1.25zm-.1673-2.3757-.4419.4419-1.5246-1.5246 1.5416-1.5417.442.4419-.7871.7872h.9373c1.3807 0 2.5 1.1193 2.5 2.5h-.625c0-1.0355-.8395-1.875-1.875-1.875h-.9375l.7702.7702z"})])],-1)]),8,fD),v("button",{class:pe($o),title:b(G)("maskEditor.mirrorHorizontal"),onClick:f},_[4]||(_[4]=[v("svg",{viewBox:"0 0 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-[var(--input-text)]"},[v("path",{d:"M7.5,1.5c-.28,0-.5.22-.5.5v11c0,.28.22.5.5.5s.5-.22.5-.5v-11c0-.28-.22-.5-.5-.5Z"}),v("path",{d:"M3.5,4.5l-2,3,2,3v-6ZM11.5,4.5v6l2-3-2-3Z"})],-1)]),8,mD),v("button",{class:pe($o),title:b(G)("maskEditor.mirrorVertical"),onClick:g},_[5]||(_[5]=[v("svg",{viewBox:"0 0 15 15",class:"h-6.25 w-6.25 pointer-events-none fill-[var(--input-text)]"},[v("path",{d:"M2,7.5c0-.28.22-.5.5-.5h11c.28,0,.5.22.5.5s-.22.5-.5.5h-11c-.28,0-.5-.22-.5-.5Z"}),v("path",{d:"M4.5,4.5l3-2,3,2h-6ZM4.5,10.5h6l-3,2-3-2Z"})],-1)]),8,gD),_[7]||(_[7]=v("div",{class:"h-5 w-px bg-[var(--p-form-field-border-color)]"},null,-1)),v("button",{class:pe(Cc),onClick:m},$(b(G)("maskEditor.invert")),1),v("button",{class:pe(Cc),onClick:h},$(b(G)("maskEditor.clear")),1)])]),v("div",hD,[R(se,{variant:"primary",disabled:!l.value,onClick:y},{default:W(()=>[_[8]||(_[8]=v("i",{class:"pi pi-check"},null,-1)),fe(" "+$(i.value),1)]),_:1},8,["disabled"]),R(se,{variant:"secondary",onClick:k},{default:W(()=>[_[9]||(_[9]=v("i",{class:"pi pi-times"},null,-1)),fe(" "+$(b(G)("g.cancel")),1)]),_:1})])]))}}),yD=vD;function am(){const e=xt(),t=n(async(r,i,l)=>{const u=e.maskColor;l.drawImage(r,0,0,i.width,i.height);const c=l.getImageData(0,0,i.width,i.height);for(let d=0;d<c.data.length;d+=4){const p=c.data[d+3];c.data[d]=u.r,c.data[d+1]=u.g,c.data[d+2]=u.b,c.data[d+3]=255-p}l.globalCompositeOperation="source-over",l.putImageData(c,0,0)},"prepareMask"),a=n(async(r,i,l)=>{const{imgCanvas:u,maskCanvas:c,rgbCanvas:d,imgCtx:p,maskCtx:f,rgbCtx:g}=e;if(!u||!c||!d||!p||!f||!g)throw new Error("Canvas elements or contexts not available");u.width=r.width,u.height=r.height,c.width=r.width,c.height=r.height,d.width=r.width,d.height=r.height,p.drawImage(r,0,0,r.width,r.height),l&&g.drawImage(l,0,0,l.width,l.height),await t(i,c,f)},"invalidateCanvas"),o=n(()=>{const r=e.canvasBackground;r&&(e.maskBlendMode===Xt.Black?r.style.backgroundColor="rgba(0,0,0,1)":(e.maskBlendMode===Xt.White||e.maskBlendMode===Xt.Negative)&&(r.style.backgroundColor="rgba(255,255,255,1)"))},"setCanvasBackground");return{invalidateCanvas:a,updateMaskColor:n(async()=>{const{maskCanvas:r,maskCtx:i,maskColor:l,maskBlendMode:u,maskOpacity:c}=e;if(!r||!i)return;u===Xt.Negative?(r.style.mixBlendMode="difference",r.style.opacity="1"):(r.style.mixBlendMode="initial",r.style.opacity=String(c)),i.fillStyle=`rgb(${l.r}, ${l.g}, ${l.b})`,o();const d=i.getImageData(0,0,r.width,r.height);for(let p=0;p<d.data.length;p+=4)d.data[p]=l.r,d.data[p+1]=l.g,d.data[p+2]=l.b;i.putImageData(d,0,0)},"updateMaskColor")}}n(am,"useCanvasManager");function wD(){const e=xt(),t=br(),a=am();return{loadImages:n(async()=>{const s=t.inputData;if(!s)throw new Error("No input data available in dataStore");const{imgCanvas:r,maskCanvas:i,rgbCanvas:l,imgCtx:u,maskCtx:c}=e;if(!r||!i||!l||!u||!c)throw new Error("Canvas elements or contexts not available");u.clearRect(0,0,r.width,r.height),c.clearRect(0,0,i.width,i.height);const d=s.baseLayer.image,p=s.maskLayer.image,f=s.paintLayer?.image;return i.width=d.width,i.height=d.height,l.width=d.width,l.height=d.height,e.image=d,await a.invalidateCanvas(d,p,f||null),await a.updateMaskColor(),d},"loadImages")}}n(wD,"useImageLoaderInternal");const bD=on(wD);function _D(){const e=xt(),t=A([]),a=n(u=>t.value.includes(u),"isKeyDown"),o=n(()=>{t.value=[]},"clearKeys"),s=n(u=>{if(t.value.includes(u.key)||t.value.push(u.key),u.key===" "){u.preventDefault();const c=document.activeElement;c&&c.blur&&c.blur()}if((u.ctrlKey||u.metaKey)&&!u.altKey){const c=u.key.toUpperCase();c==="Y"&&!u.shiftKey||c==="Z"&&u.shiftKey?e.canvasHistory.redo():c==="Z"&&!u.shiftKey&&e.canvasHistory.undo()}},"handleKeyDown"),r=n(u=>{t.value=t.value.filter(c=>c!==u.key)},"handleKeyUp");return{isKeyDown:a,addListeners:n(()=>{document.addEventListener("keydown",s),document.addEventListener("keyup",r),window.addEventListener("blur",o)},"addListeners"),removeListeners:n(()=>{document.removeEventListener("keydown",s),document.removeEventListener("keyup",r),window.removeEventListener("blur",o)},"removeListeners")}}n(_D,"useKeyboard");var xc="clipspace-painted-masked-";function kD(e){if(!e.startsWith(xc))return;const t=e.slice(25),a=parseInt(t.split(".")[0],10);return{maskedImage:`clipspace-mask-${a}.png`,paint:`clipspace-paint-${a}.png`,paintedImage:`clipspace-painted-${a}.png`,paintedMaskedImage:`${xc}${a}.png`}}n(kD,"imageLayerFilenamesIfApplicable");function jr(e){return{filename:e,subfolder:"clipspace",type:"input"}}n(jr,"toRef");function ps(e){const t=new URLSearchParams;t.set("filename",e.ref.filename),e.ref.subfolder&&t.set("subfolder",e.ref.subfolder),e.ref.type&&t.set("type",e.ref.type);const a=oe.apiURL("/view?"+t.toString()+Z.getPreviewFormatParam()+Z.getRandParam()),o=new Image;return o.crossOrigin="anonymous",o.src=a,o.src}n(ps,"mkFileUrl");function CD(){const e=br(),t=Gt(),a=n(async c=>{e.setLoading(!0);try{o(c);let d=s(c),p=r(d),f;if(c.widgets){const x=c.widgets.find(D=>D.name==="image");x&&(typeof x.value=="string"?f=x.value:typeof x.value=="object"&&x.value&&"filename"in x.value&&typeof x.value.filename=="string"&&(f=x.value.filename))}if(f&&!f.startsWith("$"))try{let x=f,D,T="input";const N=x.match(/ \[([^\]]+)\]$/);N&&(T=N[1],x=x.substring(0,x.length-N[0].length));const M=x.lastIndexOf("/");M!==-1&&(D=x.substring(0,M),x=x.substring(M+1)),p={filename:x,type:T,subfolder:D},d=ps({ref:p})}catch(x){console.warn("Failed to parse widget filename as ref",x)}const g=f||p.filename;let m;if(qe)try{const x=await oe.fetchApi(`/files/mask-layers?filename=${g}`);x.ok&&(m=await x.json())}catch{}let h=kD(p.filename);if(m){const x=m.painted_masked||m.painted;x&&(h={maskedImage:x,paint:m.paint||"",paintedImage:m.painted||"",paintedMaskedImage:m.painted_masked||x})}const y=h?.maskedImage?ps({ref:jr(h.maskedImage)}):d,k=h?.maskedImage?r(y):p;let S=null;m?.paint?S=ps({ref:jr(m.paint)}):h?.paint&&(S=ps({ref:jr(h.paint)}));const[_,I,w]=await Promise.all([i(y,"rgb"),i(y,"a"),S?u(S):Promise.resolve(void 0)]);e.inputData={baseLayer:_,maskLayer:I,paintLayer:w,sourceRef:k,nodeId:c.id},e.sourceNode=c,e.setLoading(!1)}catch(d){const p=d instanceof Error?d.message:"Failed to load from node";throw console.error("[MaskEditorLoader]",p,d),e.setLoading(!1,p),d}},"loadFromNode");function o(c){if(!c)throw new Error("Node is null or undefined");if(!(c.imgs?.length||c.previewMediaType==="image"))throw new Error("Node has no images")}n(o,"validateNode");function s(c){if(c.images?.[0]){const p=c.images[0],f=new URLSearchParams({filename:p.filename,type:p.type||"output",subfolder:p.subfolder||""});return oe.apiURL(`/view?${f.toString()}`)}const d=t.getNodeOutputs(c);if(d?.images?.[0]){const p=d.images[0];if(!p.filename)throw new Error("nodeOutputStore image missing filename");const f=new URLSearchParams;return f.set("filename",p.filename),f.set("type",p.type||"output"),f.set("subfolder",p.subfolder||""),oe.apiURL(`/view?${f.toString()}`)}if(c.imgs?.length){const p=c.imageIndex??0,f=c.imgs[p].src;if(f&&!f.startsWith("data:"))return f}throw new Error("Unable to get image URL from node")}n(s,"getNodeImageUrl");function r(c){try{const d=new URL(c),p=d.searchParams.get("filename");if(!p)throw new Error("Image URL missing filename parameter");return{filename:p,subfolder:d.searchParams.get("subfolder")||void 0,type:d.searchParams.get("type")||void 0}}catch{try{const p=new URL(c,window.location.origin),f=p.searchParams.get("filename");if(!f)throw new Error("Image URL missing filename parameter");return{filename:f,subfolder:p.searchParams.get("subfolder")||void 0,type:p.searchParams.get("type")||void 0}}catch{throw new Error(`Invalid image URL: ${c}`)}}}n(r,"parseImageRef");async function i(c,d){let p;try{p=new URL(c)}catch{p=new URL(c,window.location.origin)}d&&(p.searchParams.delete("channel"),p.searchParams.set("channel",d));const f=p.toString();return{image:await l(f),url:f}}n(i,"loadImageLayer");function l(c){return new Promise((d,p)=>{const f=new Image;f.crossOrigin="anonymous",f.onload=()=>d(f),f.onerror=()=>p(new Error(`Failed to load image: ${c}`)),f.src=c})}n(l,"loadImage");async function u(c){let d;try{d=new URL(c)}catch{d=new URL(c,window.location.origin)}const p=d.toString();return{image:await l(p),url:p}}return n(u,"loadPaintLayer"),{loadFromNode:a}}n(CD,"useMaskEditorLoader");function xD(){const e=xt(),t=300,a=A(0),o=A(!1),s=A(0),r=A({x:0,y:0}),i=A({x:0,y:0}),l=A(1),u=A(1),c=A({x:0,y:0}),d=A(null),p=A({x:0,y:0}),f=A(null),g=A(null),m=A(null),h=A(null),y=A(null),k=A(null),S=A(null),_=A(0),I=A(0),w=A({x:0,y:0}),x=A([]),D=n(z=>{const Y=z[0].clientX-z[1].clientX,ie=z[0].clientY-z[1].clientY;return Math.sqrt(Y*Y+ie*ie)},"getTouchDistance"),T=n(z=>({x:(z[0].clientX+z[1].clientX)/2,y:(z[0].clientY+z[1].clientY)/2}),"getTouchMidpoint"),N=n(z=>{const Y=z.x-c.value.x,ie=z.y-c.value.y;w.value={x:Y,y:ie},e.setCursorPoint({x:Y,y:ie})},"updateCursorPosition"),M=n(()=>{e.canvasHistory.undo()},"handleDoubleTap"),O=n(async()=>{if(!S.value?.width||!S.value?.height||!c.value||!l.value){console.warn("Missing required properties for pan/zoom");return}const z=S.value.width*l.value,Y=S.value.height*l.value;f.value||(f.value=e.canvasContainer),f.value&&(Object.assign(f.value.style,{width:`${z}px`,height:`${Y}px`,left:`${c.value.x}px`,top:`${c.value.y}px`}),m.value||(m.value=e.rgbCanvas),m.value&&((m.value.width!==S.value.width||m.value.height!==S.value.height)&&(m.value.width=S.value.width,m.value.height=S.value.height),m.value.style.width=`${z}px`,m.value.style.height=`${Y}px`),e.setPanOffset(c.value),e.setZoomRatio(l.value))},"invalidatePanZoom"),L=n(z=>{d.value={x:z.clientX,y:z.clientY},e.isPanning=!0,p.value={...c.value}},"handlePanStart"),F=n(async z=>{if(d.value===null)throw new Error("mouseDownPoint is null");const Y=d.value.x-z.clientX,ie=d.value.y-z.clientY;c.value={x:p.value.x-Y,y:p.value.y-ie},await O()},"handlePanMove"),K=n(async z=>{if(i.value===null){i.value={x:z.clientX,y:z.clientY};return}const Y=z.clientX-i.value.x,ie=z.clientY-i.value.y;c.value.x+=Y,c.value.y+=ie,await O(),i.value={x:z.clientX,y:z.clientY}},"handleSingleTouchPan"),j=n(z=>{if(z.preventDefault(),!(x.value.length>0))if(e.brushVisible=!1,z.touches.length===2){const Y=new Date().getTime();Y-a.value<t?(M(),a.value=0):(a.value=Y,o.value=!0,s.value=D(z.touches),r.value=T(z.touches))}else z.touches.length===1&&(i.value={x:z.touches[0].clientX,y:z.touches[0].clientY})},"handleTouchStart"),V=n(async z=>{if(z.preventDefault(),!(x.value.length>0))if(a.value=0,o.value&&z.touches.length===2){const Y=D(z.touches),ie=Y/s.value,ge=l.value;l.value=Math.max(.2,Math.min(10,l.value*ie));const Le=l.value,_e=T(z.touches);if(r.value){const xe=_e.x-r.value.x,Ue=_e.y-r.value.y;c.value.x+=xe,c.value.y+=Ue}if(g.value===null&&(g.value=e.maskCanvas),!g.value)return;const Q=g.value.getBoundingClientRect(),ue=_e.x-Q.left,we=_e.y-Q.top,Ce=Le/ge;c.value.x+=ue-ue*Ce,c.value.y+=we-we*Ce,await O(),s.value=Y,r.value=_e}else z.touches.length===1&&await K(z.touches[0])},"handleTouchMove"),q=n(z=>{z.preventDefault();const Y=z.touches[0];Y?i.value={x:Y.clientX,y:Y.clientY}:(o.value=!1,r.value={x:0,y:0})},"handleTouchEnd"),re=n(async z=>{const Y={x:z.clientX,y:z.clientY},ie=l.value,ge=z.deltaY<0?1.1:.9;l.value=Math.max(.2,Math.min(10,l.value*ge));const Le=l.value;if(g.value||(g.value=e.maskCanvas),!g.value)return;const _e=g.value.getBoundingClientRect(),Q=Y.x-_e.left,ue=Y.y-_e.top,we=Le/ie;c.value.x+=Q-Q*we,c.value.y+=ue-ue*we,await O();const Ce=g.value.clientWidth/_.value;u.value=Ce,e.displayZoomRatio=Ce,N(Y)},"zoom"),ae=n(()=>{const z=y.value?.getBoundingClientRect().width||64;return{sidePanelWidth:k.value?.getBoundingClientRect().width||220,toolPanelWidth:z}},"getPanelDimensions"),ce=n(async(z=500)=>{if(!S.value||!h.value)return;const Y=l.value,ie={...c.value},{sidePanelWidth:ge,toolPanelWidth:Le}=ae(),_e=h.value.clientWidth-ge-Le,Q=h.value.clientHeight,ue=_e/S.value.width,we=Q/S.value.height,Ce=Math.min(ue,we),xe=S.value.width/S.value.height;let Ue,de;const he={x:Le,y:0};we>ue?(Ue=_e,de=Ue/xe,he.y=(Q-de)/2):(de=Q,Ue=de*xe,he.x=(_e-Ue)/2+Le);const Te=performance.now(),Ge=n(async We=>{const te=We-Te,le=Math.min(te/z,1),me=1-Math.pow(1-le,3);l.value=Y+(Ce-Y)*me,c.value.x=ie.x+(he.x-ie.x)*me,c.value.y=ie.y+(he.y-ie.y)*me,await O(),e.displayZoomRatio=Y+(1-Y)*me,le<1&&requestAnimationFrame(Ge)},"animate");requestAnimationFrame(Ge),u.value=1},"smoothResetView"),ee=n(async(z,Y,ie,ge)=>{h.value=Y,y.value=ie||null,k.value=ge||null;const{sidePanelWidth:Le,toolPanelWidth:_e}=ae(),Q=Y.clientWidth-Le-_e,ue=Y.clientHeight,we=Q/z.width,Ce=ue/z.height,xe=z.width/z.height;let Ue,de;const he={x:_e,y:0};Ce>we?(Ue=Q,de=Ue/xe,he.y=(ue-de)/2):(de=ue,Ue=de*xe,he.x=(Q-Ue)/2+_e),S.value===null&&(S.value=z),_.value=Ue,I.value=de,l.value=Math.min(we,Ce),c.value=he,x.value=[],await O()},"initializeCanvasPanZoom");return be(()=>e.resetZoomTrigger,async()=>{u.value!==1&&await ce()}),{initializeCanvasPanZoom:ee,handlePanStart:L,handlePanMove:F,handleTouchStart:j,handleTouchMove:V,handleTouchEnd:q,updateCursorPosition:N,zoom:re,invalidatePanZoom:O,addPenPointerId:n(z=>{x.value.includes(z)||x.value.push(z)},"addPenPointerId"),removePenPointerId:n(z=>{const Y=x.value.indexOf(z);Y!==-1&&x.value.splice(Y,1)},"removePenPointerId")}}n(xD,"usePanAndZoom");function ID(){const e=xt();return{screenToCanvas:n(o=>{const s=b(e.pointerZone),r=b(e.canvasContainer),i=b(e.maskCanvas);if(!s||!r||!i)return console.warn("screenToCanvas called before elements are available"),{x:0,y:0};const l=s.getBoundingClientRect(),u=r.getBoundingClientRect(),c=i.getBoundingClientRect(),d=l.left+o.x,p=l.top+o.y,f=d-u.left,g=p-u.top,m=i.width/c.width,h=i.height/c.height;return{x:f*m,y:g*h}},"screenToCanvas"),canvasToScreen:n(o=>{const s=b(e.pointerZone),r=b(e.canvasContainer),i=b(e.maskCanvas);if(!s||!r||!i)return console.warn("canvasToScreen called before elements are available"),{x:0,y:0};const l=s.getBoundingClientRect(),u=r.getBoundingClientRect(),c=i.getBoundingClientRect(),d=c.width/i.width,p=c.height/i.height,f=o.x*d,g=o.y*p,m=u.left+f,h=u.top+g;return{x:m-l.left,y:h-l.top}},"canvasToScreen")}}n(ID,"useCoordinateTransformInternal");const om=on(ID);function SD(e,t,a,o,s){const i=n((y,k,S)=>{const _=Math.hypot(S.x-k.x,S.y-k.y);return y+Math.pow(_,.5)},"getT"),l=0,u=i(l,e,t),c=i(u,t,a),d=i(c,a,o),p=u+(c-u)*s,f=n((y,k,S,_,I)=>{if(Math.abs(_-S)<1e-4)return y;const w=(I-S)/(_-S);return ED(Ic(y,1-w),Ic(k,w))},"interp"),g=f(e,t,l,u,p),m=f(t,a,u,c,p),h=f(a,o,c,d,p);return f(f(g,m,l,c,p),f(m,h,u,d,p),u,c,p)}n(SD,"catmullRomSpline");function ED(e,t){return{x:e.x+t.x,y:e.y+t.y}}n(ED,"add");function Ic(e,t){return{x:e.x*t,y:e.y*t}}n(Ic,"mul");function nm(e,t,a){if(e.length===0)return{points:[],remainder:a};const o=[];let s=0,r=a;for(let i=0;i<e.length-1;i++){const l=e[i],u=e[i+1],c=u.x-l.x,d=u.y-l.y,p=Math.hypot(c,d);if(p<1e-4){for(;r<=s;)o.push(l),r+=t;continue}for(;r<=s+p;){const f=(r-s)/p,g=l.x+f*c,m=l.y+f*d;o.push({x:g,y:m}),r+=t}s+=p}return{points:o,remainder:r-s}}n(nm,"resampleSegment");const Ml=(globalThis.__TYPEGPU_AUTONAME__??(e=>e))(Ki({brushColor:Sd,brushOpacity:Zo,hardness:Zo,screenSize:qi,brushShape:Vg}),"BrushUniforms"),TD=(globalThis.__TYPEGPU_AUTONAME__??(e=>e))(Ki({pos:uo(0,qi),size:uo(1,Zo),pressure:uo(2,Zo)}),"StrokePoint");var sm=(globalThis.__TYPEGPU_AUTONAME__??(e=>e))(Ki({position:Mg.position,localUV:uo(0,qi),color:uo(1,Sd),opacity:uo(2,Zo),hardness:uo(3,Zo)}),"VertexOutput"),AD=`
|
|
40
40
|
@group(0) @binding(0) var<uniform> globals: BrushUniforms;
|
|
41
41
|
|
|
42
42
|
@vertex
|
|
@@ -187,7 +187,7 @@ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
|
187
187
|
<path class="cls-1" d="M19.64,29.03c0,4.46-6.46,3.18-9.64,0,3.3-.47,4.75-2.58,7.06-2.58,1.43,0,2.58,1.16,2.58,2.58Z"/>
|
|
188
188
|
</svg>
|
|
189
189
|
`};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.constants=window.comfyAPI.constants||{};window.comfyAPI.constants.iconsHtml=rm;var hO={class:"h-full z-8888 flex flex-col justify-between bg-comfy-menu-bg"},vO={class:"flex flex-col"},yO=["onClick"],wO=["innerHTML"],bO=["title"],_O={class:"text-sm text-text-secondary"},kO={class:"text-xs text-text-secondary"},CO=J({__name:"ToolPanel",props:{toolManager:{}},setup(e){const t=xt(),a=n(l=>{e.toolManager.switchTool(l)},"onToolSelect"),o=E(()=>t.currentTool),s=E(()=>`${Math.round(t.displayZoomRatio*100)}%`),r=E(()=>{const l=t.image;return l?`${l.width}x${l.height}`:" "}),i=n(()=>{t.resetZoom()},"onResetZoom");return(l,u)=>(C(),P("div",hO,[v("div",vO,[(C(!0),P(Se,null,Ze(b(em),c=>(C(),P("div",{key:c,class:pe(["maskEditor_toolPanelContainer hover:bg-secondary-background-hover",{maskEditor_toolPanelContainerSelected:o.value===c}]),onClick:n(d=>a(c),"onClick")},[v("div",{class:"flex items-center justify-center",innerHTML:b(rm)[c]},null,8,wO),u[0]||(u[0]=v("div",{class:"maskEditor_toolPanelIndicator"},null,-1))],10,yO))),128))]),v("div",{class:"flex flex-col items-center cursor-pointer rounded-md mb-2 transition-colors duration-200 hover:bg-secondary-background-hover",title:b(G)("maskEditor.clickToResetZoom"),onClick:i},[v("span",_O,$(s.value),1),v("span",kO,$(r.value),1)],8,bO)]))}}),xO=CO,IO={class:"maskEditor-ui-container flex min-h-0 flex-1 flex-col"},SO={class:"flex min-h-0 flex-1 overflow-hidden"},EO=J({__name:"MaskEditorContent",props:{node:{}},setup(e){const t=xt(),a=br(),o=Ct(),s=CD(),r=A(),i=A(),l=A(),u=A(),c=A(),d=A(),p=A(),f=A(),g=A(),m=A(!1),h=_D(),y=xD(),k=VD(h,y);let S=null;const _=n(w=>{w.ctrlKey&&w.preventDefault()},"handleDragStart"),I=n(async()=>{if(!r.value){console.error("[MaskEditorContent] Cannot initialize - missing required refs");return}if(!l.value||!u.value||!c.value||!i.value||!p.value){console.error("[MaskEditorContent] Cannot initialize - missing canvas refs");return}t.maskCanvas=u.value,t.rgbCanvas=c.value,t.imgCanvas=l.value,t.canvasContainer=i.value,t.canvasBackground=p.value;try{await s.loadFromNode(e.node);const w=await bD().loadImages();await y.initializeCanvasPanZoom(w,r.value,f.value?.$el,g.value?.$el),t.canvasHistory.saveInitialState(),k.brushDrawing&&(await k.brushDrawing.initGPUResources(),d.value&&k.brushDrawing.initPreviewCanvas&&(d.value.width=u.value.width,d.value.height=u.value.height,k.brushDrawing.initPreviewCanvas(d.value))),m.value=!0}catch(w){console.error("[MaskEditorContent] Initialization failed:",w),o.closeDialog()}},"initUI");return it(()=>{h.addListeners(),r.value&&(S=new ResizeObserver(async()=>{y&&await y.invalidatePanZoom()}),S.observe(r.value)),I()}),Wa(()=>{k.brushDrawing.saveBrushSettings(),h?.removeListeners(),S&&(S.disconnect(),S=null),t.canvasHistory.clearStates(),t.resetState(),a.reset()}),(w,x)=>(C(),P("div",{ref_key:"containerRef",ref:r,class:"maskEditor-dialog-root flex h-full w-full flex-col",onContextmenu:x[4]||(x[4]=Ve(()=>{},["prevent"])),onDragstart:_,onKeydown:x[5]||(x[5]=Ve(()=>{},["stop"]))},[v("div",{id:"maskEditorCanvasContainer",ref_key:"canvasContainerRef",ref:i,onContextmenu:x[3]||(x[3]=Ve(()=>{},["prevent"]))},[v("canvas",{ref_key:"imgCanvasRef",ref:l,class:"absolute top-0 left-0 w-full h-full z-0",onContextmenu:x[0]||(x[0]=Ve(()=>{},["prevent"]))},null,544),v("canvas",{ref_key:"rgbCanvasRef",ref:c,class:"absolute top-0 left-0 w-full h-full z-10",onContextmenu:x[1]||(x[1]=Ve(()=>{},["prevent"]))},null,544),v("canvas",{ref_key:"maskCanvasRef",ref:u,class:"absolute top-0 left-0 w-full h-full z-30",onContextmenu:x[2]||(x[2]=Ve(()=>{},["prevent"]))},null,544),v("canvas",{ref_key:"gpuCanvasRef",ref:d,class:pe(["absolute top-0 left-0 w-full h-full pointer-events-none",{"z-20":b(t).activeLayer==="rgb","z-40":b(t).activeLayer==="mask"}])},null,2),v("div",{ref_key:"canvasBackgroundRef",ref:p,class:"bg-white w-full h-full"},null,512)],544),v("div",IO,[v("div",SO,[m.value?(C(),X(xO,{key:0,ref_key:"toolPanelRef",ref:f,"tool-manager":b(k)},null,8,["tool-manager"])):H("",!0),m.value?(C(),X(KD,{key:1,"tool-manager":b(k),"pan-zoom":b(y)},null,8,["tool-manager","pan-zoom"])):H("",!0),m.value?(C(),X(gO,{key:2,ref_key:"sidePanelRef",ref:g,"tool-manager":b(k)},null,8,["tool-manager"])):H("",!0)])]),m.value?(C(),X(HD,{key:0,"container-ref":r.value},null,8,["container-ref"])):H("",!0)],544))}}),TO=ot(EO,[["__scopeId","data-v-961e5a56"]]);function AO(){return{openMaskEditor:n(t=>{if(!t){console.error("[MaskEditor] No node provided");return}if(!t.imgs?.length&&t.previewMediaType!=="image"){console.error("[MaskEditor] Node has no images");return}Ct().showDialog({key:"global-mask-editor",headerComponent:yD,component:TO,props:{node:t},dialogComponentProps:{style:"width: 90vw; height: 90vh;",modal:!0,maximizable:!0,closable:!0,pt:{root:{class:"mask-editor-dialog flex flex-col"},content:{class:"flex flex-col min-h-0 flex-1 !p-0"},header:{class:"!p-2"}}}})},"openMaskEditor")}}n(AO,"useMaskEditor");const Q8=Symbol(),MO=Symbol(),Tt=n(()=>{const e=Lt(),t=Oe(),a=jn(),o=gt(),{toggleSelectedNodesMode:s}=Hd();function r(M){return`nodeDefs.${dt(M.constructor.nodeData.name)}`}n(r,"nodeKey");function i(M,O){const L=O.name,F=`${r(M)}.inputs.${dt(L)}.name`;if(a.widgets.get(O.widgetType??O.type)&&!O.forceInput||uw(M,O))return;const K=M.addInput(L,O.type,{shape:O.isOptional?co.HollowCircle:void 0,localized_name:De(F,L)});K.label??=O.display_name}n(i,"addInputSocket");function l(M){M.strokeStyles.running=function(){const O=String(this.id),L=wt().nodeIdToNodeLocatorId(O);if(Ot().nodeLocationProgressStates[L]?.state==="running")return{color:"#0f0"}},M.strokeStyles.dragOver=function(){if(Z.dragOverNode?.id==this.id)return{color:"dodgerblue"}},M.strokeStyles.executionError=function(){if(Z.lastExecutionError?.node_id==this.id)return{color:"#f0f",lineWidth:2}}}n(l,"setupStrokeStyles");function u(M,O){i(M,O),c(M,O)}n(u,"addNodeInput");function c(M,O){const L={...O};O.widgetType&&(L.type=O.widgetType);const F=O.name,K=`${r(M)}.inputs.${dt(F)}.name`,j=a.widgets.get(L.type);if(!j||O.forceInput)return;const{widget:V,minWidth:q=1,minHeight:re=1}=j(M,F,Co(L),Z)??{};if(V&&(V.label=De(K,V.label??L.display_name??F),V.options??={},Object.assign(V.options,{advanced:O.advanced,hidden:O.hidden})),!V?.options?.socketless){const ce=Co(L);M.addInput(F,O.type,{shape:O.isOptional?co.HollowCircle:void 0,localized_name:De(K,F),widget:{name:F,[MO]:()=>ce}})}const ae=M;ae._initialMinSize.width=Math.max(ae._initialMinSize.width,q),ae._initialMinSize.height=Math.max(ae._initialMinSize.height,re)}n(c,"addInputWidget");function d(M,O){const L=M.constructor.nodeData,F=Q2(L,O);for(const K of F)i(M,K);for(const K of F)c(M,K)}n(d,"addInputs");function p(M,O){for(const L of O){const{name:F,is_list:K}=L,j=L.type==="COMFY_MATCHTYPE_V3"?"*":L.type,V=K?{shape:Ne.GRID_SHAPE}:{},q=`${r(M)}.outputs.${L.index}.name`,re=`dataTypes.${dt(j)}`,ae={...V,localized_name:j!==F?De(q,F):De(re,F)};M.addOutput(F,j,ae)}}n(p,"addOutputs");function f(M){const O=M.computeSize(),L=M.widgets?.length&&!Me().get("LiteGraph.Node.DefaultPadding"),F=M;O[0]=Math.max(F._initialMinSize.width,O[0]+(L?60:0)),O[1]=Math.max(F._initialMinSize.height,O[1]),M.setSize(O)}n(f,"setInitialSize");function g(M,O,L){const F=class Ms extends $a{static{n(this,"ComfyNode")}static comfyClass;static title;static category;static nodeData;_initialMinSize={width:1,height:1};constructor(){super(Z.rootGraph,O,L),O.events.addEventListener("widget-promoted",V=>{const{widget:q}=V.detail;if(!On(q)&&!fi(q))return;const re=Ua();if(!re.widgetStates.has(q.id)){re.registerWidget(q);const ae=re.widgetStates.get(q.id);ae&&(ae.visible=o.getCanvas().graph?.nodes.includes(q.node)??!1)}}),O.events.addEventListener("widget-demoted",V=>{const{widget:q}=V.detail;if(!On(q)&&!fi(q))return;const re=Ua();re.widgetStates.has(q.id)&&re.unregisterWidget(q.id)}),l(this),d(this,Ms.nodeData.inputs),p(this,Ms.nodeData.outputs),f(this),this.serialize_widgets=!0,e.invokeExtensionsAsync("nodeCreated",this)}configure(V){const q=["name","type","shape","localized_name"],re=new Map(V.inputs?.map(ne=>[ne.name,ne])??[]),ae=new Set(this.inputs.map(ne=>ne.name)),ce=this.inputs.map(ne=>{const B=re.get(ne.name);return B?{...B,...Be.pick(ne,q.concat("widget"))}:ne}),ee=V.inputs?.filter(ne=>!ae.has(ne.name));V.inputs=[...ce,...ee??[]],V.outputs=Be.zip(this.outputs,V.outputs).map(([ne,B])=>ne?B?{...B,...Be.pick(ne,q)}:ne:B),V.widgets_values=Uu(Ms.nodeData.inputs,this.widgets??[],V.widgets_values??[]),super.configure(V)}};h(F),S(F),_(F),F.prototype.comfyClass=M.name,F.comfyClass=M.name;const K=new wo(M);F.nodeData=K,Ne.registerNodeType(O.id,F),F.category=K.category,F.skip_list=!0,F.title=K.display_name||K.name}n(g,"registerSubgraphNodeDef");async function m(M,O){const L=class Cn extends Jo{static{n(this,"ComfyNode")}static comfyClass;static title;static category;static nodeData;_initialMinSize={width:1,height:1};constructor(j){super(j),l(this),d(this,Cn.nodeData.inputs),p(this,Cn.nodeData.outputs),f(this),this.serialize_widgets=!0,Cn.nodeData.api_node&&(this.color=va.node_colors.yellow.color,this.bgcolor=va.node_colors.yellow.bgcolor),e.invokeExtensionsAsync("nodeCreated",this)}configure(j){const V=["name","type","shape","localized_name"],q=new Map(j.inputs?.map(ee=>[ee.name,ee])??[]),re=new Set(this.inputs.map(ee=>ee.name)),ae=this.inputs.map(ee=>{const ne=q.get(ee.name);return ne?{...ne,...Be.pick(ee,V.concat("widget"))}:ee}),ce=j.inputs?.filter(ee=>!re.has(ee.name));j.inputs=[...ae,...ce??[]],j.outputs=Be.zip(this.outputs,j.outputs).map(([ee,ne])=>ee?ne?{...ne,...Be.pick(ee,V)}:ee:ne),j.widgets_values=Uu(Cn.nodeData.inputs,this.widgets??[],j.widgets_values??[]),super.configure(j)}};h(L),S(L),_(L),L.prototype.comfyClass=O.name,L.comfyClass=O.name,await e.invokeExtensionsAsync("beforeRegisterNodeDef",L,O);const F=new wo(O);L.nodeData=F,Ne.registerNodeType(M,L),L.category=F.category,L.title=F.display_name||F.name}n(m,"registerNodeDef");function h(M){function O(L){return typeof window.ClipboardItem>"u"?[]:[{content:"Copy Image",callback:n(async()=>{const F=new URL(L.src);F.searchParams.delete("preview");const K=n(async j=>{await navigator.clipboard.write([new ClipboardItem({[j.type]:j})])},"writeImage");try{const j=await(await fetch(F)).blob();try{await K(j)}catch(V){if(j.type!=="image/png"){const q=Ee("canvas",{width:L.naturalWidth,height:L.naturalHeight}),re=q.getContext("2d");let ae;if(typeof window.createImageBitmap>"u"){ae=new Image;const ce=new Promise((ee,ne)=>{ae.onload=ee,ae.onerror=ne}).finally(()=>{URL.revokeObjectURL(ae.src)});ae.src=URL.createObjectURL(j),await ce}else ae=await createImageBitmap(j);try{re.drawImage(ae,0,0),q.toBlob(K,"image/png")}finally{typeof ae.close=="function"&&ae.close()}return}throw V}}catch(j){t.addAlert(G("toastMessages.errorCopyImage",{error:j.message??j}))}},"callback")}]}n(O,"getCopyImageOption"),M.prototype.getExtraMenuOptions=function(L,F){if(this.imgs){let q;this.imageIndex!=null?q=this.imgs[this.imageIndex]:this.overIndex!=null&&(q=this.imgs[this.overIndex]),q&&F.unshift({content:"Open Image",callback:n(()=>{const re=new URL(q.src);re.searchParams.delete("preview"),window.open(re,"_blank")},"callback")},...O(q),{content:"Save Image",callback:n(()=>{const re=new URL(q.src);re.searchParams.delete("preview");const ae=new URLSearchParams(re.search).get("filename");Gs(re.toString(),ae??void 0)},"callback")})}F.push({content:"Bypass",callback:n(()=>{s(eo.BYPASS),L.setDirty(!0,!0)},"callback")}),Vo.clipspace_return_node||(F.push({content:"Copy (Clipspace)",callback:n(()=>{Vo.copyToClipspace(this)},"callback")}),Vo.clipspace!=null&&F.push({content:"Paste (Clipspace)",callback:n(()=>{Vo.pasteFromClipspace(this)},"callback")}),yl(this)&&F.push({content:"Open in MaskEditor | Image Canvas",callback:n(()=>{AO().openMaskEditor(this)},"callback")})),this instanceof $a&&F.unshift({content:"Edit Subgraph Widgets",callback:n(()=>{J2().openPanel("subgraph")},"callback")},{content:"Unpack Subgraph",callback:n(()=>{const{unpackSubgraph:q}=G2();q()},"callback")});const[K,j]=L.graph_mouse,V=this.getWidgetOnPos(K,j,!0);if(V){const q=this.inputs.find(ce=>ce.widget?.name===V.name);q&&F.unshift({content:`${G("contextMenu.RenameWidget")}: ${V.label??V.name}`,callback:n(async()=>{const ce=await pt().prompt({title:G("g.rename"),message:G("g.enterNewName")+":",defaultValue:V.label,placeholder:V.name});ce!==null&&(V.label=ce||void 0,q.label=ce||void 0,gt().canvas?.setDirty(!0))},"callback")});const re=Z2(),ae=re.isFavorited(this,V.name);F.unshift({content:ae?`${G("contextMenu.UnfavoriteWidget")}: ${V.label??V.name}`:`${G("contextMenu.FavoriteWidget")}: ${V.label??V.name}`,callback:n(()=>{re.toggleFavorite(this,V.name)},"callback")}),this.graph&&!this.graph.isRootGraph&&PO(F,V,this)}return[]}}n(h,"addNodeContextMenuHandler");function y(M,O){try{k.call(M,O)}catch(L){console.error("Error drawing node background",L)}}n(y,"updatePreviews");function k(M){if(this.flags.collapsed)return;const O=Gt(),{showAnimatedPreview:L,removeAnimatedPreview:F}=H2(),{showCanvasImagePreview:K,removeCanvasImagePreview:j}=X2(),V=O.getNodeOutputs(this),q=O.getNodePreviews(this),re=V&&this.images!==V.images,ae=q&&this.preview!==q;if(ae&&(this.preview=q),re&&(this.images=V.images),re||ae){this.animatedImages=V?.animated?.find(Boolean);const ce=this.animatedImages&&V?.images?.some(ne=>ne.filename?.includes("webp")),ee=this.animatedImages&&V?.images?.some(ne=>ne.filename?.includes("png"));this.animatedImages&&!ce&&!ee||wl(this)?$p(this,M).showPreview():Np(this,M).showPreview()}this.imgs?.length&&(this.animatedImages?(j(this),L(this)):(F(this),K(this)))}n(k,"unsafeUpdatePreviews");function S(M){M.prototype.setSizeForImage=function(){console.warn("node.setSizeForImage is deprecated. Now it has no effect. Please remove the call to it.")},M.prototype.onDrawBackground=function(){y(this)}}n(S,"addDrawBackgroundHandler");function _(M){const O=M.prototype.onKeyDown;M.prototype.onKeyDown=function(L){if(O&&O.apply(this,L)===!1)return!1;if(this.flags.collapsed||!this.imgs||this.imageIndex===null)return;let F=!1;if(L.key==="ArrowLeft"||L.key==="ArrowRight"?(L.key==="ArrowLeft"?this.imageIndex-=1:L.key==="ArrowRight"&&(this.imageIndex+=1),this.imageIndex%=this.imgs.length,this.imageIndex<0&&(this.imageIndex=this.imgs.length+this.imageIndex),F=!0):L.key==="Escape"&&(this.imageIndex=null,F=!0),F===!0)return L.preventDefault(),L.stopImmediatePropagation(),!1}}n(_,"addNodeKeyHandler");function I(M,O={}){if(O.pos??=w(),M.name.startsWith(Ia().typePrefix)){const F=o.getCanvas(),K=Ia().getBlueprint(M.name),j={nodes:K.nodes,subgraphs:K.definitions?.subgraphs},V=F._deserializeItems(j,{position:O.pos});if(!V)throw new Error("Failed to add subgraph blueprint");const q=V.nodes.values().next().value;if(!q)throw new Error("Subgraph blueprint was added, but failed to resolve a subgraph Node");return q}const L=Ne.createNode(M.name,M.display_name,O);return(wt().activeSubgraph??Z.graph).add(L),L}n(I,"addNodeOnGraph");function w(){const M=Math.max(window.devicePixelRatio??1,1),[O,L,F,K]=Z.canvas.ds.visible_area;return[O+F/M/2,L+K/M/2]}n(w,"getCanvasCenter");function x(M){const O=Z.canvas.graph?.getNodeById(M);O&&Z.canvas.animateToBounds(O.boundingRect)}n(x,"goToNode");function D(M){for(const O of M)O.boundingRect.every(L=>L===0)&&O.updateArea()}n(D,"ensureBounds");function T(){const M=o.canvas;M&&(M.ds.scale=1,M.ds.offset=[0,0],M.setDirty(!0,!0))}n(T,"resetView");function N(){const M=o.getCanvas(),O=M.graph?.nodes;if(!O)return;D(O);const L=Bd(O);L&&(M.ds.fitToBounds(L),M.setDirty(!0,!0))}return n(N,"fitView"),{registerNodeDef:m,registerSubgraphNodeDef:g,addNodeOnGraph:I,addNodeInput:u,getCanvasCenter:w,goToNode:x,resetView:T,fitView:N,updatePreviews:y}},"useLitegraphService"),Mi=Je("subgraphNavigation",()=>{const e=wt(),t=gt(),a=Qt(),o=A([]),s=new Mo.default({maxSize:32}),r=n(()=>{const g=t.getCanvas();return g?g.graph?.rootGraph?.id??"root":"root"},"getCurrentRootGraphId"),i=E(()=>o.value.map(g=>Z.rootGraph.subgraphs.get(g)).filter(Ch)),l=n(g=>{o.value.length=0;for(const m of g)o.value.push(m)},"restoreState"),u=n(()=>[...o.value],"exportState"),c=n(()=>{const g=t.getCanvas();return g?{scale:g.ds.state.scale,offset:[...g.ds.state.offset]}:null},"getCurrentViewport"),d=n(g=>{const m=c();m&&s.set(g,m)},"saveViewport"),p=n(g=>{const m=s.get(g);if(!m)return;const h=Z.canvas;h&&(h.ds.scale=m.scale,h.ds.offset[0]=m.offset[0],h.ds.offset[1]=m.offset[1],h.setDirty(!0,!0))},"restoreViewport"),f=n((g,m)=>{if(m?d(m.id):!m&&g&&d(r()),!g){o.value.length=0,p(r());return}const h=gh(g.rootGraph,g.id);h?o.value=[...h]:o.value=[g.id],p(g.id)},"onNavigated");return be(()=>e.activeSubgraph,(g,m)=>{f(g,m)}),{activeSubgraph:a,navigationStack:i,restoreState:l,exportState:u,saveViewport:d,restoreViewport:p,viewportCache:s}});function Yn(e){return Vs(e.properties.proxyWidgets)}n(Yn,"getProxyWidgets");function Pl(e,t,a){for(const o of a){const s=Yn(o);if(s.some(qn([e,t])))continue;const r=[...s,im([e,t])];o.properties.proxyWidgets=r}t.promoted=!0}n(Pl,"promoteWidget");function Dl(e,t,a){for(const o of a){const s=Yn(o).filter(r=>!qn([e,t])(r));o.properties.proxyWidgets=s}t.promoted=!1}n(Dl,"demoteWidget");function e6([e,t]){return([a,o])=>a.id==e&&o.name===t}n(e6,"matchesWidgetItem");function qn([e,t]){return([a,o])=>e.id==a&&t.name===o}n(qn,"matchesPropertyItem");function im([e,t]){return[`${e.id}`,t.name]}n(im,"widgetItemToProperty");function lm(){const{navigationStack:e}=Mi(),t=e.at(-1);return t?(e.at(-2)??t.rootGraph).nodes.filter(a=>a.type===t.id&&a.isSubgraphNode()):(Oe().add({severity:"error",summary:G("g.error"),detail:G("subgraphStore.promoteOutsideSubgraph"),life:2e3}),[])}n(lm,"getParentNodes");function PO(e,t,a){const o=lm(),s=o.filter(r=>!Yn(r).some(qn([a,t])));s.length>0?e.unshift({content:`Promote Widget: ${t.label??t.name}`,callback:n(()=>{Pl(a,t,s)},"callback")}):e.unshift({content:`Un-Promote Widget: ${t.label??t.name}`,callback:n(()=>{Dl(a,t,o)},"callback")})}n(PO,"addWidgetPromotionOptions");function t6(){const e=gt().getCanvas(),[t,a]=e.graph_mouse,o=e.graph?.getNodeOnPos(t,a,e.visible_nodes);if(!o)return;const s=o.getWidgetOnPos(t,a,!0),r=lm();if(!r.length||!s)return;const i=r.filter(l=>!Yn(l).some(qn([o,s])));i.length>0?Pl(o,s,i):Dl(o,s,r)}n(t6,"tryToggleWidgetPromotion");var DO=["CLIPTextEncode","LoadImage","SaveImage","PreviewImage"],LO=["seed"];function OO([e,t]){return!t.computedDisabled&&(DO.includes(e.type)||LO.includes(t.name))}n(OO,"isRecommendedWidget");function NO(e){return e.widgets?.map(t=>[e,t])??[]}n(NO,"nodeWidgets");function $O(e){const{updatePreviews:t}=Tt(),a=e.subgraph.nodes;for(const s of a){let r=function(){t(s);const i=s.widgets?.find(l=>l.name.startsWith("$$"));i&&(Yn(e).some(qn([s,i]))||Pl(s,i,[e]))};n(r,"checkWidgets"),s.updateComputedDisabled(),requestAnimationFrame(()=>t(s,r))}const o=a.flatMap(NO).filter(OO).map(im);e.properties.proxyWidgets=o,e.computeSize(e.size)}n($O,"promoteRecommendedWidgets");function a6(e){e.properties.proxyWidgets=e.widgets.filter(Yo).filter(t=>!um(t)).map(t=>[t._overlay.nodeId,t._overlay.widgetName])}n(a6,"pruneDisconnected");var RO=class extends Rd{static{n(this,"DisconnectedWidget")}constructor(e){super(e,new Jo("DisconnectedPlaceholder")),this.disabled=!0}drawWidget(e,{width:t,showText:a=!0}){e.save(),this.drawWidgetShape(e,{width:t,showText:a}),a&&this.drawTruncatingText({ctx:e,width:t,leftPadding:0,rightPadding:0}),e.restore()}onClick(){}get _displayValue(){return"Disconnected"}},BO={type:"button",value:void 0,name:"Disconnected",options:{},y:0,clicked:!1};const Ps=new RO(BO);function Yo(e){return e?._overlay?.isProxyWidget??!1}n(Yo,"isProxyWidget");function um(e){return e instanceof Ps.constructor}n(um,"isDisconnectedWidget");function FO(e){e.canvas.addEventListener("subgraph-opened",t=>{const{subgraph:a,fromNode:o}=t.detail,s=Vs(o.properties.proxyWidgets);for(const r of a.nodes)for(const i of r.widgets??[])i.promoted=s.some(([l,u])=>r.id==l&&i.name==u)}),e.canvas.addEventListener("subgraph-converted",t=>$O(t.detail.subgraphNode)),$a.prototype.onConfigure=WO}n(FO,"registerProxyWidgets");var UO=$a.prototype.onConfigure,WO=n(function(e){if(!this.isSubgraphNode())throw new Error("Can't add proxyWidgets to non-subgraphNode");const t=gt();if(this.properties.proxyWidgets??=[],UO?.call(this,e),Object.defineProperty(this.properties,"proxyWidgets",{get:n(()=>this.widgets.map(a=>Yo(a)?[a._overlay.nodeId,a._overlay.widgetName]:["-1",a.name]),"get"),set:n(a=>{const o=Vs(a),{deactivateWidget:s,setWidget:r}=Ua(),i=gt().canvas?.graph===this.graph;if(i)for(const u of this.widgets.filter(c=>Yo(c)))u instanceof Nn&&s(u.id);const l=o.flatMap(([u,c])=>{if(u==="-1"){const p=this.widgets.find(f=>f.name===c);return p?[p]:[]}const d=zO(this,u,c);return i&&d instanceof Nn&&r(d),[d]});this.widgets=this.widgets.filter(u=>!Yo(u)&&!o.some(([,c])=>u.name===c)),this.widgets.push(...l),t.canvas?.setDirty(!0,!0),this._setConcreteSlots(),this.arrange()},"set")}),e.properties?.proxyWidgets){this.properties.proxyWidgets=e.properties.proxyWidgets;const a=Vs(e.properties.proxyWidgets);e.widgets_values?.forEach((o,s)=>{if(a[s]?.[0]!=="-1")return;const r=this.widgets.find(i=>i.name==a[s][1]);o!==null&&r&&(r.value=o)})}},"onConfigure");function zO(e,t,a){const o=`${t}: ${a}`;return VO(e,{nodeId:t,graph:e.subgraph,widgetName:a,afterQueued:void 0,computedHeight:void 0,isProxyWidget:!0,last_y:void 0,name:o,node:e,onRemove:void 0,promoted:void 0,serialize:!1,width:void 0,y:0})}n(zO,"newProxyWidget");function Mc(e){const{graph:t,nodeId:a,widgetName:o}=e,s=Fs(t,a);if(!s)return[void 0,void 0];const r=s.widgets?.find(i=>i.name===o);return r&&Yo(r)&&um(r)&&(r.computedHeight=20),[s,r]}n(Mc,"resolveLinkedWidget");function VO(e,t){const{updatePreviews:a}=Tt();let[o,s]=Mc(t),r=s??Ps;return t.widgetName.startsWith("$$")&&(t.node=new Proxy(e,{get(i,l){return l!=="imgs"?Reflect.get(e,l):o?o.imgs:[]}})),new Proxy(Ps,{get(i,l,u){let c=r,d=u;return l=="_overlay"?t:(l=="value"&&(d=r),Object.prototype.hasOwnProperty.call(t,l)&&(c=t,d=t),Reflect.get(c,l,d))},set(i,l,u){let c=r;return l=="computedHeight"&&(t.widgetName.startsWith("$$")&&o&&a(o),o&&s?.computedDisabled&&Dl(o,s,[e]),[o,s]=Mc(t),r=s??Ps),Object.prototype.hasOwnProperty.call(t,l)&&(c=t),Reflect.set(c,l,u,c)},getPrototypeOf(){return Reflect.getPrototypeOf(r)},ownKeys(){return Reflect.ownKeys(r)},has(i,l){let u=r;return Object.prototype.hasOwnProperty.call(t,l)&&(u=t),Reflect.has(u,l)}})}n(VO,"newProxyFromOverlay");var ha=(function(e){return e[e.INPUT=0]="INPUT",e[e.OUTPUT=1]="OUTPUT",e})(ha||{});function ms(e,t){return e.getNodeById?e.getNodeById(t):(e=e,e.nodes.find(a=>a.id==t))}n(ms,"getNodeById");function Pc(e){return{link:e,id:e[0],origin_id:e[1],origin_slot:e[2],target_id:e[3],target_slot:e[4],type:e[5]}}n(Pc,"extendLink");function cm(e,t={}){const{fix:a=!1,silent:o=!1,logger:s=console}=t,r={log:n((...m)=>{o||s.log(...m)},"log")},i={},l={patchedNodes:[],deletedLinks:[]};function u(m,h,y,k,S){i[m.id]=i[m.id]||{};const _=i[m.id];if(h==ha.INPUT){if(_.inputs=_.inputs||{},_.inputs[y]!==void 0)return r.log(` > Already set ${m.id}.inputs[${y}] to ${_.inputs[y]} Skipping.`),!1;const I=S==="REMOVE"?null:k;_.inputs[y]=I}else{if(_.outputs=_.outputs||{},_.outputs[y]=_.outputs[y]||{links:[...m.outputs?.[y]?.links||[]],changes:{}},_.outputs[y].changes[k]!==void 0)return r.log(` > Already set ${m.id}.outputs[${y}] to ${_.inputs[y]}! Skipping.`),!1;if(_.outputs[y].changes[k]=S,S==="ADD"){if(_.outputs[y].links.indexOf(k)!==-1)return r.log(` > Hmmm.. asked to add ${k} but it is already in list...`),!1;_.outputs[y].links.push(k),a&&(m.outputs=m.outputs||[],m.outputs[y]=m.outputs[y]||{},m.outputs[y].links=m.outputs[y].links||[],m.outputs[y].links.push(k))}else{const I=_.outputs[y].links.indexOf(k);if(I===-1)return r.log(` > Hmmm.. asked to remove ${k} but it doesn't exist...`),!1;_.outputs[y].links.splice(I,1),a&&m.outputs?.[y].links.splice(I,1)}}return l.patchedNodes.push(m),!0}n(u,"patchNodeSlot");function c(m,h,y,k){let S=!1;if(h===ha.INPUT){const _=m.inputs?.[y]?.link===k;if(i[m.id]?.inputs){const I=i[m.id].inputs[y]===k;if(a&&_!==I)throw Error("Error. Expected node to match patched data.");S=I}else S=!!_}else{const _=m.outputs?.[y]?.links?.includes(k);if(i[m.id]?.outputs?.[y]?.changes[k]){const I=i[m.id].outputs[y]?.links.includes(k);if(a&&_!==I)throw Error("Error. Expected node to match patched data.");S=!!I}else S=!!_}return S}n(c,"nodeHasLinkId");function d(m,h,y){let k=!1;if(h===ha.INPUT){const S=m.inputs?.[y]?.link!=null;if(i[m.id]?.inputs){const _=i[m.id].inputs[y]!=null;if(a&&S!==_)throw Error("Error. Expected node to match patched data.");k=_}else k=!!S}else{const S=m.outputs?.[y]?.links?.length;if(i[m.id]?.outputs?.[y]?.changes){const _=i[m.id].outputs[y]?.links.length;if(a&&S!==_)throw Error("Error. Expected node to match patched data.");k=!!_}else k=!!S}return k}n(d,"nodeHasAnyLink");let p=[];Array.isArray(e.links)?p=e.links:p=Object.values(e.links).reduce((m,h)=>(m[h.id]=h,m),p);const f=[...p];f.reverse();for(const m of f){if(!m)continue;const h=m.origin_slot!=null?m:Pc(m),y=ms(e,h.origin_id),k=n(()=>c(y,ha.OUTPUT,h.origin_slot,h.id),"originHasLink"),S=n((N,M=h.id)=>u(y,ha.OUTPUT,h.origin_slot,M,N),"patchOrigin"),_=ms(e,h.target_id),I=n(()=>c(_,ha.INPUT,h.target_slot,h.id),"targetHasLink"),w=n(()=>d(_,ha.INPUT,h.target_slot),"targetHasAnyLink"),x=n((N,M=h.id)=>u(_,ha.INPUT,h.target_slot,M,N),"patchTarget"),D=`origin(${h.origin_id}).outputs[${h.origin_slot}].links`,T=`target(${h.target_id}).inputs[${h.target_slot}].link`;if(!y||!_){!y&&!_?r.log(`Link ${h.id} is invalid, both origin ${h.origin_id} and target ${h.target_id} do not exist`):y?_||(r.log(`Link ${h.id} is funky... target ${h.target_id} does not exist, but origin ${h.origin_id} does.`),k()&&(r.log(` > [PATCH] Origin's links' has ${h.id}; will remove the link first.`),S("REMOVE"))):(r.log(`Link ${h.id} is funky... origin ${h.origin_id} does not exist, but target ${h.target_id} does.`),I()&&(r.log(` > [PATCH] ${T} does have link, will remove the inputs' link first.`),x("REMOVE",-1)));continue}if(I()||k()){if(!k())r.log(`${h.id} is funky... ${D} does NOT contain it, but ${T} does.`),r.log(` > [PATCH] Attempt a fix by adding this ${h.id} to ${D}.`),S("ADD");else if(!I())if(r.log(`${h.id} is funky... ${T} is NOT correct (is ${_.inputs?.[h.target_slot]?.link}), but ${D} contains it`),w())r.log(` > [PATCH] ${T} is defined, removing ${h.id} from ${D}.`),S("REMOVE");else{r.log(` > [PATCH] ${T} is not defined, will set to ${h.id}.`);let N=x("ADD");N||(r.log(` > [PATCH] Nvm, ${T} already patched. Removing ${h.id} from ${D}.`),N=S("REMOVE"))}}}for(const m of f){if(!m)continue;const h=m.origin_slot!=null?m:Pc(m),y=ms(e,h.origin_id),k=ms(e,h.target_id);if((!y||!c(y,ha.OUTPUT,h.origin_slot,h.id))&&(!k||!c(k,ha.INPUT,h.target_slot,h.id))){r.log(`${h.id} is def invalid; BOTH origin node ${h.origin_id} ${y?`doesn't have ${h.id}`:"is removed"} and ${h.origin_id} target node ${k?`doesn't have ${h.id}`:"is removed"}.`),l.deletedLinks.push(h.id);continue}}if(a){for(let m=l.deletedLinks.length-1;m>=0;m--)if(r.log(`Deleting link #${l.deletedLinks[m]}.`),e.getNodeById)delete e.links[l.deletedLinks[m]];else{e=e;const h=e.links.findIndex(y=>y&&(y[0]===l.deletedLinks[m]||y.id===l.deletedLinks[m]));h===-1&&r.log(`INDEX NOT FOUND for #${l.deletedLinks[m]}`),r.log(`splicing ${h} from links`),e.links.splice(h,1)}e.getNodeById||(e.links=e.links.filter(m=>!!m))}if(!l.patchedNodes.length&&!l.deletedLinks.length)return{hasBadLinks:!1,fixed:!1,graph:e,patched:l.patchedNodes.length,deleted:l.deletedLinks.length};r.log(`${a?"Made":"Would make"} ${l.patchedNodes.length||"no"} node link patches, and ${l.deletedLinks.length||"no"} stale link removals.`);let g=!!(l.patchedNodes.length||l.deletedLinks.length);return a&&!o&&(g=cm(e,{fix:!1,silent:!0}).hasBadLinks),{hasBadLinks:g,fixed:!!g&&a,graph:e,patched:l.patchedNodes.length,deleted:l.deletedLinks.length}}n(cm,"fixBadLinks");function GO(){const e=Oe();function t(o,s={}){const{silent:r=!1}=s,i=[],l=cm(o,{fix:!0,silent:r,logger:{log:n(u=>{i.push(u)},"log")}});return!r&&i.length>0&&e.add({severity:"warn",summary:"Workflow Validation",detail:i.join(`
|
|
190
|
-
`)}),l.fixed&&(r||e.add({severity:"success",summary:"Workflow Links Fixed",detail:`Fixed ${l.patched} node connections and removed ${l.deleted} invalid links.`})),l.graph}n(t,"tryFixLinks");async function a(o,s={}){const{silent:r=!1}=s;let i=null;const l=await uh(o,u=>{r||e.addAlert(u)});if(l)try{i=t(l,{silent:r})}catch(u){console.error(u)}return{graphData:i}}return n(a,"validateWorkflow"),{validateWorkflow:a}}n(GO,"useWorkflowValidation");const Dc=n(()=>{const e=zt();function t(r,i,l){const u={id:-1,type:l.id,pos:[0,0],size:[100,100],inputs:[],outputs:[],flags:{},order:0,mode:0};Tt().registerSubgraphNodeDef(r,i,u)}n(t,"registerLitegraphNode");function a(r){const{id:i,name:l}=r,u={input:{required:{}},output:[],output_is_list:[],output_name:[],output_tooltips:[],name:i,display_name:l,description:`Subgraph node for ${l}`,category:"subgraph",output_node:!1,python_module:"nodes"};return e.addNodeDef(u),u}n(a,"createNodeDef");function o(r){const i=r.definitions?.subgraphs;if(i)for(const l of i)s(Z.rootGraph.subgraphs.get(l.id)??Z.rootGraph.createSubgraph(l),l)}n(o,"loadSubgraphs");function s(r,i){t(a(i),r,i)}return n(s,"registerNewSubgraph"),{loadSubgraphs:o,registerNewSubgraph:s}},"useSubgraphService"),HO=Symbol();function jO(e){return e.constructor?.nodeData?.[HO]!==void 0}n(jO,"isGroupNode");var KO=class extends $d{static{n(this,"ExecutableGroupNodeDTO")}get isVirtualNode(){return!0}getInnerNodes(){return this.node.getInnerNodes?.(this.nodesByExecutionId)??[]}resolveOutput(e,t,a){if(this.mode===eo.BYPASS){const{inputs:l}=this,u=[e,...Object.keys(l).map(Number)].find(c=>l[c]?.type===t);return u===void 0?void 0:this.resolveInput(u,a)}const o=this.node.outputs[e]?.links?.at(0),s=this.node.graph?.getLink(o);if(!s)throw new Error(`Failed to get link for group node ${this.node.id} with link ${o}`);const r=this.node.updateLink?.(s);if(!r)throw new Error(`Failed to update link for group node ${this.node.id} with link ${o}`);const i=this.node.getInnerNodes?.(this.nodesByExecutionId).find(l=>l.id===r.origin_id);if(!i)throw new Error(`Failed to get node for group node ${this.node.id} with link ${o}`);return{node:i,origin_id:`${this.id}:${r.origin_id.split(":").at(-1)}`,origin_slot:r.origin_slot}}};const YO=n(async(e,t={})=>{const{sortNodes:a=!1}=t;for(const i of e.computeExecutionOrder(!1)){const l=i.getInnerNodes?i.getInnerNodes(new Map):[i];for(const u of l)u.isVirtualNode&&u.applyToGraph?.()}const o=e.serialize({sortNodes:a});for(const i of o.nodes){for(const l of i.inputs??[])delete l.localized_name;for(const l of i.outputs??[])delete l.localized_name}mC(o),o.extra??={},o.extra.frontendVersion="1.38.5";const s=new Map;for(const i of e.computeExecutionOrder(!1)){const l=jO(i)?new KO(i,[],s):new $d(i,[],s);for(const u of l.getInnerNodes())s.set(u.id,u);s.set(l.id,l)}const r={};for(const i of s.values()){if(i.isVirtualNode||i.mode===eo.NEVER||i.mode===eo.BYPASS)continue;const l={},{widgets:u}=i;if(u)for(const[c,d]of u.entries()){if(!d.name||d.options?.serialize===!1)continue;const p=d.serializeValue?await d.serializeValue(i,c):d.value;l[d.name]=Array.isArray(p)?{__value__:p}:p}for(const[c,d]of i.inputs.entries()){const p=i.resolveInput(c);if(p){if(p.widgetInfo){const{value:f}=p.widgetInfo;l[d.name]=Array.isArray(f)?{__value__:f}:f;continue}l[d.name]=[String(p.origin_id),parseInt(p.origin_slot)]}}r[String(i.id)]={inputs:l,class_type:i.comfyClass,_meta:{title:i.title}}}for(const{inputs:i}of Object.values(r))for(const[l,u]of Object.entries(i))Array.isArray(u)&&u.length===2&&!r[u[0]]&&delete i[l];return{workflow:o,output:r}},"graphToPrompt"),qO=n((e,t)=>{let a=Math.abs(e),o=Math.abs(t);if(a===0)return o;if(o===0)return a;const s=1e-10,r=100;let i=0;for(;o>s&&i<r;)[a,o]=[o,a%o],i++;return a},"gcd"),o6=n((e,t)=>Math.abs(e*t)/qO(e,t),"lcm");function n6(e){const t=e.length;if(t===0)return null;const a=e[0];let o=a[0],s=a[1],r=o+a[2],i=s+a[3];for(let l=1;l<t;l++){const u=e[l],c=u[0],d=u[1],p=c+u[2],f=d+u[3];c<o&&(o=c),d<s&&(s=d),p>r&&(r=p),f>i&&(i=f)}return{x:o,y:s,width:r-o,height:i-s}}n(n6,"computeUnionBounds");function XO(e,t){const a=t[0]+t[2],o=t[1]+t[3];for(const s of e)if(s.pos[0]<a&&s.pos[0]+s.size[0]>t[0]&&s.pos[1]<o&&s.pos[1]+s.size[1]>t[1])return!0;return!1}n(XO,"anyItemOverlapsRect");function Ll(e){return e.nodes.filter(t=>t.type==="Reroute")}n(Ll,"findLegacyRerouteNodes");function ZO(e){return!e.extra?.reroutes?.length&&!e.extra?.linkExtensions?.length}n(ZO,"noNativeReroutes");function JO(e){return[e.pos[0]+e.size[0]/2,e.pos[1]+e.size[1]/2]}n(JO,"getNodeCenter");var QO=class{static{n(this,"ConversionContext")}nodeById;linkById;rerouteById;rerouteByNodeId;linkExtensions;validReroutes;#e=0;constructor(e){this.workflow=e,this.nodeById=Be.keyBy(e.nodes.map(Be.cloneDeep),"id"),this.linkById=Be.keyBy(e.links.map(a=>({id:a[0],origin_id:a[1],origin_slot:a[2],target_id:a[3],target_slot:a[4],type:a[5]})),"id");const t=Ll(e).map((a,o)=>({nodeId:a.id,id:o+1,pos:JO(a),linkIds:[]}));this.#e=t.length+1,this.rerouteByNodeId=Be.keyBy(t,"nodeId"),this.rerouteById=Be.keyBy(t,"id"),this.linkExtensions=[],this.validReroutes=new Set}#t(e){const t=[];let a=e;for(;a?.type==="Reroute";){t.push(a);const o=this.linkById[a.inputs?.[0]?.link??0];if(!o)break;a=this.nodeById[o.origin_id]}return t}#a(e){const t=e.map(a=>this.rerouteByNodeId[a.id]);for(const a of t)this.validReroutes.add(a);for(let a=0;a<e.length-1;a++){const o=t[a];o.parentId=t[a+1].id}return t}#o(e,t,a){if(a.length===0)throw new Error("No reroute nodes found");const o=this.rerouteByNodeId[a[0].id];this.linkExtensions.push({id:t.id,parentId:o.id});const s=this.#a(a);for(const r of s)r.linkIds??=[],r.linkIds.push(t.id),delete r.floating;return{id:t.id,origin_id:e.origin_id,origin_slot:e.origin_slot,target_id:t.target_id,target_slot:t.target_slot,type:t.type}}#n(e,t){const a=this.#a(t);for(const o of a)o.linkIds?.length||(o.floating={slotType:"input"});return{id:this.#e++,origin_id:-1,origin_slot:-1,target_id:e.target_id,target_slot:e.target_slot,type:e.type,parentId:a[0].id}}#s(e,t){const a=this.#a(t);for(const o of a)o.linkIds?.length||(o.floating={slotType:"output"});return{id:this.#e++,origin_id:e.origin_id,origin_slot:e.origin_slot,target_id:-1,target_slot:-1,type:e.type,parentId:a[0].id}}#r(e,t){for(const o of e){for(const s of o.inputs??[])s.link=null;for(const s of o.outputs??[])s.links=[]}const a=Be.keyBy(e,"id");for(const o of t){a[o.origin_id].outputs[o.origin_slot].links.push(o.id);const s=a[o.target_id];s.inputs[o.target_slot].link=o.id}}migrateReroutes(){const e=[],t=[],a=[];for(const r of Object.values(this.linkById)){const i=!!this.rerouteByNodeId[r.origin_id],l=!!this.rerouteByNodeId[r.target_id];!i&&!l?e.push(r):i&&!l&&a.push(r)}for(const r of a){const i=this.nodeById[r.origin_id],l=this.#t(i),u=this.linkById[l[l.length-1]?.inputs?.[0]?.link??-1];u?e.push(this.#o(u,r,l)):t.push(this.#n(r,l))}const o=Object.keys(this.rerouteByNodeId).map(r=>this.nodeById[r]).filter(r=>{const i=r.outputs?.[0];return i?!i.links?.length:!1});for(const r of o){const i=this.#t(r),l=this.linkById[i[i.length-1]?.inputs?.[0]?.link??-1];l&&t.push(this.#s(l,i))}const s=Object.values(this.nodeById).filter(r=>r.type!=="Reroute");return this.#r(s,e),{...this.workflow,nodes:s,links:e.map(r=>[r.id,r.origin_id,r.origin_slot,r.target_id,r.target_slot,r.type]),floatingLinks:t.length>0?t:void 0,extra:{...this.workflow.extra,reroutes:Array.from(this.validReroutes).map(r=>Be.omit(r,"nodeId")),linkExtensions:this.linkExtensions}}}};const s6=n(e=>{if(Ll(e).length===0)return e;const t=JSON.parse(JSON.stringify(e));return t.extra||(t.extra={}),new QO(t).migrateReroutes()},"migrateLegacyRerouteNodes");function eN(e){try{if(!e.properties?.models?.length||!e.widgets_values)return;const t=Array.isArray(e.widgets_values)?e.widgets_values:Object.values(e.widgets_values);if(!t.length)return;const a=new Set;for(const o of t)typeof o=="string"&&o.trim()&&a.add(o);return e.properties.models.filter(o=>a.has(o.name))}catch(t){console.error("Error filtering models by current selection:",t)}}n(eN,"getSelectedModelsMetadata");function r6(e,t){const a={nodes:[],links:[]};let o=0;const s=[];for(const r of e)r.clonable!==!1&&(r._relative_id=o++,s.push(r));for(const r of s){const i=r.clone();if(!i){console.warn("node type not found: "+r.type);continue}if(a.nodes.push(i.serialize()),!!r.inputs?.length)for(const l of r.inputs){if(!l||l.link==null)continue;const u=t.links.get(l.link);if(!u)continue;const c=t.getNodeById(u.origin_id);c&&a.links.push([c._relative_id,u.origin_slot,r._relative_id,u.target_slot,c.id])}}return JSON.stringify(a)}n(r6,"serialise");function tN(e,t){if(!e)return;const{graph:a,graph_mouse:o}=t;t.emitBeforeChange();try{a.beforeChange();const s=JSON.parse(e),r=[1/0,1/0];for(const{pos:l}of s.nodes)r[0]>l[0]&&(r[0]=l[0]),r[1]>l[1]&&(r[1]=l[1]);(!Number.isFinite(r[0])||!Number.isFinite(r[1]))&&(r[0]=o[0],r[1]=o[1]);const i=[];for(const l of s.nodes){const u=Ne.createNode(l.type);u&&(u.configure(l),u.pos[0]+=o[0]-r[0],u.pos[1]+=o[1]-r[1],a.add(u,!0),i.push(u))}for(const l of s.links){const u=l[0],c=u!=null?i[u]:void 0,d=i[l[2]];c&&d?c.connect(l[1],d,l[3]):console.warn("Warning, nodes missing on pasting")}t.selectNodes(i),a.afterChange()}finally{t.emitAfterChange()}}n(tN,"deserialiseAndCreate");function Ol(e,t,...a){t??="";let o;typeof t=="string"?o=t:t instanceof Array?o=t.join(" "):o=Object.entries(t).reduce((s,r)=>(r[1]&&(s+=(s.length?" ":"")+r[0]),s),""),e.className=o,a&&e.classList.add(...a)}n(Ol,"applyClasses");function Pi(e,{onHide:t,onShow:a}={}){let o,s;return r=>{r?(s&&(s=!1,o.replaceWith(e)),a?.(e,r)):(o||(o=document.createComment("")),s=!0,e.replaceWith(o),t?.(e))}}n(Pi,"toggleElement");window.comfyAPI=window.comfyAPI||{};window.comfyAPI.utils=window.comfyAPI.utils||{};window.comfyAPI.utils.applyClasses=Ol;window.comfyAPI.utils.toggleElement=Pi;var dm=class{static{n(this,"ComfyButton")}#e=0;#t=!1;isOver=!1;iconElement=Ee("i.mdi");contentElement=Ee("span");popup;element;overIcon;iconSize;content;icon;tooltip;classList;hidden;enabled;action;constructor({icon:e,overIcon:t,iconSize:a,content:o,tooltip:s,action:r,classList:i="comfyui-button",visibilitySetting:l,app:u,enabled:c=!0}){if(this.element=Ee("button",{onmouseenter:n(()=>{this.isOver=!0,this.overIcon&&this.updateIcon()},"onmouseenter"),onmouseleave:n(()=>{this.isOver=!1,this.overIcon&&this.updateIcon()},"onmouseleave")},[this.iconElement,this.contentElement]),this.icon=Ft(this,"icon",e,Pi(this.iconElement,{onShow:this.updateIcon})),this.overIcon=Ft(this,"overIcon",t,()=>{this.isOver&&this.updateIcon()}),this.iconSize=Ft(this,"iconSize",a,this.updateIcon),this.content=Ft(this,"content",o,Pi(this.contentElement,{onShow:n((d,p)=>{typeof p=="string"?d.textContent=p:d.replaceChildren(p)},"onShow")})),this.tooltip=Ft(this,"tooltip",s,d=>{d?this.element.title=d:this.element.removeAttribute("title")}),s!==void 0&&this.element.setAttribute("aria-label",s),this.classList=Ft(this,"classList",i,this.updateClasses),this.hidden=Ft(this,"hidden",!1,this.updateClasses),this.enabled=Ft(this,"enabled",c,()=>{this.updateClasses(),this.element.disabled=!this.enabled}),this.action=Ft(this,"action",r),this.element.addEventListener("click",d=>{this.popup&&(this.#e||this.popup.toggle()),this.action?.(d,this)}),l?.id){const d=n(()=>{this.hidden=u.ui.settings.getSettingValue(l.id)!==l.showValue},"settingUpdated");u.ui.settings.addEventListener(l.id+".change",d),d()}}updateIcon=n(()=>this.iconElement.className=`mdi mdi-${this.isOver&&this.overIcon||this.icon}${this.iconSize?" mdi-"+this.iconSize+"px":""}`,"updateIcon");updateClasses=n(()=>{const e=[];this.hidden&&e.push("hidden"),this.enabled||e.push("disabled"),this.popup&&(this.#t?e.push("popup-open"):e.push("popup-closed")),Ol(this.element,this.classList,...e)},"updateClasses");withPopup(e,t="click"){if(this.popup=e,t==="hover")for(const a of[this.element,this.popup.element])a.addEventListener("mouseenter",()=>{this.popup.open=!!++this.#e}),a.addEventListener("mouseleave",()=>{this.popup.open=!!--this.#e});return e.addEventListener("change",()=>{this.#t=e.open,this.updateClasses()}),this}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.button=window.comfyAPI.button||{};window.comfyAPI.button.ComfyButton=dm;var Ds=class{static{n(this,"ComfyButtonGroup")}element=Ee("div.comfyui-button-group");buttons;constructor(...e){this.buttons=Ft(this,"buttons",e,()=>this.update())}insert(e,t){this.buttons.splice(t,0,e),this.update()}append(e){this.buttons.push(e),this.update()}remove(e){if(typeof e!="number"&&(e=this.buttons.indexOf(e)),e>-1){const t=this.buttons.splice(e,1);return this.update(),t}}update(){this.element.replaceChildren(...this.buttons.map(e=>e.element??e))}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.buttonGroup=window.comfyAPI.buttonGroup||{};window.comfyAPI.buttonGroup.ComfyButtonGroup=Ds;var pm=class extends EventTarget{static{n(this,"ComfyPopup")}element=Ee("div.comfyui-popup");open;children;target;ignoreTarget;container;position;closeOnEscape;horizontal;classList;constructor({target:e,container:t=document.body,classList:a="",ignoreTarget:o=!0,closeOnEscape:s=!0,position:r="absolute",horizontal:i="left"},...l){super(),this.target=e,this.ignoreTarget=o,this.container=t,this.position=r,this.closeOnEscape=s,this.horizontal=i,t.append(this.element),this.children=Ft(this,"children",l,()=>{this.element.replaceChildren(...this.children),this.update()}),this.classList=Ft(this,"classList",a,()=>Ol(this.element,this.classList,"comfyui-popup",i)),this.open=Ft(this,"open",!1,(u,c)=>{u!==c&&(u?this.#t():this.#e())})}toggle(){this.open=!this.open}#e(){this.element.classList.remove("open"),window.removeEventListener("resize",this.update),window.removeEventListener("click",this.#o,{capture:!0}),window.removeEventListener("keydown",this.#a,{capture:!0}),this.dispatchEvent(new CustomEvent("close")),this.dispatchEvent(new CustomEvent("change"))}#t(){this.element.classList.add("open"),this.update(),window.addEventListener("resize",this.update),window.addEventListener("click",this.#o,{capture:!0}),this.closeOnEscape&&window.addEventListener("keydown",this.#a,{capture:!0}),this.dispatchEvent(new CustomEvent("open")),this.dispatchEvent(new CustomEvent("change"))}#a=n(e=>{e.key==="Escape"&&(this.open=!1,e.preventDefault(),e.stopImmediatePropagation())},"#escHandler");#o=n(e=>{const t=e.target;!this.element.contains(t)&&this.ignoreTarget&&!this.target.contains(t)&&(this.open=!1)},"#clickHandler");update=n(()=>{const e=this.target.getBoundingClientRect();this.element.style.setProperty("--bottom","unset"),this.position==="absolute"?(this.horizontal==="left"?this.element.style.setProperty("--left",e.left+"px"):this.element.style.setProperty("--left",e.right-this.element.clientWidth+"px"),this.element.style.setProperty("--top",e.bottom+"px"),this.element.style.setProperty("--limit",e.bottom+"px")):(this.element.style.setProperty("--left","0px"),this.element.style.setProperty("--top",e.height+"px"),this.element.style.setProperty("--limit",e.height+"px")),this.element.getBoundingClientRect().height<30&&(this.element.style.setProperty("--top","unset"),this.element.style.setProperty("--bottom",e.height+5+"px"),this.element.style.setProperty("--limit",e.height+5+"px"))},"update")};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.popup=window.comfyAPI.popup||{};window.comfyAPI.popup.ComfyPopup=pm;var aN=class{static{n(this,"ComfySplitButton")}arrow;element;popup;items;constructor({primary:e,mode:t,horizontal:a="left",position:o="relative"},...s){this.arrow=new dm({icon:"chevron-down"}),this.element=Ee("div.comfyui-split-button"+(t==="hover"?".hover":""),[Ee("div.comfyui-split-primary",{ariaLabel:"Queue current workflow"},e.element),Ee("div.comfyui-split-arrow",{ariaLabel:"Open extra opens",ariaHasPopup:"true"},this.arrow.element)]),this.popup=new pm({target:this.element,container:o==="relative"?this.element:document.body,classList:"comfyui-split-button-popup"+(t==="hover"?" hover":""),closeOnEscape:t==="click",position:o,horizontal:a}),this.arrow.withPopup(this.popup,t),this.items=Ft(this,"items",s,()=>this.update())}update(){this.popup.element.replaceChildren(...this.items.map(e=>"element"in e?e.element:e))}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.splitButton=window.comfyAPI.splitButton||{};window.comfyAPI.splitButton.ComfySplitButton=aN;var oN=class fm extends dr{static{n(this,"ComfyAsyncDialog")}#e;constructor(t){super("dialog.comfy-dialog.comfyui-dialog",t?.map(a=>(typeof a=="string"&&(a={text:a}),Ee("button.comfyui-button",{type:"button",textContent:a.text,onclick:n(()=>this.close(a.value??a.text),"onclick")}))))}show(t){return this.element.addEventListener("close",()=>{this.close()}),super.show(t),new Promise(a=>{this.#e=a})}showModal(t){return this.element.addEventListener("close",()=>{this.close()}),super.show(t),this.element.showModal(),new Promise(a=>{this.#e=a})}close(t=null){this.#e(t),this.element.close(),super.close()}static async prompt({title:t=null,message:a,actions:o}){const s=new fm(o),r=[Ee("span",a)];t&&r.unshift(Ee("h3",t));const i=await s.showModal(r);return s.element.remove(),i}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.asyncDialog=window.comfyAPI.asyncDialog||{};window.comfyAPI.asyncDialog.ComfyAsyncDialog=oN;var mm=document.createElement("style");mm.textContent=`
|
|
190
|
+
`)}),l.fixed&&(r||e.add({severity:"success",summary:"Workflow Links Fixed",detail:`Fixed ${l.patched} node connections and removed ${l.deleted} invalid links.`})),l.graph}n(t,"tryFixLinks");async function a(o,s={}){const{silent:r=!1}=s;let i=null;const l=await uh(o,u=>{r||e.addAlert(u)});if(l)try{i=t(l,{silent:r})}catch(u){console.error(u)}return{graphData:i}}return n(a,"validateWorkflow"),{validateWorkflow:a}}n(GO,"useWorkflowValidation");const Dc=n(()=>{const e=zt();function t(r,i,l){const u={id:-1,type:l.id,pos:[0,0],size:[100,100],inputs:[],outputs:[],flags:{},order:0,mode:0};Tt().registerSubgraphNodeDef(r,i,u)}n(t,"registerLitegraphNode");function a(r){const{id:i,name:l}=r,u={input:{required:{}},output:[],output_is_list:[],output_name:[],output_tooltips:[],name:i,display_name:l,description:`Subgraph node for ${l}`,category:"subgraph",output_node:!1,python_module:"nodes"};return e.addNodeDef(u),u}n(a,"createNodeDef");function o(r){const i=r.definitions?.subgraphs;if(i)for(const l of i)s(Z.rootGraph.subgraphs.get(l.id)??Z.rootGraph.createSubgraph(l),l)}n(o,"loadSubgraphs");function s(r,i){t(a(i),r,i)}return n(s,"registerNewSubgraph"),{loadSubgraphs:o,registerNewSubgraph:s}},"useSubgraphService"),HO=Symbol();function jO(e){return e.constructor?.nodeData?.[HO]!==void 0}n(jO,"isGroupNode");var KO=class extends $d{static{n(this,"ExecutableGroupNodeDTO")}get isVirtualNode(){return!0}getInnerNodes(){return this.node.getInnerNodes?.(this.nodesByExecutionId)??[]}resolveOutput(e,t,a){if(this.mode===eo.BYPASS){const{inputs:l}=this,u=[e,...Object.keys(l).map(Number)].find(c=>l[c]?.type===t);return u===void 0?void 0:this.resolveInput(u,a)}const o=this.node.outputs[e]?.links?.at(0),s=this.node.graph?.getLink(o);if(!s)throw new Error(`Failed to get link for group node ${this.node.id} with link ${o}`);const r=this.node.updateLink?.(s);if(!r)throw new Error(`Failed to update link for group node ${this.node.id} with link ${o}`);const i=this.node.getInnerNodes?.(this.nodesByExecutionId).find(l=>l.id===r.origin_id);if(!i)throw new Error(`Failed to get node for group node ${this.node.id} with link ${o}`);return{node:i,origin_id:`${this.id}:${r.origin_id.split(":").at(-1)}`,origin_slot:r.origin_slot}}};const YO=n(async(e,t={})=>{const{sortNodes:a=!1}=t;for(const i of e.computeExecutionOrder(!1)){const l=i.getInnerNodes?i.getInnerNodes(new Map):[i];for(const u of l)u.isVirtualNode&&u.applyToGraph?.()}const o=e.serialize({sortNodes:a});for(const i of o.nodes){for(const l of i.inputs??[])delete l.localized_name;for(const l of i.outputs??[])delete l.localized_name}mC(o),o.extra??={},o.extra.frontendVersion="1.38.6";const s=new Map;for(const i of e.computeExecutionOrder(!1)){const l=jO(i)?new KO(i,[],s):new $d(i,[],s);for(const u of l.getInnerNodes())s.set(u.id,u);s.set(l.id,l)}const r={};for(const i of s.values()){if(i.isVirtualNode||i.mode===eo.NEVER||i.mode===eo.BYPASS)continue;const l={},{widgets:u}=i;if(u)for(const[c,d]of u.entries()){if(!d.name||d.options?.serialize===!1)continue;const p=d.serializeValue?await d.serializeValue(i,c):d.value;l[d.name]=Array.isArray(p)?{__value__:p}:p}for(const[c,d]of i.inputs.entries()){const p=i.resolveInput(c);if(p){if(p.widgetInfo){const{value:f}=p.widgetInfo;l[d.name]=Array.isArray(f)?{__value__:f}:f;continue}l[d.name]=[String(p.origin_id),parseInt(p.origin_slot)]}}r[String(i.id)]={inputs:l,class_type:i.comfyClass,_meta:{title:i.title}}}for(const{inputs:i}of Object.values(r))for(const[l,u]of Object.entries(i))Array.isArray(u)&&u.length===2&&!r[u[0]]&&delete i[l];return{workflow:o,output:r}},"graphToPrompt"),qO=n((e,t)=>{let a=Math.abs(e),o=Math.abs(t);if(a===0)return o;if(o===0)return a;const s=1e-10,r=100;let i=0;for(;o>s&&i<r;)[a,o]=[o,a%o],i++;return a},"gcd"),o6=n((e,t)=>Math.abs(e*t)/qO(e,t),"lcm");function n6(e){const t=e.length;if(t===0)return null;const a=e[0];let o=a[0],s=a[1],r=o+a[2],i=s+a[3];for(let l=1;l<t;l++){const u=e[l],c=u[0],d=u[1],p=c+u[2],f=d+u[3];c<o&&(o=c),d<s&&(s=d),p>r&&(r=p),f>i&&(i=f)}return{x:o,y:s,width:r-o,height:i-s}}n(n6,"computeUnionBounds");function XO(e,t){const a=t[0]+t[2],o=t[1]+t[3];for(const s of e)if(s.pos[0]<a&&s.pos[0]+s.size[0]>t[0]&&s.pos[1]<o&&s.pos[1]+s.size[1]>t[1])return!0;return!1}n(XO,"anyItemOverlapsRect");function Ll(e){return e.nodes.filter(t=>t.type==="Reroute")}n(Ll,"findLegacyRerouteNodes");function ZO(e){return!e.extra?.reroutes?.length&&!e.extra?.linkExtensions?.length}n(ZO,"noNativeReroutes");function JO(e){return[e.pos[0]+e.size[0]/2,e.pos[1]+e.size[1]/2]}n(JO,"getNodeCenter");var QO=class{static{n(this,"ConversionContext")}nodeById;linkById;rerouteById;rerouteByNodeId;linkExtensions;validReroutes;#e=0;constructor(e){this.workflow=e,this.nodeById=Be.keyBy(e.nodes.map(Be.cloneDeep),"id"),this.linkById=Be.keyBy(e.links.map(a=>({id:a[0],origin_id:a[1],origin_slot:a[2],target_id:a[3],target_slot:a[4],type:a[5]})),"id");const t=Ll(e).map((a,o)=>({nodeId:a.id,id:o+1,pos:JO(a),linkIds:[]}));this.#e=t.length+1,this.rerouteByNodeId=Be.keyBy(t,"nodeId"),this.rerouteById=Be.keyBy(t,"id"),this.linkExtensions=[],this.validReroutes=new Set}#t(e){const t=[];let a=e;for(;a?.type==="Reroute";){t.push(a);const o=this.linkById[a.inputs?.[0]?.link??0];if(!o)break;a=this.nodeById[o.origin_id]}return t}#a(e){const t=e.map(a=>this.rerouteByNodeId[a.id]);for(const a of t)this.validReroutes.add(a);for(let a=0;a<e.length-1;a++){const o=t[a];o.parentId=t[a+1].id}return t}#o(e,t,a){if(a.length===0)throw new Error("No reroute nodes found");const o=this.rerouteByNodeId[a[0].id];this.linkExtensions.push({id:t.id,parentId:o.id});const s=this.#a(a);for(const r of s)r.linkIds??=[],r.linkIds.push(t.id),delete r.floating;return{id:t.id,origin_id:e.origin_id,origin_slot:e.origin_slot,target_id:t.target_id,target_slot:t.target_slot,type:t.type}}#n(e,t){const a=this.#a(t);for(const o of a)o.linkIds?.length||(o.floating={slotType:"input"});return{id:this.#e++,origin_id:-1,origin_slot:-1,target_id:e.target_id,target_slot:e.target_slot,type:e.type,parentId:a[0].id}}#s(e,t){const a=this.#a(t);for(const o of a)o.linkIds?.length||(o.floating={slotType:"output"});return{id:this.#e++,origin_id:e.origin_id,origin_slot:e.origin_slot,target_id:-1,target_slot:-1,type:e.type,parentId:a[0].id}}#r(e,t){for(const o of e){for(const s of o.inputs??[])s.link=null;for(const s of o.outputs??[])s.links=[]}const a=Be.keyBy(e,"id");for(const o of t){a[o.origin_id].outputs[o.origin_slot].links.push(o.id);const s=a[o.target_id];s.inputs[o.target_slot].link=o.id}}migrateReroutes(){const e=[],t=[],a=[];for(const r of Object.values(this.linkById)){const i=!!this.rerouteByNodeId[r.origin_id],l=!!this.rerouteByNodeId[r.target_id];!i&&!l?e.push(r):i&&!l&&a.push(r)}for(const r of a){const i=this.nodeById[r.origin_id],l=this.#t(i),u=this.linkById[l[l.length-1]?.inputs?.[0]?.link??-1];u?e.push(this.#o(u,r,l)):t.push(this.#n(r,l))}const o=Object.keys(this.rerouteByNodeId).map(r=>this.nodeById[r]).filter(r=>{const i=r.outputs?.[0];return i?!i.links?.length:!1});for(const r of o){const i=this.#t(r),l=this.linkById[i[i.length-1]?.inputs?.[0]?.link??-1];l&&t.push(this.#s(l,i))}const s=Object.values(this.nodeById).filter(r=>r.type!=="Reroute");return this.#r(s,e),{...this.workflow,nodes:s,links:e.map(r=>[r.id,r.origin_id,r.origin_slot,r.target_id,r.target_slot,r.type]),floatingLinks:t.length>0?t:void 0,extra:{...this.workflow.extra,reroutes:Array.from(this.validReroutes).map(r=>Be.omit(r,"nodeId")),linkExtensions:this.linkExtensions}}}};const s6=n(e=>{if(Ll(e).length===0)return e;const t=JSON.parse(JSON.stringify(e));return t.extra||(t.extra={}),new QO(t).migrateReroutes()},"migrateLegacyRerouteNodes");function eN(e){try{if(!e.properties?.models?.length||!e.widgets_values)return;const t=Array.isArray(e.widgets_values)?e.widgets_values:Object.values(e.widgets_values);if(!t.length)return;const a=new Set;for(const o of t)typeof o=="string"&&o.trim()&&a.add(o);return e.properties.models.filter(o=>a.has(o.name))}catch(t){console.error("Error filtering models by current selection:",t)}}n(eN,"getSelectedModelsMetadata");function r6(e,t){const a={nodes:[],links:[]};let o=0;const s=[];for(const r of e)r.clonable!==!1&&(r._relative_id=o++,s.push(r));for(const r of s){const i=r.clone();if(!i){console.warn("node type not found: "+r.type);continue}if(a.nodes.push(i.serialize()),!!r.inputs?.length)for(const l of r.inputs){if(!l||l.link==null)continue;const u=t.links.get(l.link);if(!u)continue;const c=t.getNodeById(u.origin_id);c&&a.links.push([c._relative_id,u.origin_slot,r._relative_id,u.target_slot,c.id])}}return JSON.stringify(a)}n(r6,"serialise");function tN(e,t){if(!e)return;const{graph:a,graph_mouse:o}=t;t.emitBeforeChange();try{a.beforeChange();const s=JSON.parse(e),r=[1/0,1/0];for(const{pos:l}of s.nodes)r[0]>l[0]&&(r[0]=l[0]),r[1]>l[1]&&(r[1]=l[1]);(!Number.isFinite(r[0])||!Number.isFinite(r[1]))&&(r[0]=o[0],r[1]=o[1]);const i=[];for(const l of s.nodes){const u=Ne.createNode(l.type);u&&(u.configure(l),u.pos[0]+=o[0]-r[0],u.pos[1]+=o[1]-r[1],a.add(u,!0),i.push(u))}for(const l of s.links){const u=l[0],c=u!=null?i[u]:void 0,d=i[l[2]];c&&d?c.connect(l[1],d,l[3]):console.warn("Warning, nodes missing on pasting")}t.selectNodes(i),a.afterChange()}finally{t.emitAfterChange()}}n(tN,"deserialiseAndCreate");function Ol(e,t,...a){t??="";let o;typeof t=="string"?o=t:t instanceof Array?o=t.join(" "):o=Object.entries(t).reduce((s,r)=>(r[1]&&(s+=(s.length?" ":"")+r[0]),s),""),e.className=o,a&&e.classList.add(...a)}n(Ol,"applyClasses");function Pi(e,{onHide:t,onShow:a}={}){let o,s;return r=>{r?(s&&(s=!1,o.replaceWith(e)),a?.(e,r)):(o||(o=document.createComment("")),s=!0,e.replaceWith(o),t?.(e))}}n(Pi,"toggleElement");window.comfyAPI=window.comfyAPI||{};window.comfyAPI.utils=window.comfyAPI.utils||{};window.comfyAPI.utils.applyClasses=Ol;window.comfyAPI.utils.toggleElement=Pi;var dm=class{static{n(this,"ComfyButton")}#e=0;#t=!1;isOver=!1;iconElement=Ee("i.mdi");contentElement=Ee("span");popup;element;overIcon;iconSize;content;icon;tooltip;classList;hidden;enabled;action;constructor({icon:e,overIcon:t,iconSize:a,content:o,tooltip:s,action:r,classList:i="comfyui-button",visibilitySetting:l,app:u,enabled:c=!0}){if(this.element=Ee("button",{onmouseenter:n(()=>{this.isOver=!0,this.overIcon&&this.updateIcon()},"onmouseenter"),onmouseleave:n(()=>{this.isOver=!1,this.overIcon&&this.updateIcon()},"onmouseleave")},[this.iconElement,this.contentElement]),this.icon=Ft(this,"icon",e,Pi(this.iconElement,{onShow:this.updateIcon})),this.overIcon=Ft(this,"overIcon",t,()=>{this.isOver&&this.updateIcon()}),this.iconSize=Ft(this,"iconSize",a,this.updateIcon),this.content=Ft(this,"content",o,Pi(this.contentElement,{onShow:n((d,p)=>{typeof p=="string"?d.textContent=p:d.replaceChildren(p)},"onShow")})),this.tooltip=Ft(this,"tooltip",s,d=>{d?this.element.title=d:this.element.removeAttribute("title")}),s!==void 0&&this.element.setAttribute("aria-label",s),this.classList=Ft(this,"classList",i,this.updateClasses),this.hidden=Ft(this,"hidden",!1,this.updateClasses),this.enabled=Ft(this,"enabled",c,()=>{this.updateClasses(),this.element.disabled=!this.enabled}),this.action=Ft(this,"action",r),this.element.addEventListener("click",d=>{this.popup&&(this.#e||this.popup.toggle()),this.action?.(d,this)}),l?.id){const d=n(()=>{this.hidden=u.ui.settings.getSettingValue(l.id)!==l.showValue},"settingUpdated");u.ui.settings.addEventListener(l.id+".change",d),d()}}updateIcon=n(()=>this.iconElement.className=`mdi mdi-${this.isOver&&this.overIcon||this.icon}${this.iconSize?" mdi-"+this.iconSize+"px":""}`,"updateIcon");updateClasses=n(()=>{const e=[];this.hidden&&e.push("hidden"),this.enabled||e.push("disabled"),this.popup&&(this.#t?e.push("popup-open"):e.push("popup-closed")),Ol(this.element,this.classList,...e)},"updateClasses");withPopup(e,t="click"){if(this.popup=e,t==="hover")for(const a of[this.element,this.popup.element])a.addEventListener("mouseenter",()=>{this.popup.open=!!++this.#e}),a.addEventListener("mouseleave",()=>{this.popup.open=!!--this.#e});return e.addEventListener("change",()=>{this.#t=e.open,this.updateClasses()}),this}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.button=window.comfyAPI.button||{};window.comfyAPI.button.ComfyButton=dm;var Ds=class{static{n(this,"ComfyButtonGroup")}element=Ee("div.comfyui-button-group");buttons;constructor(...e){this.buttons=Ft(this,"buttons",e,()=>this.update())}insert(e,t){this.buttons.splice(t,0,e),this.update()}append(e){this.buttons.push(e),this.update()}remove(e){if(typeof e!="number"&&(e=this.buttons.indexOf(e)),e>-1){const t=this.buttons.splice(e,1);return this.update(),t}}update(){this.element.replaceChildren(...this.buttons.map(e=>e.element??e))}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.buttonGroup=window.comfyAPI.buttonGroup||{};window.comfyAPI.buttonGroup.ComfyButtonGroup=Ds;var pm=class extends EventTarget{static{n(this,"ComfyPopup")}element=Ee("div.comfyui-popup");open;children;target;ignoreTarget;container;position;closeOnEscape;horizontal;classList;constructor({target:e,container:t=document.body,classList:a="",ignoreTarget:o=!0,closeOnEscape:s=!0,position:r="absolute",horizontal:i="left"},...l){super(),this.target=e,this.ignoreTarget=o,this.container=t,this.position=r,this.closeOnEscape=s,this.horizontal=i,t.append(this.element),this.children=Ft(this,"children",l,()=>{this.element.replaceChildren(...this.children),this.update()}),this.classList=Ft(this,"classList",a,()=>Ol(this.element,this.classList,"comfyui-popup",i)),this.open=Ft(this,"open",!1,(u,c)=>{u!==c&&(u?this.#t():this.#e())})}toggle(){this.open=!this.open}#e(){this.element.classList.remove("open"),window.removeEventListener("resize",this.update),window.removeEventListener("click",this.#o,{capture:!0}),window.removeEventListener("keydown",this.#a,{capture:!0}),this.dispatchEvent(new CustomEvent("close")),this.dispatchEvent(new CustomEvent("change"))}#t(){this.element.classList.add("open"),this.update(),window.addEventListener("resize",this.update),window.addEventListener("click",this.#o,{capture:!0}),this.closeOnEscape&&window.addEventListener("keydown",this.#a,{capture:!0}),this.dispatchEvent(new CustomEvent("open")),this.dispatchEvent(new CustomEvent("change"))}#a=n(e=>{e.key==="Escape"&&(this.open=!1,e.preventDefault(),e.stopImmediatePropagation())},"#escHandler");#o=n(e=>{const t=e.target;!this.element.contains(t)&&this.ignoreTarget&&!this.target.contains(t)&&(this.open=!1)},"#clickHandler");update=n(()=>{const e=this.target.getBoundingClientRect();this.element.style.setProperty("--bottom","unset"),this.position==="absolute"?(this.horizontal==="left"?this.element.style.setProperty("--left",e.left+"px"):this.element.style.setProperty("--left",e.right-this.element.clientWidth+"px"),this.element.style.setProperty("--top",e.bottom+"px"),this.element.style.setProperty("--limit",e.bottom+"px")):(this.element.style.setProperty("--left","0px"),this.element.style.setProperty("--top",e.height+"px"),this.element.style.setProperty("--limit",e.height+"px")),this.element.getBoundingClientRect().height<30&&(this.element.style.setProperty("--top","unset"),this.element.style.setProperty("--bottom",e.height+5+"px"),this.element.style.setProperty("--limit",e.height+5+"px"))},"update")};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.popup=window.comfyAPI.popup||{};window.comfyAPI.popup.ComfyPopup=pm;var aN=class{static{n(this,"ComfySplitButton")}arrow;element;popup;items;constructor({primary:e,mode:t,horizontal:a="left",position:o="relative"},...s){this.arrow=new dm({icon:"chevron-down"}),this.element=Ee("div.comfyui-split-button"+(t==="hover"?".hover":""),[Ee("div.comfyui-split-primary",{ariaLabel:"Queue current workflow"},e.element),Ee("div.comfyui-split-arrow",{ariaLabel:"Open extra opens",ariaHasPopup:"true"},this.arrow.element)]),this.popup=new pm({target:this.element,container:o==="relative"?this.element:document.body,classList:"comfyui-split-button-popup"+(t==="hover"?" hover":""),closeOnEscape:t==="click",position:o,horizontal:a}),this.arrow.withPopup(this.popup,t),this.items=Ft(this,"items",s,()=>this.update())}update(){this.popup.element.replaceChildren(...this.items.map(e=>"element"in e?e.element:e))}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.splitButton=window.comfyAPI.splitButton||{};window.comfyAPI.splitButton.ComfySplitButton=aN;var oN=class fm extends dr{static{n(this,"ComfyAsyncDialog")}#e;constructor(t){super("dialog.comfy-dialog.comfyui-dialog",t?.map(a=>(typeof a=="string"&&(a={text:a}),Ee("button.comfyui-button",{type:"button",textContent:a.text,onclick:n(()=>this.close(a.value??a.text),"onclick")}))))}show(t){return this.element.addEventListener("close",()=>{this.close()}),super.show(t),new Promise(a=>{this.#e=a})}showModal(t){return this.element.addEventListener("close",()=>{this.close()}),super.show(t),this.element.showModal(),new Promise(a=>{this.#e=a})}close(t=null){this.#e(t),this.element.close(),super.close()}static async prompt({title:t=null,message:a,actions:o}){const s=new fm(o),r=[Ee("span",a)];t&&r.unshift(Ee("h3",t));const i=await s.showModal(r);return s.element.remove(),i}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.asyncDialog=window.comfyAPI.asyncDialog||{};window.comfyAPI.asyncDialog.ComfyAsyncDialog=oN;var mm=document.createElement("style");mm.textContent=`
|
|
191
191
|
.draggable-item {
|
|
192
192
|
position: relative;
|
|
193
193
|
will-change: transform;
|
|
@@ -201,7 +201,7 @@ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
|
201
201
|
}
|
|
202
202
|
`;document.head.append(mm);var nN=class extends EventTarget{static{n(this,"DraggableList")}listContainer;draggableItem;pointerStartX;pointerStartY;scrollYMax;itemsGap=0;items=[];itemSelector;handleClass="drag-handle";off=[];offDrag=[];constructor(e,t){super(),this.listContainer=e,this.itemSelector=t,this.listContainer&&(this.off.push(this.on(this.listContainer,"mousedown",this.dragStart)),this.off.push(this.on(this.listContainer,"touchstart",this.dragStart)),this.off.push(this.on(document,"mouseup",this.dragEnd)),this.off.push(this.on(document,"touchend",this.dragEnd)),this.off.push(this.on(document,"pointercancel",this.dragEnd)))}getAllItems(){return this.items?.length||(this.items=Array.from(this.listContainer.querySelectorAll(this.itemSelector)),this.items.forEach(e=>{e.classList.add("is-idle")})),this.items}getIdleItems(){return this.getAllItems().filter(e=>e.classList.contains("is-idle"))}isItemAbove(e){return e.hasAttribute("data-is-above")}isItemToggled(e){return e.hasAttribute("data-is-toggled")}on(e,t,a,o){return a=a.bind(this),e.addEventListener(t,a,o),()=>e.removeEventListener(t,a)}dragStart(e){e.button>0||(e.target.classList.contains(this.handleClass)&&(this.draggableItem=e.target.closest(this.itemSelector)),this.draggableItem&&(this.pointerStartX=e.clientX||e.touches[0].clientX,this.pointerStartY=e.clientY||e.touches[0].clientY,this.scrollYMax=this.listContainer.scrollHeight-this.listContainer.clientHeight,this.setItemsGap(),this.initDraggableItem(),this.initItemsState(),this.offDrag.push(this.on(document,"mousemove",this.drag)),this.offDrag.push(this.on(document,"touchmove",this.drag,{passive:!1})),this.dispatchEvent(new CustomEvent("dragstart",{detail:{element:this.draggableItem,position:this.getAllItems().indexOf(this.draggableItem)}}))))}setItemsGap(){if(this.getIdleItems().length<=1){this.itemsGap=0;return}const e=this.getIdleItems()[0],t=this.getIdleItems()[1],a=e.getBoundingClientRect(),o=t.getBoundingClientRect();this.itemsGap=Math.abs(a.bottom-o.top)}initItemsState(){this.getIdleItems().forEach((e,t)=>{this.getAllItems().indexOf(this.draggableItem)>t&&(e.dataset.isAbove="")})}initDraggableItem(){this.draggableItem.classList.remove("is-idle"),this.draggableItem.classList.add("is-draggable")}drag(e){if(!this.draggableItem)return;e.preventDefault();const t=e.clientX||e.touches[0].clientX,a=e.clientY||e.touches[0].clientY,o=this.listContainer.getBoundingClientRect();a>o.bottom?this.listContainer.scrollTop<this.scrollYMax&&(this.listContainer.scrollBy(0,10),this.pointerStartY-=10):a<o.top&&this.listContainer.scrollTop>0&&(this.pointerStartY+=10,this.listContainer.scrollBy(0,-10));const s=t-this.pointerStartX,r=a-this.pointerStartY;this.updateIdleItemsStateAndPosition(),this.draggableItem.style.transform=`translate(${s}px, ${r}px)`}updateIdleItemsStateAndPosition(){const e=this.draggableItem.getBoundingClientRect(),t=e.top+e.height/2;this.getIdleItems().forEach(a=>{const o=a.getBoundingClientRect(),s=o.top+o.height/2;this.isItemAbove(a)?t<=s?a.dataset.isToggled="":delete a.dataset.isToggled:t>=s?a.dataset.isToggled="":delete a.dataset.isToggled}),this.getIdleItems().forEach(a=>{if(this.isItemToggled(a)){const o=this.isItemAbove(a)?1:-1;a.style.transform=`translateY(${o*(e.height+this.itemsGap)}px)`}else a.style.transform=""})}dragEnd(){this.draggableItem&&(this.applyNewItemsOrder(),this.cleanup())}applyNewItemsOrder(){const e=[];let t=-1;this.getAllItems().forEach((a,o)=>{if(a===this.draggableItem){t=o;return}if(!this.isItemToggled(a)){e[o]=a;return}const s=this.isItemAbove(a)?o+1:o-1;e[s]=a});for(let a=0;a<this.getAllItems().length;a++)typeof e[a]>"u"&&(e[a]=this.draggableItem);e.forEach(a=>{this.listContainer.appendChild(a)}),this.items=e,this.dispatchEvent(new CustomEvent("dragend",{detail:{element:this.draggableItem,oldPosition:t,newPosition:e.indexOf(this.draggableItem)}}))}cleanup(){this.itemsGap=0,this.items=[],this.unsetDraggableItem(),this.unsetItemState(),this.offDrag.forEach(e=>e()),this.offDrag=[]}unsetDraggableItem(){this.draggableItem.style=null,this.draggableItem.classList.remove("is-draggable"),this.draggableItem.classList.add("is-idle"),this.draggableItem=null}unsetItemState(){this.getIdleItems().forEach(e=>{delete e.dataset.isAbove,delete e.dataset.isToggled,e.style.transform=""})}dispose(){this.off.forEach(e=>e())}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.draggableList=window.comfyAPI.draggableList||{};window.comfyAPI.draggableList.DraggableList=nN;var gm=class{static{n(this,"ComfyAppMenu")}app;actionsGroup;settingsGroup;viewGroup;element;constructor(e){this.app=e,this.actionsGroup=new Ds,this.settingsGroup=new Ds,this.viewGroup=new Ds,this.element=Ee("div.flex.gap-2.mx-2",[this.actionsGroup.element,this.settingsGroup.element,this.viewGroup.element])}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.index=window.comfyAPI.index||{};window.comfyAPI.index.ComfyAppMenu=gm;var Lc=1.2;function Yr(e="LG",t){if(!Me().get("Comfy.VueNodes.AutoScaleLayout"))return;const a=Z.canvas,o=t??a?.graph;if(!o?.nodes)return;const{shouldRenderVueNodes:s}=vr(),r=e==="LG"&&s.value,i=e==="Vue"&&!s.value;if(!r&&!i){o.extra.workflowRendererVersion??=e;return}const l=Bd(o.nodes);if(!l)return;const[u,c]=l,d=new Map(o.nodes.map(m=>[m.id,m])),p=[],f=r?Lc:1/Lc,g=!t||t===a?.graph;for(const m of o.nodes){const h=d.get(m.id);if(!h)continue;const[y,k]=h.pos,S=y-u,_=k-c,I=u+S*f,w=c+_*f,x=h.width*f,D=r?h.size[1]*f+Ne.NODE_TITLE_HEIGHT:(h.size[1]-Ne.NODE_TITLE_HEIGHT)*f;h.pos[0]=I,h.pos[1]=w,h.size[0]=x,h.size[1]=D,g&&p.push({nodeId:String(h.id),bounds:{x:I,y:w,width:x,height:D}})}g&&p.length>0&&kt.batchUpdateNodeBounds(p);for(const m of o.reroutes.values()){const[h,y]=m.pos,k=h-u,S=y-c,_=u+k*f,I=c+S*f;m.pos=[_,I],g&&s.value&&Od().moveReroute(m.id,{x:_,y:I},{x:h,y})}if("inputNode"in o&&"outputNode"in o){const m=[o.inputNode,o.outputNode];for(const h of m){const[y,k]=h.pos,[S,_]=h.size,I=y-u,w=k-c,x=u+I*f,D=c+w*f,T=S*f,N=_*f;h.pos=[x,D],h.size=[T,N]}}if(o.groups.forEach(m=>{const[h,y]=m.pos,[k,S]=m.size,_=h-u,I=y-c,w=u+_*f,x=c+I*f,D=k*f,T=S*f;m.pos=[w,x],m.size=[D,T]}),g&&a){const m=a.ds.convertOffsetToCanvas([u,c]);a.ds.changeScale(a.ds.scale/f,m)}o.extra.workflowRendererVersion=r?"Vue":"LG"}n(Yr,"ensureCorrectLayoutScale");async function sN(e){if(!e.dataTransfer)return;if(e.dataTransfer.files.length&&e.dataTransfer.files[0].type!=="image/bmp")return e.dataTransfer.files[0];const t=["text/uri-list","text/x-moz-url"],a=[...e.dataTransfer.types].find(r=>t.includes(r));if(!a)return;const o=e.dataTransfer.getData(a)?.split(`
|
|
203
203
|
`)?.[0];if(!o)return;const s=await(await fetch(o)).blob();return new File([s],o,{type:s.type})}n(sN,"extractFileFromDragEvent");function rN(){const e=window.getSelection();return e!==null&&e.toString().trim().length>0}n(rN,"hasTextSelection");function iN(e){return e instanceof HTMLTextAreaElement||e instanceof HTMLInputElement&&!["button","checkbox","file","hidden","image","radio","range","reset","search","submit"].includes(e.type)||gt().linearMode||rN()}n(iN,"shouldIgnoreCopyPaste");function lN(e){const t=e.getData("text/html").match(/data-metadata="([A-Za-z0-9+/=]+)"/)?.[1];if(!t)return!1;try{const a=atob(t),o=Uint8Array.from(a,r=>r.charCodeAt(0)),s=new TextDecoder().decode(o);return gt().getCanvas()._deserializeItems(JSON.parse(s),{}),!0}catch(a){console.error(a)}return!1}n(lN,"pasteClipboardItems");function Di(e,t,a){if(!t)return;const o=Array.from(e).filter(r=>r.type.startsWith(a)),s=o[0]?.getAsFile();s&&(t.pasteFile?.(s),t.pasteFiles?.(Array.from(o).map(r=>r.getAsFile()).filter(r=>r!==null)))}n(Di,"pasteItemsOnNode");function hm(e,t,a=null){const{graph:o,graph_mouse:[s,r]}=e;if(!a){const i=Ne.createNode("LoadImage");i&&(i.pos=[s,r],a=o?.add(i)??null),o?.change()}Di(t,a,"image")}n(hm,"pasteImageNode");const i6=n(()=>{const e=Ra(),t=gt();At(document,"paste",async a=>{if(iN(a.target)||e.shiftDown)return;const{canvas:o}=t;if(!o)return;const{graph:s}=o;let r=a.clipboardData;if(!r)throw new Error("No clipboard data on clipboard event");const{items:i}=r,l=o.current_node,u=l?.is_selected,c=u&&yl(l),d=u&&wl(l);let p=u&&uC(l)?l:null;const f=c?l:null,g=d?l:null;for(const h of i)if(h.type.startsWith("image/")){hm(o,i,f);return}else if(h.type.startsWith("video/")){if(g){Di(i,g,"video");return}}else if(h.type.startsWith("audio/")){if(!p){const y=Ne.createNode("LoadAudio");y&&(y.pos=[o.graph_mouse[0],o.graph_mouse[1]],p=s?.add(y)??null),s?.change()}Di(i,p,"audio");return}if(lN(r))return;r=r.getData("text/plain");let m=null;try{r=r.slice(r.indexOf("{")),m=JSON.parse(r)}catch{try{r=r.slice(r.indexOf(`workflow
|
|
204
|
-
`)),r=r.slice(r.indexOf("{")),m=JSON.parse(r)}catch{m=null}}if(m&&m.version&&m.nodes&&m.extra)await Z.loadGraphData(m);else{if(a.target instanceof HTMLTextAreaElement&&a.target.type==="textarea"||a.target instanceof HTMLInputElement&&a.target.type==="text")return;o.pasteFromClipboard()}})},"usePaste"),Ls="$$comfy_animation_preview";function uN(e){let t={"&":"","<":"",">":"",'"':"","'":"","`":"","=":""};return String(e).replace(/[&<>"'`=]/g,n(function(o){return t[o]},"fromEntityMap"))}n(uN,"sanitizeNodeName");var Vo=class at{static{n(this,"ComfyApp")}queueItems=[];processingQueue=!1;static clipspace=null;static clipspace_invalidate_handler=null;static open_maskeditor=null;static maskeditor_is_opended=null;static clipspace_return_node=null;vueAppReady;api;ui;extensionManager;_nodeOutputs;nodePreviewImages;rootGraphInternal;get graph(){return this.rootGraphInternal}get rootGraph(){return this.rootGraphInternal||console.error("ComfyApp graph accessed before initialization"),this.rootGraphInternal}canvas;dragOverNode=null;canvasElRef=Qt();get canvasEl(){return b(this.canvasElRef)}configuringGraphLevel=0;get configuringGraph(){return this.configuringGraphLevel>0}ctx;bodyTop;bodyLeft;bodyRight;bodyBottom;canvasContainer;menu;openClipspace=n(()=>{},"openClipspace");positionConversion;get lastNodeErrors(){return Ot().lastNodeErrors}get lastExecutionError(){return Ot().lastExecutionError}get runningNodeId(){return Ot().executingNodeId}get shiftDown(){return Ra().shiftDown}get widgets(){return Object.fromEntries(jn().widgets.entries())}get storageLocation(){return"server"}get isNewUserSession(){return!1}get extensions(){return tl().extensions}get progress(){return Ot()._executingNodeProgress}static isImageNode(t){return yl(t)}resetView(){Tt().resetView()}constructor(){this.vueAppReady=!1,this.ui=new dp(this),this.api=oe,this.bodyTop=Ee("div.comfyui-body-top"),this.bodyLeft=Ee("div.comfyui-body-left"),this.bodyRight=Ee("div.comfyui-body-right"),this.bodyBottom=Ee("div.comfyui-body-bottom"),this.canvasContainer=Ee("div.graph-canvas-container"),this.menu=new gm(this),this.nodeOutputs={},this.nodePreviewImages={}}get nodeOutputs(){return this._nodeOutputs}set nodeOutputs(t){this._nodeOutputs=t,this.vueAppReady&&Lt().invokeExtensions("onNodeOutputsUpdated",t)}getPreviewFormatParam(){let t=Me().get("Comfy.PreviewFormat");return t?`&preview=${t}`:""}getRandParam(){return qe?"":"&rand="+Math.random()}static onClipspaceEditorSave(){at.clipspace_return_node&&at.pasteFromClipspace(at.clipspace_return_node)}static onClipspaceEditorClosed(){at.clipspace_return_node=null}static copyToClipspace(t){var a=null;t.widgets&&(a=t.widgets.map(({type:c,name:d,value:p})=>({type:c,name:d,value:p})));var o=void 0,s=void 0;if(t.imgs!=null){o=[],s=[];for(let c=0;c<t.imgs.length;c++)o[c]=new Image,o[c].src=t.imgs[c].src,s[c]=o[c]}var r=0;t.imageIndex&&(r=t.imageIndex);const i=o?o.length+1:1,l=o?o.length+2:2,u=t.images??Gt().getNodeOutputs(t)?.images;at.clipspace={widgets:a,imgs:o,original_imgs:s,images:u,selectedIndex:r,img_paste_mode:"selected",paintedIndex:i,combinedIndex:l},at.clipspace_return_node=null,at.clipspace_invalidate_handler&&at.clipspace_invalidate_handler()}static pasteFromClipspace(t){if(at.clipspace){let a;if(at.clipspace.combinedIndex!==void 0&&at.clipspace.imgs&&at.clipspace.combinedIndex<at.clipspace.imgs.length&&(a=at.clipspace.imgs[at.clipspace.combinedIndex].src),at.clipspace.imgs&&t.imgs&&(at.clipspace.images&&(at.clipspace.img_paste_mode=="selected"?t.images=[at.clipspace.images[at.clipspace.selectedIndex]]:t.images=at.clipspace.images,Z.nodeOutputs[t.id+""]&&(Z.nodeOutputs[t.id+""].images=t.images)),at.clipspace.imgs))if(at.clipspace.img_paste_mode=="selected"){const o=new Image;o.src=at.clipspace.imgs[at.clipspace.selectedIndex].src,t.imgs=[o],t.imageIndex=0}else{const o=[];for(let s=0;s<at.clipspace.imgs.length;s++)o[s]=new Image,o[s].src=at.clipspace.imgs[s].src,t.imgs=o}if(at.clipspace.imgs?.[at.clipspace.paintedIndex]&&t.imgs){const o=new Image;o.src=at.clipspace.imgs[at.clipspace.paintedIndex].src,t.imgs.push(o)}if(at.clipspace.imgs?.[at.clipspace.combinedIndex]&&t.imgs&&a){const o=new Image;o.src=a,t.imgs=[o]}if(t.widgets){if(at.clipspace.images){const o=at.clipspace.images[at.clipspace.selectedIndex],s=t.widgets.findIndex(r=>r.name==="image");s>=0&&(t.widgets[s].type!="image"&&typeof t.widgets[s].value=="string"&&o.filename?t.widgets[s].value=(o.subfolder?o.subfolder+"/":"")+o.filename+(o.type?` [${o.type}]`:""):t.widgets[s].value=o)}at.clipspace.widgets&&t.widgets&&at.clipspace.widgets.forEach(({type:o,name:s,value:r})=>{const i=t.widgets?.find(l=>l.type===o&&l.name===s);if(i&&i.type!="button"){const l=r;if(i.type!="image"&&typeof i.value=="string"&&l?.filename){const u=r;i.value=(u.subfolder?u.subfolder+"/":"")+u.filename+(u.type?` [${u.type}]`:"")}else i.value=r,i.callback?.(r)}})}Z.canvas.setDirty(!0),Gt().updateNodeImages(t)}}addDropHandler(){At(document,"drop",async t=>{try{t.preventDefault(),t.stopPropagation();const a=this.dragOverNode;if(this.dragOverNode=null,await a?.onDragDrop?.(t))return;const o=await sN(t);if(!o)return;const s=Ra();try{s.spinner=!0,await this.handleFile(o,"file_drop")}finally{s.spinner=!1}}catch(a){Oe().addAlert(G("toastMessages.dropFileError",{error:a}))}}),At(this.canvasElRef,"dragleave",async()=>{this.dragOverNode&&(this.dragOverNode=null,this.canvas.setDirty(!1,!0))}),At(this.canvasElRef,"dragover",t=>{this.canvas.adjustMouseEvent(t);const a=this.canvas.graph?.getNodeOnPos(t.canvasX,t.canvasY);if(!a?.onDragOver?.(t)){this.dragOverNode=null;return}this.dragOverNode=a,requestAnimationFrame(()=>{this.canvas.setDirty(!1,!0)})},!1)}addProcessKeyHandler(){const t=va.prototype.processKey;va.prototype.processKey=function(a){if(this.graph&&!(a.target instanceof Element&&a.target.localName=="input")){if(a.type=="keydown"&&!a.repeat){const o=Zd.fromEvent(a),s=sl().getKeybinding(o);if(s&&s.targetElementId==="graph-canvas-container"){Pt().execute(s.commandId),this.graph.change(),a.preventDefault(),a.stopImmediatePropagation();return}if(a.key==="c"&&(a.metaKey||a.ctrlKey)||(a.key==="v"||a.key=="V")&&(a.metaKey||a.ctrlKey)&&!a.shiftKey)return}return t.apply(this,[a])}}}addApiUpdateHandlers(){oe.addEventListener("status",({detail:t})=>{this.ui.setStatus(t)}),oe.addEventListener("progress",()=>{this.canvas.setDirty(!0,!1)}),oe.addEventListener("executing",()=>{this.canvas.setDirty(!0,!1)}),oe.addEventListener("executed",({detail:t})=>{const a=Gt(),o=String(t.display_node||t.node);a.setNodeOutputsByExecutionId(o,t.output,{merge:t.merge});const s=Fs(this.rootGraph,o);s&&s.onExecuted&&s.onExecuted(t.output)}),oe.addEventListener("execution_start",()=>{Tr(this.rootGraph,"onExecutionStart")}),oe.addEventListener("execution_error",({detail:t})=>{if(t.exception_message?.includes("Unauthorized: Please login first to use this node."))pt().showApiNodesSignInDialog([t.node_type]);else if(t.exception_message?.includes("Payment Required: Please add credits to your account to use this node.")){const{isActiveSubscription:a}=nn();a.value&&pt().showTopUpCreditsDialog({isInsufficientCredits:!0})}else pt().showExecutionErrorDialog(t);this.canvas.draw(!0,!0)}),oe.addEventListener("b_preview_with_metadata",({detail:t})=>{const{blob:a,displayNodeId:o}=t,{setNodePreviewsByExecutionId:s,revokePreviewsByExecutionId:r}=Gt();r(o);const i=URL.createObjectURL(a),l=o.split(":");for(let u=1;u<=l.length;u++)s(l.slice(0,u).join(":"),[i])}),oe.init()}addConfigureHandler(){const t=this,a=Cs.prototype.configure;Cs.prototype.configure=function(...o){t.configuringGraphLevel++;try{return a.apply(this,o)}finally{t.configuringGraphLevel--}}}addAfterConfigureHandler(t){const{onConfigure:a}=t;t.onConfigure=function(...o){Bp(this),Tr(this,"onGraphConfigured");const s=a?.apply(this,o);return Tr(this,"onAfterGraphConfigured"),s}}async setup(t){this.bodyTop=document.getElementById("comfyui-body-top"),this.bodyLeft=document.getElementById("comfyui-body-left"),this.bodyRight=document.getElementById("comfyui-body-right"),this.bodyBottom=document.getElementById("comfyui-body-bottom"),this.canvasContainer=document.getElementById("graph-canvas-container"),this.canvasElRef.value=t,await Ra().workflow.syncWorkflows(),Ia().fetchSubgraphs(),await Lt().loadExtensions(),this.addProcessKeyHandler(),this.addConfigureHandler(),this.addApiUpdateHandlers();const a=new Cs;a.events.addEventListener("subgraph-created",o=>{try{const{subgraph:s,data:r}=o.detail;Dc().registerNewSubgraph(s,r)}catch(s){console.error("Failed to register subgraph",s),Oe().add({severity:"error",summary:"Failed to register subgraph",detail:s instanceof Error?s.message:String(s)})}}),this.addAfterConfigureHandler(a),this.rootGraphInternal=a,this.canvas=new va(t,a),this.canvas.state=_d(this.canvas.state),this.ctx=t.getContext("2d"),Ne.alt_drag_do_clone_nodes=!0,Ne.macGesturesRequireMac=!1,this.canvas.canvas.addEventListener("litegraph:set-graph",o=>{const{newGraph:s}=o.detail,r=Ua(),i=Object.fromEntries(s.nodes.flatMap(l=>l.widgets??[]).filter(l=>l instanceof Nn||l instanceof lr).map(l=>[l.id,l]));for(const[l,u]of r.widgetStates.entries())l in i?(u.active=!0,u.widget=i[l]):u.active=!1}),this.canvas.canvas.addEventListener("litegraph:set-graph",o=>{const{newGraph:s,oldGraph:r}=o.detail;r&&Yr(s.extra.workflowRendererVersion,s)}),FO(this.canvas),this.rootGraph.start(),Gi(this.canvasElRef,([o])=>{o.target instanceof HTMLCanvasElement&&this.resizeCanvas(o.target)}),await Lt().invokeExtensionsAsync("init"),await this.registerNodes(),this.addDropHandler(),await Lt().invokeExtensionsAsync("setup"),this.positionConversion=Vd(this.canvasContainer,this.canvas)}resizeCanvas(t){const a=Math.max(window.devicePixelRatio,1);t.height=t.width=NaN;const{width:o,height:s}=t.getBoundingClientRect();t.width=Math.round(o*a),t.height=Math.round(s*a),t.getContext("2d")?.scale(a,a),this.canvas?.draw(!0,!0)}updateVueAppNodeDefs(t){const a={};for(const[i,l]of Object.entries(Ne.registered_node_types))i in t||i in hc||l.skip_list||(a[i]={name:i,display_name:i,category:l.category||"__frontend_only__",input:{required:{},optional:{}},output:[],output_name:[],output_is_list:[],output_node:!1,python_module:"custom_nodes.frontend_only",description:l.description??`Frontend only node for ${i}`});const o={...a,...t,...hc},s=zt(),r=Object.values(o);Lt().invokeExtensions("beforeRegisterVueAppNodeDefs",r,this),s.updateNodeDefs(r)}async getNodeDefs(){const t=n(a=>({...a,display_name:De(`nodeDefs.${a.name}.display_name`,a.display_name??a.name),description:a.description?De(`nodeDefs.${a.name}.description`,a.description):"",category:a.category.split("/").map(o=>De(`nodeCategories.${o}`,o)).join("/")}),"translateNodeDef");return Be.mapValues(await oe.getNodeDefs(),a=>t(a))}async registerNodes(){const t=await this.getNodeDefs();await this.registerNodesFromDefs(t),await Lt().invokeExtensionsAsync("registerCustomNodes"),this.vueAppReady&&this.updateVueAppNodeDefs(t)}async registerNodeDef(t,a){return await Tt().registerNodeDef(t,a)}async registerNodesFromDefs(t){await Lt().invokeExtensionsAsync("addCustomNodeDefs",t);for(const a in t)this.registerNodeDef(a,t[a])}loadTemplateData(t){if(!t?.templates)return;const a=localStorage.getItem("litegrapheditor_clipboard");for(const o of t.templates){if(!o?.data)continue;JSON.parse(o.data).reroutes?(localStorage.setItem("litegrapheditor_clipboard",o.data),Z.canvas.pasteFromClipboard()):tN(o.data,Z.canvas);let s;for(const r in Z.canvas.selected_nodes){const i=Z.canvas.selected_nodes[r],l=i.pos[1]+i.size[1];(s===void 0||l>s)&&(s=l)}s!==void 0&&(Z.canvas.graph_mouse[1]=s+50)}a!==null&&localStorage.setItem("litegrapheditor_clipboard",a)}showMissingNodesError(t){Me().get("Comfy.Workflow.ShowMissingNodesWarning")&&pt().showLoadWorkflowWarning({missingNodeTypes:t})}showMissingModelsError(t,a){Me().get("Comfy.Workflow.ShowMissingModelsWarning")&&pt().showMissingModelsWarning({missingModels:t,paths:a})}async loadGraphData(t,a=!0,o=!0,s=null,r={}){const{showMissingNodesDialog:i=!0,showMissingModelsDialog:l=!0,checkForRerouteMigration:u=!1,openSource:c}=r;_a().beforeLoadNewGraph(),a!==!1&&this.clean();let d=!1;if((!t||typeof t!="object"||Array.isArray(t))&&(t=cr,d=!0),t=pp(t),Me().get("Comfy.Validation.Workflows")){const{graphData:I}=await GO().validateWorkflow(t);t=I??t}u&&t.version===.4&&Ll(t).length&&ZO(t)&&Oe().add({group:"reroute-migration",severity:"warn"}),Dc().loadSubgraphs(t);const p=[],f=[];await Lt().invokeExtensionsAsync("beforeConfigureGraph",t,p);const g=[],m=n((I,w="")=>{if(!Array.isArray(I)){console.warn("Workflow nodes data is missing or invalid, skipping node processing",{nodes:I,path:w});return}for(let x of I){x.type=="T2IAdapterLoader"&&(x.type="ControlNetLoader"),x.type=="ConditioningAverage "&&(x.type="ConditioningAverage"),x.type=="SDV_img2vid_Conditioning"&&(x.type="SVD_img2vid_Conditioning"),x.type=="Load3DAnimation"&&(x.type="Load3D"),x.type=="Preview3DAnimation"&&(x.type="Preview3D"),x.type in Ne.registered_node_types||(w?p.push({type:x.type,hint:`in subgraph '${w}'`}):p.push(x.type),x.type=uN(x.type));const D=eN(x);D?.length&&g.push(...D)}},"collectMissingNodesAndModels");if(m(t.nodes),t.definitions?.subgraphs)for(const I of t.definitions.subgraphs)lh(I)&&m(I.nodes,I.name||I.id);const h=t.models;h?.length&&g.push(...h);const y=n(I=>I.url||I.hash,"getModelKey"),k=g.filter(y),S=Be.uniqBy(k,y);if(S.length&&Me().get("Comfy.Workflow.ShowMissingModelsWarning")){const I=Rf();await I.loadModelFolders();for(const w of S){const x=await I.getLoadedModelFolder(w.directory);x||(w.directory_invalid=!0);const D=x?.models;D&&Object.values(D).some(T=>T.file_name===w.name)||f.push(w)}}try{this.rootGraph.configure(t);const I=this.rootGraph.extra.workflowRendererVersion;Yr(I);for(const w of this.rootGraph.subgraphs.values())Yr(w.extra.workflowRendererVersion||I,w);o&&Me().get("Comfy.EnableWorkflowViewRestore")&&(t.extra?.ds?(this.canvas.ds.offset=t.extra.ds.offset,this.canvas.ds.scale=t.extra.ds.scale,this.canvas.ds.computeVisibleArea(this.canvas.viewport),this.canvas.visible_area.width&&this.canvas.visible_area.height&&!XO(this.rootGraph._nodes,this.canvas.visible_area)&&requestAnimationFrame(()=>Tt().fitView())):Tt().fitView())}catch(I){pt().showErrorDialog(I,{title:G("errorDialog.loadWorkflowTitle"),reportType:"loadWorkflowError"}),console.error(I);return}if(bs(this.rootGraph,I=>{const w=I.computeSize();if(w[0]=Math.max(I.size[0],w[0]),w[1]=Math.max(I.size[1],w[1]),I.setSize(w),I.widgets){for(let x of I.widgets)if((I.type=="KSampler"||I.type=="KSamplerAdvanced")&&x.name=="sampler_name"&&typeof x.value=="string"&&x.value.startsWith("sample_")&&(x.value=x.value.slice(7)),(I.type=="KSampler"||I.type=="KSamplerAdvanced"||I.type=="PrimitiveNode")&&x.name=="control_after_generate"&&(x.value===!0?x.value="randomize":x.value===!1&&(x.value="fixed")),d&&x.type=="combo"){const D=x.options.values;D&&D.length>0&&!D.includes(x.value)&&(x.value=D[0])}}Lt().invokeExtensions("loadedGraphNode",I)}),p.length&&i&&this.showMissingNodesError(p),f.length&&l){const I=await oe.getFolderPaths();this.showMissingModelsError(f,I)}await Lt().invokeExtensionsAsync("afterConfigureGraph",p);const _={missing_node_count:p.length,missing_node_types:p.map(I=>typeof I=="string"?I:I.type),open_source:c??"unknown"};yt()?.trackWorkflowOpened(_),yt()?.trackWorkflowImported(_),await _a().afterLoadNewGraph(s,this.rootGraph.serialize()),requestAnimationFrame(()=>{this.canvas.setDirty(!0,!0)})}async graphToPrompt(t=this.rootGraph){return YO(t,{sortNodes:Me().get("Comfy.Workflow.SortNodeIdOnSave")})}async queuePrompt(t,a=1,o){if(this.queueItems.push({number:t,batchCount:a,queueNodeIds:o}),this.processingQueue)return!1;this.processingQueue=!0;const s=Ot();s.lastNodeErrors=null;let r=await Pa().getIdToken(),i=Gn().getApiKey();try{for(;this.queueItems.length;){const{number:l,batchCount:u,queueNodeIds:c}=this.queueItems.pop(),d=Me().get("Comfy.Execution.PreviewMethod");for(let p=0;p<u;p++){bs(this.rootGraph,m=>{for(const h of m.widgets??[])h.beforeQueued?.()});const f=await this.graphToPrompt(this.rootGraph),g=Zi(this.rootGraph);try{oe.authToken=r,oe.apiKey=i??void 0;const m=await oe.queuePrompt(l,f,{partialExecutionTargets:c,previewMethod:d});if(delete oe.authToken,delete oe.apiKey,s.lastNodeErrors=m.node_errors??null,s.lastNodeErrors?.length)this.canvas.draw(!0,!0);else try{m.prompt_id&&s.storePrompt({id:m.prompt_id,nodes:Object.keys(f.output),workflow:Ra().workflow.activeWorkflow})}catch{}}catch(m){pt().showErrorDialog(m,{title:G("errorDialog.promptExecutionError"),reportType:"promptExecutionError"}),console.error(m),m instanceof Ih&&(s.lastNodeErrors=m.response.node_errors??null,this.canvas.draw(!0,!0));break}fC(g,"afterQueued"),this.canvas.draw(!0,!0),await this.ui.queue.update()}}}finally{this.processingQueue=!1}return oe.dispatchCustomEvent("promptQueued",{number:t,batchCount:a}),!s.lastNodeErrors}showErrorOnFileLoad(t){Oe().addAlert(G("toastMessages.fileLoadError",{fileName:t.name}))}async handleFile(t,a){const o=t.name.replace(/\.\w+$/,""),s=await xl(t);if(Be.isEmpty(s)){if(t.type.startsWith("image")){const c=new DataTransfer;c.items.add(t),hm(this.canvas,c.items);return}this.showErrorOnFileLoad(t);return}const{workflow:r,prompt:i,parameters:l,templates:u}=s;if(u&&typeof u=="object"&&Array.isArray(u)&&this.loadTemplateData({templates:u}),r){let c;try{if(c=typeof r=="string"?JSON.parse(r):r,c&&typeof c=="object"&&!Array.isArray(c)){await this.loadGraphData(c,!0,!0,o,{openSource:a});return}else console.error("Invalid workflow structure, trying parameters fallback"),this.showErrorOnFileLoad(t)}catch(d){console.error("Failed to parse workflow:",d),this.showErrorOnFileLoad(t)}}if(i)try{const c=typeof i=="string"?JSON.parse(i):i;if(this.isApiJson(c)){this.loadApiJson(c,o);return}}catch(c){console.error("Failed to parse prompt:",c)}if(l&&typeof l=="string"){_a().beforeLoadNewGraph(),Mf(this.rootGraph,l),_a().afterLoadNewGraph(o,this.rootGraph.serialize());return}this.showErrorOnFileLoad(t)}isApiJson(t){return!Be.isObject(t)||Array.isArray(t)||Object.keys(t).length===0?!1:Object.values(t).every(a=>{if(!a||typeof a!="object"||Array.isArray(a))return!1;const{class_type:o,inputs:s}=a,r=Be.isObject(s)&&!Array.isArray(s);return typeof o=="string"&&r})}loadApiJson(t,a){_a().beforeLoadNewGraph();const o=Object.values(t).filter(i=>!Ne.registered_node_types[i.class_type]);if(o.length){this.showMissingNodesError(o.map(i=>i.class_type));return}const s=Object.keys(t);Z.rootGraph.clear();for(const i of s){const l=t[i],u=Ne.createNode(l.class_type);u&&(u.id=isNaN(+i)?i:+i,u.title=l._meta?.title??u.title,Z.rootGraph.add(u))}const r=n(i=>{const l=t[i],u=Z.rootGraph.getNodeById(i);if(u)for(const c in l.inputs??{}){const d=l.inputs[c];if(d instanceof Array){const[p,f]=d,g=Z.rootGraph.getNodeById(p);if(!g)continue;let m=u.inputs?.findIndex(h=>h.name===c)??-1;if(m===-1)try{const h=u.widgets?.find(k=>k.name===c),y=u.convertWidgetToInput;h&&y?.(h)&&(m=u.inputs?.findIndex(k=>k.name===c)??-1)}catch{}m!==-1&&g.connect(f,u,m)}else{const p=u.widgets?.find(f=>f.name===c);p&&(p.value=d,p.callback?.(d))}}},"processNodeInputs");for(const i of s)r(i);Z.rootGraph.arrange();for(const i of s)r(i);Z.rootGraph.arrange(),_a().afterLoadNewGraph(a,this.rootGraph.serialize())}registerExtension(t){Lt().registerExtension(t)}collectCanvasMenuItems(t){return Lt().invokeExtensions("getCanvasMenuItems",t).flat()}collectNodeMenuItems(t){return Lt().invokeExtensions("getNodeMenuItems",t).flat()}async refreshComboInNodes(){const t={severity:"info",summary:G("g.update"),detail:G("toastMessages.updateRequested")};this.vueAppReady&&Oe().add(t);const a=await this.getNodeDefs();for(const o in a)this.registerNodeDef(o,a[o]);bs(this.rootGraph,o=>{const s=a[o.type];if(o.refreshComboInNode?.(a),!!s?.input&&o.widgets){const r=s.input;for(const i of o.widgets)if(i.type==="combo"){let l;if(r.required?.[i.name]!==void 0?l="required":r.optional?.[i.name]!==void 0&&(l="optional"),l!==void 0){const u=r[l]?.[i.name];u&&(ul(u)?i.options.values=u[1]?.options:ll(u)&&(i.options.values=u[0]))}}}}),await Lt().invokeExtensionsAsync("refreshComboInNodes",a),this.vueAppReady&&(this.updateVueAppNodeDefs(a),Oe().remove(t),Oe().add({severity:"success",summary:G("g.updated"),detail:G("toastMessages.nodeDefinitionsUpdated"),life:1e3}))}clean(){Gt().resetAllOutputsAndPreviews();const t=Ot();t.lastNodeErrors=null,t.lastExecutionError=null,Ua().clear(),this.rootGraph&&!this.canvas.subgraph&&this.rootGraph.clear()}clientPosToCanvasPos(t){if(!this.positionConversion)throw new Error("clientPosToCanvasPos called before setup");return this.positionConversion.clientPosToCanvasPos(t)}canvasPosToClientPos(t){if(!this.positionConversion)throw new Error("canvasPosToClientPos called before setup");return this.positionConversion.canvasPosToClientPos(t)}};const Z=new Vo;window.comfyAPI=window.comfyAPI||{};window.comfyAPI.app=window.comfyAPI.app||{};window.comfyAPI.app.ANIM_PREVIEW_WIDGET=Ls;window.comfyAPI.app.ComfyApp=Vo;window.comfyAPI.app.app=Z;const l6=Je("titleEditor",()=>({titleEditorTarget:Qt(null)})),gt=Je("canvas",()=>{const e=Qt(null),t=A([]),a=n(()=>{t.value=Array.from(e.value?.selectedItems??[]).map(y=>bt(y))},"updateSelectedItems"),o=A(100),s=A(!1);let r;const i=n(()=>{Z.canvas?.ds&&(r=Z.canvas.ds.onChanged,o.value=Math.round(Z.canvas.ds.scale*100),Z.canvas.ds.onChanged=()=>{Z.canvas?.ds?.scale&&(o.value=Math.round(Z.canvas.ds.scale*100)),r?.(Z.canvas.ds.scale,Z.canvas.ds.offset)})},"initScaleSync"),l=n(()=>{Z.canvas?.ds&&(Z.canvas.ds.onChanged=r,r=void 0)},"cleanupScaleSync"),u=E(()=>t.value.some(Rp)),c=E(()=>t.value.some(dC)),d=E(()=>t.value.some(pC)),p=n(()=>{if(!e.value)throw new Error("getCanvas: canvas is null");return e.value},"getCanvas"),f=n(y=>{if(!Z.canvas?.ds||y<=0)return;const k=y/100,S=Z.canvas.ds;S.changeScale(k,S.element?[S.element.width/2,S.element.height/2]:void 0),Z.canvas.setDirty(!0,!0),o.value=Math.round(k*100)},"setAppZoomFromPercentage"),g=Qt(null),m=A(!1),h=E(()=>new Set(t.value.filter(y=>y.id!==void 0).map(y=>String(y.id))));return Mt(()=>e.value,y=>{At(y.canvas,"litegraph:set-graph",k=>{g.value=k.detail?.newGraph??Z.canvas?.graph,m.value=!!Z.canvas?.subgraph}),At(y.canvas,"subgraph-opened",()=>{m.value=!0})},{immediate:!0}),{canvas:e,selectedItems:t,selectedNodeIds:h,nodeSelected:u,groupSelected:c,rerouteSelected:d,appScalePercentage:o,linearMode:s,updateSelectedItems:a,getCanvas:p,setAppZoomFromPercentage:f,initScaleSync:i,cleanupScaleSync:l,currentGraph:g,isInSubgraph:m}});function vm(e){if(!e||e.length===0)return null;let t=1/0,a=1/0,o=-1/0,s=-1/0;for(const r of e){const i=r.pos[0],l=r.pos[1],u=r.size[0],c=r.size[1];t=Math.min(t,i),a=Math.min(a,l),o=Math.max(o,i+u),s=Math.max(s,l+c)}return{minX:t,minY:a,maxX:o,maxY:s,width:o-t,height:s-a}}n(vm,"calculateNodeBounds");function u6(e,t=2500,a=2e3){let{minX:o,minY:s,maxX:r,maxY:i,width:l,height:u}=e;if(l<t){const c=(t-l)/2;o-=c,r+=c,l=t}if(u<a){const c=(a-u)/2;s-=c,i+=c,u=a}return{minX:o,minY:s,maxX:r,maxY:i,width:l,height:u}}n(u6,"enforceMinimumBounds");function cN(e,t,a,o=.9){if(e.width===0||e.height===0)return 1;const s=t/e.width,r=a/e.height;return Math.min(s,r)*o}n(cN,"calculateMinimapScale");var ym=class{static{n(this,"AbstractMinimapDataSource")}constructor(e){this.graph=e}getBounds(){const e=this.getNodes();if(e.length===0)return{minX:0,minY:0,maxX:100,maxY:100,width:100,height:100};const t=vm(e.map(a=>({pos:[a.x,a.y],size:[a.width,a.height]})));return t||{minX:0,minY:0,maxX:100,maxY:100,width:100,height:100}}getGroups(){return this.graph?._groups?this.graph._groups.map(e=>({x:e.pos[0],y:e.pos[1],width:e.size[0],height:e.size[1],color:e.color})):[]}getLinks(){return this.graph?this.extractLinksFromGraph(this.graph):[]}extractLinksFromGraph(e){const t=[],a=new Map(this.getNodes().map(o=>[o.id,o]));for(const o of e._nodes){if(!o.outputs)continue;const s=a.get(String(o.id));if(s){for(const r of o.outputs)if(r.links)for(const i of r.links){const l=e.links[i];if(!l)continue;const u=a.get(String(l.target_id));u&&t.push({sourceNode:s,targetNode:u,sourceSlot:l.origin_slot,targetSlot:l.target_slot})}}}return t}},dN=class extends ym{static{n(this,"LayoutStoreDataSource")}getNodes(){const e=kt.getAllNodes().value;if(e.size===0)return[];const t=[];for(const[a,o]of e){const s=this.graph?._nodes?.find(r=>String(r.id)===a);t.push({id:a,x:o.position.x,y:o.position.y,width:o.size.width,height:o.size.height,bgcolor:s?.bgcolor,mode:s?.mode,hasErrors:s?.has_errors})}return t}getNodeCount(){return kt.getAllNodes().value.size}hasData(){return this.getNodeCount()>0}},pN=class extends ym{static{n(this,"LiteGraphDataSource")}getNodes(){return this.graph?._nodes?this.graph._nodes.map(e=>({id:String(e.id),x:e.pos[0],y:e.pos[1],width:e.size[0],height:e.size[1],bgcolor:e.bgcolor,mode:e.mode,hasErrors:e.has_errors})):[]}getNodeCount(){return this.graph?._nodes?.length??0}hasData(){return this.getNodeCount()>0}},fN=class{static{n(this,"MinimapDataSourceFactory")}static create(e){return kt.getAllNodes().value.size>0?new dN(e):new pN(e)}};function mN(){const e=za().completedActivePalette.light_theme;return{nodeColor:e?"#3DA8E099":"#0B8CE999",nodeColorDefault:e?"#D9D9D9":"#353535",linkColor:e?"#616161":"#B3B3B3",slotColor:e?"#616161":"#B3B3B3",groupColor:e?"#A2D3EC":"#1F547A",groupColorDefault:e?"#283640":"#B3C1CB",bypassColor:e?"#DBDBDB":"#4B184B",errorColor:"#FF0000",isLightTheme:e}}n(mN,"getMinimapColors");function gN(e,t,a){return t.renderBypass&&e.mode===eo.BYPASS?a.bypassColor:t.nodeColors?e.bgcolor?a.isLightTheme?el(e.bgcolor,{lightness:.5}):e.bgcolor:a.nodeColorDefault:a.nodeColor}n(gN,"getNodeColor");function hN(e,t,a,o,s,r){const i=t.getGroups();if(i.length!==0)for(const l of i){const u=(l.x-s.bounds.minX)*s.scale+a,c=(l.y-s.bounds.minY)*s.scale+o,d=l.width*s.scale,p=l.height*s.scale;let f=r.groupColor;s.settings.nodeColors&&(f=l.color??r.groupColorDefault,r.isLightTheme&&(f=el(f,{opacity:.5}))),e.fillStyle=f,e.fillRect(u,c,d,p)}}n(hN,"renderGroups");function vN(e,t,a,o,s,r){const i=t.getNodes();if(i.length===0)return;const l=new Map;for(const u of i){const c=(u.x-s.bounds.minX)*s.scale+a,d=(u.y-s.bounds.minY)*s.scale+o,p=u.width*s.scale,f=u.height*s.scale,g=gN(u,s.settings,r);l.has(g)||l.set(g,[]),l.get(g).push({x:c,y:d,w:p,h:f,hasErrors:u.hasErrors})}for(const[u,c]of l){e.fillStyle=u;for(const d of c)e.fillRect(d.x,d.y,d.w,d.h)}if(s.settings.renderError){e.strokeStyle=r.errorColor,e.lineWidth=.3;for(const u of l.values())for(const c of u)c.hasErrors&&e.strokeRect(c.x,c.y,c.w,c.h)}}n(vN,"renderNodes");function yN(e,t,a,o,s,r){const i=t.getLinks();if(i.length===0)return;e.strokeStyle=r.linkColor,e.lineWidth=.3;const l=Math.max(s.scale,.5),u=[];for(const c of i){const d=(c.sourceNode.x-s.bounds.minX)*s.scale+a,p=(c.sourceNode.y-s.bounds.minY)*s.scale+o,f=(c.targetNode.x-s.bounds.minX)*s.scale+a,g=(c.targetNode.y-s.bounds.minY)*s.scale+o,m=d+c.sourceNode.width*s.scale,h=p+c.sourceNode.height*s.scale*.2,y=f,k=g+c.targetNode.height*s.scale*.2;e.beginPath(),e.moveTo(m,h),e.lineTo(y,k),e.stroke(),u.push({x1:m,y1:h,x2:y,y2:k})}e.fillStyle=r.slotColor;for(const c of u)e.beginPath(),e.arc(c.x1,c.y1,l,0,Math.PI*2),e.fill(),e.beginPath(),e.arc(c.x2,c.y2,l,0,Math.PI*2),e.fill()}n(yN,"renderConnections");function wN(e,t,a){const o=e.getContext("2d");if(!o)return;o.clearRect(0,0,a.width,a.height);const s=fN.create(t);if(!s.hasData())return;const r=mN(),i=(a.width-a.bounds.width*a.scale)/2,l=(a.height-a.bounds.height*a.scale)/2;a.settings.showGroups&&hN(o,s,i,l,a,r),a.settings.showLinks&&yN(o,s,i,l,a,r),vN(o,s,i,l,a,r)}n(wN,"renderMinimapToCanvas");function bN(){const e=gt(),t=wt().activeSubgraph||e.canvas?.graph;if(!t||!t._nodes||t._nodes.length===0)return null;const a=250,o=200,s=vm(t._nodes);if(!s)return null;const r=cN(s,a,o),i=document.createElement("canvas");i.width=a,i.height=o,wN(i,t,{bounds:s,scale:r,settings:{nodeColors:!0,showLinks:!1,showGroups:!0,renderBypass:!1,renderError:!1},width:a,height:o});const l=i.toDataURL(),u=i.getContext("2d");return u&&u.clearRect(0,0,a,o),l}n(bN,"createGraphThumbnail");var pa=A(new Map);const wm=n(()=>{const e=n(()=>{try{const i=bN();return Promise.resolve(i)}catch(i){return console.error("Failed to capture canvas thumbnail:",i),Promise.resolve(null)}},"createMinimapPreview");return{createMinimapPreview:e,storeThumbnail:n(async i=>{const l=await e();if(l){const u=pa.value.get(i.key);u&&URL.revokeObjectURL(u),pa.value.set(i.key,l)}},"storeThumbnail"),getThumbnail:n(i=>pa.value.get(i),"getThumbnail"),clearThumbnail:n(i=>{const l=pa.value.get(i);l&&URL.revokeObjectURL(l),pa.value.delete(i)},"clearThumbnail"),clearAllThumbnails:n(()=>{for(const i of pa.value.values())URL.revokeObjectURL(i);pa.value.clear()},"clearAllThumbnails"),moveWorkflowThumbnail:n((i,l)=>{if(i===l)return;const u=pa.value.get(i);u&&(pa.value.set(l,u),pa.value.delete(i))},"moveWorkflowThumbnail"),workflowThumbnails:pa}},"useWorkflowThumbnail");var _N=nd(Ng(),1);function qr(e){return JSON.parse(JSON.stringify(e))}n(qr,"clone");var Dt=_N.default.getLogger("ChangeTracker");Dt.setLevel("info");var bm=class Fo{static{n(this,"ChangeTracker")}static MAX_HISTORY=50;activeState;undoQueue=[];redoQueue=[];changeCount=0;_restoringState=!1;ds;nodeOutputs;subgraphState;constructor(t,a){this.workflow=t,this.initialState=a,this.activeState=a}reset(t){this._restoringState||(Dt.debug("Reset State"),t&&(this.activeState=qr(t)),this.initialState=qr(this.activeState))}store(){this.ds={scale:Z.canvas.ds.scale,offset:[Z.canvas.ds.offset[0],Z.canvas.ds.offset[1]]},this.subgraphState={navigation:Mi().exportState()}}restore(){if(this.ds&&(Z.canvas.ds.scale=this.ds.scale,Z.canvas.ds.offset=this.ds.offset),this.nodeOutputs&&Gt().restoreOutputs(this.nodeOutputs),this.subgraphState){const{navigation:t}=this.subgraphState;Mi().restoreState(t);const a=t.at(-1);if(a){const o=Z.rootGraph.subgraphs.get(a);o&&Z.canvas.setGraph(o)}else Z.canvas.setGraph(Z.rootGraph)}}updateModified(){oe.dispatchCustomEvent("graphChanged",this.activeState);const t=wt().getWorkflowByPath(this.workflow.path);if(t&&(t.isModified=!Fo.graphEqual(this.initialState,this.activeState),Dt.getLevel()<=Dt.levels.DEBUG&&t.isModified)){const a=Fo.graphDiff(this.initialState,this.activeState);Dt.debug("Graph diff:",a)}}checkState(){if(!Z.graph||this.changeCount)return;const t=qr(Z.rootGraph.serialize());if(!this.activeState){this.activeState=t;return}Fo.graphEqual(this.activeState,t)||(this.undoQueue.push(this.activeState),this.undoQueue.length>Fo.MAX_HISTORY&&this.undoQueue.shift(),Dt.debug("Diff detected. Undo queue length:",this.undoQueue.length),this.activeState=t,this.redoQueue.length=0,this.updateModified())}async updateState(t,a){const o=t.pop();if(o){a.push(this.activeState),this._restoringState=!0;try{await Z.loadGraphData(o,!1,!1,this.workflow,{showMissingModelsDialog:!1,showMissingNodesDialog:!1,checkForRerouteMigration:!1}),this.activeState=o,this.updateModified()}finally{this._restoringState=!1}}}async undo(){await this.updateState(this.undoQueue,this.redoQueue),Dt.debug("Undo. Undo queue length:",this.undoQueue.length,"Redo queue length:",this.redoQueue.length)}async redo(){await this.updateState(this.redoQueue,this.undoQueue),Dt.debug("Redo. Undo queue length:",this.undoQueue.length,"Redo queue length:",this.redoQueue.length)}async undoRedo(t){if((t.ctrlKey||t.metaKey)&&!t.altKey){const a=t.key.toUpperCase();if(a==="Y"&&!t.shiftKey||a=="Z"&&t.shiftKey)return await this.redo(),!0;if(a==="Z"&&!t.shiftKey)return await this.undo(),!0}}beforeChange(){this.changeCount++}afterChange(){--this.changeCount||this.checkState()}static init(){const t=n(()=>wt().activeWorkflow?.changeTracker,"getCurrentChangeTracker"),a=n(()=>t()?.checkState(),"checkState");let o=!1;window.addEventListener("keydown",l=>{if(l.repeat||Z.constructor.maskeditor_is_opended?.())return;const u=document.activeElement;requestAnimationFrame(async()=>{let c=null;if(!Z.ui.autoQueueEnabled||Z.ui.autoQueueMode==="instant"){if(u?.tagName==="INPUT"||u&&"type"in u&&u.type==="textarea")return;c=u}if(o=l.key==="Control"||l.key==="Shift"||l.key==="Alt"||l.key==="Meta",o)return;const d=t();d&&(await d.undoRedo(l)||Fo.bindInput(c)||(Dt.debug("checkState on keydown"),d.checkState()))})},!0),window.addEventListener("keyup",()=>{o&&(o=!1,Dt.debug("checkState on keyup"),a())}),window.addEventListener("mouseup",()=>{Dt.debug("checkState on mouseup"),a()}),oe.addEventListener("promptQueued",()=>{Dt.debug("checkState on promptQueued"),a()}),oe.addEventListener("graphCleared",()=>{Dt.debug("checkState on graphCleared"),a()});const s=va.prototype.processMouseUp;va.prototype.processMouseUp=function(l){const u=s.apply(this,[l]);return Dt.debug("checkState on processMouseUp"),a(),u};const r=va.prototype.prompt;va.prototype.prompt=function(l,u,c,d){const p=n(f=>{c(f),a()},"extendedCallback");return Dt.debug("checkState on prompt"),r.apply(this,[l,u,p,d])};const i=Ne.ContextMenu.prototype.close;Ne.ContextMenu.prototype.close=function(l){const u=i.apply(this,[l]);return Dt.debug("checkState on contextMenuClose"),a(),u},document.addEventListener("litegraph:canvas",l=>{const u=l.detail;u.subType==="before-change"?t()?.beforeChange():u.subType==="after-change"&&t()?.afterChange()}),oe.addEventListener("executed",l=>{const u=l.detail,c=Ot().queuedPrompts[u.prompt_id]?.workflow?.changeTracker;if(!c)return;c.nodeOutputs??={};const d=c.nodeOutputs,p=d[u.node];if(u.merge&&p)for(const f in u.output??{}){const g=p[f];g instanceof Array?p[f]=g.concat(u.output[f]):p[f]=u.output[f]}else d[u.node]=u.output})}static bindInput(t){if(!t||t.tagName==="CANVAS"||t.tagName==="BODY")return!1;for(const a of["change","input","blur"]){const o=t;if(`on${a}`in o){const s=n(()=>{wt().activeWorkflow?.changeTracker?.checkState?.(),o.removeEventListener(a,s)},"listener");return o.addEventListener(a,s),!0}}return!1}static graphEqual(t,a){if(t===a)return!0;if(typeof t=="object"&&t&&typeof a=="object"&&a){if(!Be.isEqualWith(t.nodes,a.nodes,(o,s)=>{if(Array.isArray(o)&&Array.isArray(s))return Be.isEqual(new Set(o),new Set(s))})||!Be.isEqual(Be.omit(t.extra??{},["ds"]),Be.omit(a.extra??{},["ds"])))return!1;for(const o of["links","floatingLinks","reroutes","groups","definitions","subgraphs"])if(!Be.isEqual(t[o],a[o]))return!1;return!0}return!1}static graphDiff(t,a){function o(s){return{links:s.links,floatingLinks:s.floatingLinks,reroutes:s.reroutes,groups:s.groups,extra:s.extra,definitions:s.definitions,subgraphs:s.subgraphs,nodes:s.nodes.sort((r,i)=>typeof r.id=="number"&&typeof i.id=="number"?r.id-i.id:0)}}return n(o,"sortGraphNodes"),Yg(o(t),o(a))}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.changeTracker=window.comfyAPI.changeTracker||{};window.comfyAPI.changeTracker.ChangeTracker=bm;async function _m(e,t,a,o,s=()=>!1){const r=(await oe.listUserDataFullInfo(e)).map(i=>({...i,path:e?`${e}/${i.path}`:i.path}));for(const i of r){const l=t[i.path];if(!l)t[i.path]=a(i);else{if(s(l))continue;o(l,i)}}for(const[i,l]of Object.entries(t))s(l)||r.some(u=>u.path===i)||delete t[i]}n(_m,"syncEntities");var km=class Li{static{n(this,"UserFile")}directory;fullFilename;filename;suffix;isLoading=!1;content=null;originalContent=null;constructor(t,a,o){this.path=t,this.lastModified=a,this.size=o;const s=li(t);this.path=t,this.directory=s.directory,this.fullFilename=s.fullFilename,this.filename=s.filename,this.suffix=s.suffix}updatePath(t){const a=li(t);this.path=t,this.directory=a.directory,this.fullFilename=a.fullFilename,this.filename=a.filename,this.suffix=a.suffix}static createTemporary(t){return new Li(t,Date.now(),-1)}get isTemporary(){return this.size===-1}get isPersisted(){return!this.isTemporary}get key(){return this.path}get isLoaded(){return this.content!==null}get isModified(){return this.content!==this.originalContent}async load({force:t=!1}={}){if(this.isTemporary||!t&&this.isLoaded)return this;this.isLoading=!0;const a=await oe.getUserData(this.path);if(a.status!==200)throw new Error(`Failed to load file '${this.path}': ${a.status} ${a.statusText}`);return this.content=await a.text(),this.originalContent=this.content,this.isLoading=!1,this}unload(){this.content=null,this.originalContent=null,this.isLoading=!1}async saveAs(t){const a=this.isTemporary?this:Li.createTemporary(t);return a.content=this.content,await a.save(),a}async save({force:t=!1}={}){if(this.isPersisted&&!this.isModified&&!t)return this;const a=await(await oe.storeUserData(this.path,this.content,{overwrite:this.isPersisted,throwOnError:!0,full_info:!0})).json();return typeof a=="object"&&(this.lastModified=a.modified,this.size=a.size),this.originalContent=this.content,this}async delete(){if(this.isTemporary)return;const t=await oe.deleteUserData(this.path);if(t.status!==204)throw new Error(`Failed to delete file '${this.path}': ${t.status} ${t.statusText}`)}async rename(t){if(this.isTemporary)return this.updatePath(t),this;const a=await oe.moveUserData(this.path,t);if(a.status!==200)throw new Error(`Failed to rename file '${this.path}': ${a.status} ${a.statusText}`);this.updatePath(t);const o=await a.json();return typeof o=="object"&&(this.lastModified=o.modified,this.size=o.size),this}};const c6=Je("userFile",()=>{const e=A({}),t=E(()=>Object.values(e.value)),a=E(()=>t.value.filter(i=>i.isModified)),o=E(()=>t.value.filter(i=>i.isLoaded)),s=E(()=>yo(t.value,i=>i.path.split("/")));return{userFiles:t,modifiedFiles:a,loadedFiles:o,fileTree:s,syncFiles:n(async(i="")=>{await _m(i,e.value,l=>new km(l.path,l.modified,l.size),(l,u)=>{l.lastModified=u.modified,l.size=u.size,l.unload()})},"syncFiles")}});var qa=class Cm extends km{static{n(this,"ComfyWorkflow")}static basePath="workflows/";tintCanvasBg;changeTracker=null;_isModified=!1;constructor(t){super(t.path,t.modified,t.size)}get key(){return this.path.substring(Cm.basePath.length)}get activeState(){return this.changeTracker?.activeState??null}get initialState(){return this.changeTracker?.initialState??null}get isLoaded(){return this.changeTracker!==null}get isModified(){return this._isModified}set isModified(t){this._isModified=t}async load({force:t=!1}={}){if(await super.load({force:t}),!t&&this.isLoaded)return this;if(!this.originalContent)throw new Error("[ASSERT] Workflow content should be loaded");return this.changeTracker=bt(new bm(this,JSON.parse(this.originalContent))),this}unload(){this.changeTracker=null,super.unload()}async save(){this.content=JSON.stringify(this.activeState);const t=await super.save({force:!0});return this.changeTracker?.reset(),this.isModified=!1,t}async saveAs(t){return this.content=JSON.stringify(this.activeState),await super.saveAs(t)}async promptSave(){return await pt().prompt({title:G("workflowService.saveWorkflow"),message:G("workflowService.enterFilename")+":",defaultValue:this.filename})}};const wt=Je("workflow",()=>{const e=A([]),t=32,a=n(Q=>{delete i.value[Q.path];const ue=c.value.indexOf(Q.path);return ue!==-1&&(c.value=c.value.filter(we=>we!==Q.path)),ue},"detachWorkflow"),o=n((Q,ue=-1)=>{i.value[Q.path]=Q,ue!==-1&&c.value.splice(ue,0,Q.path)},"attachWorkflow"),s=A(null),r=n(Q=>s.value?.path===Q.path,"isActive"),i=A({}),l=E(()=>Object.values(i.value)),u=n(Q=>i.value[Q]??null,"getWorkflowByPath"),c=A([]),d=E(()=>new Set(c.value)),p=E(()=>c.value.map(Q=>i.value[Q])),f=n((Q,ue)=>{const we=c.value[Q];c.value.splice(Q,1),c.value.splice(ue,0,we)},"reorderWorkflows"),g=n(Q=>d.value.has(Q.path),"isOpen"),m=n(Q=>{const{left:ue=[],right:we=[]}=Q;if(!ue.length&&!we.length)return;const Ce=n(xe=>typeof xe=="string"&&xe in i.value,"isValidPath");c.value=Be.union(ue,c.value,we).filter(Ce)},"openWorkflowsInBackground"),h=n(async Q=>{if(r(Q))return Q;c.value.includes(Q.path)||c.value.push(Q.path);const ue=await Q.load();s.value=ue,Z.canvas.bg_tint=ue.tintCanvasBg;const we=e.value.indexOf(Q.path);return we!==-1&&e.value.splice(we,1),e.value.push(Q.path),e.value.length>t&&e.value.shift(),ue},"openWorkflow"),y=n(Q=>{const{directory:ue,filename:we,suffix:Ce}=li(Q);let xe=2,Ue=Q;for(;i.value[Ue];)Ue=`${ue}/${we} (${xe}).${Ce}`,xe++;return Ue},"getUnconflictedPath"),k=n((Q,ue)=>{const we=Ud(),Ce=JSON.parse(JSON.stringify(Q.activeState));Ce.id=we;const xe=new Q.constructor({path:ue,modified:Date.now(),size:-1});return xe.originalContent=xe.content=JSON.stringify(Ce),i.value[xe.path]=xe,xe},"saveAs"),S=n((Q,ue)=>{const we=new qa({path:Q,modified:Date.now(),size:-1});return we.originalContent=we.content=ue?JSON.stringify(ue):rp,i.value[we.path]=we,we},"createNewWorkflow"),_=n((Q,ue)=>{const we=y(qa.basePath+(Q??"Unsaved Workflow.json"));if(Q&&ue){const Ce=l.value.find(xe=>xe.fullFilename===Q);if(Ce?.changeTracker&&!Ce.directory.startsWith(qa.basePath.slice(0,-1)))return Ce.changeTracker.reset(ue),Ce}return S(we,ue)},"createTemporary"),I=n((Q,ue)=>S(y(qa.basePath+(Q??"Unsaved Workflow.json")),ue),"createNewTemporary"),w=n(async Q=>{c.value=c.value.filter(ue=>ue!==Q.path),Q.isTemporary?(j(Q.key),delete i.value[Q.path]):Q.unload()},"closeWorkflow"),x=n(Q=>{const ue=c.value.indexOf(s.value?.path??"");if(ue!==-1){const we=p.value.length,Ce=(ue+Q+we)%we;return p.value[Ce]??null}return null},"openedWorkflowIndexShift"),D=n(()=>{const Q=s.value?.path,ue=[];for(let we=e.value.length-1;we>=0;we--){const Ce=e.value[we];if(Ce!==Q&&d.value.has(Ce)){ue.unshift(Ce);const xe=i.value[Ce];if(xe)return e.value=ue,xe}}return e.value=[],null},"getMostRecentWorkflow"),T=E(()=>Array.from(l.value).filter(Q=>Q.isPersisted&&!Q.path.startsWith("subgraphs/"))),N=n(async(Q="")=>{await _m(Q?"workflows/"+Q:"workflows",i.value,ue=>new qa({path:ue.path,modified:ue.modified,size:ue.size}),(ue,we)=>{const Ce=s.value?.path===ue.path,xe=Math.max(ue.lastModified,we.modified),Ue=xe===ue.lastModified&&we.size===ue.size;Ue||(ue.lastModified=xe,ue.size=we.size),!Ce&&(Ue||ue.unload())},ue=>ue.isTemporary)},"syncWorkflows"),M=Nl(),O=E(()=>l.value.filter(Q=>M.isBookmarked(Q.path))),L=E(()=>l.value.filter(Q=>Q.isModified)),F=A(!1),{moveWorkflowThumbnail:K,clearThumbnail:j}=wm(),V=n(async(Q,ue)=>{F.value=!0;try{const we=Q.path,Ce=Q.key,xe=M.isBookmarked(we),Ue=a(Q);try{await Q.rename(ue)}finally{o(Q,Ue)}const de=Q.key;K(Ce,de),xe&&(await M.setBookmarked(we,!1),await M.setBookmarked(ue,!0))}finally{F.value=!1}},"renameWorkflow"),q=n(async Q=>{F.value=!0;try{await Q.delete(),M.isBookmarked(Q.path)&&await M.setBookmarked(Q.path,!1),j(Q.key),delete i.value[Q.path]}finally{F.value=!1}},"deleteWorkflow"),re=n(async Q=>{F.value=!0;try{const ue=a(Q);try{await Q.save()}finally{o(Q,ue)}}finally{F.value=!1}},"saveWorkflow"),ae=A(!1),ce=Qt(),ee=n(()=>{const Q=Z.canvas?.subgraph;ce.value=Q?bt(Q):void 0,Z.canvas&&(ae.value=ks(Q))},"updateActiveGraph"),ne=n((Q,ue)=>{const we=ue.getNodeById(Q);if(we?.isSubgraphNode())return we.subgraph},"subgraphNodeIdToSubgraph$1"),B=n((Q,ue,we=[])=>{const Ce=ue.shift();if(Ce===void 0)return we;const xe=ne(Ce,Q);if(xe===void 0)throw new Error("Subgraph not found");return we.push(xe),B(xe,ue,we)},"getSubgraphsFromInstanceIds$1"),z=n(Q=>{const ue=ce.value;if(Q.includes(":")){if(!ue)return}else return ue?void 0:Q;const we=Q.split(":"),Ce=Z.rootGraph;if(B(Ce,we).at(-1)===ue)return we.at(-1)},"executionIdToCurrentId");return be(s,ee),{activeWorkflow:s,attachWorkflow:o,isActive:r,openWorkflows:p,openedWorkflowIndexShift:x,getMostRecentWorkflow:D,openWorkflow:h,openWorkflowsInBackground:m,isOpen:g,isBusy:F,closeWorkflow:w,createTemporary:_,createNewTemporary:I,renameWorkflow:V,deleteWorkflow:q,saveAs:k,saveWorkflow:re,reorderWorkflows:f,workflows:l,bookmarkedWorkflows:O,persistedWorkflows:T,modifiedWorkflows:L,getWorkflowByPath:u,syncWorkflows:N,isSubgraphActive:ae,activeSubgraph:ce,updateActiveGraph:ee,executionIdToCurrentId:z,nodeIdToNodeLocatorId:n((Q,ue)=>{const we=ue??ce.value;return we?_s(we.id,Q):String(Q)},"nodeIdToNodeLocatorId"),nodeToNodeLocatorId:n(Q=>ks(Q.graph)?_s(Q.graph.id,Q.id):String(Q.id),"nodeToNodeLocatorId"),nodeExecutionIdToNodeLocatorId:n(Q=>{if(!Q.includes(":"))return Q;const ue=kh(Q);if(!ue||ue.length===0)return null;const we=ue[ue.length-1],Ce=ue.slice(0,-1);if(Ce.length===0)return String(we);try{const xe=B(Z.rootGraph,Ce.map(de=>String(de))),Ue=xe[xe.length-1];return _s(Ue.id,we)}catch{return null}},"nodeExecutionIdToNodeLocatorId"),nodeLocatorIdToNodeId:n(Q=>Jl(Q)?.localNodeId??null,"nodeLocatorIdToNodeId"),nodeLocatorIdToNodeExecutionId:n((Q,ue)=>{const we=Jl(Q);if(!we)return null;const{subgraphUuid:Ce,localNodeId:xe}=we;if(!Ce)return String(xe);const Ue=n((he,Te,Ge=[])=>{if(ks(he)&&he.id===Te)return Ge;for(const We of he._nodes)if(We.isSubgraphNode()&&We.subgraph){const te=Ue(We.subgraph,Te,[...Ge,We.id]);if(te)return te}return null},"findSubgraphPath"),de=Ue(Z.rootGraph,Ce);return!de||ue&&!de.some((he,Te)=>{const Ge=B(Z.rootGraph,de.slice(0,Te+1).map(We=>String(We)));return Ge[Ge.length-1]===ue})?null:xh([...de,xe])},"nodeLocatorIdToNodeExecutionId")}}),Nl=Je("workflowBookmark",()=>{const e=A(new Set),t=n(i=>e.value.has(i),"isBookmarked"),a=n(async()=>{const i=await oe.getUserData("workflows/.index.json");if(i.status===200){const l=await i.json();e.value=new Set(l?.favorites??[])}},"loadBookmarks"),o=n(async()=>{await oe.storeUserData("workflows/.index.json",{favorites:Array.from(e.value)})},"saveBookmarks"),s=n(async(i,l)=>{e.value.has(i)!==l&&(l?e.value.add(i):e.value.delete(i),await o())},"setBookmarked");return{isBookmarked:t,loadBookmarks:a,saveBookmarks:o,setBookmarked:s,toggleBookmarked:n(async i=>{await s(i,!e.value.has(i))},"toggleBookmarked")}});var kN=50;function Xa(e,t={}){const{maxSize:a=kN,cacheKeyFn:o=Fd}=t,s=new Mo.default({maxSize:a}),r=new Map,i=new Map,l=n(async(f,g)=>{try{const m=new AbortController;i.set(g,m);const h=e(f,m.signal);r.set(g,h);const y=await h;return s.set(g,y),y}catch{return s.set(g,null),null}finally{r.delete(g),i.delete(g)}},"executeAndCacheCall"),u=n(async f=>{try{return await f}catch(g){return console.error("Error in pending request:",g),null}},"handlePendingRequest"),c=n(()=>{for(const f of i.values())f.abort()},"abortAllRequests");return{call:n(async f=>{const g=o(f),m=s.get(g);if(m!==void 0)return m;const h=r.get(g);return h?u(h):l(f,g)},"call"),cancel:n(()=>{c(),i.clear(),r.clear()},"cancel"),clear:n(()=>s.clear(),"clear")}}n(Xa,"useCachedRequest");var fa=So.create({baseURL:"https://api.comfy.org",headers:{"Content-Type":"application/json"},paramsSerializer:{indexes:null}});const $l=n(()=>{const e=A(!1),t=A(null),a=n((h,y,k)=>{if(!So.isAxiosError(h))return h instanceof Error?`${y}: ${h.message}`:`${y}: Unknown error occurred`;const S=h;if(S.response){const{status:_,data:I}=S.response;if(k&&k[_])return k[_];switch(_){case 400:return`Bad request: ${I?.message||"Invalid input"}`;case 401:return"Unauthorized: Authentication required";case 403:return`Forbidden: ${I?.message||"Access denied"}`;case 404:return`Not found: ${I?.message||"Resource not found"}`;case 409:return`Conflict: ${I?.message||"Resource conflict"}`;case 500:return`Server error: ${I?.message||"Internal server error"}`;default:return`${y}: ${I?.message||S.message}`}}return`${y}: ${S.message}`},"handleApiError"),o=n(async(h,y,k)=>{e.value=!0,t.value=null;try{return(await h()).data}catch(S){return Nd(S)||(t.value=a(S,y,k)),null}finally{e.value=!1}},"executeApiRequest");return{isLoading:e,error:t,listAllPacks:n(async(h,y)=>{const k="/nodes";return o(()=>fa.get(k,{params:h,signal:y}),"Failed to list packs")},"listAllPacks"),search:n(async(h,y)=>{const k="/nodes/search";return o(()=>fa.get(k,{params:h,signal:y}),"Failed to perform search")},"search"),getPackById:n(async(h,y)=>{const k=`/nodes/${h}`;return o(()=>fa.get(k,{signal:y}),"Failed to get pack",{404:`Pack not found: The pack with ID ${h} does not exist`})},"getPackById"),getPackVersions:n(async(h,y,k)=>{const S=`/nodes/${h}/versions`;return o(()=>fa.get(S,{params:y,signal:k}),"Failed to get pack versions",{403:"This pack has been banned and its versions are not available",404:`Pack not found: Pack with ID ${h} does not exist`})},"getPackVersions"),getPackByVersion:n(async(h,y,k)=>{const S=`/nodes/${h}/versions/${y}`;return o(()=>fa.get(S,{signal:k}),"Failed to get pack version",{403:"This pack has been banned and its versions are not available",404:`Pack not found: Pack with ID ${h} does not exist`})},"getPackByVersion"),getPublisherById:n(async(h,y)=>{const k=`/publishers/${h}`;return o(()=>fa.get(k,{signal:y}),"Failed to get publisher",{404:`Publisher not found: The publisher with ID ${h} does not exist`})},"getPublisherById"),listPacksForPublisher:n(async(h,y,k)=>{const S=y?{include_banned:!0}:void 0,_=`/publishers/${h}/nodes`;return o(()=>fa.get(_,{params:S,signal:k}),"Failed to list packs for publisher",{400:"Bad request: Invalid input data",404:`Publisher not found: The publisher with ID ${h} does not exist`})},"listPacksForPublisher"),getNodeDefs:n(async(h,y)=>{const{packId:k,version:S,..._}=h;if(!k||!S)return null;const I=`/nodes/${k}/versions/${S}/comfy-nodes`;return o(()=>fa.get(I,{params:_,signal:y}),"Failed to get node definitions",{403:"This pack has been banned and its definition is not available",404:"The requested node, version, or comfy node does not exist"})},"getNodeDefs"),postPackReview:n(async(h,y,k)=>{const S=`/nodes/${h}/reviews`,_={star:y};return o(()=>fa.post(S,null,{params:_,signal:k}),"Failed to add review",{400:"Bad request: Invalid review",404:`Pack not found: Pack with ID ${h} does not exist`})},"postPackReview"),inferPackFromNodeName:n(async(h,y)=>{const k=`/comfy-nodes/${h}/node`;return o(()=>fa.get(k,{signal:y}),"Failed to infer pack from comfy node name",{404:`Comfy node not found: The node with name ${h} does not exist in the registry`})},"inferPackFromNodeName"),getBulkNodeVersions:n(async(h,y)=>{const k="/bulk/nodes/versions",S="Failed to get bulk node versions",_={400:"Bad request: Invalid node version identifiers provided"},I={node_versions:h};return o(()=>fa.post(k,I,{signal:y}),S,_)},"getBulkNodeVersions")}},"useComfyRegistryService");var Oc=20,gs=64,CN=n(e=>e!==void 0&&"id"in e,"isNodePack");const ln=Je("comfyRegistry",()=>{const e=$l();let t=null;const a=new Mo.default({maxSize:gs}),o=Xa(e.listAllPacks,{maxSize:Oc}),s=Xa(async p=>p?e.getPackById(p):null,{maxSize:gs}),r=n(async p=>{const[f,g]=Wg(p,h=>a.has(h)),m=f.map(h=>a.get(h)).filter(CN);if(g.length){t=new AbortController;const{nodes:h=[]}=await e.listAllPacks({node_id:g.filter(y=>y!==void 0)},t.signal)??{};h.forEach(y=>{y?.id&&(a.set(y.id,y),m.push(y))})}return m},"getPacksByIds"),i=Xa(e.getNodeDefs,{maxSize:gs}),l=Xa(e.search,{maxSize:Oc}),u=Xa(e.inferPackFromNodeName,{maxSize:gs});return{listAllPacks:o,getPackById:s,getPacksByIds:{call:r,cancel:n(()=>t?.abort(),"cancel")},getNodeDefs:i,search:l,inferPackFromNodeName:u,clearCache:n(()=>{i.clear(),o.clear(),s.clear(),u.clear()},"clearCache"),cancelRequests:n(()=>{i.cancel(),o.cancel(),s.cancel(),u.cancel(),t?.abort()},"cancelRequests"),isLoading:e.isLoading,error:e.error}}),xm=n((e,t={})=>{const{immediate:a=!1}=t,{getPacksByIds:o}=ln(),s=n(()=>o.call(Jm(e).filter(Boolean)),"fetchPacks"),{isReady:r,isLoading:i,error:l,execute:u,state:c}=Xo(s,[],{immediate:a});return{error:l,isLoading:i,isReady:r,nodePacks:c,startFetch:u,cleanup:n(()=>{o.cancel(),r.value=!1,i.value=!1},"cleanup")}},"useNodePacks");var Nc="comfy-core";const Im=n((e={})=>{const t=zt(),a=Qo(),{inferPackFromNodeName:o}=ln(),s=A([]),r=n(I=>{if(typeof I.properties?.cnr_id=="string")return I.properties.cnr_id;if(typeof I.properties?.aux_id=="string")return I.properties.aux_id},"getWorkflowNodePackId"),i=n(I=>I.replace(/^v/,"").trim(),"cleanVersionString"),l=n(async I=>{const w=I.type;if(t.nodeDefsByName[w]?.nodeSource.type==="core")return a.systemStats||await a.refetchSystemStats(),{id:Nc,version:a.systemStats?.system?.comfyui_version??"nightly"};const x=await o.call(w);if(x)return{id:x.id,version:x.latest_version?.version??"nightly"}},"inferPack"),u=n(async I=>{const w=r(I);if(!w)return l(I);if(w!==Nc)return{id:w,version:typeof I.properties.ver=="string"?i(I.properties.ver):void 0}},"workflowNodeToPack"),c=n(async()=>{if(!Z.rootGraph)return[];const I=ch(Z.rootGraph,u);s.value=(await Promise.all(I)).filter(w=>w!==void 0)},"getWorkflowPacks"),d=n(I=>I.reduce((w,x)=>(x?.id&&w.add(x.id),w),new Set),"packsToUniqueIds"),p=E(()=>Array.from(d(s.value))),{startFetch:f,cleanup:g,error:m,isLoading:h,nodePacks:y,isReady:k}=xm(p,e),S=n(I=>p.value.includes(I),"isIdInWorkflow"),_=n(I=>I.filter(w=>!!w.id&&S(w.id)),"filterWorkflowPack");return St(()=>{g()}),{error:m,isLoading:h,isReady:k,workflowPacks:y,startFetchWorkflowPacks:n(async()=>{await c(),await f()},"startFetchWorkflowPacks"),filterWorkflowPack:_}},"useWorkflowPacks");var $c="logs",xN="cm-task-completed",IN="cm-task-started";const SN=n((e={})=>{const{ui_id:t,immediate:a=!1,messageFilter:o=n(y=>!!y.trim(),"messageFilter")}=e,s=A([]),r=A(!t);let i=null,l=null,u=null;const c=n(y=>y?.type===$c&&y.detail?.entries?.length>0,"isValidLogEvent"),d=n(y=>y.detail.entries.map(k=>k.m).filter(o),"parseLogMessage"),p=n(y=>{if(r.value&&c(y)){const k=d(y);k.length>0&&s.value.push(...k)}},"handleLogMessage"),f=n(y=>{t&&y?.detail?.ui_id===t&&(r.value=!0)},"handleTaskStarted"),g=n(y=>{t&&y?.detail?.ui_id===t&&(r.value=!1)},"handleTaskDone"),m=n(async()=>{await oe.subscribeLogs(!0),i=At(oe,$c,p),t&&(u=At(oe,IN,f),l=At(oe,xN,g))},"start"),h=n(async()=>{i?.(),u?.(),l?.(),i=null,u=null,l=null,await oe.subscribeLogs(!1)},"stopListening");return a&&m(),St(async()=>{await h(),s.value=[]}),{logs:s,startListening:m,stopListening:h}},"useServerLogs");var Rc="cm-task-completed",Bc="cm-task-started";const EN=n((e,t,a)=>{const o=A(64),s=A(!1),r=A(!1),i=E(()=>t.value.running_queue.length+t.value.pending_queue.length),l=n(()=>{r.value=i.value>0},"updateProcessingState"),u=E(()=>i.value===0),c=E(()=>Object.keys(e.value).length),d=n(S=>S.client_id===Z.api.clientId,"isTaskFromThisClient"),p=n(S=>S.client_id===Z.api.clientId,"isHistoryTaskFromThisClient"),f=n(S=>S.filter(d),"filterQueueByClientId"),g=n(S=>th(S,p),"filterHistoryByClientId"),m=n(S=>{t.value.running_queue=f(S.running_queue),t.value.pending_queue=f(S.pending_queue),e.value=g(S.history),S.installed_packs&&(a.value=Yf(S.installed_packs)),l()},"updateTaskState"),h=At(Z.api,Rc,S=>{S?.type===Rc&&S.detail?.state&&m(S.detail.state)}),y=At(Z.api,Bc,S=>{S?.type===Bc&&S.detail?.state&&m(S.detail.state)});return{isLoading:s,isProcessing:r,maxHistoryItems:o,allTasksDone:u,historyCount:c,currentQueueLength:i,updateTaskState:m,cleanup:n(()=>{h(),y(),r.value=!1,s.value=!1},"cleanup")}},"useManagerQueue");var TN={name:"AutoCompletePlus",extends:es,emits:["focused-option-changed"],data(){return{isComposing:!1}},mounted(){typeof es.mounted=="function"&&es.mounted.call(this);const e=this.$el.querySelector("input");e&&(e.addEventListener("compositionstart",()=>{this.isComposing=!0}),e.addEventListener("compositionend",()=>{this.isComposing=!1})),this.$watch(()=>this.focusedOptionIndex,(t,a)=>{this.$emit("focused-option-changed",t)})},methods:{onKeyDown(e){if(e.key==="Enter"&&this.isComposing){e.preventDefault(),e.stopPropagation();return}es.methods.onKeyDown.call(this,e)}}},AN=TN,MN=["width","height"],PN={"clip-path":"url(#clip0_776_9582)"},DN=["fill"],LN=["fill"],ON=["fill"],NN=["fill"],$N=["fill"],RN=["fill"],BN=["fill"],FN=["fill"],UN=J({__name:"DotSpinner",props:{size:{default:24},duration:{default:"2s"}},setup(e){const t=za(),a=E(()=>t.completedActivePalette.light_theme?"#2C2B30":"#D4D4D4");return(o,s)=>(C(),P("div",{class:"inline-flex items-center justify-center",style:nt({width:o.size+"px",height:o.size+"px"})},[(C(),P("svg",{xmlns:"http://www.w3.org/2000/svg",width:o.size,height:o.size,viewBox:"0 0 14 14",fill:"none",class:"animate-spin",style:nt({animationDuration:o.duration})},[v("g",PN,[v("path",{class:"dot-animation",style:{"animation-delay":"0s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M7 2.21053C7.61042 2.21053 8.10526 1.71568 8.10526 1.10526C8.10526 0.494843 7.61042 0 7 0C6.38958 0 5.89474 0.494843 5.89474 1.10526C5.89474 1.71568 6.38958 2.21053 7 2.21053Z",fill:a.value},null,8,DN),v("path",{class:"dot-animation",style:{"animation-delay":"0.25s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M2.21053 7C2.21053 7.61042 1.71568 8.10526 1.10526 8.10526C0.494843 8.10526 0 7.61042 0 7C0 6.38958 0.494843 5.89474 1.10526 5.89474C1.71568 5.89474 2.21053 6.38958 2.21053 7Z",fill:a.value},null,8,LN),v("path",{class:"dot-animation",style:{"animation-delay":"0.5s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M14 7C14 7.61042 13.5052 8.10526 12.8947 8.10526C12.2843 8.10526 11.7895 7.61042 11.7895 7C11.7895 6.38958 12.2843 5.89474 12.8947 5.89474C13.5052 5.89474 14 6.38958 14 7Z",fill:a.value},null,8,ON),v("path",{class:"dot-animation",style:{"animation-delay":"0.75s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M8.10526 12.8947C8.10526 13.5052 7.61041 14 6.99999 14C6.38957 14 5.89473 13.5052 5.89473 12.8947C5.89473 12.2843 6.38957 11.7895 6.99999 11.7895C7.61041 11.7895 8.10526 12.2843 8.10526 12.8947Z",fill:a.value},null,8,NN),v("path",{class:"dot-animation",style:{"animation-delay":"0.125s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M2.05039 3.61349C2.48203 4.04513 3.18184 4.04513 3.61347 3.61349C4.0451 3.18186 4.0451 2.48205 3.61347 2.05042C3.18184 1.61878 2.48203 1.61878 2.05039 2.05042C1.61876 2.48205 1.61876 3.18186 2.05039 3.61349Z",fill:a.value},null,8,$N),v("path",{class:"dot-animation",style:{"animation-delay":"0.625s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M11.9496 11.9496C11.518 12.3812 10.8182 12.3812 10.3865 11.9496C9.9549 11.5179 9.9549 10.8181 10.3865 10.3865C10.8182 9.95485 11.518 9.95485 11.9496 10.3865C12.3812 10.8181 12.3812 11.5179 11.9496 11.9496Z",fill:a.value},null,8,RN),v("path",{class:"dot-animation",style:{"animation-delay":"0.875s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M2.05039 11.9496C2.48203 12.3812 3.18184 12.3812 3.61347 11.9496C4.0451 11.5179 4.0451 10.8181 3.61347 10.3865C3.18184 9.95485 2.48203 9.95485 2.05039 10.3865C1.61876 10.8181 1.61876 11.5179 2.05039 11.9496Z",fill:a.value},null,8,BN),v("path",{class:"dot-animation",style:{"animation-delay":"0.375s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M11.9496 3.61349C11.518 4.04513 10.8182 4.04513 10.3865 3.61349C9.9549 3.18186 9.9549 2.48205 10.3865 2.05042C10.8182 1.61878 11.518 1.61878 11.9496 2.05042C12.3812 2.48205 12.3812 3.18186 11.9496 3.61349Z",fill:a.value},null,8,FN)]),s[0]||(s[0]=v("defs",null,[v("clipPath",{id:"clip0_776_9582"},[v("rect",{width:"14",height:"14",fill:"white"})])],-1))],12,MN))],4))}}),_r=ot(UN,[["__scopeId","data-v-ec0691c8"]]);const Rl=n((e={})=>{const t=It(),a=A(!1),o=A(""),s=E(()=>Array.from(t.installedPacksIds)),{startFetch:r,cleanup:i,error:l,isLoading:u,nodePacks:c,isReady:d}=xm(s,e),p=n(g=>g.filter(m=>t.isPackInstalled(m.id)),"filterInstalledPack"),f=n(async()=>{if(!a.value){a.value=!0;try{t.installedPacksIds.size===0&&await t.refreshInstalledList(),await r()}finally{a.value=!1}}},"startFetchInstalled");return Mt(s,async g=>{const m=g.sort().join(",");m!==o.value&&!a.value&&(o.value=m,await r())}),St(()=>{i()}),{error:l,isLoading:u,isReady:d,installedPacks:c,installedPacksWithVersions:E(()=>{const g=[];for(const m of Object.values(t.installedPacks)){const h=m.cnr_id||m.aux_id;h&&g.push({id:h,version:m.ver??""})}return g}),startFetchInstalled:f,filterInstalledPack:p}},"useInstalledPacks"),un=Je("conflictDetection",()=>{const e=A([]),t=A(!1),a=A(null),o=E(()=>e.value.some(p=>p.has_conflict)),s=E(()=>p=>e.value.find(f=>f.package_id===p)),r=E(()=>e.value.filter(p=>p.conflicts.some(f=>f.type==="banned"))),i=E(()=>e.value.filter(p=>p.conflicts.some(f=>f.type==="pending")));function l(p){e.value=[...p]}n(l,"setConflictedPackages");function u(){e.value=[]}n(u,"clearConflicts");function c(p){t.value=p}n(c,"setDetecting");function d(p){a.value=p}return n(d,"setLastDetectionTime"),{conflictedPackages:e,isDetecting:t,lastDetectionTime:a,hasConflicts:o,getConflictsForPackageByID:s,bannedPackages:r,securityPendingPackages:i,setConflictedPackages:l,clearConflicts:u,setDetecting:c,setLastDetectionTime:d}});var Bl={CONFLICT_MODAL_DISMISSED:"Comfy.ConflictModalDismissed",CONFLICT_RED_DOT_DISMISSED:"Comfy.ConflictRedDotDismissed",CONFLICT_WARNING_BANNER_DISMISSED:"Comfy.ConflictWarningBannerDismissed"},Xr=Vi(Bl.CONFLICT_MODAL_DISMISSED,!1),wn=Vi(Bl.CONFLICT_RED_DOT_DISMISSED,!1),hs=Vi(Bl.CONFLICT_WARNING_BANNER_DISMISSED,!1);function Fl(){const e=un(),t=E(()=>({modal_dismissed:Xr.value,red_dot_dismissed:wn.value,warning_banner_dismissed:hs.value}));function a(){wn.value=!0}n(a,"dismissRedDotNotification");function o(){hs.value=!0,wn.value=!0}n(o,"dismissWarningBanner");function s(){wn.value=!0,Xr.value=!0,hs.value=!0}n(s,"markConflictsAsSeen");const r=E(()=>e.hasConflicts);return{acknowledgmentState:t,shouldShowConflictModal:E(()=>!Xr.value),shouldShowRedDot:E(()=>!(!r.value||wn.value)),shouldShowManagerBanner:E(()=>r.value&&!hs.value),dismissRedDotNotification:a,dismissWarningBanner:o,markConflictsAsSeen:s}}n(Fl,"useConflictAcknowledgment");function Fc(e){return e===!0?{type:"banned",current_value:"installed",required_value:"not_banned"}:null}n(Fc,"createBannedConflict");function Uc(e){return e===!0?{type:"pending",current_value:"installed",required_value:"not_pending"}:null}n(Uc,"createPendingConflict");function WN(e){const t=Td(e,a=>Tl(a.package_name));return Object.entries(t).map(([a,o])=>{const s=ig(o.flatMap(r=>r.conflicts),r=>`${r.type}|${r.current_value}|${r.required_value}`);return{...o[0],package_name:a,conflicts:s,has_conflict:s.length>0,is_compatible:s.length===0}})}n(WN,"consolidateConflictsByPackage");function zN(e){if(!e)return;const t=e.toLowerCase();if(t.includes("darwin")||t.includes("mac"))return"macOS";if(t.includes("win"))return"Windows";if(t.includes("linux"))return"Linux"}n(zN,"getRegistryOS");function VN(e){if(!e)return"CPU";const t=e.toLowerCase();return t==="cuda"?"CUDA":t==="mps"?"Metal":t==="rocm"?"ROCm":"CPU"}n(VN,"getRegistryAccelerator");function Wc(e,t){if(Ln(e)||Dn(e))return null;const a=zN(t);return a?e.includes(a)?null:{type:"os",current_value:a,required_value:e.join(", ")}:{type:"os",current_value:"Unknown",required_value:e.join(", ")}}n(Wc,"checkOSCompatibility");function zc(e,t){if(Ln(e)||Dn(e))return null;const a=VN(t);return e.includes(a)?null:{type:"accelerator",current_value:a,required_value:e.join(", ")}}n(zc,"checkAcceleratorCompatibility");function Vc(e){if(Ln(e)||Dn(e)||e.some(a=>a.toLowerCase()==="os independent"))return;const t=[];return e.forEach(a=>{(a==="Windows"||a==="macOS"||a==="Linux")&&(t.includes(a)||t.push(a))}),t.length>0?t:void 0}n(Vc,"normalizeOSList");var GN={app_title:"ComfyUI",app_version:"1.38.5"};function HN(e){return(0,ea.clean)(e)||e}n(HN,"cleanVersion");function vs(e,t,a){if(Ln(t)||Dn(t)||Ln(a)||Dn(a?.trim()))return null;const o=HN(t);let s=!1;try{s=(0,ea.satisfies)(o,a)}catch{return{type:e,current_value:t,required_value:a}}return s?null:{type:e,current_value:t,required_value:a}}n(vs,"checkVersionCompatibility");function Gc(){return GN.app_version||void 0}n(Gc,"getFrontendVersion");function Po(){const e=It(),{startFetchInstalled:t,installedPacks:a,installedPacksWithVersions:o,isReady:s}=Rl(),r=A(!1),i=A(null),l=A(null),u=A(null),c=A([]),d=A([]),p=A(null),f=Fl(),g=un(),m=E(()=>g.hasConflicts),h=E(()=>g.conflictedPackages),y=E(()=>g.bannedPackages),k=E(()=>g.securityPendingPackages);async function S(){try{const L=Qo(),{systemStats:F}=L;await ni(()=>L.isInitialized).toBe(!0);const K=Gc(),j={comfyui_version:F?.system.comfyui_version??"",frontend_version:K,os:F?.system.os??"",accelerator:F?.devices?.[0]?.type??""};return u.value=j,j}catch{const F={comfyui_version:void 0,frontend_version:void 0,os:void 0,accelerator:void 0};return u.value=F,F}}n(S,"collectSystemEnvironment");async function _(){try{if(await t(),!s.value||!a.value||a.value.length===0)return console.warn("[ConflictDetection] No installed packages available from useInstalledPacks"),[];const L=$l();p.value=new AbortController;const F=new Map,K=o.value.map(V=>({node_id:V.id,version:V.version}));if(K.length>0)try{const V=await L.getBulkNodeVersions(K,p.value?.signal);V&&V.node_versions?.length>0&&V.node_versions.forEach(q=>{q.status==="success"&&q.node_version?F.set(q.identifier.node_id,q.node_version):q.status==="error"&&console.warn(`[ConflictDetection] Failed to fetch version data for ${q.identifier.node_id}@${q.identifier.version}:`,q.error_message)})}catch(V){console.warn("[ConflictDetection] Failed to fetch bulk version data:",V)}const j=[];for(const V of o.value){const q=F.get(V.id),re=e.isPackEnabled(V.id),ae=qg(a.value,{id:V.id});if(q){const ce={id:V.id,name:ae?.name||V.id,installed_version:V.version,is_enabled:re,supported_comfyui_version:q.supported_comfyui_version,supported_comfyui_frontend_version:q.supported_comfyui_frontend_version,supported_os:Vc(q.supported_os),supported_accelerators:q.supported_accelerators,version_status:q.status,is_banned:q.status==="NodeVersionStatusBanned",is_pending:q.status==="NodeVersionStatusPending"};j.push(ce)}else{console.warn(`[ConflictDetection] No Registry data found for ${V.id}, using fallback`);const ce={id:V.id,name:ae?.name||V.id,installed_version:V.version,is_enabled:re,is_banned:!1,is_pending:!1};j.push(ce)}}return j}catch(L){return console.warn("[ConflictDetection] Failed to fetch package requirements:",L),[]}}n(_,"buildNodeRequirements");function I(L,F){const K=[],j=vs("comfyui_version",F.comfyui_version,L.supported_comfyui_version);j&&K.push(j);const V=vs("frontend_version",F.frontend_version,L.supported_comfyui_frontend_version);V&&K.push(V);const q=Wc(L.supported_os,F.os);q&&K.push(q);const re=zc(L.supported_accelerators,F.accelerator);re&&K.push(re);const ae=Fc(L.is_banned);ae&&K.push(ae);const ce=Uc(L.is_pending);ce&&K.push(ce);const ee=K.length>0;return{package_id:L.id??"",package_name:L.name??"",has_conflict:ee,conflicts:K,is_compatible:!ee}}n(I,"analyzePackageConflicts");async function w(){try{const L=Dm();if(!o.value||o.value.length===0)return console.warn("[ConflictDetection] No installed packages available for import failure check"),{};const F=o.value.map(j=>j.id),K=await L.getImportFailInfoBulk({cnr_ids:F},p.value?.signal);if(K){const j={};return Object.entries(K).forEach(([V,q])=>{q!==null&&(j[V]=q)}),j}return{}}catch(L){return console.warn("[ConflictDetection] Failed to fetch import failure information:",L),{}}}n(w,"fetchImportFailInfo");function x(L){const F=[];if(!L||typeof L!="object")return F;for(const[K,j]of Object.entries(L)){if(!j||typeof j!="object")continue;const V=j.error||"Unknown import error",q=j.traceback||V;F.push({package_id:K,package_name:K,has_conflict:!0,conflicts:[{type:"import_failed",current_value:V,required_value:q}],is_compatible:!1}),console.warn(`[ConflictDetection] Python import failure detected for ${K}:`,V)}return F}n(x,"detectImportFailConflicts");async function D(){if(r.value)return{success:!1,error_message:"Already detecting conflicts",results:c.value};r.value=!0,l.value=null;try{const L=await S(),F=(await _()).map(async q=>{try{return I(q,L)}catch(re){return console.warn(`[ConflictDetection] Failed to detect conflicts for package ${q.name}:`,re),null}}),K=(await Promise.allSettled(F)).map(q=>q.status==="fulfilled"?q.value:null).filter(q=>q!==null),j=x(await w()),V=[...K,...j];if(c.value=V,i.value=new Date().toISOString(),V.some(q=>q.has_conflict)){const q=WN(V.filter(re=>re.has_conflict));return g.setConflictedPackages(q),c.value=[...q],d.value=[...q],{success:!0,results:q,detected_system_environment:L}}else g.clearConflicts(),c.value=[];return{success:!0,results:V,detected_system_environment:L}}catch(L){return console.error("[ConflictDetection] Error during conflict detection:",L),l.value=L instanceof Error?L.message:String(L),{success:!1,error_message:l.value,results:[]}}finally{r.value=!1,p.value&&(p.value=null)}}n(D,"runFullConflictAnalysis");async function T(){try{const L=Qo();if(await ni(()=>L.isInitialized).toBe(!0),!Vl().isNewManagerUI.value)return;await D()}catch(L){console.warn("[ConflictDetection] Error during initialization (ignored):",L)}}n(T,"initializeConflictDetection");function N(){p.value&&(p.value.abort(),p.value=null)}n(N,"cancelRequests"),ji()&&St(()=>{N()});async function M(){c.value.length===0&&await D();const L=m.value,F=f.shouldShowConflictModal.value;return L&&F}n(M,"shouldShowConflictModalAfterUpdate");function O(L){const F=[],K=Wc(Vc(L.supported_os),u.value?.os);K&&F.push(K);const j=zc(L.supported_accelerators,u.value?.accelerator);j&&F.push(j);const V=vs("comfyui_version",u.value?.comfyui_version,L.supported_comfyui_version);V&&F.push(V);const q=vs("frontend_version",Gc(),L.supported_comfyui_frontend_version);q&&F.push(q);const re=Fc(L.status==="NodeStatusBanned"||L.status==="NodeVersionStatusBanned");re&&F.push(re);const ae=Uc(L.status==="NodeVersionStatusPending");return ae&&F.push(ae),{hasConflict:F.length>0,conflicts:F}}return n(O,"checkNodeCompatibility"),{isDetecting:ra(r),lastDetectionTime:ra(i),detectionError:ra(l),systemEnvironment:ra(u),detectionResults:ra(c),hasConflicts:m,conflictedPackages:h,bannedPackages:y,securityPendingPackages:k,runFullConflictAnalysis:D,collectSystemEnvironment:S,initializeConflictDetection:T,cancelRequests:N,shouldShowConflictModalAfterUpdate:M,checkNodeCompatibility:O}}n(Po,"useConflictDetection");var jN={key:0,class:"icon-[lucide--triangle-alert] text-warning-background"},KN=J({__name:"PackInstallButton",props:{nodePacks:{},isLoading:{type:Boolean,default:!1},label:{default:"Install"},size:{default:"sm"},hasConflict:{type:Boolean},conflictInfo:{}},setup(e){const t=It(),{showNodeConflictDialog:a}=pt(),{t:o}=Fe(),s=E(()=>e.nodePacks?.length?e.nodePacks.some(d=>t.isPackInstalling(d.id)):!1),r=n(d=>{if(!d.id)throw new Error("Node ID is required for installation");const p=d.publisher?.name==="Unclaimed"?"nightly":d.latest_version?.version??"latest";return{id:d.id,repository:d.repository??"",channel:"dev",mode:"cache",selected_version:p,version:p}},"createPayload"),i=n(d=>t.installPack.call(r(d)),"installPack"),l=n(async()=>{if(!e.nodePacks?.length)return;if(e.hasConflict&&e.conflictInfo){const{checkNodeCompatibility:p}=Po();a({conflictedPackages:e.nodePacks.map(f=>{const g=p(f);return{package_id:f.id||"",package_name:f.name||"",has_conflict:g.hasConflict,conflicts:g.conflicts,is_compatible:!g.hasConflict}}).filter(f=>f.has_conflict),buttonText:o("manager.conflicts.installAnyway"),onButtonClick:n(async()=>{const f=e.nodePacks.filter(g=>!t.isPackInstalled(g.id));f.length&&await u(f)},"onButtonClick")});return}const d=e.nodePacks.filter(p=>!t.isPackInstalled(p.id));d.length&&await u(d)},"installAllPacks"),u=n(async d=>{await Promise.all(d.map(i)),t.installPack.clear()},"performInstallation"),c=E(()=>s.value?o("g.installing"):e.label??(e.nodePacks.length>1?o("manager.installSelected"):o("g.install")));return(d,p)=>(C(),X(se,{variant:"secondary",size:d.size,disabled:d.isLoading||s.value,onClick:l},{default:W(()=>[d.hasConflict&&!s.value&&!d.isLoading?(C(),P("i",jN)):d.isLoading||s.value?(C(),X(_r,{key:1,duration:"1s",size:d.size==="sm"?12:16},null,8,["size"])):H("",!0),v("span",null,$(c.value),1)]),_:1},8,["size","disabled"]))}}),Xn=KN,YN=J({__name:"PackUpdateButton",props:{nodePacks:{},hasDisabledUpdatePacks:{type:Boolean},size:{default:"sm"}},setup(e){const t=A(!1),a=It(),o=n(i=>({id:i.id,version:i.latest_version.version}),"createPayload"),s=n(async i=>{if(!i.id||!i.latest_version?.version){console.warn("Pack missing required id or version:",i);return}await a.updatePack.call(o(i))},"updatePack"),r=n(async()=>{if(!e.nodePacks?.length){console.warn("No packs provided for update");return}t.value=!0;const i=e.nodePacks.filter(l=>a.isPackInstalled(l.id));if(!i.length){t.value=!1;return}try{await Promise.all(i.map(s)),a.updatePack.clear()}catch(l){console.error("Pack update failed:",l),console.error("Failed packs info:",i.map(u=>u.id))}finally{t.value=!1}},"updateAllPacks");return(i,l)=>{const u=ht("tooltip");return ze((C(),X(se,{class:"border",size:i.size,disabled:t.value,onClick:r},{default:W(()=>[t.value?(C(),X(_r,{key:0,duration:"1s",size:12})):H("",!0),v("span",null,$(i.$t("manager.updateAll")),1)]),_:1},8,["size","disabled"])),[[u,i.hasDisabledUpdatePacks?i.$t("manager.disabledNodesWontUpdate"):null,void 0,{top:!0}]])}}}),qN=YN;const Zn=Symbol("ImportFailed");var XN=J({__name:"PackStatusMessage",props:{statusType:{},hasCompatibilityIssues:{type:Boolean}},setup(e){const t=Ma(Zn)?.importFailed,a={NodeStatusActive:{label:"active",severity:"success"},NodeStatusDeleted:{label:"deleted",severity:"warn"},NodeStatusBanned:{label:"banned",severity:"error"},NodeVersionStatusActive:{label:"active",severity:"success"},NodeVersionStatusPending:{label:"pending",severity:"warn"},NodeVersionStatusDeleted:{label:"deleted",severity:"warn"},NodeVersionStatusFlagged:{label:"flagged",severity:"error"},NodeVersionStatusBanned:{label:"banned",severity:"error"}},o=E(()=>t?.value?"importFailed":e.hasCompatibilityIssues?"conflicting":a[e.statusType]?.label||"unknown"),s=E(()=>e.hasCompatibilityIssues||t?.value?"error":a[e.statusType]?.severity||"secondary");return(r,i)=>(C(),X(b(Ea),{severity:s.value,class:"flex w-fit items-center rounded-xl p-0 break-words",pt:{text:{class:"text-xs"},content:{class:"px-2 py-0.5"}}},{default:W(()=>[i[0]||(i[0]=v("i",{class:"pi pi-circle-fill mr-1.5 p-0 text-[0.6rem]",style:{opacity:.8}},null,-1)),fe(" "+$(r.$t(`manager.status.${o.value}`)),1)]),_:1},8,["severity"]))}}),Sm=XN,ZN=J({__name:"ContentDivider",props:{orientation:{default:"horizontal"},width:{default:.3}},setup(e){ug(o=>({"4bb7c524":o.width+"px"}));const t=za(),a=E(()=>t.completedActivePalette.light_theme);return(o,s)=>(C(),P("div",{class:pe({"content-divider":!0,"content-divider--horizontal":o.orientation==="horizontal","content-divider--vertical":o.orientation==="vertical"}),style:nt({backgroundColor:a.value?"#DCDAE1":"#2C2C2C"})},null,6))}}),Oi=ot(ZN,[["__scopeId","data-v-1d39213b"]]),JN=["width","height"],QN=["fill"],e$=J({__name:"VerifiedIcon",props:{size:{default:16},color:{default:"#60A5FA"},class:{}},setup(e){const t=E(()=>e.class||"");return(a,o)=>(C(),P("svg",{xmlns:"http://www.w3.org/2000/svg",width:a.size,height:a.size,viewBox:"0 0 16 16",fill:"none",class:pe(t.value)},[v("path",{d:"M8.00049 1.3335C8.73661 1.33367 9.33332 1.93038 9.3335 2.6665V2.83447C9.82278 2.96041 10.2851 3.15405 10.7095 3.40479L10.8286 3.28564C11.3493 2.76525 12.1937 2.76519 12.7144 3.28564C13.235 3.80626 13.2348 4.65067 12.7144 5.17139L12.5952 5.29053C12.846 5.71486 13.0396 6.17725 13.1655 6.6665H13.3335C14.0699 6.6665 14.6665 7.26411 14.6665 8.00049C14.6663 8.73672 14.0698 9.3335 13.3335 9.3335H13.1655C13.0396 9.82284 12.846 10.2851 12.5952 10.7095L12.7144 10.8286C13.235 11.3493 13.235 12.1937 12.7144 12.7144C12.1937 13.235 11.3493 13.235 10.8286 12.7144L10.7095 12.5952C10.2851 12.846 9.82284 13.0396 9.3335 13.1655V13.3335C9.3335 14.0698 8.73672 14.6663 8.00049 14.6665C7.26411 14.6665 6.6665 14.0699 6.6665 13.3335V13.1655C6.17725 13.0396 5.71486 12.846 5.29053 12.5952L5.17139 12.7144C4.65067 13.2348 3.80626 13.235 3.28564 12.7144C2.76519 12.1937 2.76525 11.3493 3.28564 10.8286L3.40479 10.7095C3.15405 10.2851 2.96041 9.82278 2.83447 9.3335H2.6665C1.93038 9.33332 1.33367 8.73661 1.3335 8.00049C1.3335 7.26422 1.93027 6.66668 2.6665 6.6665H2.83447C2.96043 6.17722 3.15403 5.71488 3.40479 5.29053L3.28564 5.17139C2.76536 4.65065 2.76508 3.80621 3.28564 3.28564C3.80621 2.76508 4.65065 2.76536 5.17139 3.28564L5.29053 3.40479C5.71488 3.15403 6.17722 2.96043 6.6665 2.83447V2.6665C6.66668 1.93027 7.26422 1.3335 8.00049 1.3335ZM7.3335 8.00049L6.00049 6.6665L4.6665 8.00049L7.3335 10.6665L11.3335 6.6665L10.0005 5.3335L7.3335 8.00049Z",fill:a.color},null,8,QN)],10,JN))}}),t$=e$;function Js(e,t){const a=`manager.conflicts.conflictMessages.${e.type}`;return e.type==="comfyui_version"||e.type==="frontend_version"||e.type==="os"||e.type==="accelerator"?t(a,{current:e.current_value,required:e.required_value}):e.type==="banned"||e.type==="pending"||e.type==="import_failed"?t(a):t("manager.conflicts.conflictMessages.generic",{current:e.current_value,required:e.required_value})}n(Js,"getConflictMessage");function a$(e,t,a="; "){return e.map(o=>Js(o,t)).join(a)}n(a$,"getJoinedConflictMessages");var o$={class:"w-64 pt-1"},n$={class:"py-2"},s$={class:"text-md pl-3 font-semibold text-neutral-500"},r$={key:0,class:"flex flex-col items-center py-4 text-center text-muted"},i$={key:1,class:"py-2"},l$={class:"flex w-full items-center justify-between p-1"},u$={class:"flex items-center gap-2"},c$={key:0,class:"w-4"},d$={key:0,class:"icon-[lucide--triangle-alert] text-warning-background"},p$={key:0,class:"pi pi-check text-highlight"},f$={class:"flex justify-end gap-2 px-3 py-1"},m$=J({__name:"PackVersionSelectorPopover",props:{nodePack:{}},emits:["cancel","submit"],setup(e,{emit:t}){const a={LATEST:"latest",NIGHTLY:"nightly"},o={DEFAULT:"default",DEV:"dev"},s={CACHE:"cache",REMOTE:"remote",LOCAL:"local"},r=t,{t:i}=Fe(),l=$l(),u=It(),{checkNodeCompatibility:c}=Po(),d=A(!1),p=A(a.LATEST);it(()=>{const D=f()??a.LATEST;p.value=(0,ea.valid)(D)?D:a.NIGHTLY});const f=n(()=>{if(e.nodePack.id)return e.nodePack.publisher?.name==="Unclaimed"?a.NIGHTLY:u.isPackInstalled(e.nodePack.id)?u.getInstalledPackVersion(e.nodePack.id):e.nodePack.latest_version?.version},"getInitialSelectedVersion"),g=n(async()=>e.nodePack?.id?await l.getPackVersions(e.nodePack.id)||[]:[],"fetchVersions"),m=A([]),h=A([]),y=A(!1),k=n(async()=>{y.value=!0;const D=await g();h.value=D;const T=e.nodePack.latest_version?.version,N=D.map(L=>({value:L.version??"",label:L.version??""})).filter(L=>L.value&&L.value!==T),M=T?`${i("manager.latestVersion")} (${T})`:i("manager.latestVersion"),O=[{value:a.LATEST,label:M}];e.nodePack.repository?.length&&O.push({value:a.NIGHTLY,label:i("manager.nightlyVersion")}),m.value=[...O,...N],y.value=!1},"onNodePackChange");Mt(()=>e.nodePack.id,(D,T)=>{D!==T&&k()},{deep:!0,immediate:!0});const S=n(async()=>{if(d.value=!0,!e.nodePack.id)throw new Error("Node ID is required for installation");const D=p.value==="latest"?e.nodePack.latest_version?.version??"latest":p.value;await u.installPack.call({id:e.nodePack.id,repository:e.nodePack.repository??"",channel:o.DEFAULT,mode:s.CACHE,version:D,selected_version:p.value}),d.value=!1,r("submit")},"handleSubmit"),_=n(D=>{const T=e.nodePack.latest_version?.version;if(D==="latest"||D===T)return{...e.nodePack.latest_version};const N=h.value.find(M=>M.version===D);return N?{...N}:{...e.nodePack}},"getVersionData"),I=n(D=>{const T=c(_(D)),N=T.hasConflict?a$(T.conflicts,i):"";return{hasConflict:T.hasConflict,conflictMessage:N}},"getVersionCompatibility"),w=n(D=>p.value===D||D==="latest"&&p.value===e.nodePack.latest_version?.version,"isOptionSelected"),x=E(()=>m.value.map(D=>{const T=I(D.value),N=w(D.value);return{...D,hasConflict:T.hasConflict,conflictMessage:T.conflictMessage,isSelected:N}}));return(D,T)=>{const N=ht("tooltip");return C(),P("div",o$,[v("div",n$,[v("span",s$,$(D.$t("manager.selectVersion")),1)]),y.value||d.value?(C(),P("div",r$,[R(b(Io),{class:"mb-2 h-8 w-8"}),fe(" "+$(D.$t("manager.loadingVersions")),1)])):m.value.length===0?(C(),P("div",i$,[R(Va,{title:D.$t("g.noResultsFound"),message:D.$t("manager.tryAgainLater"),icon:"pi pi-exclamation-circle",class:"p-0"},null,8,["title","message"])])):(C(),X(b(Fi),{key:2,modelValue:p.value,"onUpdate:modelValue":T[0]||(T[0]=M=>p.value=M),"option-label":"label","option-value":"value",options:x.value,"highlight-on-select":!1,class:"max-h-[50vh] w-full rounded-md border-none shadow-none",pt:{listContainer:{class:"scrollbar-hide"}}},{option:W(M=>[v("div",l$,[v("div",u$,[M.option.value==="nightly"?(C(),P("div",c$)):(C(),P(Se,{key:1},[M.option.hasConflict?ze((C(),P("i",d$,null,512)),[[N,{value:M.option.conflictMessage,showDelay:300}]]):(C(),X(t$,{key:1,size:20,class:"relative right-0.5"}))],64)),v("span",null,$(M.option.label),1)]),M.option.isSelected?(C(),P("i",p$)):H("",!0)])]),_:1},8,["modelValue","options"])),R(Oi,{class:"my-2"}),v("div",f$,[R(se,{variant:"muted-textonly",class:"text-sm",disabled:d.value,onClick:T[1]||(T[1]=M=>r("cancel"))},{default:W(()=>[fe($(D.$t("g.cancel")),1)]),_:1},8,["disabled"]),R(se,{variant:"secondary",class:"rounded-lg bg-secondary-background px-4 py-2.5 text-sm text-base-foreground",disabled:d.value,onClick:S},{default:W(()=>[fe($(D.$t("g.install")),1)]),_:1},8,["disabled"])])])}}}),g$=m$;const Ul=n(e=>{const{isPackInstalled:t,isPackEnabled:a,getInstalledPackVersion:o}=It(),s=E(()=>lg(e)),r=E(()=>t(s.value?.id)),i=E(()=>a(s.value?.id)),l=E(()=>o(s.value?.id??"")),u=E(()=>s.value?.latest_version?.version),c=E(()=>!!l.value&&!(0,ea.valid)(l.value));return{isUpdateAvailable:E(()=>!r.value||c.value||!u.value||!l.value?!1:(0,ea.compare)(u.value,l.value)>0),isNightlyPack:c,canTryNightlyUpdate:E(()=>r.value&&i.value&&c.value),installedVersion:l,latestVersion:u}},"usePackUpdateStatus");var h$=["aria-haspopup","role","tabindex"],v$={key:0,class:"pi pi-arrow-circle-up text-xs text-blue-600"},y$={key:1,class:"pi pi-chevron-right text-xxs"},w$=7,b$=J({__name:"PackVersionBadge",props:{nodePack:{},isSelected:{type:Boolean},fill:{type:Boolean,default:!0}},setup(e){const{isUpdateAvailable:t}=Ul(()=>e.nodePack),a=A(),o=It(),s=E(()=>o.isPackInstalled(e.nodePack?.id)),r=E(()=>s.value&&!o.isPackEnabled(e.nodePack?.id)),i=E(()=>{if(!e.nodePack.id)return"nightly";const c=o.installedPacks[e.nodePack.id]?.ver??e.nodePack.latest_version?.version??"nightly";return(0,ea.valid)(c)?c:c.slice(0,w$)}),l=n(c=>{a.value.toggle(c)},"toggleVersionSelector"),u=n(()=>{a.value.hide()},"closeVersionSelector");return be(()=>e.isSelected,(c,d)=>{d&&!c&&u()}),(c,d)=>{const p=ht("tooltip");return C(),P("div",null,[ze((C(),P("div",{class:pe(["inline-flex items-center gap-1 rounded-2xl py-1 text-xs",{"bg-dialog-surface px-1.5":c.fill,"cursor-pointer":!r.value,"cursor-not-allowed opacity-60":r.value}]),"aria-haspopup":!r.value,role:r.value?"text":"button",tabindex:r.value?-1:0,onClick:d[0]||(d[0]=f=>!r.value&&l(f)),onKeydown:[d[1]||(d[1]=Ja(f=>!r.value&&l(f),["enter"])),d[2]||(d[2]=Ja(f=>!r.value&&l(f),["space"]))]},[b(t)?(C(),P("i",v$)):H("",!0),v("span",null,$(i.value),1),r.value?H("",!0):(C(),P("i",y$))],42,h$)),[[p,r.value?c.$t("manager.enablePackToChangeVersion"):null,void 0,{top:!0}]]),R(b(mo),{ref_key:"popoverRef",ref:a,pt:{content:{class:"p-0 shadow-lg"}}},{default:W(()=>[R(g$,{"installed-version":i.value,"node-pack":c.nodePack,onCancel:u,onSubmit:u},null,8,["installed-version","node-pack"])]),_:1},512)])}}}),Em=b$;function _$(e){if(!e)return null;const t=e.filter(a=>a.type==="import_failed");return t.length>0?t:null}n(_$,"extractImportFailedConflicts");function k$(){const{showImportFailedNodeDialog:e}=pt();return(t,a)=>{t&&t.length>0&&e({conflictedPackages:t,dialogComponentProps:{onClose:a}})}}n(k$,"createImportFailedDialog");function Tm(e){const{isPackInstalled:t}=It(),{getConflictsForPackageByID:a}=un(),o=E(()=>e?t(b(e)):!1),s=E(()=>{const u=b(e);return!u||!o.value?null:a(u)||null}),r=E(()=>_$(s.value?.conflicts)),i=E(()=>r.value!==null),l=k$();return{importFailedInfo:r,importFailed:i,showImportFailedDialog:n(u=>{s.value&&l([s.value],u)},"showImportFailedDialog"),isInstalled:o}}n(Tm,"useImportFailedDetection");var C$={class:"flex items-center gap-2"},x$=256,I$=J({__name:"PackEnableToggle",props:{nodePack:{}},setup(e){const{t}=Fe(),{isPackEnabled:a,enablePack:o,disablePack:s,installedPacks:r}=It(),{getConflictsForPackageByID:i}=un(),{showNodeConflictDialog:l}=pt(),{acknowledgmentState:u,markConflictsAsSeen:c}=Fl(),{showImportFailedDialog:d}=Tm(e.nodePack.id||""),p=A(!1),f=E(()=>a(e.nodePack.id)),g=E(()=>{const x=e.nodePack.id;return x?r[x]?.ver??e.nodePack.latest_version?.version??"nightly":"nightly"}),m=E(()=>{if(e.nodePack.id)return i(e.nodePack.id)}),h=E(()=>!(m.value?.has_conflict&&!u.value.modal_dismissed)),y=n(x=>{let D=u.value.modal_dismissed;x&&(D=!1),m.value&&!D&&(m.value.conflicts.some(T=>T.type==="import_failed")?d(()=>{c()}):l({conflictedPackages:[m.value],buttonText:f.value?t("manager.conflicts.understood"):t("manager.conflicts.enableAnyway"),onButtonClick:n(async()=>{f.value||await k()},"onButtonClick"),dialogComponentProps:{onClose:n(()=>{c()},"onClose")}}))},"showConflictModal"),k=n(()=>{if(!e.nodePack.id)throw new Error("Node ID is required for enabling");return o({id:e.nodePack.id,version:g.value??"latest"})},"handleEnable"),S=n(()=>{if(!e.nodePack.id)throw new Error("Node ID is required for disabling");return s({id:e.nodePack.id,version:g.value??"latest"})},"handleDisable"),_=n(async x=>{p.value||(p.value=!0,x?await k():await S(),p.value=!1)},"handleToggle"),I=tr(x=>{_(x)},x$,{trailing:!0}),w=n(async x=>{h.value||(x.preventDefault(),y(!1))},"handleToggleInteraction");return(x,D)=>{const T=ht("tooltip");return C(),P("div",C$,[m.value?.has_conflict?ze((C(),P("div",{key:0,class:"flex h-6 w-6 cursor-pointer items-center justify-center",onClick:D[0]||(D[0]=N=>y(!0))},D[1]||(D[1]=[v("i",{class:"icon-[lucide--triangle-alert] text-xl text-warning-background"},null,-1)]))),[[T,{value:x.$t("manager.conflicts.warningTooltip"),showDelay:300}]]):H("",!0),h.value?(C(),X(b(ti),{key:2,"model-value":f.value,disabled:p.value,"aria-label":x.$t("g.enableOrDisablePack"),"onUpdate:modelValue":b(I)},null,8,["model-value","disabled","aria-label","onUpdate:modelValue"])):(C(),X(b(ti),{key:1,"model-value":f.value,disabled:p.value,readonly:!h.value,"aria-label":x.$t("g.enableOrDisablePack"),onFocus:w},null,8,["model-value","disabled","readonly","aria-label"]))])}}}),Am=I$,S$=J({__name:"PackTryUpdateButton",props:{nodePack:{},size:{}},setup(e){const{t}=Fe(),a=It(),o=A(!1);async function s(){if(!e.nodePack.id){console.warn("Pack missing required id:",e.nodePack);return}o.value=!0;try{await a.updatePack.call({id:e.nodePack.id,version:"nightly"}),a.updatePack.clear()}catch(r){console.error("Nightly update failed:",r)}finally{o.value=!1}}return n(s,"tryUpdate"),(r,i)=>{const l=ht("tooltip");return ze((C(),X(se,{variant:"textonly",size:r.size,disabled:o.value,onClick:s},{default:W(()=>[o.value?(C(),X(_r,{key:0,duration:"1s",size:r.size==="sm"?12:16},null,8,["size"])):H("",!0),v("span",null,$(o.value?b(t)("g.updating"):b(t)("manager.tryUpdate")),1)]),_:1},8,["size","disabled"])),[[l,r.$t("manager.tryUpdateTooltip"),void 0,{top:!0}]])}}}),E$=S$,T$=J({__name:"PackUninstallButton",props:{nodePacks:{},size:{}},setup(e){const t=It(),{t:a}=Fe(),o=n(i=>{if(!i.id)throw new Error("Node ID is required for uninstallation");return{id:i.id,version:i.latest_version?.version||"unknown"}},"createPayload"),s=n(i=>t.uninstallPack(o(i)),"uninstallPack"),r=n(async()=>{e.nodePacks?.length&&await Promise.all(e.nodePacks.map(s))},"uninstallItems");return(i,l)=>(C(),X(se,{variant:"textonly",size:i.size,class:"border border-red-500",onClick:r},{default:W(()=>[fe($(i.nodePacks.length>1?b(a)("manager.uninstallSelected"):b(a)("manager.uninstall")),1)]),_:1},8,["size"]))}}),Wl=T$,A$={class:"aspect-[2/1] w-full max-w-[204] overflow-hidden rounded-lg"},M$={key:0,class:"h-full w-full"},P$=["alt"],D$={key:1,class:"relative h-full w-full"},L$=["src","alt"],Hc="/assets/images/fallback-gradient-avatar.svg",O$=J({__name:"PackIcon",props:{nodePack:{}},setup(e){const t=A(!1),a=E(()=>!e.nodePack.banner_url&&!e.nodePack.icon),o=E(()=>e.nodePack.banner_url||e.nodePack.icon);return(s,r)=>(C(),P("div",A$,[a.value?(C(),P("div",M$,[v("img",{src:Hc,alt:s.$t("g.defaultBanner"),class:"h-full w-full object-cover"},null,8,P$)])):(C(),P("div",D$,[o.value?(C(),P("div",{key:0,class:"absolute inset-0 bg-cover bg-center bg-no-repeat",style:nt({backgroundImage:`url(${o.value})`,filter:"blur(10px)"})},null,4)):H("",!0),v("img",{src:t.value?Hc:o.value,alt:s.nodePack.name+" banner",class:pe(t.value?"relative w-full h-full object-cover z-10":"relative w-full h-full object-contain z-10"),onError:r[0]||(r[0]=i=>t.value=!0)},null,42,L$)]))]))}}),Mm=O$,N$={key:0,class:"flex flex-col items-center"},$$={class:"mt-4 mb-2 text-center text-2xl font-bold",style:{"word-break":"break-all"}},R$={class:"inline-block text-base"},B$={key:0,class:"mt-2 mb-4 flex w-full max-w-xs justify-center"},F$={key:1,class:"flex flex-col items-center"},U$=J({__name:"InfoPanelHeader",props:{nodePacks:{},hasConflict:{type:Boolean}},setup(e){const t=It(),a=Ma(Zn)?.importFailed,o=A(!1);be([()=>e.nodePacks,()=>t.installedPacks],()=>{o.value=e.nodePacks.every(l=>t.isPackInstalled(l.id))},{immediate:!0});const{checkNodeCompatibility:s}=Po(),r=E(()=>{if(!e.nodePacks?.length)return[];const l=[];for(const u of e.nodePacks){const c=s(u);c.conflicts&&l.push(...c.conflicts)}return l}),i=E(()=>r.value.length>0);return(l,u)=>l.nodePacks?.length?(C(),P("div",N$,[tt(l.$slots,"thumbnail",{},()=>[R(Mm,{"node-pack":l.nodePacks[0],width:"204",height:"106"},null,8,["node-pack"])]),v("h2",$$,[tt(l.$slots,"title",{},()=>[v("span",R$,$(l.nodePacks[0].name),1)])]),b(a)?H("",!0):(C(),P("div",B$,[tt(l.$slots,"install-button",{},()=>[o.value?(C(),X(Wl,Ht({key:0},l.$attrs,{size:"md","node-packs":l.nodePacks}),null,16,["node-packs"])):(C(),X(Xn,Ht({key:1},l.$attrs,{size:"md","node-packs":l.nodePacks,"has-conflict":l.hasConflict||i.value,"conflict-info":r.value}),null,16,["node-packs","has-conflict","conflict-info"]))])]))])):(C(),P("div",F$,[R(Va,{message:l.$t("manager.status.unknown"),title:l.$t("manager.tryAgainLater")},null,8,["message","title"])]))}}),Pm=U$,W$=["textContent"],z$={key:1,class:"break-words"},V$=["href"],G$={class:"text-blue-600"},H$={key:1},j$={key:2},K$={key:3,class:"rounded px-1 py-0.5 text-xs"},Y$={key:4},q$=J({__name:"MarkdownText",props:{text:{}},setup(e){const t=E(()=>/(\[.*?\]\(.*?\)|(\*\*|__)(.*?)(\*\*|__)|(\*|_)(.*?)(\*|_)|`(.*?)`)/.test(e.text)),a=E(()=>{if(!t.value)return[{type:"text",text:e.text}];const o=[],s=e.text;let r=0;const i=/\[(.*?)\]\((.*?)\)/g;let l;for(;(l=i.exec(s))!==null;)l.index>r&&o.push({type:"text",text:s.substring(r,l.index)}),o.push({type:"link",text:l[1],url:l[2]}),r=l.index+l[0].length;if(r<s.length){let u=s.substring(r);u=u.replace(/(\*\*|__)(.*?)(\*\*|__)/g,(c,d,p)=>(o.push({type:"bold",text:p}),"")),u=u.replace(/(\*|_)(.*?)(\*|_)/g,(c,d,p)=>(o.push({type:"italic",text:p}),"")),u=u.replace(/`(.*?)`/g,(c,d)=>(o.push({type:"code",text:d}),"")),u&&o.push({type:"text",text:u})}return o});return(o,s)=>(C(),P("div",null,[t.value?(C(),P("div",z$,[(C(!0),P(Se,null,Ze(a.value,(r,i)=>(C(),P(Se,{key:i},[r.type==="link"&&"url"in r?(C(),P("a",{key:0,href:r.url,target:"_blank",rel:"noopener noreferrer",class:"hover:underline"},[v("span",G$,$(r.text),1)],8,V$)):r.type==="bold"?(C(),P("strong",H$,$(r.text),1)):r.type==="italic"?(C(),P("em",j$,$(r.text),1)):r.type==="code"?(C(),P("code",K$,$(r.text),1)):(C(),P("span",Y$,$(r.text),1))],64))),128))])):(C(),P("div",{key:0,class:"break-words",textContent:$(o.text)},null,8,W$))]))}}),X$=q$,Z$={class:"flex flex-col gap-4 text-sm"},J$={class:"mb-3"},Q$={class:"break-words text-muted"},eR=["href"],tR={key:0,class:"pi pi-github text-base"},aR={class:"break-all"},oR=J({__name:"InfoTextSection",props:{sections:{}},setup(e){const t=n(a=>a.includes("github.com"),"isGitHubLink");return(a,o)=>(C(),P("div",Z$,[(C(!0),P(Se,null,Ze(a.sections,(s,r)=>(C(),P("div",{key:r,class:"mb-4"},[v("div",J$,$(s.title),1),v("div",Q$,[s.isUrl?(C(),P("a",{key:0,href:s.text,target:"_blank",rel:"noopener noreferrer",class:"flex items-center gap-2"},[t(s.text)?(C(),P("i",tR)):H("",!0),v("span",aR,$(s.text),1)],8,eR)):(C(),X(X$,{key:1,text:s.text,class:"text-muted"},null,8,["text"]))])]))),128))]))}}),nR=oR,sR={class:"overflow-hidden"},rR={key:1,class:"text-sm text-muted italic"},iR={key:2},lR={class:"mb-1"},uR=J({__name:"DescriptionTabPanel",props:{nodePack:{}},setup(e){const{t}=Fe(),a=n(u=>/^license(\.md|\.txt)?$/i.test(u),"isLicenseFile"),o=n(u=>{const c=u.match(/^(https?:\/\/github\.com\/[^/]+\/[^/]+)/i);return c?c[1]:u},"extractBaseRepoUrl"),s=n((u,c)=>{if(!c||!u)return"";const d=a(u)?u:"LICENSE";return`${o(c)}/blob/main/${d}`},"createLicenseUrl"),r=n(u=>{const c=u.file||u.text;if(typeof c=="string"&&a(c)&&e.nodePack.repository){const d=s(c,e.nodePack.repository);return{text:d,isUrl:!!d&&xs(d)}}else{if(u.text)return{text:u.text,isUrl:!1};if(typeof c=="string")return{text:c,isUrl:!1}}return{text:JSON.stringify(u),isUrl:!1}},"parseLicenseObject"),i=n(u=>{if(u==="{}")return null;try{const c=JSON.parse(u);return Object.keys(c).length===0?null:r(c)}catch{if(a(u)&&e.nodePack.repository){const d=s(u,e.nodePack.repository);return{text:d,isUrl:!!d&&xs(d)}}return{text:u,isUrl:!1}}},"formatLicense"),l=E(()=>{const u=[{title:t("g.description"),text:e.nodePack.description||t("manager.noDescription")}];if(e.nodePack.repository&&u.push({title:t("manager.repository"),text:e.nodePack.repository,isUrl:xs(e.nodePack.repository)}),e.nodePack.license){const c=i(e.nodePack.license);c&&c.text&&u.push({title:t("manager.license"),text:c.text,isUrl:c.isUrl})}return u});return(u,c)=>(C(),P("div",sR,[u.nodePack?.description?(C(),X(nR,{key:0,sections:l.value},null,8,["sections"])):(C(),P("p",rR,$(u.$t("manager.noDescription")),1)),u.nodePack?.latest_version?.dependencies?.length?(C(),P("div",iR,[v("p",lR,$(u.$t("manager.dependencies")),1),(C(!0),P(Se,null,Ze(u.nodePack.latest_version.dependencies,(d,p)=>(C(),P("div",{key:p,class:"break-words text-muted"},$(d),1))),128))])):H("",!0)]))}}),cR=uR,dR=n(e=>{const t=JSON.parse(e.return_types??"{}");if(!t.length)return[];const a=JSON.parse(e.return_names??"{}"),o=e.output_is_list??[],s=[];for(let r=0;r<t.length;r++)s.push({type:t[r],name:a[r]||t[r],is_list:o[r]??!1,index:r});return s},"registryToFrontendV2NodeOutputs"),pR=n(e=>{const t=JSON.parse(e.input_types??"{}");if(!t||!Object.keys(t).length)return{};const a={};return t.required&&Object.entries(t.required).forEach(([o,s])=>{a[o]=ko(s,{name:o,isOptional:!1})}),t.optional&&Object.entries(t.optional).forEach(([o,s])=>{a[o]=ko(s,{name:o,isOptional:!0})}),a},"registryToFrontendV2NodeInputs");const fR=n((e,t)=>{const a=e.comfy_node_name??"Node Name";return{category:e.category??"unknown",description:e.description??"",display_name:a,name:a,inputs:pR(e),outputs:dR(e),output_node:!1,python_module:t.name??t.id??"unknown"}},"registryToFrontendV2NodeDef");var mR={class:"flex flex-col gap-4 text-sm"},gR={class:"[zoom:0.6]"},hR=J({__name:"NodesTabPanel",props:{nodePack:{},nodeNames:{}},setup(e){const{getNodeDefs:t}=ln(),a=A(!1),o=Qt(null);Mt(()=>e.nodePack,n(async()=>{t.cancel(),a.value=!0;const{id:u}=e.nodePack,c=e.nodePack.latest_version?.version;!u||!c?o.value=null:o.value=(await t.call({packId:u,version:c,page:1,limit:256}))?.comfy_nodes??null,a.value=!1},"fetchNodeDefs"),{immediate:!0,deep:!0});const r=n(u=>{try{return fR(u,e.nodePack)}catch{return null}},"toFrontendNodeDef"),i=E(()=>o.value?o.value.map(r).filter(u=>u!==null):null),l=n(u=>`${u.category}${u.comfy_node_name??$s()}`,"createNodeDefKey");return(u,c)=>(C(),P("div",mR,[i.value?.length?(C(!0),P(Se,{key:0},Ze(i.value,d=>(C(),P("div",{key:l(d),class:"rounded-lg border p-4"},[v("div",gR,[R(wr,{"node-def":d,position:"relative",class:"min-w-full! text-[.625rem]!"},null,8,["node-def"])])]))),128)):a.value?(C(),X(b(Io),{key:1})):u.nodeNames.length?(C(!0),P(Se,{key:2},Ze(u.nodeNames,d=>(C(),P("div",{key:d,class:"truncate text-muted"},$(d),1))),128)):(C(),X(Va,{key:3,title:u.$t("manager.noNodesFound"),message:u.$t("manager.noNodesFoundDescription")},null,8,["title","message"]))]))}}),vR=hR,yR={class:"flex flex-col gap-3"},wR={key:0,class:"max-h-64 overflow-x-hidden scrollbar-custom overflow-y-auto rounded px-2"},bR={class:"text-xs text-muted-foreground break-all font-mono"},_R={key:1,class:"text-sm break-words"},kR=J({__name:"WarningTabPanel",props:{conflictResult:{}},setup(e){return(t,a)=>(C(),P("div",yR,[(C(!0),P(Se,null,Ze(t.conflictResult?.conflicts||[],(o,s)=>(C(),P("div",{key:s,class:"rounded-md bg-secondary-background/60 px-2 py-1"},[o.type==="import_failed"?(C(),P(Se,{key:0},[o.required_value?(C(),P("div",wR,[v("p",bR,$(o.required_value),1)])):H("",!0)],64)):(C(),P("div",_R,$(b(Js)(o,t.$t)),1))]))),128))]))}}),CR=kR,xR={class:"overflow-hidden"},IR={class:"flex items-center gap-1"},SR=J({__name:"InfoTabs",props:{nodePack:{},hasCompatibilityIssues:{type:Boolean},conflictResult:{}},setup(e){const t=Ma(Zn)?.importFailed,a=E(()=>{const{comfy_nodes:s}=e.nodePack;return s??[]}),o=A("description");return ar(()=>{e.hasCompatibilityIssues?o.value="warning":o.value==="warning"&&(o.value="description")},{flush:"post"}),(s,r)=>(C(),P("div",xR,[R(b(md),{value:o.value},{default:W(()=>[R(b(qm),{class:"scrollbar-hide overflow-x-auto"},{default:W(()=>[s.hasCompatibilityIssues?(C(),X(b(Ir),{key:0,value:"warning",class:"mr-6 p-2 font-inter"},{default:W(()=>[v("div",IR,[r[0]||(r[0]=v("span",null,"⚠️",-1)),fe(" "+$(b(t)?s.$t("g.error"):s.$t("g.warning")),1)])]),_:1})):H("",!0),R(b(Ir),{value:"description",class:"mr-6 p-2 font-inter"},{default:W(()=>[fe($(s.$t("g.description")),1)]),_:1}),R(b(Ir),{value:"nodes",class:"p-2 font-inter"},{default:W(()=>[fe($(s.$t("g.nodes")),1)]),_:1})]),_:1}),R(b(cd),{class:"overflow-auto px-2 py-4"},{default:W(()=>[s.hasCompatibilityIssues?(C(),X(b(xr),{key:0,value:"warning",class:"bg-transparent"},{default:W(()=>[R(CR,{"node-pack":s.nodePack,"conflict-result":s.conflictResult},null,8,["node-pack","conflict-result"])]),_:1})):H("",!0),R(b(xr),{value:"description"},{default:W(()=>[R(cR,{"node-pack":s.nodePack},null,8,["node-pack"])]),_:1}),R(b(xr),{value:"nodes"},{default:W(()=>[R(vR,{"node-pack":s.nodePack,"node-names":a.value},null,8,["node-pack","node-names"])]),_:1})]),_:1})]),_:1},8,["value"])]))}}),ER=SR,TR={class:"flex py-1.5 text-xs"},AR={class:"w-1/3 truncate pr-2 text-muted"},MR={class:"w-2/3"},PR=J({__name:"MetadataRow",props:{label:{},value:{default:"N/A"}},setup(e){return(t,a)=>(C(),P("div",TR,[v("div",AR,$(t.label),1),v("div",MR,[tt(t.$slots,"default",{},()=>[fe($(t.value),1)])])]))}}),Go=PR;const DR=n(e=>"comfy_nodes"in e,"isMergedNodePack"),zl=Symbol("isInstalling");let mt=(function(e){return e.All="all",e.Installed="installed",e.Workflow="workflow",e.Missing="missing",e.UpdateAvailable="updateAvailable",e})({}),Kt=(function(e){return e.Downloads="total_install",e.Created="create_time",e.Updated="update_time",e.Publisher="publisher_id",e.Name="name",e})({});var LR={key:0,class:"relative z-40 flex h-full flex-col overflow-hidden"},OR={class:"top-0 z-10 w-full px-6 pt-6"},NR={class:"flex w-full justify-center gap-2"},$R={class:"mb-6"},RR={class:"mb-6 overflow-hidden"},BR={key:1,class:"flex-1 overflow-hidden px-8 pt-4 text-sm"},FR=J({__name:"InfoPanel",props:{nodePack:{}},setup(e){const t=A(null),{isPackInstalled:a}=It(),o=E(()=>a(e.nodePack.id)),s=A(!1);ya(zl,s),Mt(o,()=>{s.value=!1});const{canTryNightlyUpdate:r}=Ul(()=>e.nodePack),{checkNodeCompatibility:i}=Po(),{getConflictsForPackageByID:l}=un(),{t:u,d:c,n:d}=Fe(),p=E(()=>{if(o.value&&e.nodePack.id)return l(e.nodePack.id)||null;const S=i(e.nodePack);return S.hasConflict?{package_id:e.nodePack.id||"",package_name:e.nodePack.name||"",has_conflict:!0,conflicts:S.conflicts,is_compatible:!1}:null}),f=E(()=>p.value?.has_conflict),{importFailed:g,showImportFailedDialog:m}=Tm(E(()=>e.nodePack.id||""));ya(Zn,{importFailed:g,showImportFailedDialog:m});const h=E(()=>[{key:"publisher",label:u("manager.createdBy"),value:e.nodePack.publisher?.name??e.nodePack.publisher?.id},{key:"downloads",label:u("manager.downloads"),value:e.nodePack.downloads?d(e.nodePack.downloads):void 0},{key:"lastUpdated",label:u("manager.lastUpdated"),value:e.nodePack.latest_version?.createdAt?c(e.nodePack.latest_version.createdAt,{dateStyle:"medium"}):void 0}]),{y}=yd(t,{eventListenerOptions:{passive:!0}}),k=n(()=>{y.value=0},"onNodePackChange");return Mt(()=>e.nodePack.id,(S,_)=>{S!==_&&k()},{immediate:!0}),(S,_)=>S.nodePack?(C(),P("div",LR,[v("div",OR,[R(Pm,{"node-packs":[S.nodePack],"has-conflict":f.value},qo({_:2},[b(r)?{name:"install-button",fn:W(()=>[v("div",NR,[R(E$,{"node-pack":S.nodePack,size:"md"},null,8,["node-pack"]),R(Wl,{"node-packs":[S.nodePack],size:"md"},null,8,["node-packs"])])]),key:"0"}:void 0]),1032,["node-packs","has-conflict"])]),v("div",{ref_key:"scrollContainer",ref:t,class:"scrollbar-hide flex-1 overflow-y-auto p-6 pt-2 text-sm"},[v("div",$R,[!b(g)&&b(a)(S.nodePack.id)?(C(),X(Go,{key:0,label:b(u)("manager.filter.enabled"),class:"flex",style:{"align-items":"center"}},{default:W(()=>[R(Am,{"node-pack":S.nodePack,"has-conflict":f.value},null,8,["node-pack","has-conflict"])]),_:1},8,["label"])):H("",!0),(C(!0),P(Se,null,Ze(h.value,I=>ze((C(),X(Go,{key:I.key,label:I.label,value:I.value},null,8,["label","value"])),[[_o,I.value!==void 0&&I.value!==null]])),128)),R(Go,{label:b(u)("g.status")},{default:W(()=>[R(Sm,{"status-type":S.nodePack.status,"has-compatibility-issues":f.value},null,8,["status-type","has-compatibility-issues"])]),_:1},8,["label"]),R(Go,{label:b(u)("manager.version")},{default:W(()=>[R(Em,{"node-pack":S.nodePack,"is-selected":!0},null,8,["node-pack"])]),_:1},8,["label"])]),v("div",RR,[R(ER,{"node-pack":S.nodePack,"has-compatibility-issues":f.value,"conflict-result":p.value},null,8,["node-pack","has-compatibility-issues","conflict-result"])])],512)])):(C(),P("div",BR,$(S.$t("manager.infoPanelEmpty")),1))}}),UR=FR,WR={class:"relative h-[104px] w-[224px] shadow-xl"},zR={class:"rounded-lg border p-0.5 shadow-lg"},VR=J({__name:"PackIconStacked",props:{nodePacks:{},maxVisible:{default:3},offset:{default:8}},setup(e){return(t,a)=>(C(),P("div",WR,[(C(!0),P(Se,null,Ze(t.nodePacks.slice(0,t.maxVisible),(o,s)=>(C(),P("div",{key:o.id,class:"absolute h-[90px] w-[210px]",style:nt({bottom:`${s*t.offset}px`,right:`${s*t.offset}px`,zIndex:t.maxVisible-s})},[v("div",zR,[R(Mm,{"node-pack":o},null,8,["node-pack"])])],4))),128))]))}}),GR=VR;function HR(e){const t=It(),a=E(()=>e.value.filter(c=>t.isPackInstalled(c.id))),o=E(()=>e.value.filter(c=>!t.isPackInstalled(c.id))),s=E(()=>a.value.length===e.value.length),r=E(()=>o.value.length===e.value.length),i=E(()=>a.value.length>0&&o.value.length>0),l=E(()=>s.value?"all-installed":r.value?"none-installed":"mixed"),u=E(()=>a.value.filter(c=>{if(!c.id)return!1;const d=t.getInstalledPackVersion(c.id),p=!!d&&!(0,ea.valid)(d),f=t.isPackEnabled(c.id);return p&&f}));return{installedPacks:a,notInstalledPacks:o,isAllInstalled:s,isNoneInstalled:r,isMixed:i,selectionState:l,nightlyPacks:u,hasNightlyPacks:E(()=>u.value.length>0)}}n(HR,"usePacksSelection");var jR=["NodeStatusBanned","NodeVersionStatusBanned","NodeStatusDeleted","NodeVersionStatusDeleted","NodeVersionStatusFlagged","NodeVersionStatusPending","NodeStatusActive","NodeVersionStatusActive"];function KR(e){const t=un(),a=E(()=>e.value.some(o=>o.id&&t.getConflictsForPackageByID(o.id)?.conflicts?.some(s=>s.type==="import_failed")||!1));return{hasImportFailed:a,overallStatus:E(()=>{if(a.value)return"NodeVersionStatusActive";for(const o of jR)if(e.value.some(s=>s.status===o))return o;return"NodeVersionStatusActive"})}}n(KR,"usePacksStatus");var YR={key:0,class:"flex h-full flex-col"},qR={class:"flex-1 overflow-auto p-6"},XR={class:"mt-5"},ZR={class:"mr-2 inline-block text-base text-blue-500"},JR={class:"text-base"},QR={key:0,class:"text-sm text-neutral-500"},e5={key:1,class:"flex w-full justify-center gap-2"},t5={class:"mb-6"},a5={key:1,class:"mx-8 mt-4 flex-1 overflow-hidden text-sm"},o5=J({__name:"InfoPanelMultiItem",props:{nodePacks:{}},setup(e){const{t}=Fe(),a=It(),o=Ns(()=>e.nodePacks),{installedPacks:s,notInstalledPacks:r,isAllInstalled:i,isNoneInstalled:l,isMixed:u,nightlyPacks:c,hasNightlyPacks:d}=HR(o),{hasImportFailed:p,overallStatus:f}=KR(o),g=A(!1);async function m(){if(c.value.length!==0){g.value=!0;try{for(const T of c.value)T.id&&await a.updatePack.call({id:T.id,version:"nightly"});a.updatePack.clear()}catch(T){console.error("Batch nightly update failed:",T)}finally{g.value=!1}}}n(m,"updateSelectedNightlyPacks");const h=E(()=>g.value?t("g.updating"):t("manager.updateSelected")),{checkNodeCompatibility:y}=Po(),{getNodeDefs:k}=ln();ya(Zn,{importFailed:p,showImportFailedDialog:n(()=>{},"showImportFailedDialog")});const S=E(()=>{const T=new Map;for(const N of r.value){const M=y(N);M.hasConflict&&N.id&&T.set(N.id,M.conflicts)}return T}),_=E(()=>{const T=new Map;return S.value.forEach(N=>{N.forEach(M=>{const O=`${M.type}-${M.current_value}-${M.required_value}`;T.has(O)||T.set(O,M)})}),Array.from(T.values())}),I=E(()=>_.value.length>0),w=n(async T=>T.latest_version?.version?(await k.call({packId:T.id,version:T.latest_version?.version,limit:8192}))?.comfy_nodes??[]:[],"getPackNodes"),{state:x}=Xo(()=>Promise.all(e.nodePacks.map(w)),[],{immediate:!0}),D=E(()=>x.value.reduce((T,N)=>T+(N?.length||0),0));return St(()=>{k.cancel()}),(T,N)=>{const M=ht("tooltip");return T.nodePacks?.length?(C(),P("div",YR,[v("div",qR,[R(Pm,{"node-packs":T.nodePacks},{thumbnail:W(()=>[R(GR,{"node-packs":T.nodePacks},null,8,["node-packs"])]),title:W(()=>[v("div",XR,[v("span",ZR,$(T.nodePacks.length),1),v("span",JR,$(T.$t("manager.packsSelected")),1)])]),"install-button":W(()=>[b(u)?(C(),P("div",QR,$(T.$t("manager.mixedSelectionMessage")),1)):b(i)?(C(),P("div",e5,[b(d)?ze((C(),X(se,{key:0,variant:"textonly",size:"md",disabled:g.value,onClick:m},{default:W(()=>[g.value?(C(),X(_r,{key:0,duration:"1s",size:16})):H("",!0),v("span",null,$(h.value),1)]),_:1},8,["disabled"])),[[M,T.$t("manager.tryUpdateTooltip"),void 0,{top:!0}]]):H("",!0),R(Wl,{size:"md","node-packs":b(s)},null,8,["node-packs"])])):b(l)?(C(),X(Xn,{key:2,size:"md","node-packs":b(r),"has-conflict":I.value,"conflict-info":_.value},null,8,["node-packs","has-conflict","conflict-info"])):H("",!0)]),_:1},8,["node-packs"]),v("div",t5,[R(Go,{label:T.$t("g.status")},{default:W(()=>[R(Sm,{"status-type":b(f),"has-compatibility-issues":I.value},null,8,["status-type","has-compatibility-issues"])]),_:1},8,["label"]),R(Go,{label:T.$t("manager.totalNodes"),value:D.value},null,8,["label","value"])])])])):(C(),P("div",a5,$(T.$t("manager.infoPanelEmpty")),1))}}}),n5=o5,s5={class:"aspect-7/3 w-full overflow-hidden"},r5={key:0,class:"h-full w-full"},i5=["alt"],l5={key:1,class:"relative h-full w-full"},u5=["src","alt"],jc="/assets/images/fallback-gradient-avatar.svg",c5=J({__name:"PackBanner",props:{nodePack:{}},setup(e){const t=A(!1),a=E(()=>!e.nodePack.banner_url&&!e.nodePack.icon),o=E(()=>e.nodePack.banner_url||e.nodePack.icon);return(s,r)=>(C(),P("div",s5,[a.value?(C(),P("div",r5,[v("img",{src:jc,alt:s.$t("g.defaultBanner"),class:"h-full w-full object-cover"},null,8,i5)])):(C(),P("div",l5,[o.value?(C(),P("div",{key:0,class:"absolute inset-0 bg-cover bg-center bg-no-repeat opacity-30",style:nt({backgroundImage:`url(${o.value})`,filter:"blur(10px)"})},null,4)):H("",!0),v("img",{src:t.value?jc:o.value,alt:s.nodePack.name+" banner",class:pe(t.value?"relative w-full h-full object-cover z-10":"relative w-full h-full object-contain z-10"),onError:r[0]||(r[0]=i=>t.value=!0)},null,42,u5)]))]))}}),d5=c5,p5={class:"flex min-h-12 items-center justify-between px-4 py-2 text-xs leading-3 font-medium text-muted"},f5={key:0,class:"flex items-center gap-1.5"},m5=J({__name:"PackCardFooter",props:{nodePack:{}},setup(e){const{isPackInstalled:t}=It(),a=E(()=>t(e.nodePack?.id)),o=Ma(zl),{n:s}=Fe(),r=E(()=>e.nodePack.downloads?s(e.nodePack.downloads):""),{checkNodeCompatibility:i}=Po(),l=E(()=>e.nodePack?i(e.nodePack).conflicts||[]:[]),u=E(()=>l.value.length>0);return(c,d)=>(C(),P("div",p5,[c.nodePack.downloads?(C(),P("div",f5,[d[0]||(d[0]=v("i",{class:"pi pi-download text-muted"},null,-1)),v("span",null,$(r.value),1)])):H("",!0),a.value?(C(),X(Am,{key:2,"node-pack":c.nodePack},null,8,["node-pack"])):(C(),X(Xn,{key:1,"node-packs":[c.nodePack],"is-installing":b(o),"has-conflict":u.value,"conflict-info":l.value},null,8,["node-packs","is-installing","has-conflict","conflict-info"]))]))}}),g5=m5,h5={class:"h-full w-full px-4 pt-4 pb-3"},v5={class:"flex h-full w-full flex-col gap-y-1"},y5={class:"truncate overflow-hidden text-sm font-bold text-ellipsis"},w5={key:0,class:"my-0 mb-1 line-clamp-3 min-h-12 flex-1 overflow-hidden text-xs leading-4 font-medium break-words text-muted"},b5={class:"flex flex-col gap-y-2"},_5={class:"flex flex-1 items-center gap-2"},k5={key:0,class:"p-2 pl-0 text-xs"},C5={key:1,class:"flex items-center justify-center gap-1 px-2 py-1 text-xs font-medium text-muted"},x5={class:"flex"},I5={key:0,class:"max-w-40 truncate text-xs leading-3 font-medium text-muted"},S5=J({__name:"PackCard",props:{nodePack:{},isSelected:{type:Boolean,default:!1}},setup(e){const{d:t}=Fe(),a=za(),o=E(()=>a.completedActivePalette.light_theme),{isPackInstalled:s,isPackEnabled:r,isPackInstalling:i}=It(),l=E(()=>i(e.nodePack?.id));ya(zl,l);const u=E(()=>s(e.nodePack?.id)),c=E(()=>u.value&&!r(e.nodePack?.id)),d=E(()=>DR(e.nodePack)?e.nodePack.comfy_nodes?.length:void 0),p=E(()=>{if(!e.nodePack)return null;const{publisher:g,author:m}=e.nodePack;return g?.name??g?.id??m}),f=E(()=>e.nodePack.latest_version?.createdAt?t(new Date(e.nodePack.latest_version.createdAt),{dateStyle:"medium"}):null);return(g,m)=>(C(),X(b(ld),{class:pe(["shadow-elevation-3 inline-flex size-full flex-col items-start justify-between overflow-hidden rounded-lg transition-all duration-200",{"selected-card":g.isSelected,"opacity-60":c.value}]),pt:{body:{class:"p-0 flex flex-col w-full h-full rounded-lg gap-0"},content:{class:"flex-1 flex flex-col rounded-lg min-h-0"},title:{class:"w-full h-full rounded-t-lg cursor-pointer"},footer:{class:"p-0 m-0 flex flex-col gap-0",style:{borderTop:o.value?"1px solid #f4f4f4":"1px solid #2C2C2C"}}}},{title:W(()=>[R(d5,{"node-pack":g.nodePack},null,8,["node-pack"])]),content:W(()=>[v("div",h5,[v("div",v5,[v("span",y5,$(g.nodePack.name),1),g.nodePack.description?(C(),P("p",w5,$(g.nodePack.description),1)):H("",!0),v("div",b5,[v("div",_5,[d.value?(C(),P("div",k5,$(d.value)+" "+$(g.$t("g.nodes")),1)):H("",!0),R(Em,{"node-pack":g.nodePack,"is-selected":g.isSelected,fill:!1,class:pe(l.value?"pointer-events-none":"")},null,8,["node-pack","is-selected","class"]),f.value?(C(),P("div",C5,$(f.value),1)):H("",!0)]),v("div",x5,[p.value?(C(),P("span",I5,$(p.value),1)):H("",!0)])])])])]),footer:W(()=>[R(g5,{"node-pack":g.nodePack,"is-installing":l.value},null,8,["node-pack","is-installing"])]),_:1},8,["class","pt"]))}}),E5=ot(S5,[["__scopeId","data-v-d5c78bd4"]]),T5={class:"flex h-full flex-col overflow-hidden rounded-lg shadow-sm","data-virtual-grid-item":""},A5={class:"flex w-full items-center justify-between px-4 py-3"},M5={class:"flex items-center"},P5={class:"flex h-6 w-6 items-center justify-center"},D5={class:"flex flex-1 p-4"},L5={class:"mr-4 shrink-0"},O5={class:"flex flex-1 flex-col overflow-hidden"},N5={class:"mb-3"},$5={class:"flex gap-2"},R5={class:"flex w-full items-center justify-between px-5 py-4"},B5=J({__name:"PackCardSkeleton",setup(e){return(t,a)=>(C(),P("div",T5,[v("div",A5,[v("div",M5,[v("div",P5,[R(b(jt),{shape:"circle",width:"1.5rem",height:"1.5rem"})]),R(b(jt),{width:"5rem",height:"1rem",class:"ml-2"})]),R(b(jt),{width:"4rem",height:"1.75rem","border-radius":"0.75rem"})]),v("div",D5,[v("div",L5,[R(b(jt),{width:"4rem",height:"4rem","border-radius":"0.5rem"})]),v("div",O5,[R(b(jt),{width:"80%",height:"1rem",class:"mb-2"}),v("div",N5,[R(b(jt),{width:"100%",height:"0.75rem",class:"mb-1"}),R(b(jt),{width:"95%",height:"0.75rem",class:"mb-1"}),R(b(jt),{width:"90%",height:"0.75rem"})]),v("div",$5,[R(b(jt),{width:"4rem",height:"1.5rem","border-radius":"0.75rem"}),R(b(jt),{width:"5rem",height:"1.5rem","border-radius":"0.75rem"})])])]),v("div",R5,[R(b(jt),{width:"4rem",height:"0.8rem"}),R(b(jt),{width:"6rem",height:"0.8rem"})])]))}}),F5=B5,U5=J({__name:"GridSkeleton",props:{skeletonCardCount:{default:12},gridStyle:{}},setup(e){return(t,a)=>(C(),P("div",{style:nt(t.gridStyle)},[(C(!0),P(Se,null,Ze(t.skeletonCardCount,o=>(C(),X(F5,{key:o}))),128))],4))}}),W5=U5;const z5=n(()=>{const e=It(),{installedPacks:t,isLoading:a,error:o,startFetchInstalled:s}=Rl(),r=n(p=>{if(!e.isPackInstalled(p?.id))return!1;const f=e.getInstalledPackVersion(p.id??""),g=p.latest_version?.version;return f&&!(0,ea.valid)(f)||!g||!f?!1:(0,ea.compare)(g,f)>0},"isOutdatedPack"),i=n(p=>p.filter(r),"filterOutdatedPacks"),l=E(()=>t.value.length?i(t.value):[]),u=E(()=>l.value.filter(p=>e.isPackEnabled(p.id))),c=E(()=>u.value.length>0),d=E(()=>l.value.length>u.value.length);return it(async()=>{!t.value.length&&!a.value&&await s()}),{updateAvailableNodePacks:l,enabledUpdateAvailableNodePacks:u,hasUpdateAvailable:c,hasDisabledUpdatePacks:d,isLoading:a,error:o}},"useUpdateAvailableNodes");var Kc="Comfy.Manager.UI.State";const V5=n(()=>{const e=n(()=>{try{const o=localStorage.getItem(Kc);if(o)return JSON.parse(o)}catch(o){console.error("Failed to load manager UI state:",o)}return{selectedTabId:mt.All,searchQuery:"",searchMode:"packs",sortField:Kt.Downloads}},"loadStoredState"),t=n(o=>{localStorage.setItem(Kc,JSON.stringify(o))},"persistState");return{loadStoredState:e,persistState:t,reset:n(()=>{t({selectedTabId:mt.All,searchQuery:"",searchMode:"packs",sortField:Kt.Downloads})},"reset")}},"useManagerStatePersistence");var G5=["comfy_nodes","name","description","latest_version","status","publisher_id","total_install","create_time","update_time","license","repository_url","latest_version_status","comfy_node_extract_status","id","icon_url","github_stars","supported_os","supported_comfyui_version","supported_comfyui_frontend_version","supported_accelerators","banner_url"],Zr=new Mo.default({maxSize:64}),H5=n(e=>({version:e.latest_version,createdAt:e.update_time,status:e.latest_version_status,comfy_node_extract_status:e.comfy_node_extract_status??void 0}),"toRegistryLatestVersion"),j5=n(e=>({id:e.publisher_id,name:e.publisher_id}),"toRegistryPublisher"),K5=ng(e=>({id:e.id??e.objectID,name:e.name,description:e.description,repository:e.repository_url,license:e.license,downloads:e.total_install,status:e.status,icon:e.icon_url,latest_version:H5(e),publisher:j5(e),created_at:e.create_time,category:e.category,author:e.author,tags:e.tags,github_stars:e.github_stars,supported_os:e.supported_os,supported_comfyui_version:e.supported_comfyui_version,supported_comfyui_frontend_version:e.supported_comfyui_frontend_version,supported_accelerators:e.supported_accelerators,banner_url:e.banner_url,comfy_nodes:e.comfy_nodes}),e=>e.id);const Y5=n(()=>{const e=_g("4E0RO38HS8","684d998c36b67a9a9fce8fc2d8860579"),t=n(async(i,l)=>{const{pageSize:u,pageNumber:c}=l,d=[{query:i,indexName:"nodes_index",attributesToRetrieve:G5,...Qm(l,["pageSize","pageNumber"]),hitsPerPage:u,page:c}];i.length>=2&&d.push({indexName:"nodes_index_query_suggestions",query:i});const{results:p}=await e.search({requests:d,strategy:"none"}),[f,g={hits:[]}]=p;return{nodePacks:f.hits.map(K5),querySuggestions:g.hits.map(m=>({query:m.query,popularity:m.popularity}))}},"searchPacksInternal");return{searchPacks:n(async(i,l)=>{const u=Fd({query:i,...l}),c=Zr.get(u);if(c!==void 0)return c;const d=await t(i,l);return Zr.set(u,d),d},"searchPacks"),clearSearchCache:n(()=>{Zr.clear()},"clearSearchCache"),getSortValue:n((i,l)=>{switch(l){case Kt.Downloads:return i.downloads??0;case Kt.Created:{const u=i.created_at;return u?new Date(u).getTime():0}case Kt.Updated:return i.latest_version?.createdAt?new Date(i.latest_version.createdAt).getTime():0;case Kt.Publisher:return i.publisher?.name??"";case Kt.Name:return i.name??"";default:return 0}},"getSortValue"),getSortableFields:n(()=>[{id:Kt.Downloads,label:"Downloads",direction:"desc"},{id:Kt.Created,label:"Created",direction:"desc"},{id:Kt.Updated,label:"Updated",direction:"desc"},{id:Kt.Publisher,label:"Publisher",direction:"asc"},{id:Kt.Name,label:"Name",direction:"asc"}],"getSortableFields")}},"useAlgoliaSearchProvider"),q5=n(()=>{const e=ln();return{searchPacks:n(async(r,i)=>{const{pageSize:l,pageNumber:u,restrictSearchableAttributes:c}=i,d=c?.includes("comfy_nodes"),p={search:d?void 0:r,comfy_node_search:d?r:void 0,limit:l,page:u+1},f=await e.search.call(p);return!f||!f.nodes?{nodePacks:[],querySuggestions:[]}:{nodePacks:f.nodes,querySuggestions:[]}},"searchPacks"),clearSearchCache:n(()=>{e.search.clear()},"clearSearchCache"),getSortValue:n((r,i)=>{switch(i){case"downloads":return r.downloads??0;case"name":return r.name??"";case"publisher":return r.publisher?.name??"";case"updated":return r.latest_version?.createdAt?new Date(r.latest_version.createdAt).getTime():0;default:return 0}},"getSortValue"),getSortableFields:n(()=>[{id:"downloads",label:"Downloads",direction:"desc"},{id:"name",label:"Name",direction:"asc"},{id:"publisher",label:"Publisher",direction:"asc"},{id:"updated",label:"Updated",direction:"desc"}],"getSortableFields")}},"useComfyRegistrySearchProvider");var Yc=3,X5=6e4;const Z5=n(()=>{const e=[];let t=0;try{e.push({provider:Y5(),name:"Algolia",isHealthy:!0,consecutiveFailures:0})}catch(p){console.warn("Failed to initialize Algolia provider:",p)}e.push({provider:q5(),name:"ComfyRegistry",isHealthy:!0,consecutiveFailures:0});const a=n(p=>!!(p.consecutiveFailures<Yc||p.lastAttempt&&Date.now()-p.lastAttempt.getTime()>X5),"isCircuitClosed"),o=n(p=>{p.isHealthy=!0,p.consecutiveFailures=0,p.lastError=void 0},"recordSuccess"),s=n((p,f)=>{p.consecutiveFailures++,p.lastError=f,p.lastAttempt=new Date,p.consecutiveFailures>=Yc&&(p.isHealthy=!1,console.warn(`${p.name} provider circuit breaker opened after ${p.consecutiveFailures} failures`))},"recordFailure"),r=n(()=>{const p=e[t];if(p&&a(p))return p.provider;for(let f=0;f<e.length;f++){const g=e[f];if(a(g))return t=f,g.provider}throw new Error("No available search providers")},"getActiveProvider"),i=n(()=>{t<e.length-1&&t++},"updateActiveProviderOnFailure");return{searchPacks:n(async(p,f)=>{let g=null;for(let m=0;m<e.length;m++)try{const h=r(),y=e[t],k=await h.searchPacks(p,f);return o(y),k}catch(h){g=h;const y=e[t];s(y,g),console.warn(`${y.name} search provider failed (${y.consecutiveFailures} failures):`,h),i()}throw new Error(`All search providers failed. Last error: ${g?.message||"Unknown error"}`)},"searchPacks"),clearSearchCache:n(()=>{for(const p of e)try{p.provider.clearSearchCache()}catch(f){console.warn(`Failed to clear cache for ${p.name} provider:`,f)}},"clearSearchCache"),getSortValue:n((p,f)=>r().getSortValue(p,f),"getSortValue"),getSortableFields:n(()=>r().getSortableFields(),"getSortableFields")}},"useRegistrySearchGateway");var J5=320,qc=Kt.Downloads;function Q5(e={}){const{initialSortField:t=qc,initialSearchMode:a="packs",initialSearchQuery:o="",initialPageNumber:s=0}=e,r=A(!1),i=A(t),l=A(a),u=A(64),c=A(s),d=A(o),p=A([]),f=A([]),g=E(()=>l.value==="nodes"?["comfy_nodes"]:["name","description"]),{searchPacks:m,clearSearchCache:h,getSortValue:y,getSortableFields:k}=Z5(),S=n(async w=>{r.value=!0,w.append||(c.value=0);const{nodePacks:x,querySuggestions:D}=await m(d.value,{pageSize:u.value,pageNumber:c.value,restrictSearchableAttributes:g.value});let T=x;i.value&&i.value!==qc&&(T=Kg(x,[N=>y(N,i.value)],[k().find(N=>N.id===i.value)?.direction||"desc"])),w.append&&p.value?.length?p.value=p.value.concat(T):p.value=T,f.value=D,r.value=!1},"updateSearchResults"),_=n(()=>S({append:!1}),"onQueryChange"),I=n(()=>S({append:!0}),"onPageChange");return be([i,l],_),be(c,I),Ed(d,_,{debounce:J5,immediate:!0}),{isLoading:r,pageNumber:c,pageSize:u,sortField:i,searchMode:l,searchQuery:d,suggestions:f,searchResults:p,sortOptions:E(()=>k()),clearCache:h}}n(Q5,"useRegistrySearch");var e3={class:"text-neutral text-base"},t3={class:"flex items-center gap-2"},a3={key:0,class:"relative mx-6 mt-3 mb-4 flex items-center gap-6 rounded-lg bg-yellow-500/20 p-4"},o3={class:"flex flex-1 flex-col gap-2"},n3={class:"m-0 text-sm font-bold"},s3={class:"m-0 text-xs"},r3={class:"relative flex flex-wrap justify-between gap-2 px-6 pb-4"},i3={key:0,class:"scrollbar-hide h-full w-full overflow-auto"},l3=J({__name:"ManagerDialog",props:{initialTab:{},onClose:{type:Function}},setup(e){ya(pl,e.onClose);const{t}=Fe(),{buildDocsUrl:a}=nr(),o=It(),{getPackById:s}=ln(),r=Fl(),i=V5(),l=i.loadStoredState(),u={display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(17rem, 1fr))",gap:"1.5rem",padding:"0"},{shouldShowManagerBanner:c,dismissWarningBanner:d,dismissRedDotNotification:p}=r,{missingNodePacks:f,isLoading:g,error:m}=Gl(),{hasUpdateAvailable:h,enabledUpdateAvailableNodePacks:y,hasDisabledUpdatePacks:k}=z5(),S=E(()=>[{id:mt.All,label:t("g.all"),icon:"pi pi-list"},{id:mt.Installed,label:t("g.installed"),icon:"pi pi-box"},{id:mt.Workflow,label:t("manager.inWorkflow"),icon:"pi pi-folder"},{id:mt.Missing,label:t("g.missing"),icon:"pi pi-exclamation-circle"},{id:mt.UpdateAvailable,label:t("g.updateAvailable"),icon:"pi pi-sync"}]),_=A(e.initialTab??l.selectedTabId??mt.All),I=E(()=>S.value.find(ke=>ke.id===_.value)),{searchQuery:w,pageNumber:x,isLoading:D,searchResults:T,searchMode:N,sortField:M,suggestions:O,sortOptions:L}=Q5({initialSortField:l.sortField,initialSearchMode:l.searchMode,initialSearchQuery:l.searchQuery});x.value=0;const F=E(()=>[{name:t("manager.filter.nodePack"),value:"packs"},{name:t("g.nodes"),value:"nodes"}]),K=E(()=>L.value?L.value.map(ke=>({name:ke.label,value:ke.id})):[]),j=n(ke=>{w.value=ke.value.query},"onOptionSelect"),V=n(()=>{x.value++},"onApproachEnd"),q=E(()=>T.value.length===0&&w.value===""),re=E(()=>w.value===""),ae=A([]),{startFetchInstalled:ce,filterInstalledPack:ee,installedPacks:ne,isLoading:B,isReady:z}=Rl(),{startFetchWorkflowPacks:Y,filterWorkflowPack:ie,workflowPacks:ge,isLoading:Le,isReady:_e}=Im(),Q=n(ke=>ke.filter(je=>!o.isPackInstalled(je.id)),"filterMissingPacks"),ue=E(()=>I.value?.id===mt.UpdateAvailable),we=E(()=>I.value?.id===mt.Installed),Ce=E(()=>I.value?.id===mt.Missing),xe=E(()=>I.value?.id===mt.Workflow),Ue=E(()=>I.value?.id===mt.All),de=n(ke=>{const{isUpdateAvailable:je}=Ul(ke);return je.value===!0},"isOutdatedPack"),he=n(ke=>ke.filter(de),"filterOutdatedPacks");be([ue,ne],async()=>{ue.value&&(re.value&&!ne.value.length&&!z.value&&!B.value?await ce():ae.value=he(ne.value))},{immediate:!0}),be([we,ne],async()=>{we.value&&(re.value?!ne.value.length&&!z.value&&!B.value?await ce():ae.value=ne.value:ae.value=ee(T.value))},{immediate:!0}),be([Ce,xe,ge,ne],async()=>{!xe.value&&!Ce.value||(re.value?!ge.value.length&&!Le.value&&!_e.value?(await Y(),Ce.value&&await ce()):ae.value=Ce.value?Q(ge.value):ge.value:ae.value=Ce.value?Q(ie(T.value)):ie(T.value))},{immediate:!0}),be([Ue,T],()=>{Ue.value&&(ae.value=T.value)});const Te=n(()=>{window.open(a("/troubleshooting/custom-node-issues",{includeLocale:!0}),"_blank")},"onClickWarningLink"),Ge=n(()=>{switch(I.value?.id){case mt.Installed:ae.value=re.value?ne.value:ee(T.value);break;case mt.Workflow:ae.value=re.value?ge.value:ie(T.value);break;case mt.Missing:re.value||(ae.value=Q(ie(T.value)));break;case mt.UpdateAvailable:ae.value=re.value?he(ne.value):he(T.value);break;default:ae.value=T.value}},"onResultsChange");be(T,Ge,{flush:"post"}),be(()=>o.installedPacksIds,Ge);const We=E(()=>D.value?T.value.length===0:I.value?.id===mt.Installed?B.value:I.value?.id===mt.Workflow||I.value?.id===mt.Missing?Le.value:q.value),te=E(()=>ae.value.map(ke=>({...ke,key:ke.id||ke.name}))),le=A([]),me=E(()=>le.value.length===1?le.value[0]:null),ve=A(!1);be(()=>le.value.length,ke=>{ve.value=ke>0});const Ie=n(()=>{switch(I.value?.id){case mt.Installed:return o.installedPacksIds?.size;case mt.Workflow:return ge.value?.length;case mt.Missing:return ge.value?.filter?.(ke=>!o.isPackInstalled(ke.id))?.length;default:return T.value.length}},"getLoadingCount"),Ae=E(()=>{const ke=Ie();return ke||16}),ye=n((ke,je)=>{je.shiftKey||je.ctrlKey||je.metaKey?le.value.findIndex(lt=>lt.id===ke.id)===-1?le.value=[...le.value,ke]:le.value=le.value.filter(lt=>lt.id!==ke.id):le.value=[ke]},"selectNodePack"),$e=n(()=>{le.value=[]},"unSelectItems"),Ke=n(ke=>{const je=ke.target;je&&!je.closest("[data-virtual-grid-item]")&&$e()},"handleGridContainerClick"),et=E(()=>le.value.length>1),He=A(null);Mt(me,async()=>{s.cancel();const ke=me.value;if(!ke?.id||et.value||He.value===ke.id)return;const je=await s.call(ke.id);if(je?.id===ke.id){He.value=ke.id;const lt=Hi({},ke,je),$t=le.value.findIndex(Rt=>Rt.id===lt.id);$t!==-1&&le.value.splice($t,1,lt);const Da=ae.value.findIndex(Rt=>Rt.id===lt.id);Da!==-1&&ae.value.splice(Da,1,lt)}});let st=null;return it(()=>{st=document.getElementById("results-grid")}),be([w,_],()=>{st??=document.getElementById("results-grid"),st&&(x.value=0,st.scrollTop=0)}),ar(()=>{p()}),Wa(()=>{i.persistState({selectedTabId:I.value?.id??mt.All,searchQuery:w.value,searchMode:N.value,sortField:M.value})}),St(()=>{s.cancel()}),(ke,je)=>(C(),X(kp,{"right-panel-open":ve.value,"onUpdate:rightPanelOpen":je[4]||(je[4]=lt=>ve.value=lt),"content-title":ke.$t("manager.discoverCommunityContent"),class:"manager-dialog"},{leftPanel:W(()=>[R(Cp,{modelValue:_.value,"onUpdate:modelValue":je[0]||(je[0]=lt=>_.value=lt),"nav-items":S.value},{"header-icon":W(()=>je[5]||(je[5]=[v("i",{class:"icon-[lucide--puzzle]"},null,-1)])),"header-title":W(()=>[v("span",e3,$(ke.$t("manager.title")),1)]),_:1},8,["modelValue","nav-items"])]),header:W(()=>[v("div",t3,[R($n,{modelValue:b(N),"onUpdate:modelValue":je[1]||(je[1]=lt=>ua(N)?N.value=lt:null),class:"min-w-34",options:F.value},null,8,["modelValue","options"]),R(AN,{modelValue:b(w),"onUpdate:modelValue":je[2]||(je[2]=lt=>ua(w)?w.value=lt:null),modelModifiers:{lazy:!0},suggestions:b(O),placeholder:ke.$t("manager.searchPlaceholder"),"complete-on-focus":!1,delay:8,"option-label":"query",class:"w-full min-w-md max-w-lg",pt:{pcInputText:{root:{autofocus:!0,class:"w-full rounded-lg h-10"}},loader:{style:"display: none"}},"show-empty-message":!1,onComplete:b(ag),onOptionSelect:j},null,8,["modelValue","suggestions","placeholder","onComplete"])])]),contentFilter:W(()=>[b(c)?(C(),P("div",a3,[je[7]||(je[7]=v("i",{class:"icon-[lucide--triangle-alert] text-lg text-warning-background"},null,-1)),v("div",o3,[v("p",n3,$(ke.$t("manager.conflicts.warningBanner.title")),1),v("p",s3,$(ke.$t("manager.conflicts.warningBanner.message")),1),v("p",{class:"m-0 cursor-pointer text-sm font-bold",onClick:Te},$(ke.$t("manager.conflicts.warningBanner.button")),1)]),R(se,{class:"absolute top-0 right-0",variant:"textonly",size:"icon",onClick:b(d)},{default:W(()=>je[6]||(je[6]=[v("i",{class:"pi pi-times text-xs text-base-foreground"},null,-1)])),_:1},8,["onClick"])])):H("",!0),v("div",r3,[v("div",null,[Ce.value&&b(f).length>0?(C(),X(Xn,{key:0,disabled:b(g)||!!b(m),"node-packs":b(f),size:"lg",label:ke.$t("manager.installAllMissingNodes")},null,8,["disabled","node-packs","label"])):H("",!0),ue.value&&b(h)?(C(),X(qN,{key:1,"node-packs":b(y),"has-disabled-update-packs":b(k),size:"lg"},null,8,["node-packs","has-disabled-update-packs"])):H("",!0)]),v("div",null,[R($n,{modelValue:b(M),"onUpdate:modelValue":je[3]||(je[3]=lt=>ua(M)?M.value=lt:null),label:ke.$t("g.sort"),options:K.value,class:"w-48"},{icon:W(()=>je[8]||(je[8]=[v("i",{class:"icon-[lucide--arrow-up-down] text-muted-foreground"},null,-1)])),_:1},8,["modelValue","label","options"])])])]),content:W(()=>[We.value?(C(),P("div",i3,[R(W5,{"grid-style":u,"skeleton-card-count":Ae.value},null,8,["skeleton-card-count"])])):b(T).length===0?(C(),X(Va,{key:1,title:b(o).error?ke.$t("manager.errorConnecting"):ke.$t("manager.noResultsFound"),message:b(o).error?ke.$t("manager.tryAgainLater"):ke.$t("manager.tryDifferentSearch")},null,8,["title","message"])):(C(),P("div",{key:2,class:"h-full",onClick:Ke},[R(pr,{id:"results-grid",items:te.value,"buffer-rows":4,"grid-style":u,onApproachEnd:V},{item:W(({item:lt})=>[R(E5,{"node-pack":lt,"is-selected":le.value.some($t=>$t.id===lt.id),onClick:Ve($t=>ye(lt,$t),["stop"])},null,8,["node-pack","is-selected","onClick"])]),_:1},8,["items"])]))]),rightPanel:W(()=>[!et.value&&me.value?(C(),X(UR,{key:0,"node-pack":me.value},null,8,["node-pack"])):(C(),X(n5,{key:1,"node-packs":le.value},null,8,["node-packs"]))]),_:1},8,["right-panel-open","content-title"]))}}),u3=l3,Xc="global-manager";function c3(){const e=pt(),t=Ct();function a(){t.closeDialog({key:Xc})}n(a,"hide");function o(s){e.showLayoutDialog({key:Xc,component:u3,props:{onClose:a,initialTab:s},dialogComponentProps:{pt:{content:{class:"!px-0 overflow-hidden h-full !py-0"}}}})}return n(o,"show"),{show:o,hide:a}}n(c3,"useManagerDialog");let Vt=(function(e){return e.DISABLED="disabled",e.LEGACY_UI="legacy",e.NEW_UI="new",e})({});function Vl(){const{systemStats:e,isInitialized:t}=Vn(Qo()),a=c3(),o=ra(E(()=>{if(!t.value)return Vt.DISABLED;const d=oe.getClientFeatureFlags().supports_manager_v4_ui??!1,p=oe.getServerFeature("extension.manager.supports_v4");return e.value?.system?.argv?.includes("--enable-manager")?e.value?.system?.argv?.includes("--enable-manager-legacy-ui")?Vt.LEGACY_UI:d&&p===!0?Vt.NEW_UI:p===!0&&!d||p===!1?Vt.LEGACY_UI:p===void 0?Vt.NEW_UI:Vt.DISABLED:Vt.DISABLED})),s=ra(E(()=>o.value!==Vt.DISABLED)),r=ra(E(()=>o.value===Vt.NEW_UI)),i=ra(E(()=>o.value===Vt.LEGACY_UI)),l=ra(E(()=>r.value)),u=ra(E(()=>s.value));return{managerUIState:o,isManagerEnabled:s,isNewManagerUI:r,isLegacyManagerUI:i,shouldShowInstallButton:l,shouldShowManagerButtons:u,openManager:n(async d=>{const p=o.value,f=pt(),g=Pt();switch(p){case Vt.DISABLED:f.showSettingsDialog("extension");break;case Vt.LEGACY_UI:{const m=d?.legacyCommand||"Comfy.Manager.Menu.ToggleVisibility";try{await g.execute(m)}catch{d?.showToastOnLegacyError!==!1&&Oe().add({severity:"error",summary:G("g.error"),detail:G("manager.legacyMenuNotAvailable"),life:3e3}),d?.showToastOnLegacyError===!1&&f.showSettingsDialog("extension")}break}case Vt.NEW_UI:d?.isLegacyOnly?(Oe().add({severity:"error",summary:G("g.error"),detail:G("manager.legacyMenuNotAvailable"),life:3e3}),await a.show(mt.All)):await a.show(d?.initialTab);break}},"openManager")}}n(Vl,"useManagerState");var d3="Forbidden: A security error has occurred. Please check the terminal logs",sa=(function(e){return e.START_QUEUE="manager/queue/start",e.RESET_QUEUE="manager/queue/reset",e.QUEUE_STATUS="manager/queue/status",e.UPDATE_ALL="manager/queue/update_all",e.UPDATE_COMFYUI="manager/queue/update_comfyui",e.LIST_INSTALLED="customnode/installed",e.GET_NODES="customnode/getmappings",e.IMPORT_FAIL_INFO="customnode/import_fail_info",e.IMPORT_FAIL_INFO_BULK="customnode/import_fail_info_bulk",e.REBOOT="manager/reboot",e.IS_LEGACY_MANAGER_UI="manager/is_legacy_manager_ui",e.TASK_HISTORY="manager/queue/history",e.QUEUE_TASK="manager/queue/task",e})(sa||{}),ma=So.create({baseURL:oe.apiURL("/v2/"),headers:{"Content-Type":"application/json"}});const Dm=n(()=>{const e=A(!1),t=A(null),a=n(()=>Vl().isNewManagerUI.value,"isManagerServiceAvailable"),o=n((w,x,D)=>{if(Nd(w))return;let T;if(!So.isAxiosError(w))T=`${x} failed: ${w instanceof Error?w.message:String(w)}`;else{const N=w,M=N.response?.status;M&&D?.[M]?T=D[M]:M===404?T="Could not connect to ComfyUI-Manager":T=N.response?.data?.message??`${x} failed with status ${M}`}t.value=T},"handleRequestError"),s=n(async(w,x)=>{const{errorContext:D,routeSpecificErrors:T,isQueueOperation:N}=x;if(!a())return t.value="Manager service is not available in current mode",null;e.value=!0,t.value=null;try{const M=await w();return N&&await r(),M.data}catch(M){return o(M,D,T),null}finally{e.value=!1}},"executeRequest"),r=n(async w=>s(()=>ma.get(sa.START_QUEUE,{signal:w}),{errorContext:"Starting ComfyUI-Manager job queue",routeSpecificErrors:{201:"Created: ComfyUI-Manager job queue is already running"}}),"startQueue"),i=n(async(w,x)=>s(()=>ma.get(sa.QUEUE_STATUS,{params:w?{client_id:w}:void 0,signal:x}),{errorContext:"Getting ComfyUI-Manager queue status"}),"getQueueStatus"),l=n(async w=>s(()=>ma.get(sa.LIST_INSTALLED,{signal:w}),{errorContext:"Fetching installed packs"}),"listInstalledPacks"),u=n(async w=>s(()=>ma.get(sa.IMPORT_FAIL_INFO,{signal:w}),{errorContext:"Fetching import failure information"}),"getImportFailInfo"),c=n(async(w={},x)=>{const D="Fetching bulk import failure information";return!w.cnr_ids?.length&&!w.urls?.length?{}:s(()=>ma.post(sa.IMPORT_FAIL_INFO_BULK,w,{signal:x}),{errorContext:D})},"getImportFailInfoBulk"),d=n(async(w,x,D,T)=>{const N={kind:w,params:x,ui_id:D||ws(),client_id:oe.clientId??oe.initialClientId??"unknown"};return s(()=>ma.post(sa.QUEUE_TASK,N,{signal:T}),{errorContext:`Queueing ${N.kind} task`,routeSpecificErrors:{403:d3,404:"Not Found: Task could not be queued"},isQueueOperation:!0})},"queueTask");return{isLoading:e,error:t,startQueue:r,getQueueStatus:i,getTaskHistory:n(async(w={},x)=>s(()=>ma.get(sa.TASK_HISTORY,{params:w,signal:x}),{errorContext:"Getting ComfyUI-Manager task history"}),"getTaskHistory"),listInstalledPacks:l,getImportFailInfo:u,getImportFailInfoBulk:c,installPack:n(async(w,x,D)=>d("install",w,x,D),"installPack"),uninstallPack:n(async(w,x,D)=>d("uninstall",w,x,D),"uninstallPack"),enablePack:n(async(w,x,D)=>d("enable",w,x,D),"enablePack"),disablePack:n(async(w,x,D)=>d("disable",w,x,D),"disablePack"),updatePack:n(async(w,x,D)=>d("update",w,x,D),"updatePack"),updateAllPacks:n(async(w={},x,D)=>{const T="Updating all packs",N={403:"Forbidden: To use this action, a security_level of `middle or below` is required",401:"Unauthorized: ComfyUI-Manager job queue is busy"},M={mode:w.mode,client_id:oe.clientId??oe.initialClientId??"unknown",ui_id:x||ws()};return s(()=>ma.get(sa.UPDATE_ALL,{params:M,signal:D}),{errorContext:T,routeSpecificErrors:N,isQueueOperation:!0})},"updateAllPacks"),updateComfyUI:n(async(w={is_stable:!0},x,D)=>{const T="Updating ComfyUI",N={400:"Bad Request: Missing required parameters",403:"Forbidden: To use this action, a security_level of `middle or below` is required"},M={client_id:oe.clientId??oe.initialClientId??"unknown",ui_id:x||ws(),...w};return s(()=>ma.get(sa.UPDATE_COMFYUI,{params:M,signal:D}),{errorContext:T,routeSpecificErrors:N,isQueueOperation:!0})},"updateComfyUI"),rebootComfyUI:n(async w=>s(()=>ma.get(sa.REBOOT,{signal:w}),{errorContext:"Rebooting ComfyUI",routeSpecificErrors:{403:"Forbidden: Rebooting ComfyUI requires security_level of middle or below"}}),"rebootComfyUI"),isLegacyManagerUI:n(async w=>s(()=>ma.get(sa.IS_LEGACY_MANAGER_UI,{signal:w}),{errorContext:"Checking if user set Manager to use the legacy UI"}),"isLegacyManagerUI")}},"useComfyManagerService"),It=Je("comfyManager",()=>{const{t:e}=Fe(),t=Dm(),a=A({}),o=A(new Set),s=A(new Set),r=A(new Set),i=A(new Set),l=A(!0),u=A([]),c=A([]),d=A([]),p=A({}),f=A([]),g=A([]),m=A({history:{},running_queue:[],pending_queue:[],installed_packs:{}}),h=A(new Map),y=EN(p,m,a);At(Z.api,"cm-task-completed",B=>{const z=B.detail?.ui_id;if(z&&h.value.has(z)){const Y=h.value.get(z);i.value.delete(Y),h.value.delete(z)}});const k=n(()=>{l.value=!0},"setStale"),S=n(()=>{const B=[],z=[];for(const Y of u.value)g.value.includes(Y.taskId)?z.push(Y):B.push(Y);c.value=B,d.value=z},"partitionTaskLogs"),_=n(()=>{const B=[],z=[];for(const Y of Object.values(p.value))Y.status?.status_str==="success"?B.push(Y.ui_id):z.push(Y.ui_id);f.value=B,g.value=z},"partitionTasks");Mt(p,()=>{_(),S()},{deep:!0});const I=n(B=>B.cnr_id||B.aux_id,"getPackId"),w=n(B=>!!B&&r.value.has(B),"isInstalledPackId"),x=n(B=>!!B&&w(B)&&o.value.has(B),"isEnabledPackId"),D=n(B=>!!B&&i.value.has(B),"isInstallingPackId"),T=n(B=>B.reduce((z,Y)=>{const ie=Y.cnr_id||Y.aux_id;return ie&&z.add(ie),z},new Set),"packsToIdSet"),N=n(B=>{const z=new Set,Y=new Set;for(const ie of B){const ge=I(ie);if(!ge)continue;const{enabled:Le}=ie;Le===!0?z.add(ge):Le===!1&&Y.add(ge),z.has(ge)&&Y.has(ge)&&Y.delete(ge)}o.value=z,s.value=Y},"updateDisabledIds"),M=n(B=>{r.value=T(B)},"updateInstalledIds");be(a,n(()=>{const B=Object.values(a.value);N(B),M(B)},"onPacksChanged"),{deep:!0});const L=n(async()=>{const B=await t.listInstalledPacks();B&&(a.value=Yf(B)),l.value=!1},"refreshInstalledList");Mt(l,L,{immediate:!0});const F=n(async(B,z)=>{const Y=ws(),{logs:ie}=SN({ui_id:Y,immediate:!0});try{y.isProcessing.value=!0,u.value.push({taskName:z,taskId:Y,logs:ie.value}),await B(Y)}catch(ge){y.isProcessing.value=!1,p.value[Y]={ui_id:Y,client_id:oe.clientId||"unknown",kind:"error",result:"failed",status:{status_str:"error",completed:!1,messages:[ge instanceof Error?ge.message:String(ge)]},timestamp:new Date().toISOString()}}},"enqueueTaskWithLogs"),K=Xa(async(B,z)=>{if(!B.id)return;let Y=e("g.installing");if(r.value.has(B.id)){const ge=a.value[B.id];ge&&ge.ver!==B.selected_version?Y=e("manager.changingVersion",{from:ge.ver,to:B.selected_version}):Y=e("g.enabling")}i.value.add(B.id),await F(n(ge=>(h.value.set(ge,B.id),t.installPack(B,ge,z)),"task"),`${Y} ${B.id}`)},{maxSize:1}),j=n(async(B,z)=>{K.clear(),K.cancel(),i.value.add(B.id);const Y={node_name:B.id,is_unknown:!1};await F(n(ge=>(h.value.set(ge,B.id),t.uninstallPack(Y,ge,z)),"task"),e("manager.uninstalling",{id:B.id}))},"uninstallPack"),V=Xa(async(B,z)=>{q.cancel();const Y={node_name:B.id,node_ver:B.version};await F(n(ge=>t.updatePack(Y,ge,z),"task"),e("g.updating",{id:B.id}))},{maxSize:1}),q=Xa(async(B,z)=>{await F(n(ie=>t.updateAllPacks(B,ie,z),"task"),e("manager.updatingAllPacks"))},{maxSize:1}),re=n(async(B,z)=>{const Y={node_name:B.id,is_unknown:!1};await F(n(ge=>t.disablePack(Y,ge,z),"task"),e("g.disabling",{id:B.id}))},"disablePack"),ae=n(async(B,z)=>{const Y={cnr_id:B.id};await F(n(ge=>t.enablePack(Y,ge,z),"task"),e("g.enabling",{id:B.id}))},"enablePack"),ce=n(B=>a.value[B]?.ver,"getInstalledPackVersion"),ee=n(()=>{u.value=[]},"clearLogs"),ne=n(()=>{u.value=[],p.value={},f.value=[],g.value=[],c.value=[],d.value=[],i.value.clear(),h.value.clear(),m.value={history:{},running_queue:[],pending_queue:[],installed_packs:{}}},"resetTaskState");return{isLoading:t.isLoading,error:t.error,taskLogs:u,clearLogs:ee,resetTaskState:ne,setStale:k,installedPacks:a,installedPacksIds:r,isPackInstalled:w,isPackEnabled:x,isPackInstalling:D,getInstalledPackVersion:ce,refreshInstalledList:L,taskHistory:p,taskQueue:m,isProcessingTasks:y.isProcessing,succeededTasksIds:f,failedTasksIds:g,succeededTasksLogs:c,failedTasksLogs:d,managerQueue:y,installPack:K,uninstallPack:j,updatePack:V,updateAllPacks:q,disablePack:re,enablePack:ae}}),Gl=on(()=>{const e=zt(),t=It(),a=wt(),{workflowPacks:o,isLoading:s,error:r,startFetchWorkflowPacks:i}=Im(),l=n(g=>g.filter(m=>!t.isPackInstalled(m.id)),"filterMissingPacks"),u=E(()=>o.value.length?l(o.value):[]),c=n(g=>g==="comfy-core","isCorePack"),d=n(g=>{const m=g.properties?.cnr_id;if(m===void 0||!c(m))return!1;const h=g.type;return!e.nodeDefsByName[h]},"isMissingCoreNode"),p=E(()=>Td(Zi(Z.rootGraph,d),g=>String(g.properties?.ver||""))),f=E(()=>u.value.length>0||Object.keys(p.value).length>0);return be(()=>a.activeWorkflow,async()=>{await i()},{immediate:!0}),{missingNodePacks:u,missingCoreNodes:p,hasMissingNodes:f,isLoading:s,error:r}});var p3={class:"flex h-full w-full flex-col gap-4 p-4"},f3={class:"m-0 text-sm leading-4 text-muted-foreground"},m3={class:"comfy-missing-nodes flex flex-col max-h-[256px] rounded-lg py-2 scrollbar-custom bg-secondary-background"},g3={class:"text-xs"},h3={key:0,class:"text-xs"},v3={class:"m-0 text-sm leading-4 text-muted-foreground"},y3=J({__name:"MissingNodesContent",props:{missingNodeTypes:{}},setup(e){const t=e,{missingCoreNodes:a}=Gl(),o=E(()=>{const s=new Set;return t.missingNodeTypes.filter(r=>{const i=typeof r=="object"?r.type:r;return s.has(i)?!1:(s.add(i),!0)}).map(r=>typeof r=="object"?{label:r.type,hint:r.hint,action:r.action}:{label:r})});return(s,r)=>(C(),P("div",{class:pe(["flex w-[490px] flex-col border-t-1 border-border-default",b(qe)?"border-b-1":""])},[v("div",p3,[v("div",null,[v("p",f3,$(b(qe)?s.$t("missingNodes.cloud.description"):s.$t("missingNodes.oss.description")),1)]),b(qe)?H("",!0):(C(),X(Dv,{key:0,"missing-core-nodes":b(a)},null,8,["missing-core-nodes"])),v("div",m3,[(C(!0),P(Se,null,Ze(o.value,(i,l)=>(C(),P("div",{key:l,class:"flex min-h-8 items-center justify-between px-4 py-2 bg-secondary-background text-muted-foreground"},[v("span",g3,$(i.label),1),i.hint?(C(),P("span",h3,$(i.hint),1)):H("",!0)]))),128))]),v("div",null,[v("p",v3,$(b(qe)?s.$t("missingNodes.cloud.replacementInstruction"):s.$t("missingNodes.oss.replacementInstruction")),1)])])],2))}}),w3=y3,b3={key:0,class:"flex w-full items-center justify-between gap-2 py-2 px-4"},_3={key:1,class:"flex justify-end gap-1 py-2 px-4"},k3=J({__name:"MissingNodesFooter",setup(e){const t=Ct(),{t:a}=Fe(),o=n(()=>{t.closeDialog({key:"global-missing-nodes"})},"handleGotItClick"),{missingNodePacks:s,isLoading:r,error:i}=Gl(),l=It(),u=Vl(),c=E(()=>s.value?.length?s.value.some(g=>l.isPackInstalling(g.id)):!1),d=E(()=>u.shouldShowManagerButtons.value),p=E(()=>u.shouldShowInstallButton.value),f=n(async()=>{await u.openManager({initialTab:mt.Missing,showToastOnLegacyError:!0})},"openManager");return be(E(()=>!r.value&&!c.value&&s.value?.length===0),async g=>{!qe&&g&&p.value&&(await wa(),t.closeDialog({key:"global-missing-nodes"}),Oe().add({severity:"success",summary:a("g.success"),detail:a("manager.allMissingNodesInstalled"),life:3e3}))}),(g,m)=>b(qe)?(C(),P("div",b3,[R(se,{variant:"textonly",size:"sm",as:"a",href:"https://www.comfy.org/cloud",target:"_blank",rel:"noopener noreferrer"},{default:W(()=>[m[0]||(m[0]=v("i",{class:"icon-[lucide--info]"},null,-1)),v("span",null,$(g.$t("missingNodes.cloud.learnMore")),1)]),_:1}),R(se,{variant:"secondary",size:"md",onClick:o},{default:W(()=>[fe($(g.$t("missingNodes.cloud.gotIt")),1)]),_:1})])):d.value?(C(),P("div",_3,[R(se,{variant:"textonly",onClick:f},{default:W(()=>[fe($(g.$t("g.openManager")),1)]),_:1}),p.value?(C(),X(Xn,{key:0,type:"secondary",size:"md",disabled:b(r)||!!b(i)||b(s).length===0||c.value,"is-loading":b(r),"node-packs":b(s),label:b(r)?g.$t("manager.gettingInfo"):g.$t("manager.installAllMissingNodes")},null,8,["disabled","is-loading","node-packs","label"])):H("",!0)])):H("",!0)}}),C3=k3,x3={class:"flex w-full items-center justify-between p-4"},I3={class:"flex items-center gap-2"},S3={class:"m-0 text-sm"},E3=J({__name:"MissingNodesHeader",setup(e){return(t,a)=>(C(),P("div",x3,[v("div",I3,[a[0]||(a[0]=v("i",{class:"icon-[lucide--triangle-alert] text-warning-background"},null,-1)),v("p",S3,$(b(qe)?t.$t("missingNodes.cloud.title"):t.$t("missingNodes.oss.title")),1)])]))}}),T3=E3,A3=J({__name:"FindIssueButton",props:{errorMessage:{},repoOwner:{},repoName:{}},setup(e){const t=e,a=E(()=>t.errorMessage+" is:issue"),o=n(()=>{yt()?.trackUiButtonClicked({button_id:"error_dialog_find_existing_issues_clicked"});const s=encodeURIComponent(a.value),r=`https://github.com/${t.repoOwner}/${t.repoName}/issues?q=${s}`;window.open(r,"_blank")},"openGitHubIssues");return(s,r)=>(C(),X(se,{variant:"secondary",onClick:o},{default:W(()=>[r[0]||(r[0]=v("i",{class:"pi pi-github"},null,-1)),fe(" "+$(s.$t("g.findIssues")),1)]),_:1}))}}),M3=A3;function P3(e){const a=JSON.stringify(e.workflow),o=a.length>2e4?"Workflow too large. Please manually upload the workflow from local file system.":a,s=e.systemStats;return`
|
|
204
|
+
`)),r=r.slice(r.indexOf("{")),m=JSON.parse(r)}catch{m=null}}if(m&&m.version&&m.nodes&&m.extra)await Z.loadGraphData(m);else{if(a.target instanceof HTMLTextAreaElement&&a.target.type==="textarea"||a.target instanceof HTMLInputElement&&a.target.type==="text")return;o.pasteFromClipboard()}})},"usePaste"),Ls="$$comfy_animation_preview";function uN(e){let t={"&":"","<":"",">":"",'"':"","'":"","`":"","=":""};return String(e).replace(/[&<>"'`=]/g,n(function(o){return t[o]},"fromEntityMap"))}n(uN,"sanitizeNodeName");var Vo=class at{static{n(this,"ComfyApp")}queueItems=[];processingQueue=!1;static clipspace=null;static clipspace_invalidate_handler=null;static open_maskeditor=null;static maskeditor_is_opended=null;static clipspace_return_node=null;vueAppReady;api;ui;extensionManager;_nodeOutputs;nodePreviewImages;rootGraphInternal;get graph(){return this.rootGraphInternal}get rootGraph(){return this.rootGraphInternal||console.error("ComfyApp graph accessed before initialization"),this.rootGraphInternal}canvas;dragOverNode=null;canvasElRef=Qt();get canvasEl(){return b(this.canvasElRef)}configuringGraphLevel=0;get configuringGraph(){return this.configuringGraphLevel>0}ctx;bodyTop;bodyLeft;bodyRight;bodyBottom;canvasContainer;menu;openClipspace=n(()=>{},"openClipspace");positionConversion;get lastNodeErrors(){return Ot().lastNodeErrors}get lastExecutionError(){return Ot().lastExecutionError}get runningNodeId(){return Ot().executingNodeId}get shiftDown(){return Ra().shiftDown}get widgets(){return Object.fromEntries(jn().widgets.entries())}get storageLocation(){return"server"}get isNewUserSession(){return!1}get extensions(){return tl().extensions}get progress(){return Ot()._executingNodeProgress}static isImageNode(t){return yl(t)}resetView(){Tt().resetView()}constructor(){this.vueAppReady=!1,this.ui=new dp(this),this.api=oe,this.bodyTop=Ee("div.comfyui-body-top"),this.bodyLeft=Ee("div.comfyui-body-left"),this.bodyRight=Ee("div.comfyui-body-right"),this.bodyBottom=Ee("div.comfyui-body-bottom"),this.canvasContainer=Ee("div.graph-canvas-container"),this.menu=new gm(this),this.nodeOutputs={},this.nodePreviewImages={}}get nodeOutputs(){return this._nodeOutputs}set nodeOutputs(t){this._nodeOutputs=t,this.vueAppReady&&Lt().invokeExtensions("onNodeOutputsUpdated",t)}getPreviewFormatParam(){let t=Me().get("Comfy.PreviewFormat");return t?`&preview=${t}`:""}getRandParam(){return qe?"":"&rand="+Math.random()}static onClipspaceEditorSave(){at.clipspace_return_node&&at.pasteFromClipspace(at.clipspace_return_node)}static onClipspaceEditorClosed(){at.clipspace_return_node=null}static copyToClipspace(t){var a=null;t.widgets&&(a=t.widgets.map(({type:c,name:d,value:p})=>({type:c,name:d,value:p})));var o=void 0,s=void 0;if(t.imgs!=null){o=[],s=[];for(let c=0;c<t.imgs.length;c++)o[c]=new Image,o[c].src=t.imgs[c].src,s[c]=o[c]}var r=0;t.imageIndex&&(r=t.imageIndex);const i=o?o.length+1:1,l=o?o.length+2:2,u=t.images??Gt().getNodeOutputs(t)?.images;at.clipspace={widgets:a,imgs:o,original_imgs:s,images:u,selectedIndex:r,img_paste_mode:"selected",paintedIndex:i,combinedIndex:l},at.clipspace_return_node=null,at.clipspace_invalidate_handler&&at.clipspace_invalidate_handler()}static pasteFromClipspace(t){if(at.clipspace){let a;if(at.clipspace.combinedIndex!==void 0&&at.clipspace.imgs&&at.clipspace.combinedIndex<at.clipspace.imgs.length&&(a=at.clipspace.imgs[at.clipspace.combinedIndex].src),at.clipspace.imgs&&t.imgs&&(at.clipspace.images&&(at.clipspace.img_paste_mode=="selected"?t.images=[at.clipspace.images[at.clipspace.selectedIndex]]:t.images=at.clipspace.images,Z.nodeOutputs[t.id+""]&&(Z.nodeOutputs[t.id+""].images=t.images)),at.clipspace.imgs))if(at.clipspace.img_paste_mode=="selected"){const o=new Image;o.src=at.clipspace.imgs[at.clipspace.selectedIndex].src,t.imgs=[o],t.imageIndex=0}else{const o=[];for(let s=0;s<at.clipspace.imgs.length;s++)o[s]=new Image,o[s].src=at.clipspace.imgs[s].src,t.imgs=o}if(at.clipspace.imgs?.[at.clipspace.paintedIndex]&&t.imgs){const o=new Image;o.src=at.clipspace.imgs[at.clipspace.paintedIndex].src,t.imgs.push(o)}if(at.clipspace.imgs?.[at.clipspace.combinedIndex]&&t.imgs&&a){const o=new Image;o.src=a,t.imgs=[o]}if(t.widgets){if(at.clipspace.images){const o=at.clipspace.images[at.clipspace.selectedIndex],s=t.widgets.findIndex(r=>r.name==="image");s>=0&&(t.widgets[s].type!="image"&&typeof t.widgets[s].value=="string"&&o.filename?t.widgets[s].value=(o.subfolder?o.subfolder+"/":"")+o.filename+(o.type?` [${o.type}]`:""):t.widgets[s].value=o)}at.clipspace.widgets&&t.widgets&&at.clipspace.widgets.forEach(({type:o,name:s,value:r})=>{const i=t.widgets?.find(l=>l.type===o&&l.name===s);if(i&&i.type!="button"){const l=r;if(i.type!="image"&&typeof i.value=="string"&&l?.filename){const u=r;i.value=(u.subfolder?u.subfolder+"/":"")+u.filename+(u.type?` [${u.type}]`:"")}else i.value=r,i.callback?.(r)}})}Z.canvas.setDirty(!0),Gt().updateNodeImages(t)}}addDropHandler(){At(document,"drop",async t=>{try{t.preventDefault(),t.stopPropagation();const a=this.dragOverNode;if(this.dragOverNode=null,await a?.onDragDrop?.(t))return;const o=await sN(t);if(!o)return;const s=Ra();try{s.spinner=!0,await this.handleFile(o,"file_drop")}finally{s.spinner=!1}}catch(a){Oe().addAlert(G("toastMessages.dropFileError",{error:a}))}}),At(this.canvasElRef,"dragleave",async()=>{this.dragOverNode&&(this.dragOverNode=null,this.canvas.setDirty(!1,!0))}),At(this.canvasElRef,"dragover",t=>{this.canvas.adjustMouseEvent(t);const a=this.canvas.graph?.getNodeOnPos(t.canvasX,t.canvasY);if(!a?.onDragOver?.(t)){this.dragOverNode=null;return}this.dragOverNode=a,requestAnimationFrame(()=>{this.canvas.setDirty(!1,!0)})},!1)}addProcessKeyHandler(){const t=va.prototype.processKey;va.prototype.processKey=function(a){if(this.graph&&!(a.target instanceof Element&&a.target.localName=="input")){if(a.type=="keydown"&&!a.repeat){const o=Zd.fromEvent(a),s=sl().getKeybinding(o);if(s&&s.targetElementId==="graph-canvas-container"){Pt().execute(s.commandId),this.graph.change(),a.preventDefault(),a.stopImmediatePropagation();return}if(a.key==="c"&&(a.metaKey||a.ctrlKey)||(a.key==="v"||a.key=="V")&&(a.metaKey||a.ctrlKey)&&!a.shiftKey)return}return t.apply(this,[a])}}}addApiUpdateHandlers(){oe.addEventListener("status",({detail:t})=>{this.ui.setStatus(t)}),oe.addEventListener("progress",()=>{this.canvas.setDirty(!0,!1)}),oe.addEventListener("executing",()=>{this.canvas.setDirty(!0,!1)}),oe.addEventListener("executed",({detail:t})=>{const a=Gt(),o=String(t.display_node||t.node);a.setNodeOutputsByExecutionId(o,t.output,{merge:t.merge});const s=Fs(this.rootGraph,o);s&&s.onExecuted&&s.onExecuted(t.output)}),oe.addEventListener("execution_start",()=>{Tr(this.rootGraph,"onExecutionStart")}),oe.addEventListener("execution_error",({detail:t})=>{if(t.exception_message?.includes("Unauthorized: Please login first to use this node."))pt().showApiNodesSignInDialog([t.node_type]);else if(t.exception_message?.includes("Payment Required: Please add credits to your account to use this node.")){const{isActiveSubscription:a}=nn();a.value&&pt().showTopUpCreditsDialog({isInsufficientCredits:!0})}else pt().showExecutionErrorDialog(t);this.canvas.draw(!0,!0)}),oe.addEventListener("b_preview_with_metadata",({detail:t})=>{const{blob:a,displayNodeId:o}=t,{setNodePreviewsByExecutionId:s,revokePreviewsByExecutionId:r}=Gt();r(o);const i=URL.createObjectURL(a),l=o.split(":");for(let u=1;u<=l.length;u++)s(l.slice(0,u).join(":"),[i])}),oe.init()}addConfigureHandler(){const t=this,a=Cs.prototype.configure;Cs.prototype.configure=function(...o){t.configuringGraphLevel++;try{return a.apply(this,o)}finally{t.configuringGraphLevel--}}}addAfterConfigureHandler(t){const{onConfigure:a}=t;t.onConfigure=function(...o){Bp(this),Tr(this,"onGraphConfigured");const s=a?.apply(this,o);return Tr(this,"onAfterGraphConfigured"),s}}async setup(t){this.bodyTop=document.getElementById("comfyui-body-top"),this.bodyLeft=document.getElementById("comfyui-body-left"),this.bodyRight=document.getElementById("comfyui-body-right"),this.bodyBottom=document.getElementById("comfyui-body-bottom"),this.canvasContainer=document.getElementById("graph-canvas-container"),this.canvasElRef.value=t,await Ra().workflow.syncWorkflows(),Ia().fetchSubgraphs(),await Lt().loadExtensions(),this.addProcessKeyHandler(),this.addConfigureHandler(),this.addApiUpdateHandlers();const a=new Cs;a.events.addEventListener("subgraph-created",o=>{try{const{subgraph:s,data:r}=o.detail;Dc().registerNewSubgraph(s,r)}catch(s){console.error("Failed to register subgraph",s),Oe().add({severity:"error",summary:"Failed to register subgraph",detail:s instanceof Error?s.message:String(s)})}}),this.addAfterConfigureHandler(a),this.rootGraphInternal=a,this.canvas=new va(t,a),this.canvas.state=_d(this.canvas.state),this.ctx=t.getContext("2d"),Ne.alt_drag_do_clone_nodes=!0,Ne.macGesturesRequireMac=!1,this.canvas.canvas.addEventListener("litegraph:set-graph",o=>{const{newGraph:s}=o.detail,r=Ua(),i=Object.fromEntries(s.nodes.flatMap(l=>l.widgets??[]).filter(l=>l instanceof Nn||l instanceof lr).map(l=>[l.id,l]));for(const[l,u]of r.widgetStates.entries())l in i?(u.active=!0,u.widget=i[l]):u.active=!1}),this.canvas.canvas.addEventListener("litegraph:set-graph",o=>{const{newGraph:s,oldGraph:r}=o.detail;r&&Yr(s.extra.workflowRendererVersion,s)}),FO(this.canvas),this.rootGraph.start(),Gi(this.canvasElRef,([o])=>{o.target instanceof HTMLCanvasElement&&this.resizeCanvas(o.target)}),await Lt().invokeExtensionsAsync("init"),await this.registerNodes(),this.addDropHandler(),await Lt().invokeExtensionsAsync("setup"),this.positionConversion=Vd(this.canvasContainer,this.canvas)}resizeCanvas(t){const a=Math.max(window.devicePixelRatio,1);t.height=t.width=NaN;const{width:o,height:s}=t.getBoundingClientRect();t.width=Math.round(o*a),t.height=Math.round(s*a),t.getContext("2d")?.scale(a,a),this.canvas?.draw(!0,!0)}updateVueAppNodeDefs(t){const a={};for(const[i,l]of Object.entries(Ne.registered_node_types))i in t||i in hc||l.skip_list||(a[i]={name:i,display_name:i,category:l.category||"__frontend_only__",input:{required:{},optional:{}},output:[],output_name:[],output_is_list:[],output_node:!1,python_module:"custom_nodes.frontend_only",description:l.description??`Frontend only node for ${i}`});const o={...a,...t,...hc},s=zt(),r=Object.values(o);Lt().invokeExtensions("beforeRegisterVueAppNodeDefs",r,this),s.updateNodeDefs(r)}async getNodeDefs(){const t=n(a=>({...a,display_name:De(`nodeDefs.${a.name}.display_name`,a.display_name??a.name),description:a.description?De(`nodeDefs.${a.name}.description`,a.description):"",category:a.category.split("/").map(o=>De(`nodeCategories.${o}`,o)).join("/")}),"translateNodeDef");return Be.mapValues(await oe.getNodeDefs(),a=>t(a))}async registerNodes(){const t=await this.getNodeDefs();await this.registerNodesFromDefs(t),await Lt().invokeExtensionsAsync("registerCustomNodes"),this.vueAppReady&&this.updateVueAppNodeDefs(t)}async registerNodeDef(t,a){return await Tt().registerNodeDef(t,a)}async registerNodesFromDefs(t){await Lt().invokeExtensionsAsync("addCustomNodeDefs",t);for(const a in t)this.registerNodeDef(a,t[a])}loadTemplateData(t){if(!t?.templates)return;const a=localStorage.getItem("litegrapheditor_clipboard");for(const o of t.templates){if(!o?.data)continue;JSON.parse(o.data).reroutes?(localStorage.setItem("litegrapheditor_clipboard",o.data),Z.canvas.pasteFromClipboard()):tN(o.data,Z.canvas);let s;for(const r in Z.canvas.selected_nodes){const i=Z.canvas.selected_nodes[r],l=i.pos[1]+i.size[1];(s===void 0||l>s)&&(s=l)}s!==void 0&&(Z.canvas.graph_mouse[1]=s+50)}a!==null&&localStorage.setItem("litegrapheditor_clipboard",a)}showMissingNodesError(t){Me().get("Comfy.Workflow.ShowMissingNodesWarning")&&pt().showLoadWorkflowWarning({missingNodeTypes:t})}showMissingModelsError(t,a){Me().get("Comfy.Workflow.ShowMissingModelsWarning")&&pt().showMissingModelsWarning({missingModels:t,paths:a})}async loadGraphData(t,a=!0,o=!0,s=null,r={}){const{showMissingNodesDialog:i=!0,showMissingModelsDialog:l=!0,checkForRerouteMigration:u=!1,openSource:c}=r;_a().beforeLoadNewGraph(),a!==!1&&this.clean();let d=!1;if((!t||typeof t!="object"||Array.isArray(t))&&(t=cr,d=!0),t=pp(t),Me().get("Comfy.Validation.Workflows")){const{graphData:I}=await GO().validateWorkflow(t);t=I??t}u&&t.version===.4&&Ll(t).length&&ZO(t)&&Oe().add({group:"reroute-migration",severity:"warn"}),Dc().loadSubgraphs(t);const p=[],f=[];await Lt().invokeExtensionsAsync("beforeConfigureGraph",t,p);const g=[],m=n((I,w="")=>{if(!Array.isArray(I)){console.warn("Workflow nodes data is missing or invalid, skipping node processing",{nodes:I,path:w});return}for(let x of I){x.type=="T2IAdapterLoader"&&(x.type="ControlNetLoader"),x.type=="ConditioningAverage "&&(x.type="ConditioningAverage"),x.type=="SDV_img2vid_Conditioning"&&(x.type="SVD_img2vid_Conditioning"),x.type=="Load3DAnimation"&&(x.type="Load3D"),x.type=="Preview3DAnimation"&&(x.type="Preview3D"),x.type in Ne.registered_node_types||(w?p.push({type:x.type,hint:`in subgraph '${w}'`}):p.push(x.type),x.type=uN(x.type));const D=eN(x);D?.length&&g.push(...D)}},"collectMissingNodesAndModels");if(m(t.nodes),t.definitions?.subgraphs)for(const I of t.definitions.subgraphs)lh(I)&&m(I.nodes,I.name||I.id);const h=t.models;h?.length&&g.push(...h);const y=n(I=>I.url||I.hash,"getModelKey"),k=g.filter(y),S=Be.uniqBy(k,y);if(S.length&&Me().get("Comfy.Workflow.ShowMissingModelsWarning")){const I=Rf();await I.loadModelFolders();for(const w of S){const x=await I.getLoadedModelFolder(w.directory);x||(w.directory_invalid=!0);const D=x?.models;D&&Object.values(D).some(T=>T.file_name===w.name)||f.push(w)}}try{this.rootGraph.configure(t);const I=this.rootGraph.extra.workflowRendererVersion;Yr(I);for(const w of this.rootGraph.subgraphs.values())Yr(w.extra.workflowRendererVersion||I,w);o&&Me().get("Comfy.EnableWorkflowViewRestore")&&(t.extra?.ds?(this.canvas.ds.offset=t.extra.ds.offset,this.canvas.ds.scale=t.extra.ds.scale,this.canvas.ds.computeVisibleArea(this.canvas.viewport),this.canvas.visible_area.width&&this.canvas.visible_area.height&&!XO(this.rootGraph._nodes,this.canvas.visible_area)&&requestAnimationFrame(()=>Tt().fitView())):Tt().fitView())}catch(I){pt().showErrorDialog(I,{title:G("errorDialog.loadWorkflowTitle"),reportType:"loadWorkflowError"}),console.error(I);return}if(bs(this.rootGraph,I=>{const w=I.computeSize();if(w[0]=Math.max(I.size[0],w[0]),w[1]=Math.max(I.size[1],w[1]),I.setSize(w),I.widgets){for(let x of I.widgets)if((I.type=="KSampler"||I.type=="KSamplerAdvanced")&&x.name=="sampler_name"&&typeof x.value=="string"&&x.value.startsWith("sample_")&&(x.value=x.value.slice(7)),(I.type=="KSampler"||I.type=="KSamplerAdvanced"||I.type=="PrimitiveNode")&&x.name=="control_after_generate"&&(x.value===!0?x.value="randomize":x.value===!1&&(x.value="fixed")),d&&x.type=="combo"){const D=x.options.values;D&&D.length>0&&!D.includes(x.value)&&(x.value=D[0])}}Lt().invokeExtensions("loadedGraphNode",I)}),p.length&&i&&this.showMissingNodesError(p),f.length&&l){const I=await oe.getFolderPaths();this.showMissingModelsError(f,I)}await Lt().invokeExtensionsAsync("afterConfigureGraph",p);const _={missing_node_count:p.length,missing_node_types:p.map(I=>typeof I=="string"?I:I.type),open_source:c??"unknown"};yt()?.trackWorkflowOpened(_),yt()?.trackWorkflowImported(_),await _a().afterLoadNewGraph(s,this.rootGraph.serialize()),requestAnimationFrame(()=>{this.canvas.setDirty(!0,!0)})}async graphToPrompt(t=this.rootGraph){return YO(t,{sortNodes:Me().get("Comfy.Workflow.SortNodeIdOnSave")})}async queuePrompt(t,a=1,o){if(this.queueItems.push({number:t,batchCount:a,queueNodeIds:o}),this.processingQueue)return!1;this.processingQueue=!0;const s=Ot();s.lastNodeErrors=null;let r=await Pa().getIdToken(),i=Gn().getApiKey();try{for(;this.queueItems.length;){const{number:l,batchCount:u,queueNodeIds:c}=this.queueItems.pop(),d=Me().get("Comfy.Execution.PreviewMethod");for(let p=0;p<u;p++){bs(this.rootGraph,m=>{for(const h of m.widgets??[])h.beforeQueued?.()});const f=await this.graphToPrompt(this.rootGraph),g=Zi(this.rootGraph);try{oe.authToken=r,oe.apiKey=i??void 0;const m=await oe.queuePrompt(l,f,{partialExecutionTargets:c,previewMethod:d});if(delete oe.authToken,delete oe.apiKey,s.lastNodeErrors=m.node_errors??null,s.lastNodeErrors?.length)this.canvas.draw(!0,!0);else try{m.prompt_id&&s.storePrompt({id:m.prompt_id,nodes:Object.keys(f.output),workflow:Ra().workflow.activeWorkflow})}catch{}}catch(m){pt().showErrorDialog(m,{title:G("errorDialog.promptExecutionError"),reportType:"promptExecutionError"}),console.error(m),m instanceof Ih&&(s.lastNodeErrors=m.response.node_errors??null,this.canvas.draw(!0,!0));break}fC(g,"afterQueued"),this.canvas.draw(!0,!0),await this.ui.queue.update()}}}finally{this.processingQueue=!1}return oe.dispatchCustomEvent("promptQueued",{number:t,batchCount:a}),!s.lastNodeErrors}showErrorOnFileLoad(t){Oe().addAlert(G("toastMessages.fileLoadError",{fileName:t.name}))}async handleFile(t,a){const o=t.name.replace(/\.\w+$/,""),s=await xl(t);if(Be.isEmpty(s)){if(t.type.startsWith("image")){const c=new DataTransfer;c.items.add(t),hm(this.canvas,c.items);return}this.showErrorOnFileLoad(t);return}const{workflow:r,prompt:i,parameters:l,templates:u}=s;if(u&&typeof u=="object"&&Array.isArray(u)&&this.loadTemplateData({templates:u}),r){let c;try{if(c=typeof r=="string"?JSON.parse(r):r,c&&typeof c=="object"&&!Array.isArray(c)){await this.loadGraphData(c,!0,!0,o,{openSource:a});return}else console.error("Invalid workflow structure, trying parameters fallback"),this.showErrorOnFileLoad(t)}catch(d){console.error("Failed to parse workflow:",d),this.showErrorOnFileLoad(t)}}if(i)try{const c=typeof i=="string"?JSON.parse(i):i;if(this.isApiJson(c)){this.loadApiJson(c,o);return}}catch(c){console.error("Failed to parse prompt:",c)}if(l&&typeof l=="string"){_a().beforeLoadNewGraph(),Mf(this.rootGraph,l),_a().afterLoadNewGraph(o,this.rootGraph.serialize());return}this.showErrorOnFileLoad(t)}isApiJson(t){return!Be.isObject(t)||Array.isArray(t)||Object.keys(t).length===0?!1:Object.values(t).every(a=>{if(!a||typeof a!="object"||Array.isArray(a))return!1;const{class_type:o,inputs:s}=a,r=Be.isObject(s)&&!Array.isArray(s);return typeof o=="string"&&r})}loadApiJson(t,a){_a().beforeLoadNewGraph();const o=Object.values(t).filter(i=>!Ne.registered_node_types[i.class_type]);if(o.length){this.showMissingNodesError(o.map(i=>i.class_type));return}const s=Object.keys(t);Z.rootGraph.clear();for(const i of s){const l=t[i],u=Ne.createNode(l.class_type);u&&(u.id=isNaN(+i)?i:+i,u.title=l._meta?.title??u.title,Z.rootGraph.add(u))}const r=n(i=>{const l=t[i],u=Z.rootGraph.getNodeById(i);if(u)for(const c in l.inputs??{}){const d=l.inputs[c];if(d instanceof Array){const[p,f]=d,g=Z.rootGraph.getNodeById(p);if(!g)continue;let m=u.inputs?.findIndex(h=>h.name===c)??-1;if(m===-1)try{const h=u.widgets?.find(k=>k.name===c),y=u.convertWidgetToInput;h&&y?.(h)&&(m=u.inputs?.findIndex(k=>k.name===c)??-1)}catch{}m!==-1&&g.connect(f,u,m)}else{const p=u.widgets?.find(f=>f.name===c);p&&(p.value=d,p.callback?.(d))}}},"processNodeInputs");for(const i of s)r(i);Z.rootGraph.arrange();for(const i of s)r(i);Z.rootGraph.arrange(),_a().afterLoadNewGraph(a,this.rootGraph.serialize())}registerExtension(t){Lt().registerExtension(t)}collectCanvasMenuItems(t){return Lt().invokeExtensions("getCanvasMenuItems",t).flat()}collectNodeMenuItems(t){return Lt().invokeExtensions("getNodeMenuItems",t).flat()}async refreshComboInNodes(){const t={severity:"info",summary:G("g.update"),detail:G("toastMessages.updateRequested")};this.vueAppReady&&Oe().add(t);const a=await this.getNodeDefs();for(const o in a)this.registerNodeDef(o,a[o]);bs(this.rootGraph,o=>{const s=a[o.type];if(o.refreshComboInNode?.(a),!!s?.input&&o.widgets){const r=s.input;for(const i of o.widgets)if(i.type==="combo"){let l;if(r.required?.[i.name]!==void 0?l="required":r.optional?.[i.name]!==void 0&&(l="optional"),l!==void 0){const u=r[l]?.[i.name];u&&(ul(u)?i.options.values=u[1]?.options:ll(u)&&(i.options.values=u[0]))}}}}),await Lt().invokeExtensionsAsync("refreshComboInNodes",a),this.vueAppReady&&(this.updateVueAppNodeDefs(a),Oe().remove(t),Oe().add({severity:"success",summary:G("g.updated"),detail:G("toastMessages.nodeDefinitionsUpdated"),life:1e3}))}clean(){Gt().resetAllOutputsAndPreviews();const t=Ot();t.lastNodeErrors=null,t.lastExecutionError=null,Ua().clear(),this.rootGraph&&!this.canvas.subgraph&&this.rootGraph.clear()}clientPosToCanvasPos(t){if(!this.positionConversion)throw new Error("clientPosToCanvasPos called before setup");return this.positionConversion.clientPosToCanvasPos(t)}canvasPosToClientPos(t){if(!this.positionConversion)throw new Error("canvasPosToClientPos called before setup");return this.positionConversion.canvasPosToClientPos(t)}};const Z=new Vo;window.comfyAPI=window.comfyAPI||{};window.comfyAPI.app=window.comfyAPI.app||{};window.comfyAPI.app.ANIM_PREVIEW_WIDGET=Ls;window.comfyAPI.app.ComfyApp=Vo;window.comfyAPI.app.app=Z;const l6=Je("titleEditor",()=>({titleEditorTarget:Qt(null)})),gt=Je("canvas",()=>{const e=Qt(null),t=A([]),a=n(()=>{t.value=Array.from(e.value?.selectedItems??[]).map(y=>bt(y))},"updateSelectedItems"),o=A(100),s=A(!1);let r;const i=n(()=>{Z.canvas?.ds&&(r=Z.canvas.ds.onChanged,o.value=Math.round(Z.canvas.ds.scale*100),Z.canvas.ds.onChanged=()=>{Z.canvas?.ds?.scale&&(o.value=Math.round(Z.canvas.ds.scale*100)),r?.(Z.canvas.ds.scale,Z.canvas.ds.offset)})},"initScaleSync"),l=n(()=>{Z.canvas?.ds&&(Z.canvas.ds.onChanged=r,r=void 0)},"cleanupScaleSync"),u=E(()=>t.value.some(Rp)),c=E(()=>t.value.some(dC)),d=E(()=>t.value.some(pC)),p=n(()=>{if(!e.value)throw new Error("getCanvas: canvas is null");return e.value},"getCanvas"),f=n(y=>{if(!Z.canvas?.ds||y<=0)return;const k=y/100,S=Z.canvas.ds;S.changeScale(k,S.element?[S.element.width/2,S.element.height/2]:void 0),Z.canvas.setDirty(!0,!0),o.value=Math.round(k*100)},"setAppZoomFromPercentage"),g=Qt(null),m=A(!1),h=E(()=>new Set(t.value.filter(y=>y.id!==void 0).map(y=>String(y.id))));return Mt(()=>e.value,y=>{At(y.canvas,"litegraph:set-graph",k=>{g.value=k.detail?.newGraph??Z.canvas?.graph,m.value=!!Z.canvas?.subgraph}),At(y.canvas,"subgraph-opened",()=>{m.value=!0})},{immediate:!0}),{canvas:e,selectedItems:t,selectedNodeIds:h,nodeSelected:u,groupSelected:c,rerouteSelected:d,appScalePercentage:o,linearMode:s,updateSelectedItems:a,getCanvas:p,setAppZoomFromPercentage:f,initScaleSync:i,cleanupScaleSync:l,currentGraph:g,isInSubgraph:m}});function vm(e){if(!e||e.length===0)return null;let t=1/0,a=1/0,o=-1/0,s=-1/0;for(const r of e){const i=r.pos[0],l=r.pos[1],u=r.size[0],c=r.size[1];t=Math.min(t,i),a=Math.min(a,l),o=Math.max(o,i+u),s=Math.max(s,l+c)}return{minX:t,minY:a,maxX:o,maxY:s,width:o-t,height:s-a}}n(vm,"calculateNodeBounds");function u6(e,t=2500,a=2e3){let{minX:o,minY:s,maxX:r,maxY:i,width:l,height:u}=e;if(l<t){const c=(t-l)/2;o-=c,r+=c,l=t}if(u<a){const c=(a-u)/2;s-=c,i+=c,u=a}return{minX:o,minY:s,maxX:r,maxY:i,width:l,height:u}}n(u6,"enforceMinimumBounds");function cN(e,t,a,o=.9){if(e.width===0||e.height===0)return 1;const s=t/e.width,r=a/e.height;return Math.min(s,r)*o}n(cN,"calculateMinimapScale");var ym=class{static{n(this,"AbstractMinimapDataSource")}constructor(e){this.graph=e}getBounds(){const e=this.getNodes();if(e.length===0)return{minX:0,minY:0,maxX:100,maxY:100,width:100,height:100};const t=vm(e.map(a=>({pos:[a.x,a.y],size:[a.width,a.height]})));return t||{minX:0,minY:0,maxX:100,maxY:100,width:100,height:100}}getGroups(){return this.graph?._groups?this.graph._groups.map(e=>({x:e.pos[0],y:e.pos[1],width:e.size[0],height:e.size[1],color:e.color})):[]}getLinks(){return this.graph?this.extractLinksFromGraph(this.graph):[]}extractLinksFromGraph(e){const t=[],a=new Map(this.getNodes().map(o=>[o.id,o]));for(const o of e._nodes){if(!o.outputs)continue;const s=a.get(String(o.id));if(s){for(const r of o.outputs)if(r.links)for(const i of r.links){const l=e.links[i];if(!l)continue;const u=a.get(String(l.target_id));u&&t.push({sourceNode:s,targetNode:u,sourceSlot:l.origin_slot,targetSlot:l.target_slot})}}}return t}},dN=class extends ym{static{n(this,"LayoutStoreDataSource")}getNodes(){const e=kt.getAllNodes().value;if(e.size===0)return[];const t=[];for(const[a,o]of e){const s=this.graph?._nodes?.find(r=>String(r.id)===a);t.push({id:a,x:o.position.x,y:o.position.y,width:o.size.width,height:o.size.height,bgcolor:s?.bgcolor,mode:s?.mode,hasErrors:s?.has_errors})}return t}getNodeCount(){return kt.getAllNodes().value.size}hasData(){return this.getNodeCount()>0}},pN=class extends ym{static{n(this,"LiteGraphDataSource")}getNodes(){return this.graph?._nodes?this.graph._nodes.map(e=>({id:String(e.id),x:e.pos[0],y:e.pos[1],width:e.size[0],height:e.size[1],bgcolor:e.bgcolor,mode:e.mode,hasErrors:e.has_errors})):[]}getNodeCount(){return this.graph?._nodes?.length??0}hasData(){return this.getNodeCount()>0}},fN=class{static{n(this,"MinimapDataSourceFactory")}static create(e){return kt.getAllNodes().value.size>0?new dN(e):new pN(e)}};function mN(){const e=za().completedActivePalette.light_theme;return{nodeColor:e?"#3DA8E099":"#0B8CE999",nodeColorDefault:e?"#D9D9D9":"#353535",linkColor:e?"#616161":"#B3B3B3",slotColor:e?"#616161":"#B3B3B3",groupColor:e?"#A2D3EC":"#1F547A",groupColorDefault:e?"#283640":"#B3C1CB",bypassColor:e?"#DBDBDB":"#4B184B",errorColor:"#FF0000",isLightTheme:e}}n(mN,"getMinimapColors");function gN(e,t,a){return t.renderBypass&&e.mode===eo.BYPASS?a.bypassColor:t.nodeColors?e.bgcolor?a.isLightTheme?el(e.bgcolor,{lightness:.5}):e.bgcolor:a.nodeColorDefault:a.nodeColor}n(gN,"getNodeColor");function hN(e,t,a,o,s,r){const i=t.getGroups();if(i.length!==0)for(const l of i){const u=(l.x-s.bounds.minX)*s.scale+a,c=(l.y-s.bounds.minY)*s.scale+o,d=l.width*s.scale,p=l.height*s.scale;let f=r.groupColor;s.settings.nodeColors&&(f=l.color??r.groupColorDefault,r.isLightTheme&&(f=el(f,{opacity:.5}))),e.fillStyle=f,e.fillRect(u,c,d,p)}}n(hN,"renderGroups");function vN(e,t,a,o,s,r){const i=t.getNodes();if(i.length===0)return;const l=new Map;for(const u of i){const c=(u.x-s.bounds.minX)*s.scale+a,d=(u.y-s.bounds.minY)*s.scale+o,p=u.width*s.scale,f=u.height*s.scale,g=gN(u,s.settings,r);l.has(g)||l.set(g,[]),l.get(g).push({x:c,y:d,w:p,h:f,hasErrors:u.hasErrors})}for(const[u,c]of l){e.fillStyle=u;for(const d of c)e.fillRect(d.x,d.y,d.w,d.h)}if(s.settings.renderError){e.strokeStyle=r.errorColor,e.lineWidth=.3;for(const u of l.values())for(const c of u)c.hasErrors&&e.strokeRect(c.x,c.y,c.w,c.h)}}n(vN,"renderNodes");function yN(e,t,a,o,s,r){const i=t.getLinks();if(i.length===0)return;e.strokeStyle=r.linkColor,e.lineWidth=.3;const l=Math.max(s.scale,.5),u=[];for(const c of i){const d=(c.sourceNode.x-s.bounds.minX)*s.scale+a,p=(c.sourceNode.y-s.bounds.minY)*s.scale+o,f=(c.targetNode.x-s.bounds.minX)*s.scale+a,g=(c.targetNode.y-s.bounds.minY)*s.scale+o,m=d+c.sourceNode.width*s.scale,h=p+c.sourceNode.height*s.scale*.2,y=f,k=g+c.targetNode.height*s.scale*.2;e.beginPath(),e.moveTo(m,h),e.lineTo(y,k),e.stroke(),u.push({x1:m,y1:h,x2:y,y2:k})}e.fillStyle=r.slotColor;for(const c of u)e.beginPath(),e.arc(c.x1,c.y1,l,0,Math.PI*2),e.fill(),e.beginPath(),e.arc(c.x2,c.y2,l,0,Math.PI*2),e.fill()}n(yN,"renderConnections");function wN(e,t,a){const o=e.getContext("2d");if(!o)return;o.clearRect(0,0,a.width,a.height);const s=fN.create(t);if(!s.hasData())return;const r=mN(),i=(a.width-a.bounds.width*a.scale)/2,l=(a.height-a.bounds.height*a.scale)/2;a.settings.showGroups&&hN(o,s,i,l,a,r),a.settings.showLinks&&yN(o,s,i,l,a,r),vN(o,s,i,l,a,r)}n(wN,"renderMinimapToCanvas");function bN(){const e=gt(),t=wt().activeSubgraph||e.canvas?.graph;if(!t||!t._nodes||t._nodes.length===0)return null;const a=250,o=200,s=vm(t._nodes);if(!s)return null;const r=cN(s,a,o),i=document.createElement("canvas");i.width=a,i.height=o,wN(i,t,{bounds:s,scale:r,settings:{nodeColors:!0,showLinks:!1,showGroups:!0,renderBypass:!1,renderError:!1},width:a,height:o});const l=i.toDataURL(),u=i.getContext("2d");return u&&u.clearRect(0,0,a,o),l}n(bN,"createGraphThumbnail");var pa=A(new Map);const wm=n(()=>{const e=n(()=>{try{const i=bN();return Promise.resolve(i)}catch(i){return console.error("Failed to capture canvas thumbnail:",i),Promise.resolve(null)}},"createMinimapPreview");return{createMinimapPreview:e,storeThumbnail:n(async i=>{const l=await e();if(l){const u=pa.value.get(i.key);u&&URL.revokeObjectURL(u),pa.value.set(i.key,l)}},"storeThumbnail"),getThumbnail:n(i=>pa.value.get(i),"getThumbnail"),clearThumbnail:n(i=>{const l=pa.value.get(i);l&&URL.revokeObjectURL(l),pa.value.delete(i)},"clearThumbnail"),clearAllThumbnails:n(()=>{for(const i of pa.value.values())URL.revokeObjectURL(i);pa.value.clear()},"clearAllThumbnails"),moveWorkflowThumbnail:n((i,l)=>{if(i===l)return;const u=pa.value.get(i);u&&(pa.value.set(l,u),pa.value.delete(i))},"moveWorkflowThumbnail"),workflowThumbnails:pa}},"useWorkflowThumbnail");var _N=nd(Ng(),1);function qr(e){return JSON.parse(JSON.stringify(e))}n(qr,"clone");var Dt=_N.default.getLogger("ChangeTracker");Dt.setLevel("info");var bm=class Fo{static{n(this,"ChangeTracker")}static MAX_HISTORY=50;activeState;undoQueue=[];redoQueue=[];changeCount=0;_restoringState=!1;ds;nodeOutputs;subgraphState;constructor(t,a){this.workflow=t,this.initialState=a,this.activeState=a}reset(t){this._restoringState||(Dt.debug("Reset State"),t&&(this.activeState=qr(t)),this.initialState=qr(this.activeState))}store(){this.ds={scale:Z.canvas.ds.scale,offset:[Z.canvas.ds.offset[0],Z.canvas.ds.offset[1]]},this.subgraphState={navigation:Mi().exportState()}}restore(){if(this.ds&&(Z.canvas.ds.scale=this.ds.scale,Z.canvas.ds.offset=this.ds.offset),this.nodeOutputs&&Gt().restoreOutputs(this.nodeOutputs),this.subgraphState){const{navigation:t}=this.subgraphState;Mi().restoreState(t);const a=t.at(-1);if(a){const o=Z.rootGraph.subgraphs.get(a);o&&Z.canvas.setGraph(o)}else Z.canvas.setGraph(Z.rootGraph)}}updateModified(){oe.dispatchCustomEvent("graphChanged",this.activeState);const t=wt().getWorkflowByPath(this.workflow.path);if(t&&(t.isModified=!Fo.graphEqual(this.initialState,this.activeState),Dt.getLevel()<=Dt.levels.DEBUG&&t.isModified)){const a=Fo.graphDiff(this.initialState,this.activeState);Dt.debug("Graph diff:",a)}}checkState(){if(!Z.graph||this.changeCount)return;const t=qr(Z.rootGraph.serialize());if(!this.activeState){this.activeState=t;return}Fo.graphEqual(this.activeState,t)||(this.undoQueue.push(this.activeState),this.undoQueue.length>Fo.MAX_HISTORY&&this.undoQueue.shift(),Dt.debug("Diff detected. Undo queue length:",this.undoQueue.length),this.activeState=t,this.redoQueue.length=0,this.updateModified())}async updateState(t,a){const o=t.pop();if(o){a.push(this.activeState),this._restoringState=!0;try{await Z.loadGraphData(o,!1,!1,this.workflow,{showMissingModelsDialog:!1,showMissingNodesDialog:!1,checkForRerouteMigration:!1}),this.activeState=o,this.updateModified()}finally{this._restoringState=!1}}}async undo(){await this.updateState(this.undoQueue,this.redoQueue),Dt.debug("Undo. Undo queue length:",this.undoQueue.length,"Redo queue length:",this.redoQueue.length)}async redo(){await this.updateState(this.redoQueue,this.undoQueue),Dt.debug("Redo. Undo queue length:",this.undoQueue.length,"Redo queue length:",this.redoQueue.length)}async undoRedo(t){if((t.ctrlKey||t.metaKey)&&!t.altKey){const a=t.key.toUpperCase();if(a==="Y"&&!t.shiftKey||a=="Z"&&t.shiftKey)return await this.redo(),!0;if(a==="Z"&&!t.shiftKey)return await this.undo(),!0}}beforeChange(){this.changeCount++}afterChange(){--this.changeCount||this.checkState()}static init(){const t=n(()=>wt().activeWorkflow?.changeTracker,"getCurrentChangeTracker"),a=n(()=>t()?.checkState(),"checkState");let o=!1;window.addEventListener("keydown",l=>{if(l.repeat||Z.constructor.maskeditor_is_opended?.())return;const u=document.activeElement;requestAnimationFrame(async()=>{let c=null;if(!Z.ui.autoQueueEnabled||Z.ui.autoQueueMode==="instant"){if(u?.tagName==="INPUT"||u&&"type"in u&&u.type==="textarea")return;c=u}if(o=l.key==="Control"||l.key==="Shift"||l.key==="Alt"||l.key==="Meta",o)return;const d=t();d&&(await d.undoRedo(l)||Fo.bindInput(c)||(Dt.debug("checkState on keydown"),d.checkState()))})},!0),window.addEventListener("keyup",()=>{o&&(o=!1,Dt.debug("checkState on keyup"),a())}),window.addEventListener("mouseup",()=>{Dt.debug("checkState on mouseup"),a()}),oe.addEventListener("promptQueued",()=>{Dt.debug("checkState on promptQueued"),a()}),oe.addEventListener("graphCleared",()=>{Dt.debug("checkState on graphCleared"),a()});const s=va.prototype.processMouseUp;va.prototype.processMouseUp=function(l){const u=s.apply(this,[l]);return Dt.debug("checkState on processMouseUp"),a(),u};const r=va.prototype.prompt;va.prototype.prompt=function(l,u,c,d){const p=n(f=>{c(f),a()},"extendedCallback");return Dt.debug("checkState on prompt"),r.apply(this,[l,u,p,d])};const i=Ne.ContextMenu.prototype.close;Ne.ContextMenu.prototype.close=function(l){const u=i.apply(this,[l]);return Dt.debug("checkState on contextMenuClose"),a(),u},document.addEventListener("litegraph:canvas",l=>{const u=l.detail;u.subType==="before-change"?t()?.beforeChange():u.subType==="after-change"&&t()?.afterChange()}),oe.addEventListener("executed",l=>{const u=l.detail,c=Ot().queuedPrompts[u.prompt_id]?.workflow?.changeTracker;if(!c)return;c.nodeOutputs??={};const d=c.nodeOutputs,p=d[u.node];if(u.merge&&p)for(const f in u.output??{}){const g=p[f];g instanceof Array?p[f]=g.concat(u.output[f]):p[f]=u.output[f]}else d[u.node]=u.output})}static bindInput(t){if(!t||t.tagName==="CANVAS"||t.tagName==="BODY")return!1;for(const a of["change","input","blur"]){const o=t;if(`on${a}`in o){const s=n(()=>{wt().activeWorkflow?.changeTracker?.checkState?.(),o.removeEventListener(a,s)},"listener");return o.addEventListener(a,s),!0}}return!1}static graphEqual(t,a){if(t===a)return!0;if(typeof t=="object"&&t&&typeof a=="object"&&a){if(!Be.isEqualWith(t.nodes,a.nodes,(o,s)=>{if(Array.isArray(o)&&Array.isArray(s))return Be.isEqual(new Set(o),new Set(s))})||!Be.isEqual(Be.omit(t.extra??{},["ds"]),Be.omit(a.extra??{},["ds"])))return!1;for(const o of["links","floatingLinks","reroutes","groups","definitions","subgraphs"])if(!Be.isEqual(t[o],a[o]))return!1;return!0}return!1}static graphDiff(t,a){function o(s){return{links:s.links,floatingLinks:s.floatingLinks,reroutes:s.reroutes,groups:s.groups,extra:s.extra,definitions:s.definitions,subgraphs:s.subgraphs,nodes:s.nodes.sort((r,i)=>typeof r.id=="number"&&typeof i.id=="number"?r.id-i.id:0)}}return n(o,"sortGraphNodes"),Yg(o(t),o(a))}};window.comfyAPI=window.comfyAPI||{};window.comfyAPI.changeTracker=window.comfyAPI.changeTracker||{};window.comfyAPI.changeTracker.ChangeTracker=bm;async function _m(e,t,a,o,s=()=>!1){const r=(await oe.listUserDataFullInfo(e)).map(i=>({...i,path:e?`${e}/${i.path}`:i.path}));for(const i of r){const l=t[i.path];if(!l)t[i.path]=a(i);else{if(s(l))continue;o(l,i)}}for(const[i,l]of Object.entries(t))s(l)||r.some(u=>u.path===i)||delete t[i]}n(_m,"syncEntities");var km=class Li{static{n(this,"UserFile")}directory;fullFilename;filename;suffix;isLoading=!1;content=null;originalContent=null;constructor(t,a,o){this.path=t,this.lastModified=a,this.size=o;const s=li(t);this.path=t,this.directory=s.directory,this.fullFilename=s.fullFilename,this.filename=s.filename,this.suffix=s.suffix}updatePath(t){const a=li(t);this.path=t,this.directory=a.directory,this.fullFilename=a.fullFilename,this.filename=a.filename,this.suffix=a.suffix}static createTemporary(t){return new Li(t,Date.now(),-1)}get isTemporary(){return this.size===-1}get isPersisted(){return!this.isTemporary}get key(){return this.path}get isLoaded(){return this.content!==null}get isModified(){return this.content!==this.originalContent}async load({force:t=!1}={}){if(this.isTemporary||!t&&this.isLoaded)return this;this.isLoading=!0;const a=await oe.getUserData(this.path);if(a.status!==200)throw new Error(`Failed to load file '${this.path}': ${a.status} ${a.statusText}`);return this.content=await a.text(),this.originalContent=this.content,this.isLoading=!1,this}unload(){this.content=null,this.originalContent=null,this.isLoading=!1}async saveAs(t){const a=this.isTemporary?this:Li.createTemporary(t);return a.content=this.content,await a.save(),a}async save({force:t=!1}={}){if(this.isPersisted&&!this.isModified&&!t)return this;const a=await(await oe.storeUserData(this.path,this.content,{overwrite:this.isPersisted,throwOnError:!0,full_info:!0})).json();return typeof a=="object"&&(this.lastModified=a.modified,this.size=a.size),this.originalContent=this.content,this}async delete(){if(this.isTemporary)return;const t=await oe.deleteUserData(this.path);if(t.status!==204)throw new Error(`Failed to delete file '${this.path}': ${t.status} ${t.statusText}`)}async rename(t){if(this.isTemporary)return this.updatePath(t),this;const a=await oe.moveUserData(this.path,t);if(a.status!==200)throw new Error(`Failed to rename file '${this.path}': ${a.status} ${a.statusText}`);this.updatePath(t);const o=await a.json();return typeof o=="object"&&(this.lastModified=o.modified,this.size=o.size),this}};const c6=Je("userFile",()=>{const e=A({}),t=E(()=>Object.values(e.value)),a=E(()=>t.value.filter(i=>i.isModified)),o=E(()=>t.value.filter(i=>i.isLoaded)),s=E(()=>yo(t.value,i=>i.path.split("/")));return{userFiles:t,modifiedFiles:a,loadedFiles:o,fileTree:s,syncFiles:n(async(i="")=>{await _m(i,e.value,l=>new km(l.path,l.modified,l.size),(l,u)=>{l.lastModified=u.modified,l.size=u.size,l.unload()})},"syncFiles")}});var qa=class Cm extends km{static{n(this,"ComfyWorkflow")}static basePath="workflows/";tintCanvasBg;changeTracker=null;_isModified=!1;constructor(t){super(t.path,t.modified,t.size)}get key(){return this.path.substring(Cm.basePath.length)}get activeState(){return this.changeTracker?.activeState??null}get initialState(){return this.changeTracker?.initialState??null}get isLoaded(){return this.changeTracker!==null}get isModified(){return this._isModified}set isModified(t){this._isModified=t}async load({force:t=!1}={}){if(await super.load({force:t}),!t&&this.isLoaded)return this;if(!this.originalContent)throw new Error("[ASSERT] Workflow content should be loaded");return this.changeTracker=bt(new bm(this,JSON.parse(this.originalContent))),this}unload(){this.changeTracker=null,super.unload()}async save(){this.content=JSON.stringify(this.activeState);const t=await super.save({force:!0});return this.changeTracker?.reset(),this.isModified=!1,t}async saveAs(t){return this.content=JSON.stringify(this.activeState),await super.saveAs(t)}async promptSave(){return await pt().prompt({title:G("workflowService.saveWorkflow"),message:G("workflowService.enterFilename")+":",defaultValue:this.filename})}};const wt=Je("workflow",()=>{const e=A([]),t=32,a=n(Q=>{delete i.value[Q.path];const ue=c.value.indexOf(Q.path);return ue!==-1&&(c.value=c.value.filter(we=>we!==Q.path)),ue},"detachWorkflow"),o=n((Q,ue=-1)=>{i.value[Q.path]=Q,ue!==-1&&c.value.splice(ue,0,Q.path)},"attachWorkflow"),s=A(null),r=n(Q=>s.value?.path===Q.path,"isActive"),i=A({}),l=E(()=>Object.values(i.value)),u=n(Q=>i.value[Q]??null,"getWorkflowByPath"),c=A([]),d=E(()=>new Set(c.value)),p=E(()=>c.value.map(Q=>i.value[Q])),f=n((Q,ue)=>{const we=c.value[Q];c.value.splice(Q,1),c.value.splice(ue,0,we)},"reorderWorkflows"),g=n(Q=>d.value.has(Q.path),"isOpen"),m=n(Q=>{const{left:ue=[],right:we=[]}=Q;if(!ue.length&&!we.length)return;const Ce=n(xe=>typeof xe=="string"&&xe in i.value,"isValidPath");c.value=Be.union(ue,c.value,we).filter(Ce)},"openWorkflowsInBackground"),h=n(async Q=>{if(r(Q))return Q;c.value.includes(Q.path)||c.value.push(Q.path);const ue=await Q.load();s.value=ue,Z.canvas.bg_tint=ue.tintCanvasBg;const we=e.value.indexOf(Q.path);return we!==-1&&e.value.splice(we,1),e.value.push(Q.path),e.value.length>t&&e.value.shift(),ue},"openWorkflow"),y=n(Q=>{const{directory:ue,filename:we,suffix:Ce}=li(Q);let xe=2,Ue=Q;for(;i.value[Ue];)Ue=`${ue}/${we} (${xe}).${Ce}`,xe++;return Ue},"getUnconflictedPath"),k=n((Q,ue)=>{const we=Ud(),Ce=JSON.parse(JSON.stringify(Q.activeState));Ce.id=we;const xe=new Q.constructor({path:ue,modified:Date.now(),size:-1});return xe.originalContent=xe.content=JSON.stringify(Ce),i.value[xe.path]=xe,xe},"saveAs"),S=n((Q,ue)=>{const we=new qa({path:Q,modified:Date.now(),size:-1});return we.originalContent=we.content=ue?JSON.stringify(ue):rp,i.value[we.path]=we,we},"createNewWorkflow"),_=n((Q,ue)=>{const we=y(qa.basePath+(Q??"Unsaved Workflow.json"));if(Q&&ue){const Ce=l.value.find(xe=>xe.fullFilename===Q);if(Ce?.changeTracker&&!Ce.directory.startsWith(qa.basePath.slice(0,-1)))return Ce.changeTracker.reset(ue),Ce}return S(we,ue)},"createTemporary"),I=n((Q,ue)=>S(y(qa.basePath+(Q??"Unsaved Workflow.json")),ue),"createNewTemporary"),w=n(async Q=>{c.value=c.value.filter(ue=>ue!==Q.path),Q.isTemporary?(j(Q.key),delete i.value[Q.path]):Q.unload()},"closeWorkflow"),x=n(Q=>{const ue=c.value.indexOf(s.value?.path??"");if(ue!==-1){const we=p.value.length,Ce=(ue+Q+we)%we;return p.value[Ce]??null}return null},"openedWorkflowIndexShift"),D=n(()=>{const Q=s.value?.path,ue=[];for(let we=e.value.length-1;we>=0;we--){const Ce=e.value[we];if(Ce!==Q&&d.value.has(Ce)){ue.unshift(Ce);const xe=i.value[Ce];if(xe)return e.value=ue,xe}}return e.value=[],null},"getMostRecentWorkflow"),T=E(()=>Array.from(l.value).filter(Q=>Q.isPersisted&&!Q.path.startsWith("subgraphs/"))),N=n(async(Q="")=>{await _m(Q?"workflows/"+Q:"workflows",i.value,ue=>new qa({path:ue.path,modified:ue.modified,size:ue.size}),(ue,we)=>{const Ce=s.value?.path===ue.path,xe=Math.max(ue.lastModified,we.modified),Ue=xe===ue.lastModified&&we.size===ue.size;Ue||(ue.lastModified=xe,ue.size=we.size),!Ce&&(Ue||ue.unload())},ue=>ue.isTemporary)},"syncWorkflows"),M=Nl(),O=E(()=>l.value.filter(Q=>M.isBookmarked(Q.path))),L=E(()=>l.value.filter(Q=>Q.isModified)),F=A(!1),{moveWorkflowThumbnail:K,clearThumbnail:j}=wm(),V=n(async(Q,ue)=>{F.value=!0;try{const we=Q.path,Ce=Q.key,xe=M.isBookmarked(we),Ue=a(Q);try{await Q.rename(ue)}finally{o(Q,Ue)}const de=Q.key;K(Ce,de),xe&&(await M.setBookmarked(we,!1),await M.setBookmarked(ue,!0))}finally{F.value=!1}},"renameWorkflow"),q=n(async Q=>{F.value=!0;try{await Q.delete(),M.isBookmarked(Q.path)&&await M.setBookmarked(Q.path,!1),j(Q.key),delete i.value[Q.path]}finally{F.value=!1}},"deleteWorkflow"),re=n(async Q=>{F.value=!0;try{const ue=a(Q);try{await Q.save()}finally{o(Q,ue)}}finally{F.value=!1}},"saveWorkflow"),ae=A(!1),ce=Qt(),ee=n(()=>{const Q=Z.canvas?.subgraph;ce.value=Q?bt(Q):void 0,Z.canvas&&(ae.value=ks(Q))},"updateActiveGraph"),ne=n((Q,ue)=>{const we=ue.getNodeById(Q);if(we?.isSubgraphNode())return we.subgraph},"subgraphNodeIdToSubgraph$1"),B=n((Q,ue,we=[])=>{const Ce=ue.shift();if(Ce===void 0)return we;const xe=ne(Ce,Q);if(xe===void 0)throw new Error("Subgraph not found");return we.push(xe),B(xe,ue,we)},"getSubgraphsFromInstanceIds$1"),z=n(Q=>{const ue=ce.value;if(Q.includes(":")){if(!ue)return}else return ue?void 0:Q;const we=Q.split(":"),Ce=Z.rootGraph;if(B(Ce,we).at(-1)===ue)return we.at(-1)},"executionIdToCurrentId");return be(s,ee),{activeWorkflow:s,attachWorkflow:o,isActive:r,openWorkflows:p,openedWorkflowIndexShift:x,getMostRecentWorkflow:D,openWorkflow:h,openWorkflowsInBackground:m,isOpen:g,isBusy:F,closeWorkflow:w,createTemporary:_,createNewTemporary:I,renameWorkflow:V,deleteWorkflow:q,saveAs:k,saveWorkflow:re,reorderWorkflows:f,workflows:l,bookmarkedWorkflows:O,persistedWorkflows:T,modifiedWorkflows:L,getWorkflowByPath:u,syncWorkflows:N,isSubgraphActive:ae,activeSubgraph:ce,updateActiveGraph:ee,executionIdToCurrentId:z,nodeIdToNodeLocatorId:n((Q,ue)=>{const we=ue??ce.value;return we?_s(we.id,Q):String(Q)},"nodeIdToNodeLocatorId"),nodeToNodeLocatorId:n(Q=>ks(Q.graph)?_s(Q.graph.id,Q.id):String(Q.id),"nodeToNodeLocatorId"),nodeExecutionIdToNodeLocatorId:n(Q=>{if(!Q.includes(":"))return Q;const ue=kh(Q);if(!ue||ue.length===0)return null;const we=ue[ue.length-1],Ce=ue.slice(0,-1);if(Ce.length===0)return String(we);try{const xe=B(Z.rootGraph,Ce.map(de=>String(de))),Ue=xe[xe.length-1];return _s(Ue.id,we)}catch{return null}},"nodeExecutionIdToNodeLocatorId"),nodeLocatorIdToNodeId:n(Q=>Jl(Q)?.localNodeId??null,"nodeLocatorIdToNodeId"),nodeLocatorIdToNodeExecutionId:n((Q,ue)=>{const we=Jl(Q);if(!we)return null;const{subgraphUuid:Ce,localNodeId:xe}=we;if(!Ce)return String(xe);const Ue=n((he,Te,Ge=[])=>{if(ks(he)&&he.id===Te)return Ge;for(const We of he._nodes)if(We.isSubgraphNode()&&We.subgraph){const te=Ue(We.subgraph,Te,[...Ge,We.id]);if(te)return te}return null},"findSubgraphPath"),de=Ue(Z.rootGraph,Ce);return!de||ue&&!de.some((he,Te)=>{const Ge=B(Z.rootGraph,de.slice(0,Te+1).map(We=>String(We)));return Ge[Ge.length-1]===ue})?null:xh([...de,xe])},"nodeLocatorIdToNodeExecutionId")}}),Nl=Je("workflowBookmark",()=>{const e=A(new Set),t=n(i=>e.value.has(i),"isBookmarked"),a=n(async()=>{const i=await oe.getUserData("workflows/.index.json");if(i.status===200){const l=await i.json();e.value=new Set(l?.favorites??[])}},"loadBookmarks"),o=n(async()=>{await oe.storeUserData("workflows/.index.json",{favorites:Array.from(e.value)})},"saveBookmarks"),s=n(async(i,l)=>{e.value.has(i)!==l&&(l?e.value.add(i):e.value.delete(i),await o())},"setBookmarked");return{isBookmarked:t,loadBookmarks:a,saveBookmarks:o,setBookmarked:s,toggleBookmarked:n(async i=>{await s(i,!e.value.has(i))},"toggleBookmarked")}});var kN=50;function Xa(e,t={}){const{maxSize:a=kN,cacheKeyFn:o=Fd}=t,s=new Mo.default({maxSize:a}),r=new Map,i=new Map,l=n(async(f,g)=>{try{const m=new AbortController;i.set(g,m);const h=e(f,m.signal);r.set(g,h);const y=await h;return s.set(g,y),y}catch{return s.set(g,null),null}finally{r.delete(g),i.delete(g)}},"executeAndCacheCall"),u=n(async f=>{try{return await f}catch(g){return console.error("Error in pending request:",g),null}},"handlePendingRequest"),c=n(()=>{for(const f of i.values())f.abort()},"abortAllRequests");return{call:n(async f=>{const g=o(f),m=s.get(g);if(m!==void 0)return m;const h=r.get(g);return h?u(h):l(f,g)},"call"),cancel:n(()=>{c(),i.clear(),r.clear()},"cancel"),clear:n(()=>s.clear(),"clear")}}n(Xa,"useCachedRequest");var fa=So.create({baseURL:"https://api.comfy.org",headers:{"Content-Type":"application/json"},paramsSerializer:{indexes:null}});const $l=n(()=>{const e=A(!1),t=A(null),a=n((h,y,k)=>{if(!So.isAxiosError(h))return h instanceof Error?`${y}: ${h.message}`:`${y}: Unknown error occurred`;const S=h;if(S.response){const{status:_,data:I}=S.response;if(k&&k[_])return k[_];switch(_){case 400:return`Bad request: ${I?.message||"Invalid input"}`;case 401:return"Unauthorized: Authentication required";case 403:return`Forbidden: ${I?.message||"Access denied"}`;case 404:return`Not found: ${I?.message||"Resource not found"}`;case 409:return`Conflict: ${I?.message||"Resource conflict"}`;case 500:return`Server error: ${I?.message||"Internal server error"}`;default:return`${y}: ${I?.message||S.message}`}}return`${y}: ${S.message}`},"handleApiError"),o=n(async(h,y,k)=>{e.value=!0,t.value=null;try{return(await h()).data}catch(S){return Nd(S)||(t.value=a(S,y,k)),null}finally{e.value=!1}},"executeApiRequest");return{isLoading:e,error:t,listAllPacks:n(async(h,y)=>{const k="/nodes";return o(()=>fa.get(k,{params:h,signal:y}),"Failed to list packs")},"listAllPacks"),search:n(async(h,y)=>{const k="/nodes/search";return o(()=>fa.get(k,{params:h,signal:y}),"Failed to perform search")},"search"),getPackById:n(async(h,y)=>{const k=`/nodes/${h}`;return o(()=>fa.get(k,{signal:y}),"Failed to get pack",{404:`Pack not found: The pack with ID ${h} does not exist`})},"getPackById"),getPackVersions:n(async(h,y,k)=>{const S=`/nodes/${h}/versions`;return o(()=>fa.get(S,{params:y,signal:k}),"Failed to get pack versions",{403:"This pack has been banned and its versions are not available",404:`Pack not found: Pack with ID ${h} does not exist`})},"getPackVersions"),getPackByVersion:n(async(h,y,k)=>{const S=`/nodes/${h}/versions/${y}`;return o(()=>fa.get(S,{signal:k}),"Failed to get pack version",{403:"This pack has been banned and its versions are not available",404:`Pack not found: Pack with ID ${h} does not exist`})},"getPackByVersion"),getPublisherById:n(async(h,y)=>{const k=`/publishers/${h}`;return o(()=>fa.get(k,{signal:y}),"Failed to get publisher",{404:`Publisher not found: The publisher with ID ${h} does not exist`})},"getPublisherById"),listPacksForPublisher:n(async(h,y,k)=>{const S=y?{include_banned:!0}:void 0,_=`/publishers/${h}/nodes`;return o(()=>fa.get(_,{params:S,signal:k}),"Failed to list packs for publisher",{400:"Bad request: Invalid input data",404:`Publisher not found: The publisher with ID ${h} does not exist`})},"listPacksForPublisher"),getNodeDefs:n(async(h,y)=>{const{packId:k,version:S,..._}=h;if(!k||!S)return null;const I=`/nodes/${k}/versions/${S}/comfy-nodes`;return o(()=>fa.get(I,{params:_,signal:y}),"Failed to get node definitions",{403:"This pack has been banned and its definition is not available",404:"The requested node, version, or comfy node does not exist"})},"getNodeDefs"),postPackReview:n(async(h,y,k)=>{const S=`/nodes/${h}/reviews`,_={star:y};return o(()=>fa.post(S,null,{params:_,signal:k}),"Failed to add review",{400:"Bad request: Invalid review",404:`Pack not found: Pack with ID ${h} does not exist`})},"postPackReview"),inferPackFromNodeName:n(async(h,y)=>{const k=`/comfy-nodes/${h}/node`;return o(()=>fa.get(k,{signal:y}),"Failed to infer pack from comfy node name",{404:`Comfy node not found: The node with name ${h} does not exist in the registry`})},"inferPackFromNodeName"),getBulkNodeVersions:n(async(h,y)=>{const k="/bulk/nodes/versions",S="Failed to get bulk node versions",_={400:"Bad request: Invalid node version identifiers provided"},I={node_versions:h};return o(()=>fa.post(k,I,{signal:y}),S,_)},"getBulkNodeVersions")}},"useComfyRegistryService");var Oc=20,gs=64,CN=n(e=>e!==void 0&&"id"in e,"isNodePack");const ln=Je("comfyRegistry",()=>{const e=$l();let t=null;const a=new Mo.default({maxSize:gs}),o=Xa(e.listAllPacks,{maxSize:Oc}),s=Xa(async p=>p?e.getPackById(p):null,{maxSize:gs}),r=n(async p=>{const[f,g]=Wg(p,h=>a.has(h)),m=f.map(h=>a.get(h)).filter(CN);if(g.length){t=new AbortController;const{nodes:h=[]}=await e.listAllPacks({node_id:g.filter(y=>y!==void 0)},t.signal)??{};h.forEach(y=>{y?.id&&(a.set(y.id,y),m.push(y))})}return m},"getPacksByIds"),i=Xa(e.getNodeDefs,{maxSize:gs}),l=Xa(e.search,{maxSize:Oc}),u=Xa(e.inferPackFromNodeName,{maxSize:gs});return{listAllPacks:o,getPackById:s,getPacksByIds:{call:r,cancel:n(()=>t?.abort(),"cancel")},getNodeDefs:i,search:l,inferPackFromNodeName:u,clearCache:n(()=>{i.clear(),o.clear(),s.clear(),u.clear()},"clearCache"),cancelRequests:n(()=>{i.cancel(),o.cancel(),s.cancel(),u.cancel(),t?.abort()},"cancelRequests"),isLoading:e.isLoading,error:e.error}}),xm=n((e,t={})=>{const{immediate:a=!1}=t,{getPacksByIds:o}=ln(),s=n(()=>o.call(Jm(e).filter(Boolean)),"fetchPacks"),{isReady:r,isLoading:i,error:l,execute:u,state:c}=Xo(s,[],{immediate:a});return{error:l,isLoading:i,isReady:r,nodePacks:c,startFetch:u,cleanup:n(()=>{o.cancel(),r.value=!1,i.value=!1},"cleanup")}},"useNodePacks");var Nc="comfy-core";const Im=n((e={})=>{const t=zt(),a=Qo(),{inferPackFromNodeName:o}=ln(),s=A([]),r=n(I=>{if(typeof I.properties?.cnr_id=="string")return I.properties.cnr_id;if(typeof I.properties?.aux_id=="string")return I.properties.aux_id},"getWorkflowNodePackId"),i=n(I=>I.replace(/^v/,"").trim(),"cleanVersionString"),l=n(async I=>{const w=I.type;if(t.nodeDefsByName[w]?.nodeSource.type==="core")return a.systemStats||await a.refetchSystemStats(),{id:Nc,version:a.systemStats?.system?.comfyui_version??"nightly"};const x=await o.call(w);if(x)return{id:x.id,version:x.latest_version?.version??"nightly"}},"inferPack"),u=n(async I=>{const w=r(I);if(!w)return l(I);if(w!==Nc)return{id:w,version:typeof I.properties.ver=="string"?i(I.properties.ver):void 0}},"workflowNodeToPack"),c=n(async()=>{if(!Z.rootGraph)return[];const I=ch(Z.rootGraph,u);s.value=(await Promise.all(I)).filter(w=>w!==void 0)},"getWorkflowPacks"),d=n(I=>I.reduce((w,x)=>(x?.id&&w.add(x.id),w),new Set),"packsToUniqueIds"),p=E(()=>Array.from(d(s.value))),{startFetch:f,cleanup:g,error:m,isLoading:h,nodePacks:y,isReady:k}=xm(p,e),S=n(I=>p.value.includes(I),"isIdInWorkflow"),_=n(I=>I.filter(w=>!!w.id&&S(w.id)),"filterWorkflowPack");return St(()=>{g()}),{error:m,isLoading:h,isReady:k,workflowPacks:y,startFetchWorkflowPacks:n(async()=>{await c(),await f()},"startFetchWorkflowPacks"),filterWorkflowPack:_}},"useWorkflowPacks");var $c="logs",xN="cm-task-completed",IN="cm-task-started";const SN=n((e={})=>{const{ui_id:t,immediate:a=!1,messageFilter:o=n(y=>!!y.trim(),"messageFilter")}=e,s=A([]),r=A(!t);let i=null,l=null,u=null;const c=n(y=>y?.type===$c&&y.detail?.entries?.length>0,"isValidLogEvent"),d=n(y=>y.detail.entries.map(k=>k.m).filter(o),"parseLogMessage"),p=n(y=>{if(r.value&&c(y)){const k=d(y);k.length>0&&s.value.push(...k)}},"handleLogMessage"),f=n(y=>{t&&y?.detail?.ui_id===t&&(r.value=!0)},"handleTaskStarted"),g=n(y=>{t&&y?.detail?.ui_id===t&&(r.value=!1)},"handleTaskDone"),m=n(async()=>{await oe.subscribeLogs(!0),i=At(oe,$c,p),t&&(u=At(oe,IN,f),l=At(oe,xN,g))},"start"),h=n(async()=>{i?.(),u?.(),l?.(),i=null,u=null,l=null,await oe.subscribeLogs(!1)},"stopListening");return a&&m(),St(async()=>{await h(),s.value=[]}),{logs:s,startListening:m,stopListening:h}},"useServerLogs");var Rc="cm-task-completed",Bc="cm-task-started";const EN=n((e,t,a)=>{const o=A(64),s=A(!1),r=A(!1),i=E(()=>t.value.running_queue.length+t.value.pending_queue.length),l=n(()=>{r.value=i.value>0},"updateProcessingState"),u=E(()=>i.value===0),c=E(()=>Object.keys(e.value).length),d=n(S=>S.client_id===Z.api.clientId,"isTaskFromThisClient"),p=n(S=>S.client_id===Z.api.clientId,"isHistoryTaskFromThisClient"),f=n(S=>S.filter(d),"filterQueueByClientId"),g=n(S=>th(S,p),"filterHistoryByClientId"),m=n(S=>{t.value.running_queue=f(S.running_queue),t.value.pending_queue=f(S.pending_queue),e.value=g(S.history),S.installed_packs&&(a.value=Yf(S.installed_packs)),l()},"updateTaskState"),h=At(Z.api,Rc,S=>{S?.type===Rc&&S.detail?.state&&m(S.detail.state)}),y=At(Z.api,Bc,S=>{S?.type===Bc&&S.detail?.state&&m(S.detail.state)});return{isLoading:s,isProcessing:r,maxHistoryItems:o,allTasksDone:u,historyCount:c,currentQueueLength:i,updateTaskState:m,cleanup:n(()=>{h(),y(),r.value=!1,s.value=!1},"cleanup")}},"useManagerQueue");var TN={name:"AutoCompletePlus",extends:es,emits:["focused-option-changed"],data(){return{isComposing:!1}},mounted(){typeof es.mounted=="function"&&es.mounted.call(this);const e=this.$el.querySelector("input");e&&(e.addEventListener("compositionstart",()=>{this.isComposing=!0}),e.addEventListener("compositionend",()=>{this.isComposing=!1})),this.$watch(()=>this.focusedOptionIndex,(t,a)=>{this.$emit("focused-option-changed",t)})},methods:{onKeyDown(e){if(e.key==="Enter"&&this.isComposing){e.preventDefault(),e.stopPropagation();return}es.methods.onKeyDown.call(this,e)}}},AN=TN,MN=["width","height"],PN={"clip-path":"url(#clip0_776_9582)"},DN=["fill"],LN=["fill"],ON=["fill"],NN=["fill"],$N=["fill"],RN=["fill"],BN=["fill"],FN=["fill"],UN=J({__name:"DotSpinner",props:{size:{default:24},duration:{default:"2s"}},setup(e){const t=za(),a=E(()=>t.completedActivePalette.light_theme?"#2C2B30":"#D4D4D4");return(o,s)=>(C(),P("div",{class:"inline-flex items-center justify-center",style:nt({width:o.size+"px",height:o.size+"px"})},[(C(),P("svg",{xmlns:"http://www.w3.org/2000/svg",width:o.size,height:o.size,viewBox:"0 0 14 14",fill:"none",class:"animate-spin",style:nt({animationDuration:o.duration})},[v("g",PN,[v("path",{class:"dot-animation",style:{"animation-delay":"0s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M7 2.21053C7.61042 2.21053 8.10526 1.71568 8.10526 1.10526C8.10526 0.494843 7.61042 0 7 0C6.38958 0 5.89474 0.494843 5.89474 1.10526C5.89474 1.71568 6.38958 2.21053 7 2.21053Z",fill:a.value},null,8,DN),v("path",{class:"dot-animation",style:{"animation-delay":"0.25s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M2.21053 7C2.21053 7.61042 1.71568 8.10526 1.10526 8.10526C0.494843 8.10526 0 7.61042 0 7C0 6.38958 0.494843 5.89474 1.10526 5.89474C1.71568 5.89474 2.21053 6.38958 2.21053 7Z",fill:a.value},null,8,LN),v("path",{class:"dot-animation",style:{"animation-delay":"0.5s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M14 7C14 7.61042 13.5052 8.10526 12.8947 8.10526C12.2843 8.10526 11.7895 7.61042 11.7895 7C11.7895 6.38958 12.2843 5.89474 12.8947 5.89474C13.5052 5.89474 14 6.38958 14 7Z",fill:a.value},null,8,ON),v("path",{class:"dot-animation",style:{"animation-delay":"0.75s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M8.10526 12.8947C8.10526 13.5052 7.61041 14 6.99999 14C6.38957 14 5.89473 13.5052 5.89473 12.8947C5.89473 12.2843 6.38957 11.7895 6.99999 11.7895C7.61041 11.7895 8.10526 12.2843 8.10526 12.8947Z",fill:a.value},null,8,NN),v("path",{class:"dot-animation",style:{"animation-delay":"0.125s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M2.05039 3.61349C2.48203 4.04513 3.18184 4.04513 3.61347 3.61349C4.0451 3.18186 4.0451 2.48205 3.61347 2.05042C3.18184 1.61878 2.48203 1.61878 2.05039 2.05042C1.61876 2.48205 1.61876 3.18186 2.05039 3.61349Z",fill:a.value},null,8,$N),v("path",{class:"dot-animation",style:{"animation-delay":"0.625s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M11.9496 11.9496C11.518 12.3812 10.8182 12.3812 10.3865 11.9496C9.9549 11.5179 9.9549 10.8181 10.3865 10.3865C10.8182 9.95485 11.518 9.95485 11.9496 10.3865C12.3812 10.8181 12.3812 11.5179 11.9496 11.9496Z",fill:a.value},null,8,RN),v("path",{class:"dot-animation",style:{"animation-delay":"0.875s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M2.05039 11.9496C2.48203 12.3812 3.18184 12.3812 3.61347 11.9496C4.0451 11.5179 4.0451 10.8181 3.61347 10.3865C3.18184 9.95485 2.48203 9.95485 2.05039 10.3865C1.61876 10.8181 1.61876 11.5179 2.05039 11.9496Z",fill:a.value},null,8,BN),v("path",{class:"dot-animation",style:{"animation-delay":"0.375s"},"fill-rule":"evenodd","clip-rule":"evenodd",d:"M11.9496 3.61349C11.518 4.04513 10.8182 4.04513 10.3865 3.61349C9.9549 3.18186 9.9549 2.48205 10.3865 2.05042C10.8182 1.61878 11.518 1.61878 11.9496 2.05042C12.3812 2.48205 12.3812 3.18186 11.9496 3.61349Z",fill:a.value},null,8,FN)]),s[0]||(s[0]=v("defs",null,[v("clipPath",{id:"clip0_776_9582"},[v("rect",{width:"14",height:"14",fill:"white"})])],-1))],12,MN))],4))}}),_r=ot(UN,[["__scopeId","data-v-ec0691c8"]]);const Rl=n((e={})=>{const t=It(),a=A(!1),o=A(""),s=E(()=>Array.from(t.installedPacksIds)),{startFetch:r,cleanup:i,error:l,isLoading:u,nodePacks:c,isReady:d}=xm(s,e),p=n(g=>g.filter(m=>t.isPackInstalled(m.id)),"filterInstalledPack"),f=n(async()=>{if(!a.value){a.value=!0;try{t.installedPacksIds.size===0&&await t.refreshInstalledList(),await r()}finally{a.value=!1}}},"startFetchInstalled");return Mt(s,async g=>{const m=g.sort().join(",");m!==o.value&&!a.value&&(o.value=m,await r())}),St(()=>{i()}),{error:l,isLoading:u,isReady:d,installedPacks:c,installedPacksWithVersions:E(()=>{const g=[];for(const m of Object.values(t.installedPacks)){const h=m.cnr_id||m.aux_id;h&&g.push({id:h,version:m.ver??""})}return g}),startFetchInstalled:f,filterInstalledPack:p}},"useInstalledPacks"),un=Je("conflictDetection",()=>{const e=A([]),t=A(!1),a=A(null),o=E(()=>e.value.some(p=>p.has_conflict)),s=E(()=>p=>e.value.find(f=>f.package_id===p)),r=E(()=>e.value.filter(p=>p.conflicts.some(f=>f.type==="banned"))),i=E(()=>e.value.filter(p=>p.conflicts.some(f=>f.type==="pending")));function l(p){e.value=[...p]}n(l,"setConflictedPackages");function u(){e.value=[]}n(u,"clearConflicts");function c(p){t.value=p}n(c,"setDetecting");function d(p){a.value=p}return n(d,"setLastDetectionTime"),{conflictedPackages:e,isDetecting:t,lastDetectionTime:a,hasConflicts:o,getConflictsForPackageByID:s,bannedPackages:r,securityPendingPackages:i,setConflictedPackages:l,clearConflicts:u,setDetecting:c,setLastDetectionTime:d}});var Bl={CONFLICT_MODAL_DISMISSED:"Comfy.ConflictModalDismissed",CONFLICT_RED_DOT_DISMISSED:"Comfy.ConflictRedDotDismissed",CONFLICT_WARNING_BANNER_DISMISSED:"Comfy.ConflictWarningBannerDismissed"},Xr=Vi(Bl.CONFLICT_MODAL_DISMISSED,!1),wn=Vi(Bl.CONFLICT_RED_DOT_DISMISSED,!1),hs=Vi(Bl.CONFLICT_WARNING_BANNER_DISMISSED,!1);function Fl(){const e=un(),t=E(()=>({modal_dismissed:Xr.value,red_dot_dismissed:wn.value,warning_banner_dismissed:hs.value}));function a(){wn.value=!0}n(a,"dismissRedDotNotification");function o(){hs.value=!0,wn.value=!0}n(o,"dismissWarningBanner");function s(){wn.value=!0,Xr.value=!0,hs.value=!0}n(s,"markConflictsAsSeen");const r=E(()=>e.hasConflicts);return{acknowledgmentState:t,shouldShowConflictModal:E(()=>!Xr.value),shouldShowRedDot:E(()=>!(!r.value||wn.value)),shouldShowManagerBanner:E(()=>r.value&&!hs.value),dismissRedDotNotification:a,dismissWarningBanner:o,markConflictsAsSeen:s}}n(Fl,"useConflictAcknowledgment");function Fc(e){return e===!0?{type:"banned",current_value:"installed",required_value:"not_banned"}:null}n(Fc,"createBannedConflict");function Uc(e){return e===!0?{type:"pending",current_value:"installed",required_value:"not_pending"}:null}n(Uc,"createPendingConflict");function WN(e){const t=Td(e,a=>Tl(a.package_name));return Object.entries(t).map(([a,o])=>{const s=ig(o.flatMap(r=>r.conflicts),r=>`${r.type}|${r.current_value}|${r.required_value}`);return{...o[0],package_name:a,conflicts:s,has_conflict:s.length>0,is_compatible:s.length===0}})}n(WN,"consolidateConflictsByPackage");function zN(e){if(!e)return;const t=e.toLowerCase();if(t.includes("darwin")||t.includes("mac"))return"macOS";if(t.includes("win"))return"Windows";if(t.includes("linux"))return"Linux"}n(zN,"getRegistryOS");function VN(e){if(!e)return"CPU";const t=e.toLowerCase();return t==="cuda"?"CUDA":t==="mps"?"Metal":t==="rocm"?"ROCm":"CPU"}n(VN,"getRegistryAccelerator");function Wc(e,t){if(Ln(e)||Dn(e))return null;const a=zN(t);return a?e.includes(a)?null:{type:"os",current_value:a,required_value:e.join(", ")}:{type:"os",current_value:"Unknown",required_value:e.join(", ")}}n(Wc,"checkOSCompatibility");function zc(e,t){if(Ln(e)||Dn(e))return null;const a=VN(t);return e.includes(a)?null:{type:"accelerator",current_value:a,required_value:e.join(", ")}}n(zc,"checkAcceleratorCompatibility");function Vc(e){if(Ln(e)||Dn(e)||e.some(a=>a.toLowerCase()==="os independent"))return;const t=[];return e.forEach(a=>{(a==="Windows"||a==="macOS"||a==="Linux")&&(t.includes(a)||t.push(a))}),t.length>0?t:void 0}n(Vc,"normalizeOSList");var GN={app_title:"ComfyUI",app_version:"1.38.6"};function HN(e){return(0,ea.clean)(e)||e}n(HN,"cleanVersion");function vs(e,t,a){if(Ln(t)||Dn(t)||Ln(a)||Dn(a?.trim()))return null;const o=HN(t);let s=!1;try{s=(0,ea.satisfies)(o,a)}catch{return{type:e,current_value:t,required_value:a}}return s?null:{type:e,current_value:t,required_value:a}}n(vs,"checkVersionCompatibility");function Gc(){return GN.app_version||void 0}n(Gc,"getFrontendVersion");function Po(){const e=It(),{startFetchInstalled:t,installedPacks:a,installedPacksWithVersions:o,isReady:s}=Rl(),r=A(!1),i=A(null),l=A(null),u=A(null),c=A([]),d=A([]),p=A(null),f=Fl(),g=un(),m=E(()=>g.hasConflicts),h=E(()=>g.conflictedPackages),y=E(()=>g.bannedPackages),k=E(()=>g.securityPendingPackages);async function S(){try{const L=Qo(),{systemStats:F}=L;await ni(()=>L.isInitialized).toBe(!0);const K=Gc(),j={comfyui_version:F?.system.comfyui_version??"",frontend_version:K,os:F?.system.os??"",accelerator:F?.devices?.[0]?.type??""};return u.value=j,j}catch{const F={comfyui_version:void 0,frontend_version:void 0,os:void 0,accelerator:void 0};return u.value=F,F}}n(S,"collectSystemEnvironment");async function _(){try{if(await t(),!s.value||!a.value||a.value.length===0)return console.warn("[ConflictDetection] No installed packages available from useInstalledPacks"),[];const L=$l();p.value=new AbortController;const F=new Map,K=o.value.map(V=>({node_id:V.id,version:V.version}));if(K.length>0)try{const V=await L.getBulkNodeVersions(K,p.value?.signal);V&&V.node_versions?.length>0&&V.node_versions.forEach(q=>{q.status==="success"&&q.node_version?F.set(q.identifier.node_id,q.node_version):q.status==="error"&&console.warn(`[ConflictDetection] Failed to fetch version data for ${q.identifier.node_id}@${q.identifier.version}:`,q.error_message)})}catch(V){console.warn("[ConflictDetection] Failed to fetch bulk version data:",V)}const j=[];for(const V of o.value){const q=F.get(V.id),re=e.isPackEnabled(V.id),ae=qg(a.value,{id:V.id});if(q){const ce={id:V.id,name:ae?.name||V.id,installed_version:V.version,is_enabled:re,supported_comfyui_version:q.supported_comfyui_version,supported_comfyui_frontend_version:q.supported_comfyui_frontend_version,supported_os:Vc(q.supported_os),supported_accelerators:q.supported_accelerators,version_status:q.status,is_banned:q.status==="NodeVersionStatusBanned",is_pending:q.status==="NodeVersionStatusPending"};j.push(ce)}else{console.warn(`[ConflictDetection] No Registry data found for ${V.id}, using fallback`);const ce={id:V.id,name:ae?.name||V.id,installed_version:V.version,is_enabled:re,is_banned:!1,is_pending:!1};j.push(ce)}}return j}catch(L){return console.warn("[ConflictDetection] Failed to fetch package requirements:",L),[]}}n(_,"buildNodeRequirements");function I(L,F){const K=[],j=vs("comfyui_version",F.comfyui_version,L.supported_comfyui_version);j&&K.push(j);const V=vs("frontend_version",F.frontend_version,L.supported_comfyui_frontend_version);V&&K.push(V);const q=Wc(L.supported_os,F.os);q&&K.push(q);const re=zc(L.supported_accelerators,F.accelerator);re&&K.push(re);const ae=Fc(L.is_banned);ae&&K.push(ae);const ce=Uc(L.is_pending);ce&&K.push(ce);const ee=K.length>0;return{package_id:L.id??"",package_name:L.name??"",has_conflict:ee,conflicts:K,is_compatible:!ee}}n(I,"analyzePackageConflicts");async function w(){try{const L=Dm();if(!o.value||o.value.length===0)return console.warn("[ConflictDetection] No installed packages available for import failure check"),{};const F=o.value.map(j=>j.id),K=await L.getImportFailInfoBulk({cnr_ids:F},p.value?.signal);if(K){const j={};return Object.entries(K).forEach(([V,q])=>{q!==null&&(j[V]=q)}),j}return{}}catch(L){return console.warn("[ConflictDetection] Failed to fetch import failure information:",L),{}}}n(w,"fetchImportFailInfo");function x(L){const F=[];if(!L||typeof L!="object")return F;for(const[K,j]of Object.entries(L)){if(!j||typeof j!="object")continue;const V=j.error||"Unknown import error",q=j.traceback||V;F.push({package_id:K,package_name:K,has_conflict:!0,conflicts:[{type:"import_failed",current_value:V,required_value:q}],is_compatible:!1}),console.warn(`[ConflictDetection] Python import failure detected for ${K}:`,V)}return F}n(x,"detectImportFailConflicts");async function D(){if(r.value)return{success:!1,error_message:"Already detecting conflicts",results:c.value};r.value=!0,l.value=null;try{const L=await S(),F=(await _()).map(async q=>{try{return I(q,L)}catch(re){return console.warn(`[ConflictDetection] Failed to detect conflicts for package ${q.name}:`,re),null}}),K=(await Promise.allSettled(F)).map(q=>q.status==="fulfilled"?q.value:null).filter(q=>q!==null),j=x(await w()),V=[...K,...j];if(c.value=V,i.value=new Date().toISOString(),V.some(q=>q.has_conflict)){const q=WN(V.filter(re=>re.has_conflict));return g.setConflictedPackages(q),c.value=[...q],d.value=[...q],{success:!0,results:q,detected_system_environment:L}}else g.clearConflicts(),c.value=[];return{success:!0,results:V,detected_system_environment:L}}catch(L){return console.error("[ConflictDetection] Error during conflict detection:",L),l.value=L instanceof Error?L.message:String(L),{success:!1,error_message:l.value,results:[]}}finally{r.value=!1,p.value&&(p.value=null)}}n(D,"runFullConflictAnalysis");async function T(){try{const L=Qo();if(await ni(()=>L.isInitialized).toBe(!0),!Vl().isNewManagerUI.value)return;await D()}catch(L){console.warn("[ConflictDetection] Error during initialization (ignored):",L)}}n(T,"initializeConflictDetection");function N(){p.value&&(p.value.abort(),p.value=null)}n(N,"cancelRequests"),ji()&&St(()=>{N()});async function M(){c.value.length===0&&await D();const L=m.value,F=f.shouldShowConflictModal.value;return L&&F}n(M,"shouldShowConflictModalAfterUpdate");function O(L){const F=[],K=Wc(Vc(L.supported_os),u.value?.os);K&&F.push(K);const j=zc(L.supported_accelerators,u.value?.accelerator);j&&F.push(j);const V=vs("comfyui_version",u.value?.comfyui_version,L.supported_comfyui_version);V&&F.push(V);const q=vs("frontend_version",Gc(),L.supported_comfyui_frontend_version);q&&F.push(q);const re=Fc(L.status==="NodeStatusBanned"||L.status==="NodeVersionStatusBanned");re&&F.push(re);const ae=Uc(L.status==="NodeVersionStatusPending");return ae&&F.push(ae),{hasConflict:F.length>0,conflicts:F}}return n(O,"checkNodeCompatibility"),{isDetecting:ra(r),lastDetectionTime:ra(i),detectionError:ra(l),systemEnvironment:ra(u),detectionResults:ra(c),hasConflicts:m,conflictedPackages:h,bannedPackages:y,securityPendingPackages:k,runFullConflictAnalysis:D,collectSystemEnvironment:S,initializeConflictDetection:T,cancelRequests:N,shouldShowConflictModalAfterUpdate:M,checkNodeCompatibility:O}}n(Po,"useConflictDetection");var jN={key:0,class:"icon-[lucide--triangle-alert] text-warning-background"},KN=J({__name:"PackInstallButton",props:{nodePacks:{},isLoading:{type:Boolean,default:!1},label:{default:"Install"},size:{default:"sm"},hasConflict:{type:Boolean},conflictInfo:{}},setup(e){const t=It(),{showNodeConflictDialog:a}=pt(),{t:o}=Fe(),s=E(()=>e.nodePacks?.length?e.nodePacks.some(d=>t.isPackInstalling(d.id)):!1),r=n(d=>{if(!d.id)throw new Error("Node ID is required for installation");const p=d.publisher?.name==="Unclaimed"?"nightly":d.latest_version?.version??"latest";return{id:d.id,repository:d.repository??"",channel:"dev",mode:"cache",selected_version:p,version:p}},"createPayload"),i=n(d=>t.installPack.call(r(d)),"installPack"),l=n(async()=>{if(!e.nodePacks?.length)return;if(e.hasConflict&&e.conflictInfo){const{checkNodeCompatibility:p}=Po();a({conflictedPackages:e.nodePacks.map(f=>{const g=p(f);return{package_id:f.id||"",package_name:f.name||"",has_conflict:g.hasConflict,conflicts:g.conflicts,is_compatible:!g.hasConflict}}).filter(f=>f.has_conflict),buttonText:o("manager.conflicts.installAnyway"),onButtonClick:n(async()=>{const f=e.nodePacks.filter(g=>!t.isPackInstalled(g.id));f.length&&await u(f)},"onButtonClick")});return}const d=e.nodePacks.filter(p=>!t.isPackInstalled(p.id));d.length&&await u(d)},"installAllPacks"),u=n(async d=>{await Promise.all(d.map(i)),t.installPack.clear()},"performInstallation"),c=E(()=>s.value?o("g.installing"):e.label??(e.nodePacks.length>1?o("manager.installSelected"):o("g.install")));return(d,p)=>(C(),X(se,{variant:"secondary",size:d.size,disabled:d.isLoading||s.value,onClick:l},{default:W(()=>[d.hasConflict&&!s.value&&!d.isLoading?(C(),P("i",jN)):d.isLoading||s.value?(C(),X(_r,{key:1,duration:"1s",size:d.size==="sm"?12:16},null,8,["size"])):H("",!0),v("span",null,$(c.value),1)]),_:1},8,["size","disabled"]))}}),Xn=KN,YN=J({__name:"PackUpdateButton",props:{nodePacks:{},hasDisabledUpdatePacks:{type:Boolean},size:{default:"sm"}},setup(e){const t=A(!1),a=It(),o=n(i=>({id:i.id,version:i.latest_version.version}),"createPayload"),s=n(async i=>{if(!i.id||!i.latest_version?.version){console.warn("Pack missing required id or version:",i);return}await a.updatePack.call(o(i))},"updatePack"),r=n(async()=>{if(!e.nodePacks?.length){console.warn("No packs provided for update");return}t.value=!0;const i=e.nodePacks.filter(l=>a.isPackInstalled(l.id));if(!i.length){t.value=!1;return}try{await Promise.all(i.map(s)),a.updatePack.clear()}catch(l){console.error("Pack update failed:",l),console.error("Failed packs info:",i.map(u=>u.id))}finally{t.value=!1}},"updateAllPacks");return(i,l)=>{const u=ht("tooltip");return ze((C(),X(se,{class:"border",size:i.size,disabled:t.value,onClick:r},{default:W(()=>[t.value?(C(),X(_r,{key:0,duration:"1s",size:12})):H("",!0),v("span",null,$(i.$t("manager.updateAll")),1)]),_:1},8,["size","disabled"])),[[u,i.hasDisabledUpdatePacks?i.$t("manager.disabledNodesWontUpdate"):null,void 0,{top:!0}]])}}}),qN=YN;const Zn=Symbol("ImportFailed");var XN=J({__name:"PackStatusMessage",props:{statusType:{},hasCompatibilityIssues:{type:Boolean}},setup(e){const t=Ma(Zn)?.importFailed,a={NodeStatusActive:{label:"active",severity:"success"},NodeStatusDeleted:{label:"deleted",severity:"warn"},NodeStatusBanned:{label:"banned",severity:"error"},NodeVersionStatusActive:{label:"active",severity:"success"},NodeVersionStatusPending:{label:"pending",severity:"warn"},NodeVersionStatusDeleted:{label:"deleted",severity:"warn"},NodeVersionStatusFlagged:{label:"flagged",severity:"error"},NodeVersionStatusBanned:{label:"banned",severity:"error"}},o=E(()=>t?.value?"importFailed":e.hasCompatibilityIssues?"conflicting":a[e.statusType]?.label||"unknown"),s=E(()=>e.hasCompatibilityIssues||t?.value?"error":a[e.statusType]?.severity||"secondary");return(r,i)=>(C(),X(b(Ea),{severity:s.value,class:"flex w-fit items-center rounded-xl p-0 break-words",pt:{text:{class:"text-xs"},content:{class:"px-2 py-0.5"}}},{default:W(()=>[i[0]||(i[0]=v("i",{class:"pi pi-circle-fill mr-1.5 p-0 text-[0.6rem]",style:{opacity:.8}},null,-1)),fe(" "+$(r.$t(`manager.status.${o.value}`)),1)]),_:1},8,["severity"]))}}),Sm=XN,ZN=J({__name:"ContentDivider",props:{orientation:{default:"horizontal"},width:{default:.3}},setup(e){ug(o=>({"4bb7c524":o.width+"px"}));const t=za(),a=E(()=>t.completedActivePalette.light_theme);return(o,s)=>(C(),P("div",{class:pe({"content-divider":!0,"content-divider--horizontal":o.orientation==="horizontal","content-divider--vertical":o.orientation==="vertical"}),style:nt({backgroundColor:a.value?"#DCDAE1":"#2C2C2C"})},null,6))}}),Oi=ot(ZN,[["__scopeId","data-v-1d39213b"]]),JN=["width","height"],QN=["fill"],e$=J({__name:"VerifiedIcon",props:{size:{default:16},color:{default:"#60A5FA"},class:{}},setup(e){const t=E(()=>e.class||"");return(a,o)=>(C(),P("svg",{xmlns:"http://www.w3.org/2000/svg",width:a.size,height:a.size,viewBox:"0 0 16 16",fill:"none",class:pe(t.value)},[v("path",{d:"M8.00049 1.3335C8.73661 1.33367 9.33332 1.93038 9.3335 2.6665V2.83447C9.82278 2.96041 10.2851 3.15405 10.7095 3.40479L10.8286 3.28564C11.3493 2.76525 12.1937 2.76519 12.7144 3.28564C13.235 3.80626 13.2348 4.65067 12.7144 5.17139L12.5952 5.29053C12.846 5.71486 13.0396 6.17725 13.1655 6.6665H13.3335C14.0699 6.6665 14.6665 7.26411 14.6665 8.00049C14.6663 8.73672 14.0698 9.3335 13.3335 9.3335H13.1655C13.0396 9.82284 12.846 10.2851 12.5952 10.7095L12.7144 10.8286C13.235 11.3493 13.235 12.1937 12.7144 12.7144C12.1937 13.235 11.3493 13.235 10.8286 12.7144L10.7095 12.5952C10.2851 12.846 9.82284 13.0396 9.3335 13.1655V13.3335C9.3335 14.0698 8.73672 14.6663 8.00049 14.6665C7.26411 14.6665 6.6665 14.0699 6.6665 13.3335V13.1655C6.17725 13.0396 5.71486 12.846 5.29053 12.5952L5.17139 12.7144C4.65067 13.2348 3.80626 13.235 3.28564 12.7144C2.76519 12.1937 2.76525 11.3493 3.28564 10.8286L3.40479 10.7095C3.15405 10.2851 2.96041 9.82278 2.83447 9.3335H2.6665C1.93038 9.33332 1.33367 8.73661 1.3335 8.00049C1.3335 7.26422 1.93027 6.66668 2.6665 6.6665H2.83447C2.96043 6.17722 3.15403 5.71488 3.40479 5.29053L3.28564 5.17139C2.76536 4.65065 2.76508 3.80621 3.28564 3.28564C3.80621 2.76508 4.65065 2.76536 5.17139 3.28564L5.29053 3.40479C5.71488 3.15403 6.17722 2.96043 6.6665 2.83447V2.6665C6.66668 1.93027 7.26422 1.3335 8.00049 1.3335ZM7.3335 8.00049L6.00049 6.6665L4.6665 8.00049L7.3335 10.6665L11.3335 6.6665L10.0005 5.3335L7.3335 8.00049Z",fill:a.color},null,8,QN)],10,JN))}}),t$=e$;function Js(e,t){const a=`manager.conflicts.conflictMessages.${e.type}`;return e.type==="comfyui_version"||e.type==="frontend_version"||e.type==="os"||e.type==="accelerator"?t(a,{current:e.current_value,required:e.required_value}):e.type==="banned"||e.type==="pending"||e.type==="import_failed"?t(a):t("manager.conflicts.conflictMessages.generic",{current:e.current_value,required:e.required_value})}n(Js,"getConflictMessage");function a$(e,t,a="; "){return e.map(o=>Js(o,t)).join(a)}n(a$,"getJoinedConflictMessages");var o$={class:"w-64 pt-1"},n$={class:"py-2"},s$={class:"text-md pl-3 font-semibold text-neutral-500"},r$={key:0,class:"flex flex-col items-center py-4 text-center text-muted"},i$={key:1,class:"py-2"},l$={class:"flex w-full items-center justify-between p-1"},u$={class:"flex items-center gap-2"},c$={key:0,class:"w-4"},d$={key:0,class:"icon-[lucide--triangle-alert] text-warning-background"},p$={key:0,class:"pi pi-check text-highlight"},f$={class:"flex justify-end gap-2 px-3 py-1"},m$=J({__name:"PackVersionSelectorPopover",props:{nodePack:{}},emits:["cancel","submit"],setup(e,{emit:t}){const a={LATEST:"latest",NIGHTLY:"nightly"},o={DEFAULT:"default",DEV:"dev"},s={CACHE:"cache",REMOTE:"remote",LOCAL:"local"},r=t,{t:i}=Fe(),l=$l(),u=It(),{checkNodeCompatibility:c}=Po(),d=A(!1),p=A(a.LATEST);it(()=>{const D=f()??a.LATEST;p.value=(0,ea.valid)(D)?D:a.NIGHTLY});const f=n(()=>{if(e.nodePack.id)return e.nodePack.publisher?.name==="Unclaimed"?a.NIGHTLY:u.isPackInstalled(e.nodePack.id)?u.getInstalledPackVersion(e.nodePack.id):e.nodePack.latest_version?.version},"getInitialSelectedVersion"),g=n(async()=>e.nodePack?.id?await l.getPackVersions(e.nodePack.id)||[]:[],"fetchVersions"),m=A([]),h=A([]),y=A(!1),k=n(async()=>{y.value=!0;const D=await g();h.value=D;const T=e.nodePack.latest_version?.version,N=D.map(L=>({value:L.version??"",label:L.version??""})).filter(L=>L.value&&L.value!==T),M=T?`${i("manager.latestVersion")} (${T})`:i("manager.latestVersion"),O=[{value:a.LATEST,label:M}];e.nodePack.repository?.length&&O.push({value:a.NIGHTLY,label:i("manager.nightlyVersion")}),m.value=[...O,...N],y.value=!1},"onNodePackChange");Mt(()=>e.nodePack.id,(D,T)=>{D!==T&&k()},{deep:!0,immediate:!0});const S=n(async()=>{if(d.value=!0,!e.nodePack.id)throw new Error("Node ID is required for installation");const D=p.value==="latest"?e.nodePack.latest_version?.version??"latest":p.value;await u.installPack.call({id:e.nodePack.id,repository:e.nodePack.repository??"",channel:o.DEFAULT,mode:s.CACHE,version:D,selected_version:p.value}),d.value=!1,r("submit")},"handleSubmit"),_=n(D=>{const T=e.nodePack.latest_version?.version;if(D==="latest"||D===T)return{...e.nodePack.latest_version};const N=h.value.find(M=>M.version===D);return N?{...N}:{...e.nodePack}},"getVersionData"),I=n(D=>{const T=c(_(D)),N=T.hasConflict?a$(T.conflicts,i):"";return{hasConflict:T.hasConflict,conflictMessage:N}},"getVersionCompatibility"),w=n(D=>p.value===D||D==="latest"&&p.value===e.nodePack.latest_version?.version,"isOptionSelected"),x=E(()=>m.value.map(D=>{const T=I(D.value),N=w(D.value);return{...D,hasConflict:T.hasConflict,conflictMessage:T.conflictMessage,isSelected:N}}));return(D,T)=>{const N=ht("tooltip");return C(),P("div",o$,[v("div",n$,[v("span",s$,$(D.$t("manager.selectVersion")),1)]),y.value||d.value?(C(),P("div",r$,[R(b(Io),{class:"mb-2 h-8 w-8"}),fe(" "+$(D.$t("manager.loadingVersions")),1)])):m.value.length===0?(C(),P("div",i$,[R(Va,{title:D.$t("g.noResultsFound"),message:D.$t("manager.tryAgainLater"),icon:"pi pi-exclamation-circle",class:"p-0"},null,8,["title","message"])])):(C(),X(b(Fi),{key:2,modelValue:p.value,"onUpdate:modelValue":T[0]||(T[0]=M=>p.value=M),"option-label":"label","option-value":"value",options:x.value,"highlight-on-select":!1,class:"max-h-[50vh] w-full rounded-md border-none shadow-none",pt:{listContainer:{class:"scrollbar-hide"}}},{option:W(M=>[v("div",l$,[v("div",u$,[M.option.value==="nightly"?(C(),P("div",c$)):(C(),P(Se,{key:1},[M.option.hasConflict?ze((C(),P("i",d$,null,512)),[[N,{value:M.option.conflictMessage,showDelay:300}]]):(C(),X(t$,{key:1,size:20,class:"relative right-0.5"}))],64)),v("span",null,$(M.option.label),1)]),M.option.isSelected?(C(),P("i",p$)):H("",!0)])]),_:1},8,["modelValue","options"])),R(Oi,{class:"my-2"}),v("div",f$,[R(se,{variant:"muted-textonly",class:"text-sm",disabled:d.value,onClick:T[1]||(T[1]=M=>r("cancel"))},{default:W(()=>[fe($(D.$t("g.cancel")),1)]),_:1},8,["disabled"]),R(se,{variant:"secondary",class:"rounded-lg bg-secondary-background px-4 py-2.5 text-sm text-base-foreground",disabled:d.value,onClick:S},{default:W(()=>[fe($(D.$t("g.install")),1)]),_:1},8,["disabled"])])])}}}),g$=m$;const Ul=n(e=>{const{isPackInstalled:t,isPackEnabled:a,getInstalledPackVersion:o}=It(),s=E(()=>lg(e)),r=E(()=>t(s.value?.id)),i=E(()=>a(s.value?.id)),l=E(()=>o(s.value?.id??"")),u=E(()=>s.value?.latest_version?.version),c=E(()=>!!l.value&&!(0,ea.valid)(l.value));return{isUpdateAvailable:E(()=>!r.value||c.value||!u.value||!l.value?!1:(0,ea.compare)(u.value,l.value)>0),isNightlyPack:c,canTryNightlyUpdate:E(()=>r.value&&i.value&&c.value),installedVersion:l,latestVersion:u}},"usePackUpdateStatus");var h$=["aria-haspopup","role","tabindex"],v$={key:0,class:"pi pi-arrow-circle-up text-xs text-blue-600"},y$={key:1,class:"pi pi-chevron-right text-xxs"},w$=7,b$=J({__name:"PackVersionBadge",props:{nodePack:{},isSelected:{type:Boolean},fill:{type:Boolean,default:!0}},setup(e){const{isUpdateAvailable:t}=Ul(()=>e.nodePack),a=A(),o=It(),s=E(()=>o.isPackInstalled(e.nodePack?.id)),r=E(()=>s.value&&!o.isPackEnabled(e.nodePack?.id)),i=E(()=>{if(!e.nodePack.id)return"nightly";const c=o.installedPacks[e.nodePack.id]?.ver??e.nodePack.latest_version?.version??"nightly";return(0,ea.valid)(c)?c:c.slice(0,w$)}),l=n(c=>{a.value.toggle(c)},"toggleVersionSelector"),u=n(()=>{a.value.hide()},"closeVersionSelector");return be(()=>e.isSelected,(c,d)=>{d&&!c&&u()}),(c,d)=>{const p=ht("tooltip");return C(),P("div",null,[ze((C(),P("div",{class:pe(["inline-flex items-center gap-1 rounded-2xl py-1 text-xs",{"bg-dialog-surface px-1.5":c.fill,"cursor-pointer":!r.value,"cursor-not-allowed opacity-60":r.value}]),"aria-haspopup":!r.value,role:r.value?"text":"button",tabindex:r.value?-1:0,onClick:d[0]||(d[0]=f=>!r.value&&l(f)),onKeydown:[d[1]||(d[1]=Ja(f=>!r.value&&l(f),["enter"])),d[2]||(d[2]=Ja(f=>!r.value&&l(f),["space"]))]},[b(t)?(C(),P("i",v$)):H("",!0),v("span",null,$(i.value),1),r.value?H("",!0):(C(),P("i",y$))],42,h$)),[[p,r.value?c.$t("manager.enablePackToChangeVersion"):null,void 0,{top:!0}]]),R(b(mo),{ref_key:"popoverRef",ref:a,pt:{content:{class:"p-0 shadow-lg"}}},{default:W(()=>[R(g$,{"installed-version":i.value,"node-pack":c.nodePack,onCancel:u,onSubmit:u},null,8,["installed-version","node-pack"])]),_:1},512)])}}}),Em=b$;function _$(e){if(!e)return null;const t=e.filter(a=>a.type==="import_failed");return t.length>0?t:null}n(_$,"extractImportFailedConflicts");function k$(){const{showImportFailedNodeDialog:e}=pt();return(t,a)=>{t&&t.length>0&&e({conflictedPackages:t,dialogComponentProps:{onClose:a}})}}n(k$,"createImportFailedDialog");function Tm(e){const{isPackInstalled:t}=It(),{getConflictsForPackageByID:a}=un(),o=E(()=>e?t(b(e)):!1),s=E(()=>{const u=b(e);return!u||!o.value?null:a(u)||null}),r=E(()=>_$(s.value?.conflicts)),i=E(()=>r.value!==null),l=k$();return{importFailedInfo:r,importFailed:i,showImportFailedDialog:n(u=>{s.value&&l([s.value],u)},"showImportFailedDialog"),isInstalled:o}}n(Tm,"useImportFailedDetection");var C$={class:"flex items-center gap-2"},x$=256,I$=J({__name:"PackEnableToggle",props:{nodePack:{}},setup(e){const{t}=Fe(),{isPackEnabled:a,enablePack:o,disablePack:s,installedPacks:r}=It(),{getConflictsForPackageByID:i}=un(),{showNodeConflictDialog:l}=pt(),{acknowledgmentState:u,markConflictsAsSeen:c}=Fl(),{showImportFailedDialog:d}=Tm(e.nodePack.id||""),p=A(!1),f=E(()=>a(e.nodePack.id)),g=E(()=>{const x=e.nodePack.id;return x?r[x]?.ver??e.nodePack.latest_version?.version??"nightly":"nightly"}),m=E(()=>{if(e.nodePack.id)return i(e.nodePack.id)}),h=E(()=>!(m.value?.has_conflict&&!u.value.modal_dismissed)),y=n(x=>{let D=u.value.modal_dismissed;x&&(D=!1),m.value&&!D&&(m.value.conflicts.some(T=>T.type==="import_failed")?d(()=>{c()}):l({conflictedPackages:[m.value],buttonText:f.value?t("manager.conflicts.understood"):t("manager.conflicts.enableAnyway"),onButtonClick:n(async()=>{f.value||await k()},"onButtonClick"),dialogComponentProps:{onClose:n(()=>{c()},"onClose")}}))},"showConflictModal"),k=n(()=>{if(!e.nodePack.id)throw new Error("Node ID is required for enabling");return o({id:e.nodePack.id,version:g.value??"latest"})},"handleEnable"),S=n(()=>{if(!e.nodePack.id)throw new Error("Node ID is required for disabling");return s({id:e.nodePack.id,version:g.value??"latest"})},"handleDisable"),_=n(async x=>{p.value||(p.value=!0,x?await k():await S(),p.value=!1)},"handleToggle"),I=tr(x=>{_(x)},x$,{trailing:!0}),w=n(async x=>{h.value||(x.preventDefault(),y(!1))},"handleToggleInteraction");return(x,D)=>{const T=ht("tooltip");return C(),P("div",C$,[m.value?.has_conflict?ze((C(),P("div",{key:0,class:"flex h-6 w-6 cursor-pointer items-center justify-center",onClick:D[0]||(D[0]=N=>y(!0))},D[1]||(D[1]=[v("i",{class:"icon-[lucide--triangle-alert] text-xl text-warning-background"},null,-1)]))),[[T,{value:x.$t("manager.conflicts.warningTooltip"),showDelay:300}]]):H("",!0),h.value?(C(),X(b(ti),{key:2,"model-value":f.value,disabled:p.value,"aria-label":x.$t("g.enableOrDisablePack"),"onUpdate:modelValue":b(I)},null,8,["model-value","disabled","aria-label","onUpdate:modelValue"])):(C(),X(b(ti),{key:1,"model-value":f.value,disabled:p.value,readonly:!h.value,"aria-label":x.$t("g.enableOrDisablePack"),onFocus:w},null,8,["model-value","disabled","readonly","aria-label"]))])}}}),Am=I$,S$=J({__name:"PackTryUpdateButton",props:{nodePack:{},size:{}},setup(e){const{t}=Fe(),a=It(),o=A(!1);async function s(){if(!e.nodePack.id){console.warn("Pack missing required id:",e.nodePack);return}o.value=!0;try{await a.updatePack.call({id:e.nodePack.id,version:"nightly"}),a.updatePack.clear()}catch(r){console.error("Nightly update failed:",r)}finally{o.value=!1}}return n(s,"tryUpdate"),(r,i)=>{const l=ht("tooltip");return ze((C(),X(se,{variant:"textonly",size:r.size,disabled:o.value,onClick:s},{default:W(()=>[o.value?(C(),X(_r,{key:0,duration:"1s",size:r.size==="sm"?12:16},null,8,["size"])):H("",!0),v("span",null,$(o.value?b(t)("g.updating"):b(t)("manager.tryUpdate")),1)]),_:1},8,["size","disabled"])),[[l,r.$t("manager.tryUpdateTooltip"),void 0,{top:!0}]])}}}),E$=S$,T$=J({__name:"PackUninstallButton",props:{nodePacks:{},size:{}},setup(e){const t=It(),{t:a}=Fe(),o=n(i=>{if(!i.id)throw new Error("Node ID is required for uninstallation");return{id:i.id,version:i.latest_version?.version||"unknown"}},"createPayload"),s=n(i=>t.uninstallPack(o(i)),"uninstallPack"),r=n(async()=>{e.nodePacks?.length&&await Promise.all(e.nodePacks.map(s))},"uninstallItems");return(i,l)=>(C(),X(se,{variant:"textonly",size:i.size,class:"border border-red-500",onClick:r},{default:W(()=>[fe($(i.nodePacks.length>1?b(a)("manager.uninstallSelected"):b(a)("manager.uninstall")),1)]),_:1},8,["size"]))}}),Wl=T$,A$={class:"aspect-[2/1] w-full max-w-[204] overflow-hidden rounded-lg"},M$={key:0,class:"h-full w-full"},P$=["alt"],D$={key:1,class:"relative h-full w-full"},L$=["src","alt"],Hc="/assets/images/fallback-gradient-avatar.svg",O$=J({__name:"PackIcon",props:{nodePack:{}},setup(e){const t=A(!1),a=E(()=>!e.nodePack.banner_url&&!e.nodePack.icon),o=E(()=>e.nodePack.banner_url||e.nodePack.icon);return(s,r)=>(C(),P("div",A$,[a.value?(C(),P("div",M$,[v("img",{src:Hc,alt:s.$t("g.defaultBanner"),class:"h-full w-full object-cover"},null,8,P$)])):(C(),P("div",D$,[o.value?(C(),P("div",{key:0,class:"absolute inset-0 bg-cover bg-center bg-no-repeat",style:nt({backgroundImage:`url(${o.value})`,filter:"blur(10px)"})},null,4)):H("",!0),v("img",{src:t.value?Hc:o.value,alt:s.nodePack.name+" banner",class:pe(t.value?"relative w-full h-full object-cover z-10":"relative w-full h-full object-contain z-10"),onError:r[0]||(r[0]=i=>t.value=!0)},null,42,L$)]))]))}}),Mm=O$,N$={key:0,class:"flex flex-col items-center"},$$={class:"mt-4 mb-2 text-center text-2xl font-bold",style:{"word-break":"break-all"}},R$={class:"inline-block text-base"},B$={key:0,class:"mt-2 mb-4 flex w-full max-w-xs justify-center"},F$={key:1,class:"flex flex-col items-center"},U$=J({__name:"InfoPanelHeader",props:{nodePacks:{},hasConflict:{type:Boolean}},setup(e){const t=It(),a=Ma(Zn)?.importFailed,o=A(!1);be([()=>e.nodePacks,()=>t.installedPacks],()=>{o.value=e.nodePacks.every(l=>t.isPackInstalled(l.id))},{immediate:!0});const{checkNodeCompatibility:s}=Po(),r=E(()=>{if(!e.nodePacks?.length)return[];const l=[];for(const u of e.nodePacks){const c=s(u);c.conflicts&&l.push(...c.conflicts)}return l}),i=E(()=>r.value.length>0);return(l,u)=>l.nodePacks?.length?(C(),P("div",N$,[tt(l.$slots,"thumbnail",{},()=>[R(Mm,{"node-pack":l.nodePacks[0],width:"204",height:"106"},null,8,["node-pack"])]),v("h2",$$,[tt(l.$slots,"title",{},()=>[v("span",R$,$(l.nodePacks[0].name),1)])]),b(a)?H("",!0):(C(),P("div",B$,[tt(l.$slots,"install-button",{},()=>[o.value?(C(),X(Wl,Ht({key:0},l.$attrs,{size:"md","node-packs":l.nodePacks}),null,16,["node-packs"])):(C(),X(Xn,Ht({key:1},l.$attrs,{size:"md","node-packs":l.nodePacks,"has-conflict":l.hasConflict||i.value,"conflict-info":r.value}),null,16,["node-packs","has-conflict","conflict-info"]))])]))])):(C(),P("div",F$,[R(Va,{message:l.$t("manager.status.unknown"),title:l.$t("manager.tryAgainLater")},null,8,["message","title"])]))}}),Pm=U$,W$=["textContent"],z$={key:1,class:"break-words"},V$=["href"],G$={class:"text-blue-600"},H$={key:1},j$={key:2},K$={key:3,class:"rounded px-1 py-0.5 text-xs"},Y$={key:4},q$=J({__name:"MarkdownText",props:{text:{}},setup(e){const t=E(()=>/(\[.*?\]\(.*?\)|(\*\*|__)(.*?)(\*\*|__)|(\*|_)(.*?)(\*|_)|`(.*?)`)/.test(e.text)),a=E(()=>{if(!t.value)return[{type:"text",text:e.text}];const o=[],s=e.text;let r=0;const i=/\[(.*?)\]\((.*?)\)/g;let l;for(;(l=i.exec(s))!==null;)l.index>r&&o.push({type:"text",text:s.substring(r,l.index)}),o.push({type:"link",text:l[1],url:l[2]}),r=l.index+l[0].length;if(r<s.length){let u=s.substring(r);u=u.replace(/(\*\*|__)(.*?)(\*\*|__)/g,(c,d,p)=>(o.push({type:"bold",text:p}),"")),u=u.replace(/(\*|_)(.*?)(\*|_)/g,(c,d,p)=>(o.push({type:"italic",text:p}),"")),u=u.replace(/`(.*?)`/g,(c,d)=>(o.push({type:"code",text:d}),"")),u&&o.push({type:"text",text:u})}return o});return(o,s)=>(C(),P("div",null,[t.value?(C(),P("div",z$,[(C(!0),P(Se,null,Ze(a.value,(r,i)=>(C(),P(Se,{key:i},[r.type==="link"&&"url"in r?(C(),P("a",{key:0,href:r.url,target:"_blank",rel:"noopener noreferrer",class:"hover:underline"},[v("span",G$,$(r.text),1)],8,V$)):r.type==="bold"?(C(),P("strong",H$,$(r.text),1)):r.type==="italic"?(C(),P("em",j$,$(r.text),1)):r.type==="code"?(C(),P("code",K$,$(r.text),1)):(C(),P("span",Y$,$(r.text),1))],64))),128))])):(C(),P("div",{key:0,class:"break-words",textContent:$(o.text)},null,8,W$))]))}}),X$=q$,Z$={class:"flex flex-col gap-4 text-sm"},J$={class:"mb-3"},Q$={class:"break-words text-muted"},eR=["href"],tR={key:0,class:"pi pi-github text-base"},aR={class:"break-all"},oR=J({__name:"InfoTextSection",props:{sections:{}},setup(e){const t=n(a=>a.includes("github.com"),"isGitHubLink");return(a,o)=>(C(),P("div",Z$,[(C(!0),P(Se,null,Ze(a.sections,(s,r)=>(C(),P("div",{key:r,class:"mb-4"},[v("div",J$,$(s.title),1),v("div",Q$,[s.isUrl?(C(),P("a",{key:0,href:s.text,target:"_blank",rel:"noopener noreferrer",class:"flex items-center gap-2"},[t(s.text)?(C(),P("i",tR)):H("",!0),v("span",aR,$(s.text),1)],8,eR)):(C(),X(X$,{key:1,text:s.text,class:"text-muted"},null,8,["text"]))])]))),128))]))}}),nR=oR,sR={class:"overflow-hidden"},rR={key:1,class:"text-sm text-muted italic"},iR={key:2},lR={class:"mb-1"},uR=J({__name:"DescriptionTabPanel",props:{nodePack:{}},setup(e){const{t}=Fe(),a=n(u=>/^license(\.md|\.txt)?$/i.test(u),"isLicenseFile"),o=n(u=>{const c=u.match(/^(https?:\/\/github\.com\/[^/]+\/[^/]+)/i);return c?c[1]:u},"extractBaseRepoUrl"),s=n((u,c)=>{if(!c||!u)return"";const d=a(u)?u:"LICENSE";return`${o(c)}/blob/main/${d}`},"createLicenseUrl"),r=n(u=>{const c=u.file||u.text;if(typeof c=="string"&&a(c)&&e.nodePack.repository){const d=s(c,e.nodePack.repository);return{text:d,isUrl:!!d&&xs(d)}}else{if(u.text)return{text:u.text,isUrl:!1};if(typeof c=="string")return{text:c,isUrl:!1}}return{text:JSON.stringify(u),isUrl:!1}},"parseLicenseObject"),i=n(u=>{if(u==="{}")return null;try{const c=JSON.parse(u);return Object.keys(c).length===0?null:r(c)}catch{if(a(u)&&e.nodePack.repository){const d=s(u,e.nodePack.repository);return{text:d,isUrl:!!d&&xs(d)}}return{text:u,isUrl:!1}}},"formatLicense"),l=E(()=>{const u=[{title:t("g.description"),text:e.nodePack.description||t("manager.noDescription")}];if(e.nodePack.repository&&u.push({title:t("manager.repository"),text:e.nodePack.repository,isUrl:xs(e.nodePack.repository)}),e.nodePack.license){const c=i(e.nodePack.license);c&&c.text&&u.push({title:t("manager.license"),text:c.text,isUrl:c.isUrl})}return u});return(u,c)=>(C(),P("div",sR,[u.nodePack?.description?(C(),X(nR,{key:0,sections:l.value},null,8,["sections"])):(C(),P("p",rR,$(u.$t("manager.noDescription")),1)),u.nodePack?.latest_version?.dependencies?.length?(C(),P("div",iR,[v("p",lR,$(u.$t("manager.dependencies")),1),(C(!0),P(Se,null,Ze(u.nodePack.latest_version.dependencies,(d,p)=>(C(),P("div",{key:p,class:"break-words text-muted"},$(d),1))),128))])):H("",!0)]))}}),cR=uR,dR=n(e=>{const t=JSON.parse(e.return_types??"{}");if(!t.length)return[];const a=JSON.parse(e.return_names??"{}"),o=e.output_is_list??[],s=[];for(let r=0;r<t.length;r++)s.push({type:t[r],name:a[r]||t[r],is_list:o[r]??!1,index:r});return s},"registryToFrontendV2NodeOutputs"),pR=n(e=>{const t=JSON.parse(e.input_types??"{}");if(!t||!Object.keys(t).length)return{};const a={};return t.required&&Object.entries(t.required).forEach(([o,s])=>{a[o]=ko(s,{name:o,isOptional:!1})}),t.optional&&Object.entries(t.optional).forEach(([o,s])=>{a[o]=ko(s,{name:o,isOptional:!0})}),a},"registryToFrontendV2NodeInputs");const fR=n((e,t)=>{const a=e.comfy_node_name??"Node Name";return{category:e.category??"unknown",description:e.description??"",display_name:a,name:a,inputs:pR(e),outputs:dR(e),output_node:!1,python_module:t.name??t.id??"unknown"}},"registryToFrontendV2NodeDef");var mR={class:"flex flex-col gap-4 text-sm"},gR={class:"[zoom:0.6]"},hR=J({__name:"NodesTabPanel",props:{nodePack:{},nodeNames:{}},setup(e){const{getNodeDefs:t}=ln(),a=A(!1),o=Qt(null);Mt(()=>e.nodePack,n(async()=>{t.cancel(),a.value=!0;const{id:u}=e.nodePack,c=e.nodePack.latest_version?.version;!u||!c?o.value=null:o.value=(await t.call({packId:u,version:c,page:1,limit:256}))?.comfy_nodes??null,a.value=!1},"fetchNodeDefs"),{immediate:!0,deep:!0});const r=n(u=>{try{return fR(u,e.nodePack)}catch{return null}},"toFrontendNodeDef"),i=E(()=>o.value?o.value.map(r).filter(u=>u!==null):null),l=n(u=>`${u.category}${u.comfy_node_name??$s()}`,"createNodeDefKey");return(u,c)=>(C(),P("div",mR,[i.value?.length?(C(!0),P(Se,{key:0},Ze(i.value,d=>(C(),P("div",{key:l(d),class:"rounded-lg border p-4"},[v("div",gR,[R(wr,{"node-def":d,position:"relative",class:"min-w-full! text-[.625rem]!"},null,8,["node-def"])])]))),128)):a.value?(C(),X(b(Io),{key:1})):u.nodeNames.length?(C(!0),P(Se,{key:2},Ze(u.nodeNames,d=>(C(),P("div",{key:d,class:"truncate text-muted"},$(d),1))),128)):(C(),X(Va,{key:3,title:u.$t("manager.noNodesFound"),message:u.$t("manager.noNodesFoundDescription")},null,8,["title","message"]))]))}}),vR=hR,yR={class:"flex flex-col gap-3"},wR={key:0,class:"max-h-64 overflow-x-hidden scrollbar-custom overflow-y-auto rounded px-2"},bR={class:"text-xs text-muted-foreground break-all font-mono"},_R={key:1,class:"text-sm break-words"},kR=J({__name:"WarningTabPanel",props:{conflictResult:{}},setup(e){return(t,a)=>(C(),P("div",yR,[(C(!0),P(Se,null,Ze(t.conflictResult?.conflicts||[],(o,s)=>(C(),P("div",{key:s,class:"rounded-md bg-secondary-background/60 px-2 py-1"},[o.type==="import_failed"?(C(),P(Se,{key:0},[o.required_value?(C(),P("div",wR,[v("p",bR,$(o.required_value),1)])):H("",!0)],64)):(C(),P("div",_R,$(b(Js)(o,t.$t)),1))]))),128))]))}}),CR=kR,xR={class:"overflow-hidden"},IR={class:"flex items-center gap-1"},SR=J({__name:"InfoTabs",props:{nodePack:{},hasCompatibilityIssues:{type:Boolean},conflictResult:{}},setup(e){const t=Ma(Zn)?.importFailed,a=E(()=>{const{comfy_nodes:s}=e.nodePack;return s??[]}),o=A("description");return ar(()=>{e.hasCompatibilityIssues?o.value="warning":o.value==="warning"&&(o.value="description")},{flush:"post"}),(s,r)=>(C(),P("div",xR,[R(b(md),{value:o.value},{default:W(()=>[R(b(qm),{class:"scrollbar-hide overflow-x-auto"},{default:W(()=>[s.hasCompatibilityIssues?(C(),X(b(Ir),{key:0,value:"warning",class:"mr-6 p-2 font-inter"},{default:W(()=>[v("div",IR,[r[0]||(r[0]=v("span",null,"⚠️",-1)),fe(" "+$(b(t)?s.$t("g.error"):s.$t("g.warning")),1)])]),_:1})):H("",!0),R(b(Ir),{value:"description",class:"mr-6 p-2 font-inter"},{default:W(()=>[fe($(s.$t("g.description")),1)]),_:1}),R(b(Ir),{value:"nodes",class:"p-2 font-inter"},{default:W(()=>[fe($(s.$t("g.nodes")),1)]),_:1})]),_:1}),R(b(cd),{class:"overflow-auto px-2 py-4"},{default:W(()=>[s.hasCompatibilityIssues?(C(),X(b(xr),{key:0,value:"warning",class:"bg-transparent"},{default:W(()=>[R(CR,{"node-pack":s.nodePack,"conflict-result":s.conflictResult},null,8,["node-pack","conflict-result"])]),_:1})):H("",!0),R(b(xr),{value:"description"},{default:W(()=>[R(cR,{"node-pack":s.nodePack},null,8,["node-pack"])]),_:1}),R(b(xr),{value:"nodes"},{default:W(()=>[R(vR,{"node-pack":s.nodePack,"node-names":a.value},null,8,["node-pack","node-names"])]),_:1})]),_:1})]),_:1},8,["value"])]))}}),ER=SR,TR={class:"flex py-1.5 text-xs"},AR={class:"w-1/3 truncate pr-2 text-muted"},MR={class:"w-2/3"},PR=J({__name:"MetadataRow",props:{label:{},value:{default:"N/A"}},setup(e){return(t,a)=>(C(),P("div",TR,[v("div",AR,$(t.label),1),v("div",MR,[tt(t.$slots,"default",{},()=>[fe($(t.value),1)])])]))}}),Go=PR;const DR=n(e=>"comfy_nodes"in e,"isMergedNodePack"),zl=Symbol("isInstalling");let mt=(function(e){return e.All="all",e.Installed="installed",e.Workflow="workflow",e.Missing="missing",e.UpdateAvailable="updateAvailable",e})({}),Kt=(function(e){return e.Downloads="total_install",e.Created="create_time",e.Updated="update_time",e.Publisher="publisher_id",e.Name="name",e})({});var LR={key:0,class:"relative z-40 flex h-full flex-col overflow-hidden"},OR={class:"top-0 z-10 w-full px-6 pt-6"},NR={class:"flex w-full justify-center gap-2"},$R={class:"mb-6"},RR={class:"mb-6 overflow-hidden"},BR={key:1,class:"flex-1 overflow-hidden px-8 pt-4 text-sm"},FR=J({__name:"InfoPanel",props:{nodePack:{}},setup(e){const t=A(null),{isPackInstalled:a}=It(),o=E(()=>a(e.nodePack.id)),s=A(!1);ya(zl,s),Mt(o,()=>{s.value=!1});const{canTryNightlyUpdate:r}=Ul(()=>e.nodePack),{checkNodeCompatibility:i}=Po(),{getConflictsForPackageByID:l}=un(),{t:u,d:c,n:d}=Fe(),p=E(()=>{if(o.value&&e.nodePack.id)return l(e.nodePack.id)||null;const S=i(e.nodePack);return S.hasConflict?{package_id:e.nodePack.id||"",package_name:e.nodePack.name||"",has_conflict:!0,conflicts:S.conflicts,is_compatible:!1}:null}),f=E(()=>p.value?.has_conflict),{importFailed:g,showImportFailedDialog:m}=Tm(E(()=>e.nodePack.id||""));ya(Zn,{importFailed:g,showImportFailedDialog:m});const h=E(()=>[{key:"publisher",label:u("manager.createdBy"),value:e.nodePack.publisher?.name??e.nodePack.publisher?.id},{key:"downloads",label:u("manager.downloads"),value:e.nodePack.downloads?d(e.nodePack.downloads):void 0},{key:"lastUpdated",label:u("manager.lastUpdated"),value:e.nodePack.latest_version?.createdAt?c(e.nodePack.latest_version.createdAt,{dateStyle:"medium"}):void 0}]),{y}=yd(t,{eventListenerOptions:{passive:!0}}),k=n(()=>{y.value=0},"onNodePackChange");return Mt(()=>e.nodePack.id,(S,_)=>{S!==_&&k()},{immediate:!0}),(S,_)=>S.nodePack?(C(),P("div",LR,[v("div",OR,[R(Pm,{"node-packs":[S.nodePack],"has-conflict":f.value},qo({_:2},[b(r)?{name:"install-button",fn:W(()=>[v("div",NR,[R(E$,{"node-pack":S.nodePack,size:"md"},null,8,["node-pack"]),R(Wl,{"node-packs":[S.nodePack],size:"md"},null,8,["node-packs"])])]),key:"0"}:void 0]),1032,["node-packs","has-conflict"])]),v("div",{ref_key:"scrollContainer",ref:t,class:"scrollbar-hide flex-1 overflow-y-auto p-6 pt-2 text-sm"},[v("div",$R,[!b(g)&&b(a)(S.nodePack.id)?(C(),X(Go,{key:0,label:b(u)("manager.filter.enabled"),class:"flex",style:{"align-items":"center"}},{default:W(()=>[R(Am,{"node-pack":S.nodePack,"has-conflict":f.value},null,8,["node-pack","has-conflict"])]),_:1},8,["label"])):H("",!0),(C(!0),P(Se,null,Ze(h.value,I=>ze((C(),X(Go,{key:I.key,label:I.label,value:I.value},null,8,["label","value"])),[[_o,I.value!==void 0&&I.value!==null]])),128)),R(Go,{label:b(u)("g.status")},{default:W(()=>[R(Sm,{"status-type":S.nodePack.status,"has-compatibility-issues":f.value},null,8,["status-type","has-compatibility-issues"])]),_:1},8,["label"]),R(Go,{label:b(u)("manager.version")},{default:W(()=>[R(Em,{"node-pack":S.nodePack,"is-selected":!0},null,8,["node-pack"])]),_:1},8,["label"])]),v("div",RR,[R(ER,{"node-pack":S.nodePack,"has-compatibility-issues":f.value,"conflict-result":p.value},null,8,["node-pack","has-compatibility-issues","conflict-result"])])],512)])):(C(),P("div",BR,$(S.$t("manager.infoPanelEmpty")),1))}}),UR=FR,WR={class:"relative h-[104px] w-[224px] shadow-xl"},zR={class:"rounded-lg border p-0.5 shadow-lg"},VR=J({__name:"PackIconStacked",props:{nodePacks:{},maxVisible:{default:3},offset:{default:8}},setup(e){return(t,a)=>(C(),P("div",WR,[(C(!0),P(Se,null,Ze(t.nodePacks.slice(0,t.maxVisible),(o,s)=>(C(),P("div",{key:o.id,class:"absolute h-[90px] w-[210px]",style:nt({bottom:`${s*t.offset}px`,right:`${s*t.offset}px`,zIndex:t.maxVisible-s})},[v("div",zR,[R(Mm,{"node-pack":o},null,8,["node-pack"])])],4))),128))]))}}),GR=VR;function HR(e){const t=It(),a=E(()=>e.value.filter(c=>t.isPackInstalled(c.id))),o=E(()=>e.value.filter(c=>!t.isPackInstalled(c.id))),s=E(()=>a.value.length===e.value.length),r=E(()=>o.value.length===e.value.length),i=E(()=>a.value.length>0&&o.value.length>0),l=E(()=>s.value?"all-installed":r.value?"none-installed":"mixed"),u=E(()=>a.value.filter(c=>{if(!c.id)return!1;const d=t.getInstalledPackVersion(c.id),p=!!d&&!(0,ea.valid)(d),f=t.isPackEnabled(c.id);return p&&f}));return{installedPacks:a,notInstalledPacks:o,isAllInstalled:s,isNoneInstalled:r,isMixed:i,selectionState:l,nightlyPacks:u,hasNightlyPacks:E(()=>u.value.length>0)}}n(HR,"usePacksSelection");var jR=["NodeStatusBanned","NodeVersionStatusBanned","NodeStatusDeleted","NodeVersionStatusDeleted","NodeVersionStatusFlagged","NodeVersionStatusPending","NodeStatusActive","NodeVersionStatusActive"];function KR(e){const t=un(),a=E(()=>e.value.some(o=>o.id&&t.getConflictsForPackageByID(o.id)?.conflicts?.some(s=>s.type==="import_failed")||!1));return{hasImportFailed:a,overallStatus:E(()=>{if(a.value)return"NodeVersionStatusActive";for(const o of jR)if(e.value.some(s=>s.status===o))return o;return"NodeVersionStatusActive"})}}n(KR,"usePacksStatus");var YR={key:0,class:"flex h-full flex-col"},qR={class:"flex-1 overflow-auto p-6"},XR={class:"mt-5"},ZR={class:"mr-2 inline-block text-base text-blue-500"},JR={class:"text-base"},QR={key:0,class:"text-sm text-neutral-500"},e5={key:1,class:"flex w-full justify-center gap-2"},t5={class:"mb-6"},a5={key:1,class:"mx-8 mt-4 flex-1 overflow-hidden text-sm"},o5=J({__name:"InfoPanelMultiItem",props:{nodePacks:{}},setup(e){const{t}=Fe(),a=It(),o=Ns(()=>e.nodePacks),{installedPacks:s,notInstalledPacks:r,isAllInstalled:i,isNoneInstalled:l,isMixed:u,nightlyPacks:c,hasNightlyPacks:d}=HR(o),{hasImportFailed:p,overallStatus:f}=KR(o),g=A(!1);async function m(){if(c.value.length!==0){g.value=!0;try{for(const T of c.value)T.id&&await a.updatePack.call({id:T.id,version:"nightly"});a.updatePack.clear()}catch(T){console.error("Batch nightly update failed:",T)}finally{g.value=!1}}}n(m,"updateSelectedNightlyPacks");const h=E(()=>g.value?t("g.updating"):t("manager.updateSelected")),{checkNodeCompatibility:y}=Po(),{getNodeDefs:k}=ln();ya(Zn,{importFailed:p,showImportFailedDialog:n(()=>{},"showImportFailedDialog")});const S=E(()=>{const T=new Map;for(const N of r.value){const M=y(N);M.hasConflict&&N.id&&T.set(N.id,M.conflicts)}return T}),_=E(()=>{const T=new Map;return S.value.forEach(N=>{N.forEach(M=>{const O=`${M.type}-${M.current_value}-${M.required_value}`;T.has(O)||T.set(O,M)})}),Array.from(T.values())}),I=E(()=>_.value.length>0),w=n(async T=>T.latest_version?.version?(await k.call({packId:T.id,version:T.latest_version?.version,limit:8192}))?.comfy_nodes??[]:[],"getPackNodes"),{state:x}=Xo(()=>Promise.all(e.nodePacks.map(w)),[],{immediate:!0}),D=E(()=>x.value.reduce((T,N)=>T+(N?.length||0),0));return St(()=>{k.cancel()}),(T,N)=>{const M=ht("tooltip");return T.nodePacks?.length?(C(),P("div",YR,[v("div",qR,[R(Pm,{"node-packs":T.nodePacks},{thumbnail:W(()=>[R(GR,{"node-packs":T.nodePacks},null,8,["node-packs"])]),title:W(()=>[v("div",XR,[v("span",ZR,$(T.nodePacks.length),1),v("span",JR,$(T.$t("manager.packsSelected")),1)])]),"install-button":W(()=>[b(u)?(C(),P("div",QR,$(T.$t("manager.mixedSelectionMessage")),1)):b(i)?(C(),P("div",e5,[b(d)?ze((C(),X(se,{key:0,variant:"textonly",size:"md",disabled:g.value,onClick:m},{default:W(()=>[g.value?(C(),X(_r,{key:0,duration:"1s",size:16})):H("",!0),v("span",null,$(h.value),1)]),_:1},8,["disabled"])),[[M,T.$t("manager.tryUpdateTooltip"),void 0,{top:!0}]]):H("",!0),R(Wl,{size:"md","node-packs":b(s)},null,8,["node-packs"])])):b(l)?(C(),X(Xn,{key:2,size:"md","node-packs":b(r),"has-conflict":I.value,"conflict-info":_.value},null,8,["node-packs","has-conflict","conflict-info"])):H("",!0)]),_:1},8,["node-packs"]),v("div",t5,[R(Go,{label:T.$t("g.status")},{default:W(()=>[R(Sm,{"status-type":b(f),"has-compatibility-issues":I.value},null,8,["status-type","has-compatibility-issues"])]),_:1},8,["label"]),R(Go,{label:T.$t("manager.totalNodes"),value:D.value},null,8,["label","value"])])])])):(C(),P("div",a5,$(T.$t("manager.infoPanelEmpty")),1))}}}),n5=o5,s5={class:"aspect-7/3 w-full overflow-hidden"},r5={key:0,class:"h-full w-full"},i5=["alt"],l5={key:1,class:"relative h-full w-full"},u5=["src","alt"],jc="/assets/images/fallback-gradient-avatar.svg",c5=J({__name:"PackBanner",props:{nodePack:{}},setup(e){const t=A(!1),a=E(()=>!e.nodePack.banner_url&&!e.nodePack.icon),o=E(()=>e.nodePack.banner_url||e.nodePack.icon);return(s,r)=>(C(),P("div",s5,[a.value?(C(),P("div",r5,[v("img",{src:jc,alt:s.$t("g.defaultBanner"),class:"h-full w-full object-cover"},null,8,i5)])):(C(),P("div",l5,[o.value?(C(),P("div",{key:0,class:"absolute inset-0 bg-cover bg-center bg-no-repeat opacity-30",style:nt({backgroundImage:`url(${o.value})`,filter:"blur(10px)"})},null,4)):H("",!0),v("img",{src:t.value?jc:o.value,alt:s.nodePack.name+" banner",class:pe(t.value?"relative w-full h-full object-cover z-10":"relative w-full h-full object-contain z-10"),onError:r[0]||(r[0]=i=>t.value=!0)},null,42,u5)]))]))}}),d5=c5,p5={class:"flex min-h-12 items-center justify-between px-4 py-2 text-xs leading-3 font-medium text-muted"},f5={key:0,class:"flex items-center gap-1.5"},m5=J({__name:"PackCardFooter",props:{nodePack:{}},setup(e){const{isPackInstalled:t}=It(),a=E(()=>t(e.nodePack?.id)),o=Ma(zl),{n:s}=Fe(),r=E(()=>e.nodePack.downloads?s(e.nodePack.downloads):""),{checkNodeCompatibility:i}=Po(),l=E(()=>e.nodePack?i(e.nodePack).conflicts||[]:[]),u=E(()=>l.value.length>0);return(c,d)=>(C(),P("div",p5,[c.nodePack.downloads?(C(),P("div",f5,[d[0]||(d[0]=v("i",{class:"pi pi-download text-muted"},null,-1)),v("span",null,$(r.value),1)])):H("",!0),a.value?(C(),X(Am,{key:2,"node-pack":c.nodePack},null,8,["node-pack"])):(C(),X(Xn,{key:1,"node-packs":[c.nodePack],"is-installing":b(o),"has-conflict":u.value,"conflict-info":l.value},null,8,["node-packs","is-installing","has-conflict","conflict-info"]))]))}}),g5=m5,h5={class:"h-full w-full px-4 pt-4 pb-3"},v5={class:"flex h-full w-full flex-col gap-y-1"},y5={class:"truncate overflow-hidden text-sm font-bold text-ellipsis"},w5={key:0,class:"my-0 mb-1 line-clamp-3 min-h-12 flex-1 overflow-hidden text-xs leading-4 font-medium break-words text-muted"},b5={class:"flex flex-col gap-y-2"},_5={class:"flex flex-1 items-center gap-2"},k5={key:0,class:"p-2 pl-0 text-xs"},C5={key:1,class:"flex items-center justify-center gap-1 px-2 py-1 text-xs font-medium text-muted"},x5={class:"flex"},I5={key:0,class:"max-w-40 truncate text-xs leading-3 font-medium text-muted"},S5=J({__name:"PackCard",props:{nodePack:{},isSelected:{type:Boolean,default:!1}},setup(e){const{d:t}=Fe(),a=za(),o=E(()=>a.completedActivePalette.light_theme),{isPackInstalled:s,isPackEnabled:r,isPackInstalling:i}=It(),l=E(()=>i(e.nodePack?.id));ya(zl,l);const u=E(()=>s(e.nodePack?.id)),c=E(()=>u.value&&!r(e.nodePack?.id)),d=E(()=>DR(e.nodePack)?e.nodePack.comfy_nodes?.length:void 0),p=E(()=>{if(!e.nodePack)return null;const{publisher:g,author:m}=e.nodePack;return g?.name??g?.id??m}),f=E(()=>e.nodePack.latest_version?.createdAt?t(new Date(e.nodePack.latest_version.createdAt),{dateStyle:"medium"}):null);return(g,m)=>(C(),X(b(ld),{class:pe(["shadow-elevation-3 inline-flex size-full flex-col items-start justify-between overflow-hidden rounded-lg transition-all duration-200",{"selected-card":g.isSelected,"opacity-60":c.value}]),pt:{body:{class:"p-0 flex flex-col w-full h-full rounded-lg gap-0"},content:{class:"flex-1 flex flex-col rounded-lg min-h-0"},title:{class:"w-full h-full rounded-t-lg cursor-pointer"},footer:{class:"p-0 m-0 flex flex-col gap-0",style:{borderTop:o.value?"1px solid #f4f4f4":"1px solid #2C2C2C"}}}},{title:W(()=>[R(d5,{"node-pack":g.nodePack},null,8,["node-pack"])]),content:W(()=>[v("div",h5,[v("div",v5,[v("span",y5,$(g.nodePack.name),1),g.nodePack.description?(C(),P("p",w5,$(g.nodePack.description),1)):H("",!0),v("div",b5,[v("div",_5,[d.value?(C(),P("div",k5,$(d.value)+" "+$(g.$t("g.nodes")),1)):H("",!0),R(Em,{"node-pack":g.nodePack,"is-selected":g.isSelected,fill:!1,class:pe(l.value?"pointer-events-none":"")},null,8,["node-pack","is-selected","class"]),f.value?(C(),P("div",C5,$(f.value),1)):H("",!0)]),v("div",x5,[p.value?(C(),P("span",I5,$(p.value),1)):H("",!0)])])])])]),footer:W(()=>[R(g5,{"node-pack":g.nodePack,"is-installing":l.value},null,8,["node-pack","is-installing"])]),_:1},8,["class","pt"]))}}),E5=ot(S5,[["__scopeId","data-v-d5c78bd4"]]),T5={class:"flex h-full flex-col overflow-hidden rounded-lg shadow-sm","data-virtual-grid-item":""},A5={class:"flex w-full items-center justify-between px-4 py-3"},M5={class:"flex items-center"},P5={class:"flex h-6 w-6 items-center justify-center"},D5={class:"flex flex-1 p-4"},L5={class:"mr-4 shrink-0"},O5={class:"flex flex-1 flex-col overflow-hidden"},N5={class:"mb-3"},$5={class:"flex gap-2"},R5={class:"flex w-full items-center justify-between px-5 py-4"},B5=J({__name:"PackCardSkeleton",setup(e){return(t,a)=>(C(),P("div",T5,[v("div",A5,[v("div",M5,[v("div",P5,[R(b(jt),{shape:"circle",width:"1.5rem",height:"1.5rem"})]),R(b(jt),{width:"5rem",height:"1rem",class:"ml-2"})]),R(b(jt),{width:"4rem",height:"1.75rem","border-radius":"0.75rem"})]),v("div",D5,[v("div",L5,[R(b(jt),{width:"4rem",height:"4rem","border-radius":"0.5rem"})]),v("div",O5,[R(b(jt),{width:"80%",height:"1rem",class:"mb-2"}),v("div",N5,[R(b(jt),{width:"100%",height:"0.75rem",class:"mb-1"}),R(b(jt),{width:"95%",height:"0.75rem",class:"mb-1"}),R(b(jt),{width:"90%",height:"0.75rem"})]),v("div",$5,[R(b(jt),{width:"4rem",height:"1.5rem","border-radius":"0.75rem"}),R(b(jt),{width:"5rem",height:"1.5rem","border-radius":"0.75rem"})])])]),v("div",R5,[R(b(jt),{width:"4rem",height:"0.8rem"}),R(b(jt),{width:"6rem",height:"0.8rem"})])]))}}),F5=B5,U5=J({__name:"GridSkeleton",props:{skeletonCardCount:{default:12},gridStyle:{}},setup(e){return(t,a)=>(C(),P("div",{style:nt(t.gridStyle)},[(C(!0),P(Se,null,Ze(t.skeletonCardCount,o=>(C(),X(F5,{key:o}))),128))],4))}}),W5=U5;const z5=n(()=>{const e=It(),{installedPacks:t,isLoading:a,error:o,startFetchInstalled:s}=Rl(),r=n(p=>{if(!e.isPackInstalled(p?.id))return!1;const f=e.getInstalledPackVersion(p.id??""),g=p.latest_version?.version;return f&&!(0,ea.valid)(f)||!g||!f?!1:(0,ea.compare)(g,f)>0},"isOutdatedPack"),i=n(p=>p.filter(r),"filterOutdatedPacks"),l=E(()=>t.value.length?i(t.value):[]),u=E(()=>l.value.filter(p=>e.isPackEnabled(p.id))),c=E(()=>u.value.length>0),d=E(()=>l.value.length>u.value.length);return it(async()=>{!t.value.length&&!a.value&&await s()}),{updateAvailableNodePacks:l,enabledUpdateAvailableNodePacks:u,hasUpdateAvailable:c,hasDisabledUpdatePacks:d,isLoading:a,error:o}},"useUpdateAvailableNodes");var Kc="Comfy.Manager.UI.State";const V5=n(()=>{const e=n(()=>{try{const o=localStorage.getItem(Kc);if(o)return JSON.parse(o)}catch(o){console.error("Failed to load manager UI state:",o)}return{selectedTabId:mt.All,searchQuery:"",searchMode:"packs",sortField:Kt.Downloads}},"loadStoredState"),t=n(o=>{localStorage.setItem(Kc,JSON.stringify(o))},"persistState");return{loadStoredState:e,persistState:t,reset:n(()=>{t({selectedTabId:mt.All,searchQuery:"",searchMode:"packs",sortField:Kt.Downloads})},"reset")}},"useManagerStatePersistence");var G5=["comfy_nodes","name","description","latest_version","status","publisher_id","total_install","create_time","update_time","license","repository_url","latest_version_status","comfy_node_extract_status","id","icon_url","github_stars","supported_os","supported_comfyui_version","supported_comfyui_frontend_version","supported_accelerators","banner_url"],Zr=new Mo.default({maxSize:64}),H5=n(e=>({version:e.latest_version,createdAt:e.update_time,status:e.latest_version_status,comfy_node_extract_status:e.comfy_node_extract_status??void 0}),"toRegistryLatestVersion"),j5=n(e=>({id:e.publisher_id,name:e.publisher_id}),"toRegistryPublisher"),K5=ng(e=>({id:e.id??e.objectID,name:e.name,description:e.description,repository:e.repository_url,license:e.license,downloads:e.total_install,status:e.status,icon:e.icon_url,latest_version:H5(e),publisher:j5(e),created_at:e.create_time,category:e.category,author:e.author,tags:e.tags,github_stars:e.github_stars,supported_os:e.supported_os,supported_comfyui_version:e.supported_comfyui_version,supported_comfyui_frontend_version:e.supported_comfyui_frontend_version,supported_accelerators:e.supported_accelerators,banner_url:e.banner_url,comfy_nodes:e.comfy_nodes}),e=>e.id);const Y5=n(()=>{const e=_g("4E0RO38HS8","684d998c36b67a9a9fce8fc2d8860579"),t=n(async(i,l)=>{const{pageSize:u,pageNumber:c}=l,d=[{query:i,indexName:"nodes_index",attributesToRetrieve:G5,...Qm(l,["pageSize","pageNumber"]),hitsPerPage:u,page:c}];i.length>=2&&d.push({indexName:"nodes_index_query_suggestions",query:i});const{results:p}=await e.search({requests:d,strategy:"none"}),[f,g={hits:[]}]=p;return{nodePacks:f.hits.map(K5),querySuggestions:g.hits.map(m=>({query:m.query,popularity:m.popularity}))}},"searchPacksInternal");return{searchPacks:n(async(i,l)=>{const u=Fd({query:i,...l}),c=Zr.get(u);if(c!==void 0)return c;const d=await t(i,l);return Zr.set(u,d),d},"searchPacks"),clearSearchCache:n(()=>{Zr.clear()},"clearSearchCache"),getSortValue:n((i,l)=>{switch(l){case Kt.Downloads:return i.downloads??0;case Kt.Created:{const u=i.created_at;return u?new Date(u).getTime():0}case Kt.Updated:return i.latest_version?.createdAt?new Date(i.latest_version.createdAt).getTime():0;case Kt.Publisher:return i.publisher?.name??"";case Kt.Name:return i.name??"";default:return 0}},"getSortValue"),getSortableFields:n(()=>[{id:Kt.Downloads,label:"Downloads",direction:"desc"},{id:Kt.Created,label:"Created",direction:"desc"},{id:Kt.Updated,label:"Updated",direction:"desc"},{id:Kt.Publisher,label:"Publisher",direction:"asc"},{id:Kt.Name,label:"Name",direction:"asc"}],"getSortableFields")}},"useAlgoliaSearchProvider"),q5=n(()=>{const e=ln();return{searchPacks:n(async(r,i)=>{const{pageSize:l,pageNumber:u,restrictSearchableAttributes:c}=i,d=c?.includes("comfy_nodes"),p={search:d?void 0:r,comfy_node_search:d?r:void 0,limit:l,page:u+1},f=await e.search.call(p);return!f||!f.nodes?{nodePacks:[],querySuggestions:[]}:{nodePacks:f.nodes,querySuggestions:[]}},"searchPacks"),clearSearchCache:n(()=>{e.search.clear()},"clearSearchCache"),getSortValue:n((r,i)=>{switch(i){case"downloads":return r.downloads??0;case"name":return r.name??"";case"publisher":return r.publisher?.name??"";case"updated":return r.latest_version?.createdAt?new Date(r.latest_version.createdAt).getTime():0;default:return 0}},"getSortValue"),getSortableFields:n(()=>[{id:"downloads",label:"Downloads",direction:"desc"},{id:"name",label:"Name",direction:"asc"},{id:"publisher",label:"Publisher",direction:"asc"},{id:"updated",label:"Updated",direction:"desc"}],"getSortableFields")}},"useComfyRegistrySearchProvider");var Yc=3,X5=6e4;const Z5=n(()=>{const e=[];let t=0;try{e.push({provider:Y5(),name:"Algolia",isHealthy:!0,consecutiveFailures:0})}catch(p){console.warn("Failed to initialize Algolia provider:",p)}e.push({provider:q5(),name:"ComfyRegistry",isHealthy:!0,consecutiveFailures:0});const a=n(p=>!!(p.consecutiveFailures<Yc||p.lastAttempt&&Date.now()-p.lastAttempt.getTime()>X5),"isCircuitClosed"),o=n(p=>{p.isHealthy=!0,p.consecutiveFailures=0,p.lastError=void 0},"recordSuccess"),s=n((p,f)=>{p.consecutiveFailures++,p.lastError=f,p.lastAttempt=new Date,p.consecutiveFailures>=Yc&&(p.isHealthy=!1,console.warn(`${p.name} provider circuit breaker opened after ${p.consecutiveFailures} failures`))},"recordFailure"),r=n(()=>{const p=e[t];if(p&&a(p))return p.provider;for(let f=0;f<e.length;f++){const g=e[f];if(a(g))return t=f,g.provider}throw new Error("No available search providers")},"getActiveProvider"),i=n(()=>{t<e.length-1&&t++},"updateActiveProviderOnFailure");return{searchPacks:n(async(p,f)=>{let g=null;for(let m=0;m<e.length;m++)try{const h=r(),y=e[t],k=await h.searchPacks(p,f);return o(y),k}catch(h){g=h;const y=e[t];s(y,g),console.warn(`${y.name} search provider failed (${y.consecutiveFailures} failures):`,h),i()}throw new Error(`All search providers failed. Last error: ${g?.message||"Unknown error"}`)},"searchPacks"),clearSearchCache:n(()=>{for(const p of e)try{p.provider.clearSearchCache()}catch(f){console.warn(`Failed to clear cache for ${p.name} provider:`,f)}},"clearSearchCache"),getSortValue:n((p,f)=>r().getSortValue(p,f),"getSortValue"),getSortableFields:n(()=>r().getSortableFields(),"getSortableFields")}},"useRegistrySearchGateway");var J5=320,qc=Kt.Downloads;function Q5(e={}){const{initialSortField:t=qc,initialSearchMode:a="packs",initialSearchQuery:o="",initialPageNumber:s=0}=e,r=A(!1),i=A(t),l=A(a),u=A(64),c=A(s),d=A(o),p=A([]),f=A([]),g=E(()=>l.value==="nodes"?["comfy_nodes"]:["name","description"]),{searchPacks:m,clearSearchCache:h,getSortValue:y,getSortableFields:k}=Z5(),S=n(async w=>{r.value=!0,w.append||(c.value=0);const{nodePacks:x,querySuggestions:D}=await m(d.value,{pageSize:u.value,pageNumber:c.value,restrictSearchableAttributes:g.value});let T=x;i.value&&i.value!==qc&&(T=Kg(x,[N=>y(N,i.value)],[k().find(N=>N.id===i.value)?.direction||"desc"])),w.append&&p.value?.length?p.value=p.value.concat(T):p.value=T,f.value=D,r.value=!1},"updateSearchResults"),_=n(()=>S({append:!1}),"onQueryChange"),I=n(()=>S({append:!0}),"onPageChange");return be([i,l],_),be(c,I),Ed(d,_,{debounce:J5,immediate:!0}),{isLoading:r,pageNumber:c,pageSize:u,sortField:i,searchMode:l,searchQuery:d,suggestions:f,searchResults:p,sortOptions:E(()=>k()),clearCache:h}}n(Q5,"useRegistrySearch");var e3={class:"text-neutral text-base"},t3={class:"flex items-center gap-2"},a3={key:0,class:"relative mx-6 mt-3 mb-4 flex items-center gap-6 rounded-lg bg-yellow-500/20 p-4"},o3={class:"flex flex-1 flex-col gap-2"},n3={class:"m-0 text-sm font-bold"},s3={class:"m-0 text-xs"},r3={class:"relative flex flex-wrap justify-between gap-2 px-6 pb-4"},i3={key:0,class:"scrollbar-hide h-full w-full overflow-auto"},l3=J({__name:"ManagerDialog",props:{initialTab:{},onClose:{type:Function}},setup(e){ya(pl,e.onClose);const{t}=Fe(),{buildDocsUrl:a}=nr(),o=It(),{getPackById:s}=ln(),r=Fl(),i=V5(),l=i.loadStoredState(),u={display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(17rem, 1fr))",gap:"1.5rem",padding:"0"},{shouldShowManagerBanner:c,dismissWarningBanner:d,dismissRedDotNotification:p}=r,{missingNodePacks:f,isLoading:g,error:m}=Gl(),{hasUpdateAvailable:h,enabledUpdateAvailableNodePacks:y,hasDisabledUpdatePacks:k}=z5(),S=E(()=>[{id:mt.All,label:t("g.all"),icon:"pi pi-list"},{id:mt.Installed,label:t("g.installed"),icon:"pi pi-box"},{id:mt.Workflow,label:t("manager.inWorkflow"),icon:"pi pi-folder"},{id:mt.Missing,label:t("g.missing"),icon:"pi pi-exclamation-circle"},{id:mt.UpdateAvailable,label:t("g.updateAvailable"),icon:"pi pi-sync"}]),_=A(e.initialTab??l.selectedTabId??mt.All),I=E(()=>S.value.find(ke=>ke.id===_.value)),{searchQuery:w,pageNumber:x,isLoading:D,searchResults:T,searchMode:N,sortField:M,suggestions:O,sortOptions:L}=Q5({initialSortField:l.sortField,initialSearchMode:l.searchMode,initialSearchQuery:l.searchQuery});x.value=0;const F=E(()=>[{name:t("manager.filter.nodePack"),value:"packs"},{name:t("g.nodes"),value:"nodes"}]),K=E(()=>L.value?L.value.map(ke=>({name:ke.label,value:ke.id})):[]),j=n(ke=>{w.value=ke.value.query},"onOptionSelect"),V=n(()=>{x.value++},"onApproachEnd"),q=E(()=>T.value.length===0&&w.value===""),re=E(()=>w.value===""),ae=A([]),{startFetchInstalled:ce,filterInstalledPack:ee,installedPacks:ne,isLoading:B,isReady:z}=Rl(),{startFetchWorkflowPacks:Y,filterWorkflowPack:ie,workflowPacks:ge,isLoading:Le,isReady:_e}=Im(),Q=n(ke=>ke.filter(je=>!o.isPackInstalled(je.id)),"filterMissingPacks"),ue=E(()=>I.value?.id===mt.UpdateAvailable),we=E(()=>I.value?.id===mt.Installed),Ce=E(()=>I.value?.id===mt.Missing),xe=E(()=>I.value?.id===mt.Workflow),Ue=E(()=>I.value?.id===mt.All),de=n(ke=>{const{isUpdateAvailable:je}=Ul(ke);return je.value===!0},"isOutdatedPack"),he=n(ke=>ke.filter(de),"filterOutdatedPacks");be([ue,ne],async()=>{ue.value&&(re.value&&!ne.value.length&&!z.value&&!B.value?await ce():ae.value=he(ne.value))},{immediate:!0}),be([we,ne],async()=>{we.value&&(re.value?!ne.value.length&&!z.value&&!B.value?await ce():ae.value=ne.value:ae.value=ee(T.value))},{immediate:!0}),be([Ce,xe,ge,ne],async()=>{!xe.value&&!Ce.value||(re.value?!ge.value.length&&!Le.value&&!_e.value?(await Y(),Ce.value&&await ce()):ae.value=Ce.value?Q(ge.value):ge.value:ae.value=Ce.value?Q(ie(T.value)):ie(T.value))},{immediate:!0}),be([Ue,T],()=>{Ue.value&&(ae.value=T.value)});const Te=n(()=>{window.open(a("/troubleshooting/custom-node-issues",{includeLocale:!0}),"_blank")},"onClickWarningLink"),Ge=n(()=>{switch(I.value?.id){case mt.Installed:ae.value=re.value?ne.value:ee(T.value);break;case mt.Workflow:ae.value=re.value?ge.value:ie(T.value);break;case mt.Missing:re.value||(ae.value=Q(ie(T.value)));break;case mt.UpdateAvailable:ae.value=re.value?he(ne.value):he(T.value);break;default:ae.value=T.value}},"onResultsChange");be(T,Ge,{flush:"post"}),be(()=>o.installedPacksIds,Ge);const We=E(()=>D.value?T.value.length===0:I.value?.id===mt.Installed?B.value:I.value?.id===mt.Workflow||I.value?.id===mt.Missing?Le.value:q.value),te=E(()=>ae.value.map(ke=>({...ke,key:ke.id||ke.name}))),le=A([]),me=E(()=>le.value.length===1?le.value[0]:null),ve=A(!1);be(()=>le.value.length,ke=>{ve.value=ke>0});const Ie=n(()=>{switch(I.value?.id){case mt.Installed:return o.installedPacksIds?.size;case mt.Workflow:return ge.value?.length;case mt.Missing:return ge.value?.filter?.(ke=>!o.isPackInstalled(ke.id))?.length;default:return T.value.length}},"getLoadingCount"),Ae=E(()=>{const ke=Ie();return ke||16}),ye=n((ke,je)=>{je.shiftKey||je.ctrlKey||je.metaKey?le.value.findIndex(lt=>lt.id===ke.id)===-1?le.value=[...le.value,ke]:le.value=le.value.filter(lt=>lt.id!==ke.id):le.value=[ke]},"selectNodePack"),$e=n(()=>{le.value=[]},"unSelectItems"),Ke=n(ke=>{const je=ke.target;je&&!je.closest("[data-virtual-grid-item]")&&$e()},"handleGridContainerClick"),et=E(()=>le.value.length>1),He=A(null);Mt(me,async()=>{s.cancel();const ke=me.value;if(!ke?.id||et.value||He.value===ke.id)return;const je=await s.call(ke.id);if(je?.id===ke.id){He.value=ke.id;const lt=Hi({},ke,je),$t=le.value.findIndex(Rt=>Rt.id===lt.id);$t!==-1&&le.value.splice($t,1,lt);const Da=ae.value.findIndex(Rt=>Rt.id===lt.id);Da!==-1&&ae.value.splice(Da,1,lt)}});let st=null;return it(()=>{st=document.getElementById("results-grid")}),be([w,_],()=>{st??=document.getElementById("results-grid"),st&&(x.value=0,st.scrollTop=0)}),ar(()=>{p()}),Wa(()=>{i.persistState({selectedTabId:I.value?.id??mt.All,searchQuery:w.value,searchMode:N.value,sortField:M.value})}),St(()=>{s.cancel()}),(ke,je)=>(C(),X(kp,{"right-panel-open":ve.value,"onUpdate:rightPanelOpen":je[4]||(je[4]=lt=>ve.value=lt),"content-title":ke.$t("manager.discoverCommunityContent"),class:"manager-dialog"},{leftPanel:W(()=>[R(Cp,{modelValue:_.value,"onUpdate:modelValue":je[0]||(je[0]=lt=>_.value=lt),"nav-items":S.value},{"header-icon":W(()=>je[5]||(je[5]=[v("i",{class:"icon-[lucide--puzzle]"},null,-1)])),"header-title":W(()=>[v("span",e3,$(ke.$t("manager.title")),1)]),_:1},8,["modelValue","nav-items"])]),header:W(()=>[v("div",t3,[R($n,{modelValue:b(N),"onUpdate:modelValue":je[1]||(je[1]=lt=>ua(N)?N.value=lt:null),class:"min-w-34",options:F.value},null,8,["modelValue","options"]),R(AN,{modelValue:b(w),"onUpdate:modelValue":je[2]||(je[2]=lt=>ua(w)?w.value=lt:null),modelModifiers:{lazy:!0},suggestions:b(O),placeholder:ke.$t("manager.searchPlaceholder"),"complete-on-focus":!1,delay:8,"option-label":"query",class:"w-full min-w-md max-w-lg",pt:{pcInputText:{root:{autofocus:!0,class:"w-full rounded-lg h-10"}},loader:{style:"display: none"}},"show-empty-message":!1,onComplete:b(ag),onOptionSelect:j},null,8,["modelValue","suggestions","placeholder","onComplete"])])]),contentFilter:W(()=>[b(c)?(C(),P("div",a3,[je[7]||(je[7]=v("i",{class:"icon-[lucide--triangle-alert] text-lg text-warning-background"},null,-1)),v("div",o3,[v("p",n3,$(ke.$t("manager.conflicts.warningBanner.title")),1),v("p",s3,$(ke.$t("manager.conflicts.warningBanner.message")),1),v("p",{class:"m-0 cursor-pointer text-sm font-bold",onClick:Te},$(ke.$t("manager.conflicts.warningBanner.button")),1)]),R(se,{class:"absolute top-0 right-0",variant:"textonly",size:"icon",onClick:b(d)},{default:W(()=>je[6]||(je[6]=[v("i",{class:"pi pi-times text-xs text-base-foreground"},null,-1)])),_:1},8,["onClick"])])):H("",!0),v("div",r3,[v("div",null,[Ce.value&&b(f).length>0?(C(),X(Xn,{key:0,disabled:b(g)||!!b(m),"node-packs":b(f),size:"lg",label:ke.$t("manager.installAllMissingNodes")},null,8,["disabled","node-packs","label"])):H("",!0),ue.value&&b(h)?(C(),X(qN,{key:1,"node-packs":b(y),"has-disabled-update-packs":b(k),size:"lg"},null,8,["node-packs","has-disabled-update-packs"])):H("",!0)]),v("div",null,[R($n,{modelValue:b(M),"onUpdate:modelValue":je[3]||(je[3]=lt=>ua(M)?M.value=lt:null),label:ke.$t("g.sort"),options:K.value,class:"w-48"},{icon:W(()=>je[8]||(je[8]=[v("i",{class:"icon-[lucide--arrow-up-down] text-muted-foreground"},null,-1)])),_:1},8,["modelValue","label","options"])])])]),content:W(()=>[We.value?(C(),P("div",i3,[R(W5,{"grid-style":u,"skeleton-card-count":Ae.value},null,8,["skeleton-card-count"])])):b(T).length===0?(C(),X(Va,{key:1,title:b(o).error?ke.$t("manager.errorConnecting"):ke.$t("manager.noResultsFound"),message:b(o).error?ke.$t("manager.tryAgainLater"):ke.$t("manager.tryDifferentSearch")},null,8,["title","message"])):(C(),P("div",{key:2,class:"h-full",onClick:Ke},[R(pr,{id:"results-grid",items:te.value,"buffer-rows":4,"grid-style":u,onApproachEnd:V},{item:W(({item:lt})=>[R(E5,{"node-pack":lt,"is-selected":le.value.some($t=>$t.id===lt.id),onClick:Ve($t=>ye(lt,$t),["stop"])},null,8,["node-pack","is-selected","onClick"])]),_:1},8,["items"])]))]),rightPanel:W(()=>[!et.value&&me.value?(C(),X(UR,{key:0,"node-pack":me.value},null,8,["node-pack"])):(C(),X(n5,{key:1,"node-packs":le.value},null,8,["node-packs"]))]),_:1},8,["right-panel-open","content-title"]))}}),u3=l3,Xc="global-manager";function c3(){const e=pt(),t=Ct();function a(){t.closeDialog({key:Xc})}n(a,"hide");function o(s){e.showLayoutDialog({key:Xc,component:u3,props:{onClose:a,initialTab:s},dialogComponentProps:{pt:{content:{class:"!px-0 overflow-hidden h-full !py-0"}}}})}return n(o,"show"),{show:o,hide:a}}n(c3,"useManagerDialog");let Vt=(function(e){return e.DISABLED="disabled",e.LEGACY_UI="legacy",e.NEW_UI="new",e})({});function Vl(){const{systemStats:e,isInitialized:t}=Vn(Qo()),a=c3(),o=ra(E(()=>{if(!t.value)return Vt.DISABLED;const d=oe.getClientFeatureFlags().supports_manager_v4_ui??!1,p=oe.getServerFeature("extension.manager.supports_v4");return e.value?.system?.argv?.includes("--enable-manager")?e.value?.system?.argv?.includes("--enable-manager-legacy-ui")?Vt.LEGACY_UI:d&&p===!0?Vt.NEW_UI:p===!0&&!d||p===!1?Vt.LEGACY_UI:p===void 0?Vt.NEW_UI:Vt.DISABLED:Vt.DISABLED})),s=ra(E(()=>o.value!==Vt.DISABLED)),r=ra(E(()=>o.value===Vt.NEW_UI)),i=ra(E(()=>o.value===Vt.LEGACY_UI)),l=ra(E(()=>r.value)),u=ra(E(()=>s.value));return{managerUIState:o,isManagerEnabled:s,isNewManagerUI:r,isLegacyManagerUI:i,shouldShowInstallButton:l,shouldShowManagerButtons:u,openManager:n(async d=>{const p=o.value,f=pt(),g=Pt();switch(p){case Vt.DISABLED:f.showSettingsDialog("extension");break;case Vt.LEGACY_UI:{const m=d?.legacyCommand||"Comfy.Manager.Menu.ToggleVisibility";try{await g.execute(m)}catch{d?.showToastOnLegacyError!==!1&&Oe().add({severity:"error",summary:G("g.error"),detail:G("manager.legacyMenuNotAvailable"),life:3e3}),d?.showToastOnLegacyError===!1&&f.showSettingsDialog("extension")}break}case Vt.NEW_UI:d?.isLegacyOnly?(Oe().add({severity:"error",summary:G("g.error"),detail:G("manager.legacyMenuNotAvailable"),life:3e3}),await a.show(mt.All)):await a.show(d?.initialTab);break}},"openManager")}}n(Vl,"useManagerState");var d3="Forbidden: A security error has occurred. Please check the terminal logs",sa=(function(e){return e.START_QUEUE="manager/queue/start",e.RESET_QUEUE="manager/queue/reset",e.QUEUE_STATUS="manager/queue/status",e.UPDATE_ALL="manager/queue/update_all",e.UPDATE_COMFYUI="manager/queue/update_comfyui",e.LIST_INSTALLED="customnode/installed",e.GET_NODES="customnode/getmappings",e.IMPORT_FAIL_INFO="customnode/import_fail_info",e.IMPORT_FAIL_INFO_BULK="customnode/import_fail_info_bulk",e.REBOOT="manager/reboot",e.IS_LEGACY_MANAGER_UI="manager/is_legacy_manager_ui",e.TASK_HISTORY="manager/queue/history",e.QUEUE_TASK="manager/queue/task",e})(sa||{}),ma=So.create({baseURL:oe.apiURL("/v2/"),headers:{"Content-Type":"application/json"}});const Dm=n(()=>{const e=A(!1),t=A(null),a=n(()=>Vl().isNewManagerUI.value,"isManagerServiceAvailable"),o=n((w,x,D)=>{if(Nd(w))return;let T;if(!So.isAxiosError(w))T=`${x} failed: ${w instanceof Error?w.message:String(w)}`;else{const N=w,M=N.response?.status;M&&D?.[M]?T=D[M]:M===404?T="Could not connect to ComfyUI-Manager":T=N.response?.data?.message??`${x} failed with status ${M}`}t.value=T},"handleRequestError"),s=n(async(w,x)=>{const{errorContext:D,routeSpecificErrors:T,isQueueOperation:N}=x;if(!a())return t.value="Manager service is not available in current mode",null;e.value=!0,t.value=null;try{const M=await w();return N&&await r(),M.data}catch(M){return o(M,D,T),null}finally{e.value=!1}},"executeRequest"),r=n(async w=>s(()=>ma.get(sa.START_QUEUE,{signal:w}),{errorContext:"Starting ComfyUI-Manager job queue",routeSpecificErrors:{201:"Created: ComfyUI-Manager job queue is already running"}}),"startQueue"),i=n(async(w,x)=>s(()=>ma.get(sa.QUEUE_STATUS,{params:w?{client_id:w}:void 0,signal:x}),{errorContext:"Getting ComfyUI-Manager queue status"}),"getQueueStatus"),l=n(async w=>s(()=>ma.get(sa.LIST_INSTALLED,{signal:w}),{errorContext:"Fetching installed packs"}),"listInstalledPacks"),u=n(async w=>s(()=>ma.get(sa.IMPORT_FAIL_INFO,{signal:w}),{errorContext:"Fetching import failure information"}),"getImportFailInfo"),c=n(async(w={},x)=>{const D="Fetching bulk import failure information";return!w.cnr_ids?.length&&!w.urls?.length?{}:s(()=>ma.post(sa.IMPORT_FAIL_INFO_BULK,w,{signal:x}),{errorContext:D})},"getImportFailInfoBulk"),d=n(async(w,x,D,T)=>{const N={kind:w,params:x,ui_id:D||ws(),client_id:oe.clientId??oe.initialClientId??"unknown"};return s(()=>ma.post(sa.QUEUE_TASK,N,{signal:T}),{errorContext:`Queueing ${N.kind} task`,routeSpecificErrors:{403:d3,404:"Not Found: Task could not be queued"},isQueueOperation:!0})},"queueTask");return{isLoading:e,error:t,startQueue:r,getQueueStatus:i,getTaskHistory:n(async(w={},x)=>s(()=>ma.get(sa.TASK_HISTORY,{params:w,signal:x}),{errorContext:"Getting ComfyUI-Manager task history"}),"getTaskHistory"),listInstalledPacks:l,getImportFailInfo:u,getImportFailInfoBulk:c,installPack:n(async(w,x,D)=>d("install",w,x,D),"installPack"),uninstallPack:n(async(w,x,D)=>d("uninstall",w,x,D),"uninstallPack"),enablePack:n(async(w,x,D)=>d("enable",w,x,D),"enablePack"),disablePack:n(async(w,x,D)=>d("disable",w,x,D),"disablePack"),updatePack:n(async(w,x,D)=>d("update",w,x,D),"updatePack"),updateAllPacks:n(async(w={},x,D)=>{const T="Updating all packs",N={403:"Forbidden: To use this action, a security_level of `middle or below` is required",401:"Unauthorized: ComfyUI-Manager job queue is busy"},M={mode:w.mode,client_id:oe.clientId??oe.initialClientId??"unknown",ui_id:x||ws()};return s(()=>ma.get(sa.UPDATE_ALL,{params:M,signal:D}),{errorContext:T,routeSpecificErrors:N,isQueueOperation:!0})},"updateAllPacks"),updateComfyUI:n(async(w={is_stable:!0},x,D)=>{const T="Updating ComfyUI",N={400:"Bad Request: Missing required parameters",403:"Forbidden: To use this action, a security_level of `middle or below` is required"},M={client_id:oe.clientId??oe.initialClientId??"unknown",ui_id:x||ws(),...w};return s(()=>ma.get(sa.UPDATE_COMFYUI,{params:M,signal:D}),{errorContext:T,routeSpecificErrors:N,isQueueOperation:!0})},"updateComfyUI"),rebootComfyUI:n(async w=>s(()=>ma.get(sa.REBOOT,{signal:w}),{errorContext:"Rebooting ComfyUI",routeSpecificErrors:{403:"Forbidden: Rebooting ComfyUI requires security_level of middle or below"}}),"rebootComfyUI"),isLegacyManagerUI:n(async w=>s(()=>ma.get(sa.IS_LEGACY_MANAGER_UI,{signal:w}),{errorContext:"Checking if user set Manager to use the legacy UI"}),"isLegacyManagerUI")}},"useComfyManagerService"),It=Je("comfyManager",()=>{const{t:e}=Fe(),t=Dm(),a=A({}),o=A(new Set),s=A(new Set),r=A(new Set),i=A(new Set),l=A(!0),u=A([]),c=A([]),d=A([]),p=A({}),f=A([]),g=A([]),m=A({history:{},running_queue:[],pending_queue:[],installed_packs:{}}),h=A(new Map),y=EN(p,m,a);At(Z.api,"cm-task-completed",B=>{const z=B.detail?.ui_id;if(z&&h.value.has(z)){const Y=h.value.get(z);i.value.delete(Y),h.value.delete(z)}});const k=n(()=>{l.value=!0},"setStale"),S=n(()=>{const B=[],z=[];for(const Y of u.value)g.value.includes(Y.taskId)?z.push(Y):B.push(Y);c.value=B,d.value=z},"partitionTaskLogs"),_=n(()=>{const B=[],z=[];for(const Y of Object.values(p.value))Y.status?.status_str==="success"?B.push(Y.ui_id):z.push(Y.ui_id);f.value=B,g.value=z},"partitionTasks");Mt(p,()=>{_(),S()},{deep:!0});const I=n(B=>B.cnr_id||B.aux_id,"getPackId"),w=n(B=>!!B&&r.value.has(B),"isInstalledPackId"),x=n(B=>!!B&&w(B)&&o.value.has(B),"isEnabledPackId"),D=n(B=>!!B&&i.value.has(B),"isInstallingPackId"),T=n(B=>B.reduce((z,Y)=>{const ie=Y.cnr_id||Y.aux_id;return ie&&z.add(ie),z},new Set),"packsToIdSet"),N=n(B=>{const z=new Set,Y=new Set;for(const ie of B){const ge=I(ie);if(!ge)continue;const{enabled:Le}=ie;Le===!0?z.add(ge):Le===!1&&Y.add(ge),z.has(ge)&&Y.has(ge)&&Y.delete(ge)}o.value=z,s.value=Y},"updateDisabledIds"),M=n(B=>{r.value=T(B)},"updateInstalledIds");be(a,n(()=>{const B=Object.values(a.value);N(B),M(B)},"onPacksChanged"),{deep:!0});const L=n(async()=>{const B=await t.listInstalledPacks();B&&(a.value=Yf(B)),l.value=!1},"refreshInstalledList");Mt(l,L,{immediate:!0});const F=n(async(B,z)=>{const Y=ws(),{logs:ie}=SN({ui_id:Y,immediate:!0});try{y.isProcessing.value=!0,u.value.push({taskName:z,taskId:Y,logs:ie.value}),await B(Y)}catch(ge){y.isProcessing.value=!1,p.value[Y]={ui_id:Y,client_id:oe.clientId||"unknown",kind:"error",result:"failed",status:{status_str:"error",completed:!1,messages:[ge instanceof Error?ge.message:String(ge)]},timestamp:new Date().toISOString()}}},"enqueueTaskWithLogs"),K=Xa(async(B,z)=>{if(!B.id)return;let Y=e("g.installing");if(r.value.has(B.id)){const ge=a.value[B.id];ge&&ge.ver!==B.selected_version?Y=e("manager.changingVersion",{from:ge.ver,to:B.selected_version}):Y=e("g.enabling")}i.value.add(B.id),await F(n(ge=>(h.value.set(ge,B.id),t.installPack(B,ge,z)),"task"),`${Y} ${B.id}`)},{maxSize:1}),j=n(async(B,z)=>{K.clear(),K.cancel(),i.value.add(B.id);const Y={node_name:B.id,is_unknown:!1};await F(n(ge=>(h.value.set(ge,B.id),t.uninstallPack(Y,ge,z)),"task"),e("manager.uninstalling",{id:B.id}))},"uninstallPack"),V=Xa(async(B,z)=>{q.cancel();const Y={node_name:B.id,node_ver:B.version};await F(n(ge=>t.updatePack(Y,ge,z),"task"),e("g.updating",{id:B.id}))},{maxSize:1}),q=Xa(async(B,z)=>{await F(n(ie=>t.updateAllPacks(B,ie,z),"task"),e("manager.updatingAllPacks"))},{maxSize:1}),re=n(async(B,z)=>{const Y={node_name:B.id,is_unknown:!1};await F(n(ge=>t.disablePack(Y,ge,z),"task"),e("g.disabling",{id:B.id}))},"disablePack"),ae=n(async(B,z)=>{const Y={cnr_id:B.id};await F(n(ge=>t.enablePack(Y,ge,z),"task"),e("g.enabling",{id:B.id}))},"enablePack"),ce=n(B=>a.value[B]?.ver,"getInstalledPackVersion"),ee=n(()=>{u.value=[]},"clearLogs"),ne=n(()=>{u.value=[],p.value={},f.value=[],g.value=[],c.value=[],d.value=[],i.value.clear(),h.value.clear(),m.value={history:{},running_queue:[],pending_queue:[],installed_packs:{}}},"resetTaskState");return{isLoading:t.isLoading,error:t.error,taskLogs:u,clearLogs:ee,resetTaskState:ne,setStale:k,installedPacks:a,installedPacksIds:r,isPackInstalled:w,isPackEnabled:x,isPackInstalling:D,getInstalledPackVersion:ce,refreshInstalledList:L,taskHistory:p,taskQueue:m,isProcessingTasks:y.isProcessing,succeededTasksIds:f,failedTasksIds:g,succeededTasksLogs:c,failedTasksLogs:d,managerQueue:y,installPack:K,uninstallPack:j,updatePack:V,updateAllPacks:q,disablePack:re,enablePack:ae}}),Gl=on(()=>{const e=zt(),t=It(),a=wt(),{workflowPacks:o,isLoading:s,error:r,startFetchWorkflowPacks:i}=Im(),l=n(g=>g.filter(m=>!t.isPackInstalled(m.id)),"filterMissingPacks"),u=E(()=>o.value.length?l(o.value):[]),c=n(g=>g==="comfy-core","isCorePack"),d=n(g=>{const m=g.properties?.cnr_id;if(m===void 0||!c(m))return!1;const h=g.type;return!e.nodeDefsByName[h]},"isMissingCoreNode"),p=E(()=>Td(Zi(Z.rootGraph,d),g=>String(g.properties?.ver||""))),f=E(()=>u.value.length>0||Object.keys(p.value).length>0);return be(()=>a.activeWorkflow,async()=>{await i()},{immediate:!0}),{missingNodePacks:u,missingCoreNodes:p,hasMissingNodes:f,isLoading:s,error:r}});var p3={class:"flex h-full w-full flex-col gap-4 p-4"},f3={class:"m-0 text-sm leading-4 text-muted-foreground"},m3={class:"comfy-missing-nodes flex flex-col max-h-[256px] rounded-lg py-2 scrollbar-custom bg-secondary-background"},g3={class:"text-xs"},h3={key:0,class:"text-xs"},v3={class:"m-0 text-sm leading-4 text-muted-foreground"},y3=J({__name:"MissingNodesContent",props:{missingNodeTypes:{}},setup(e){const t=e,{missingCoreNodes:a}=Gl(),o=E(()=>{const s=new Set;return t.missingNodeTypes.filter(r=>{const i=typeof r=="object"?r.type:r;return s.has(i)?!1:(s.add(i),!0)}).map(r=>typeof r=="object"?{label:r.type,hint:r.hint,action:r.action}:{label:r})});return(s,r)=>(C(),P("div",{class:pe(["flex w-[490px] flex-col border-t-1 border-border-default",b(qe)?"border-b-1":""])},[v("div",p3,[v("div",null,[v("p",f3,$(b(qe)?s.$t("missingNodes.cloud.description"):s.$t("missingNodes.oss.description")),1)]),b(qe)?H("",!0):(C(),X(Dv,{key:0,"missing-core-nodes":b(a)},null,8,["missing-core-nodes"])),v("div",m3,[(C(!0),P(Se,null,Ze(o.value,(i,l)=>(C(),P("div",{key:l,class:"flex min-h-8 items-center justify-between px-4 py-2 bg-secondary-background text-muted-foreground"},[v("span",g3,$(i.label),1),i.hint?(C(),P("span",h3,$(i.hint),1)):H("",!0)]))),128))]),v("div",null,[v("p",v3,$(b(qe)?s.$t("missingNodes.cloud.replacementInstruction"):s.$t("missingNodes.oss.replacementInstruction")),1)])])],2))}}),w3=y3,b3={key:0,class:"flex w-full items-center justify-between gap-2 py-2 px-4"},_3={key:1,class:"flex justify-end gap-1 py-2 px-4"},k3=J({__name:"MissingNodesFooter",setup(e){const t=Ct(),{t:a}=Fe(),o=n(()=>{t.closeDialog({key:"global-missing-nodes"})},"handleGotItClick"),{missingNodePacks:s,isLoading:r,error:i}=Gl(),l=It(),u=Vl(),c=E(()=>s.value?.length?s.value.some(g=>l.isPackInstalling(g.id)):!1),d=E(()=>u.shouldShowManagerButtons.value),p=E(()=>u.shouldShowInstallButton.value),f=n(async()=>{await u.openManager({initialTab:mt.Missing,showToastOnLegacyError:!0})},"openManager");return be(E(()=>!r.value&&!c.value&&s.value?.length===0),async g=>{!qe&&g&&p.value&&(await wa(),t.closeDialog({key:"global-missing-nodes"}),Oe().add({severity:"success",summary:a("g.success"),detail:a("manager.allMissingNodesInstalled"),life:3e3}))}),(g,m)=>b(qe)?(C(),P("div",b3,[R(se,{variant:"textonly",size:"sm",as:"a",href:"https://www.comfy.org/cloud",target:"_blank",rel:"noopener noreferrer"},{default:W(()=>[m[0]||(m[0]=v("i",{class:"icon-[lucide--info]"},null,-1)),v("span",null,$(g.$t("missingNodes.cloud.learnMore")),1)]),_:1}),R(se,{variant:"secondary",size:"md",onClick:o},{default:W(()=>[fe($(g.$t("missingNodes.cloud.gotIt")),1)]),_:1})])):d.value?(C(),P("div",_3,[R(se,{variant:"textonly",onClick:f},{default:W(()=>[fe($(g.$t("g.openManager")),1)]),_:1}),p.value?(C(),X(Xn,{key:0,type:"secondary",size:"md",disabled:b(r)||!!b(i)||b(s).length===0||c.value,"is-loading":b(r),"node-packs":b(s),label:b(r)?g.$t("manager.gettingInfo"):g.$t("manager.installAllMissingNodes")},null,8,["disabled","is-loading","node-packs","label"])):H("",!0)])):H("",!0)}}),C3=k3,x3={class:"flex w-full items-center justify-between p-4"},I3={class:"flex items-center gap-2"},S3={class:"m-0 text-sm"},E3=J({__name:"MissingNodesHeader",setup(e){return(t,a)=>(C(),P("div",x3,[v("div",I3,[a[0]||(a[0]=v("i",{class:"icon-[lucide--triangle-alert] text-warning-background"},null,-1)),v("p",S3,$(b(qe)?t.$t("missingNodes.cloud.title"):t.$t("missingNodes.oss.title")),1)])]))}}),T3=E3,A3=J({__name:"FindIssueButton",props:{errorMessage:{},repoOwner:{},repoName:{}},setup(e){const t=e,a=E(()=>t.errorMessage+" is:issue"),o=n(()=>{yt()?.trackUiButtonClicked({button_id:"error_dialog_find_existing_issues_clicked"});const s=encodeURIComponent(a.value),r=`https://github.com/${t.repoOwner}/${t.repoName}/issues?q=${s}`;window.open(r,"_blank")},"openGitHubIssues");return(s,r)=>(C(),X(se,{variant:"secondary",onClick:o},{default:W(()=>[r[0]||(r[0]=v("i",{class:"pi pi-github"},null,-1)),fe(" "+$(s.$t("g.findIssues")),1)]),_:1}))}}),M3=A3;function P3(e){const a=JSON.stringify(e.workflow),o=a.length>2e4?"Workflow too large. Please manually upload the workflow from local file system.":a,s=e.systemStats;return`
|
|
205
205
|
# ComfyUI Error Report
|
|
206
206
|
${e?`## Error Details
|
|
207
207
|
- **Node ID:** ${e.nodeId||"N/A"}
|
|
@@ -241,9 +241,9 @@ ${o}
|
|
|
241
241
|
|
|
242
242
|
## Additional Context
|
|
243
243
|
(Please add any additional context or steps to reproduce the error here)
|
|
244
|
-
`}n(P3,"generateErrorReport");var D3={class:"comfy-error-report flex flex-col gap-4"},L3={class:"font-bold"},O3={class:"flex justify-center gap-2"},N3={class:"break-words whitespace-pre-wrap"},$3={class:"flex justify-end gap-4"},R3="comfyanonymous",B3="ComfyUI",F3=J({__name:"ErrorDialogContent",props:{error:{}},setup(e){const t=A(""),a=A(!1),o=n(()=>{yt()?.trackUiButtonClicked({button_id:"error_dialog_show_report_clicked"}),a.value=!0},"showReport"),s=tn(),{t:r}=Fe(),i=Qo(),l=yt(),u=E(()=>e.error.nodeType??e.error.exceptionType??r("errorDialog.defaultTitle")),c=n(async()=>{l?.trackHelpResourceClicked({resource_type:"help_feedback",is_external:!0,source:"error_dialog"}),await Pt().execute("Comfy.ContactSupport")},"showContactSupport");it(async()=>{i.systemStats||await i.refetchSystemStats();try{const[f]=await Promise.all([oe.getLogs()]);t.value=P3({systemStats:i.systemStats,serverLogs:f,workflow:Z.rootGraph.serialize(),exceptionType:e.error.exceptionType,exceptionMessage:e.error.exceptionMessage,traceback:e.error.traceback,nodeId:e.error.nodeId,nodeType:e.error.nodeType})}catch(f){console.error("Error fetching logs:",f),s.add({severity:"error",summary:r("g.error"),detail:r("toastMessages.failedToFetchLogs"),life:5e3})}});const{copyToClipboard:d}=sn(),p=n(async()=>{await d(t.value)},"copyReportToClipboard");return(f,g)=>(C(),P("div",D3,[R(Va,{class:"pb-0",icon:"pi pi-exclamation-circle",title:u.value,message:f.error.exceptionMessage,"text-class":"break-words max-w-[60vw]"},null,8,["title","message"]),f.error.extensionFile?(C(),P(Se,{key:0},[v("span",null,$(b(r)("errorDialog.extensionFileHint"))+":",1),g[0]||(g[0]=v("br",null,null,-1)),v("span",L3,$(f.error.extensionFile),1)],64)):H("",!0),v("div",O3,[ze(R(se,{variant:"textonly",onClick:o},{default:W(()=>[fe($(f.$t("g.showReport")),1)]),_:1},512),[[_o,!a.value]]),ze(R(se,{variant:"textonly",onClick:c},{default:W(()=>[fe($(f.$t("issueReport.helpFix")),1)]),_:1},512),[[_o,!a.value]])]),a.value?(C(),P(Se,{key:1},[R(b(la)),R(b(zi),{class:"h-[400px] w-full max-w-[80vw]"},{default:W(()=>[v("pre",N3,$(t.value),1)]),_:1}),R(b(la))],64)):H("",!0),v("div",$3,[R(M3,{"error-message":f.error.exceptionMessage,"repo-owner":R3,"repo-name":B3},null,8,["error-message"]),a.value?(C(),X(se,{key:0,onClick:p},{default:W(()=>[g[1]||(g[1]=v("i",{class:"pi pi-copy"},null,-1)),fe(" "+$(f.$t("g.copyToClipboard")),1)]),_:1})):H("",!0)])]))}}),Zc=F3;function U3(e){const t=n(u=>`https://civitai.com/api/v1/model-versions/${u}`,"createModelVersionUrl"),a=n(()=>new URL(e).pathname.split("/").pop()||null,"extractModelIdFromUrl"),o=n(async()=>{const u=a();if(!u)return null;const c=t(u);return(await fetch(c)).json()},"fetchModelData"),s=n(()=>{const u=r.value?.files?.find(c=>c.downloadUrl&&e.startsWith(c.downloadUrl));return u?.sizeKB?u.sizeKB<<10:null},"findMatchingFileSize"),{state:r,isLoading:i,error:l}=Xo(o,null,{immediate:!0});return{fileSize:E(()=>i.value?null:s()),isLoading:i,error:l,modelData:r}}n(U3,"useCivitaiModel");function Lm(e,t){const a=A(null),o=A(null),s=n(l=>{a.value=l},"setFileSize"),r=n(async()=>{try{const l=await fetch(e,{method:"HEAD"});if(!l.ok)throw new Error("Failed to fetch file size");const u=l.headers.get("content-length");if(u)s(parseInt(u));else return console.error('"content-length" header not found'),null}catch(l){return console.error("Error fetching file size:",l),o.value=l instanceof Error?l:new Error(String(l)),null}},"fetchFileSize"),i=n(()=>{const l=document.createElement("a");e.includes("huggingface.co")&&o.value?l.href=$h(e):(l.href=e,l.download=t||e.split("/").pop()||"download"),l.target="_blank",l.rel="noopener noreferrer",l.click()},"triggerBrowserDownload");return it(()=>{if(Oh(e)){const{fileSize:l,error:u}=U3(e);Mt(l,s),Mt(u,r,{once:!0})}else r()}),{triggerBrowserDownload:i,fileSize:a}}n(Lm,"useDownload");var W3={class:"flex flex-col"},z3={class:"flex flex-row items-center gap-2"},V3={key:0,class:"pi pi-check text-green-500"},G3={class:"file-info"},H3={class:"file-details"},j3=["title"],K3={key:0,class:"file-error"},Y3={class:"file-action flex flex-row items-center gap-2"},q3={key:0,class:"flex flex-row items-center gap-2"},X3=J({__name:"ElectronFileDownload",props:{url:{},hint:{},label:{},error:{}},setup(e){const t=e,{t:a}=Fe(),o=E(()=>t.label||t.url.split("/").pop()),s=E(()=>t.hint||t.url),r=Lm(t.url),i=A(0),l=A(null),u=E(()=>r.fileSize.value?rr(r.fileSize.value):"?"),{copyToClipboard:c}=sn(),d=gr(),[p,f]=t.label.split("/");d.$subscribe((S,{downloads:_})=>{const I=_.find(w=>t.url===w.url);I&&(i.value=Number((I.progress*100).toFixed(1)),l.value=I.status)});const g=n(async()=>{await d.start({url:t.url,savePath:p.trim(),filename:f.trim()})},"triggerDownload"),m=n(()=>d.cancel(t.url),"triggerCancelDownload"),h=n(()=>d.pause(t.url),"triggerPauseDownload"),y=n(()=>d.resume(t.url),"triggerResumeDownload"),k=n(async()=>{await c(t.url)},"copyURL");return(S,_)=>{const I=ht("tooltip");return C(),P("div",W3,[v("div",z3,[l.value==="completed"?(C(),P("i",V3)):H("",!0),v("div",G3,[v("div",H3,[v("span",{class:"file-type",title:s.value},$(o.value),9,j3)]),t.error?(C(),P("div",K3,$(t.error),1)):H("",!0)]),v("div",Y3,[l.value===null||l.value==="error"?(C(),X(se,{key:0,class:"file-action-button",variant:"secondary",size:"sm",disabled:!!t.error,onClick:g},{default:W(()=>[_[0]||(_[0]=v("i",{class:"pi pi-download"},null,-1)),fe(" "+$(S.$t("g.download")+" ("+u.value+")"),1)]),_:1},8,["disabled"])):H("",!0),(l.value===null||l.value==="error")&&t.url?(C(),X(se,{key:1,variant:"secondary",size:"sm",onClick:k},{default:W(()=>[fe($(S.$t("g.copyURL")),1)]),_:1})):H("",!0)])]),l.value==="in_progress"||l.value==="paused"?(C(),P("div",q3,[R(b(sd),{class:"flex-1",value:i.value,"show-value":i.value>10},null,8,["value","show-value"]),l.value==="in_progress"?ze((C(),X(se,{key:0,class:"file-action-button",variant:"secondary",size:"sm",disabled:!!t.error,onClick:h},{default:W(()=>_[1]||(_[1]=[v("i",{class:"pi pi-pause-circle"},null,-1)])),_:1},8,["disabled"])),[[I,b(a)("electronFileDownload.pause"),void 0,{top:!0}]]):H("",!0),l.value==="paused"?ze((C(),X(se,{key:1,class:"file-action-button",variant:"secondary",size:"sm","aria-label":b(a)("electronFileDownload.resume"),disabled:!!t.error,onClick:y},{default:W(()=>_[2]||(_[2]=[v("i",{class:"pi pi-play-circle"},null,-1)])),_:1},8,["aria-label","disabled"])),[[I,b(a)("electronFileDownload.resume"),void 0,{top:!0}]]):H("",!0),ze((C(),X(se,{class:"file-action-button",variant:"destructive",size:"sm","aria-label":b(a)("electronFileDownload.cancel"),disabled:!!t.error,onClick:m},{default:W(()=>_[3]||(_[3]=[v("i",{class:"pi pi-times-circle"},null,-1)])),_:1},8,["aria-label","disabled"])),[[I,b(a)("electronFileDownload.cancel"),void 0,{top:!0}]])])):H("",!0)])}}}),Z3=X3,J3={class:"flex flex-row items-center gap-2"},Q3=["title"],eB=J({__name:"FileDownload",props:{url:{},hint:{},label:{},error:{}},setup(e){const t=e,a=E(()=>t.label||t.url.split("/").pop()),o=E(()=>t.hint||t.url),s=Lm(t.url),r=E(()=>s.fileSize.value?rr(s.fileSize.value):"?"),i=n(async()=>{await l(t.url)},"copyURL"),{copyToClipboard:l}=sn();return(u,c)=>(C(),P("div",J3,[v("div",null,[v("div",null,[v("span",{title:o.value},$(a.value),9,Q3)]),t.error?(C(),X(b(Ea),{key:0,severity:"error",icon:"pi pi-exclamation-triangle",size:"small",variant:"outlined",class:"my-2 h-min max-w-xs px-1",title:t.error,pt:{text:{class:"overflow-hidden text-ellipsis"}}},{default:W(()=>[fe($(t.error),1)]),_:1},8,["title"])):H("",!0)]),v("div",null,[R(se,{variant:"secondary",disabled:!!t.error,title:t.url,onClick:b(s).triggerBrowserDownload},{default:W(()=>[fe($(u.$t("g.download")+" ("+r.value+")"),1)]),_:1},8,["disabled","title","onClick"])]),v("div",null,[R(se,{variant:"secondary",disabled:!!t.error,onClick:i},{default:W(()=>[fe($(u.$t("g.copyURL")),1)]),_:1},8,["disabled"])])]))}}),tB=eB,aB={class:"mb-4 flex gap-1"},oB={for:"doNotAskAgain"},nB=J({__name:"MissingModelsWarning",props:{missingModels:{},paths:{}},setup(e){const t=["https://civitai.com/","https://huggingface.co/","http://localhost:"],a=[".safetensors",".sft"],o=new Set(["https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt","https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_depth_sd14v1.pth?download=true","https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth"]),s=e,{t:r}=Fe(),i=A(!1),l=A({}),u=E(()=>s.missingModels.map(c=>{const d=s.paths[c.directory];if(c.directory_invalid||!d)return{label:`${c.directory} / ${c.name}`,url:c.url,error:"Invalid directory specified (does this require custom nodes?)"};const p=l.value[c.name]??{downloading:!1,completed:!1,progress:0,error:null,name:c.name,directory:c.directory,url:c.url,folder_path:d[0]};if(l.value[c.name]=p,!o.has(c.url)){if(!t.some(f=>c.url.startsWith(f)))return{label:`${c.directory} / ${c.name}`,url:c.url,error:`Download not allowed from source '${c.url}', only allowed from '${t.join("', '")}'`};if(!a.some(f=>c.name.endsWith(f)))return{label:`${c.directory} / ${c.name}`,url:c.url,error:`Only allowed suffixes are: '${a.join("', '")}'`}}return{url:c.url,label:`${c.directory} / ${c.name}`,downloading:p.downloading,completed:p.completed,progress:p.progress,error:p.error,name:c.name,paths:d,folderPath:p.folder_path}}));return Wa(async()=>{i.value&&await Me().set("Comfy.Workflow.ShowMissingModelsWarning",!1)}),(c,d)=>(C(),P(Se,null,[R(Va,{class:"pb-0",icon:"pi pi-exclamation-circle",title:b(r)("missingModelsDialog.missingModels"),message:b(r)("missingModelsDialog.missingModelsMessage")},null,8,["title","message"]),v("div",aB,[R(b(Wi),{modelValue:i.value,"onUpdate:modelValue":d[0]||(d[0]=p=>i.value=p),binary:"","input-id":"doNotAskAgain"},null,8,["modelValue"]),v("label",oB,$(b(r)("missingModelsDialog.doNotAskAgain")),1)]),R(b(Fi),{options:u.value,class:"comfy-missing-models"},{option:W(({option:p})=>[b(Qa)()?(C(),X(vd,{key:0},{default:W(()=>[R(Z3,{url:p.url,label:p.label,error:p.error},null,8,["url","label","error"])]),_:2},1024)):(C(),X(tB,{key:1,url:p.url,label:p.label,error:p.error},null,8,["url","label","error"]))]),_:1},8,["options"])],64))}}),sB=ot(nB,[["__scopeId","data-v-520e7481"]]),rB={class:"prompt-dialog-content flex flex-col gap-2 pt-8"},iB=J({__name:"PromptDialogContent",props:{message:{},defaultValue:{},onConfirm:{type:Function},placeholder:{}},setup(e){const t=e,a=A(t.defaultValue),o=n(()=>{t.onConfirm(a.value),Ct().closeDialog()},"onConfirm"),s=A(),r=n(()=>{if(!s.value)return;const i=s.value.$el;i.setSelectionRange(0,i.value.length)},"selectAllText");return(i,l)=>(C(),P("div",rB,[R(b(Km),null,{default:W(()=>[R(b(ca),{ref_key:"inputRef",ref:s,modelValue:a.value,"onUpdate:modelValue":l[0]||(l[0]=u=>a.value=u),placeholder:i.placeholder,autofocus:"",onKeyup:Ja(o,["enter"]),onFocus:r},null,8,["modelValue","placeholder"]),v("label",null,$(i.message),1)]),_:1}),R(se,{onClick:o},{default:W(()=>[fe($(i.$t("g.confirm")),1)]),_:1})]))}}),lB=iB,uB=""+new URL("images/comfy-logo-mono.svg",import.meta.url).href,cB=["localhost"];function Ni(e){let t=(e||"").trim().toLowerCase();t=t.replace(/\.$/,"");const a=t.match(/^\[([^\]]+)\]:(\d+)$/);if(a)t=a[1];else{const o=t.match(/^([^:]+):(\d+)$/);o&&(t=o[1])}return t=t.replace(/^\[|\]$/g,""),t}n(Ni,"normalizeHost");function dB(e){const t=Ni(e);return pB(t)||mB(t)||vB(t)||wB(t)?!0:cB.map(Ni).includes(t)}n(dB,"isHostWhitelisted");function pB(e){return e==="localhost"||e.endsWith(".localhost")}n(pB,"isLocalhostLabel");var fB=new RegExp("^127\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|0?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|0?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|0?\\d?\\d)$");function mB(e){return fB.test(e)}n(mB,"isIPv4Loopback");var gB=/^(?:0{1,4}:){7}0{0,3}1$/i,hB=/^((?:0{1,4}(?::0{1,4}){0,6})?)::((?:0{1,4}:){0,6})0{0,3}1$/i;function vB(e){if(gB.test(e))return!0;const t=e.match(hB);return t?(t[1]?t[1].match(/0{1,4}:/gi)?.length??0:0)+(t[2]?t[2].match(/0{1,4}:/gi)?.length??0:0)<=6:!1}n(vB,"isIPv6Loopback");var yB=/\.comfy\.org$/;function wB(e){return yB.test(e)}n(wB,"isComfyOrgHost");var bB=[200,201,301,302,307,308];const _B=n(async e=>{try{const t=await So.head(e);return bB.includes(t.status)}catch{return!1}},"checkUrlReachable");async function kB(){const e=navigator.language.toLowerCase().startsWith("zh-cn");try{if(await Promise.race([fetch("https://www.google.com",{mode:"no-cors",cache:"no-cache"}),new Promise((t,a)=>setTimeout(()=>a(),2e3))]))return!1}catch{if(e)return!0;try{const t=performance.now();return await fetch("https://www.baidu.com",{mode:"no-cors",cache:"no-cache"}),performance.now()-t<150}catch{return e}}return!1}n(kB,"isInChina");const CB=U.object({apiKey:U.string().trim().startsWith("comfyui-",G("validation.prefix",{prefix:"comfyui-"})).length(72,G("validation.length",{length:72}))}),xB=U.object({email:U.string().email(G("validation.invalidEmail")).min(1,G("validation.required")),password:U.string().min(1,G("validation.required"))});var Om=U.object({password:U.string().min(8,G("validation.minLength",{length:8})).max(32,G("validation.maxLength",{length:32})).regex(/[A-Z]/,G("validation.password.uppercase")).regex(/[a-z]/,G("validation.password.lowercase")).regex(/\d/,G("validation.password.number")).regex(/[^A-Za-z0-9]/,G("validation.password.special")),confirmPassword:U.string().min(1,G("validation.required"))});const IB=Om.refine(e=>e.password===e.confirmPassword,{message:G("validation.password.match"),path:["confirmPassword"]}),SB=Om.extend({email:U.string().email(G("validation.invalidEmail")).min(1,G("validation.required"))}).refine(e=>e.password===e.confirmPassword,{message:G("validation.password.match"),path:["confirmPassword"]});var EB={class:"flex flex-col gap-6"},TB={class:"mb-8 flex flex-col gap-4"},AB={class:"my-0 text-2xl leading-normal font-medium"},MB={class:"flex flex-col gap-2"},PB={class:"my-0 text-base text-muted"},DB={href:"https://docs.comfy.org/interface/user#logging-in-with-an-api-key",target:"_blank",class:"cursor-pointer text-blue-500"},LB={class:"flex flex-col gap-2"},OB={class:"mb-2 text-base font-medium opacity-80",for:"comfy-org-api-key"},NB={class:"flex flex-col gap-2"},$B={class:"text-muted"},RB=["href"],BB={href:"https://docs.comfy.org/tutorials/api-nodes/overview#log-in-with-api-key-on-non-whitelisted-websites",target:"_blank",class:"cursor-pointer text-blue-500"},FB={class:"mt-4 flex items-center justify-between"},UB=J({__name:"ApiKeyForm",emits:["back","success"],setup(e,{emit:t}){const a=Pa(),o=Gn(),s=E(()=>a.loading),r=E(()=>or(Eo.value,"comfy_platform_base_url",nl())),{t:i}=Fe(),l=t,u=n(async c=>{c.valid&&(await o.storeApiKey(c.values.apiKey),l("success"))},"onSubmit");return(c,d)=>(C(),P("div",EB,[v("div",TB,[v("h1",AB,$(b(i)("auth.apiKey.title")),1),v("div",MB,[v("p",PB,$(b(i)("auth.apiKey.description")),1),v("a",DB,$(b(i)("g.learnMore")),1)])]),R(b(Qs),{class:"flex flex-col gap-6",resolver:b(er)(b(CB)),onSubmit:u},{default:W(p=>[p.apiKey?.invalid?(C(),X(b(Ea),{key:0,severity:"error",class:"mb-4"},{default:W(()=>[fe($(p.apiKey.error.message),1)]),_:2},1024)):H("",!0),v("div",LB,[v("label",OB,$(b(i)("auth.apiKey.label")),1),v("div",NB,[R(b(ca),{"pt:root:id":"comfy-org-api-key","pt:root:autocomplete":"off",class:"h-10",name:"apiKey",type:"password",placeholder:b(i)("auth.apiKey.placeholder"),invalid:p.apiKey?.invalid},null,8,["placeholder","invalid"]),v("small",$B,[fe($(b(i)("auth.apiKey.helpText"))+" ",1),v("a",{href:`${r.value}/login`,target:"_blank",class:"cursor-pointer text-blue-500"},$(b(i)("auth.apiKey.generateKey")),9,RB),d[1]||(d[1]=v("span",{class:"mx-1"},"•",-1)),v("a",BB,$(b(i)("auth.apiKey.whitelistInfo")),1)])])]),v("div",FB,[R(se,{type:"button",variant:"textonly",onClick:d[0]||(d[0]=f=>c.$emit("back"))},{default:W(()=>[fe($(b(i)("g.back")),1)]),_:1}),R(se,{type:"submit",variant:"primary",loading:s.value,disabled:s.value},{default:W(()=>[fe($(b(i)("g.save")),1)]),_:1},8,["loading","disabled"])])]),_:1},8,["resolver"])]))}}),WB=UB,zB={class:"flex flex-col gap-2"},VB={key:0,class:"text-red-500"},GB={class:"flex flex-col gap-2"},HB={class:"mb-2 flex items-center justify-between"},jB={class:"text-base font-medium opacity-80",for:"comfy-org-sign-in-password"},KB=["onClick"],YB={key:0,class:"text-red-500"},Jr="comfy-org-sign-in-email",qB=J({__name:"SignInForm",emits:["submit"],setup(e,{emit:t}){const a=Pa(),o=To(),s=E(()=>a.loading),r=tn(),{t:i}=Fe(),l=t,u=xd(d=>{d.valid&&l("submit",d.values)},1500),c=n(async(d,p)=>{if(!d||!p){r.add({severity:"warn",summary:i("auth.login.emailPlaceholder"),life:5e3}),document.getElementById(Jr)?.focus?.();return}await o.sendPasswordReset(d)},"handleForgotPassword");return(d,p)=>(C(),X(b(Qs),{class:"flex flex-col gap-6",resolver:b(er)(b(xB)),onSubmit:b(u)},{default:W(f=>[v("div",zB,[v("label",{class:"mb-2 text-base font-medium opacity-80",for:Jr},$(b(i)("auth.login.emailLabel")),1),R(b(ca),{id:Jr,autocomplete:"email",class:"h-10",name:"email",type:"text",placeholder:b(i)("auth.login.emailPlaceholder"),invalid:f.email?.invalid},null,8,["placeholder","invalid"]),f.email?.invalid?(C(),P("small",VB,$(f.email.error.message),1)):H("",!0)]),v("div",GB,[v("div",HB,[v("label",jB,$(b(i)("auth.login.passwordLabel")),1),v("span",{class:pe(["cursor-pointer text-base font-medium text-muted select-none",{"text-link-disabled":!f.email?.value||f.email?.invalid}]),onClick:n(g=>c(f.email?.value,f.email?.valid),"onClick")},$(b(i)("auth.login.forgotPassword")),11,KB)]),R(b(oi),{"input-id":"comfy-org-sign-in-password","pt:pc-input-text:root:autocomplete":"current-password",name:"password",feedback:!1,"toggle-mask":"",placeholder:b(i)("auth.login.passwordPlaceholder"),class:pe([{"p-invalid":f.password?.invalid},"h-10"]),fluid:""},null,8,["placeholder","class"]),f.password?.invalid?(C(),P("small",YB,$(f.password.error.message),1)):H("",!0)]),s.value?(C(),X(b(Io),{key:0,class:"mx-auto h-8 w-8"})):(C(),X(se,{key:1,type:"submit",class:"mt-4 h-10 font-medium",disabled:!f.valid},{default:W(()=>[fe($(b(i)("auth.login.loginButton")),1)]),_:2},1032,["disabled"]))]),_:1},8,["resolver","onSubmit"]))}}),XB=ot(qB,[["__scopeId","data-v-7fcd01b3"]]),ZB={class:"mb-2 flex items-center justify-between"},JB={class:"text-base font-medium opacity-80",for:"comfy-org-sign-up-password"},QB={class:"flex flex-col gap-1"},e4={key:0,class:"text-sm"},t4={class:"mt-1 space-y-1"},a4={class:"mb-2 text-base font-medium opacity-80",for:"comfy-org-sign-up-confirm-password"},o4={key:0,class:"text-red-500"},n4=J({__name:"PasswordFields",setup(e){const{t}=Fe(),a=A(""),o=E(()=>({length:a.value.length>=8&&a.value.length<=32,uppercase:/[A-Z]/.test(a.value),lowercase:/[a-z]/.test(a.value),number:/\d/.test(a.value),special:/[^A-Za-z0-9]/.test(a.value)}));return(s,r)=>(C(),P(Se,null,[R(b(ai),{name:"password",class:"flex flex-col gap-2"},{default:W(i=>[v("div",ZB,[v("label",JB,$(b(t)("auth.signup.passwordLabel")),1)]),R(b(oi),{modelValue:a.value,"onUpdate:modelValue":r[0]||(r[0]=l=>a.value=l),"input-id":"comfy-org-sign-up-password","pt:pc-input-text:root:autocomplete":"new-password",name:"password",feedback:!1,"toggle-mask":"",placeholder:b(t)("auth.signup.passwordPlaceholder"),class:pe([{"p-invalid":i.invalid},"h-10"]),fluid:""},null,8,["modelValue","placeholder","class"]),v("div",QB,[i.dirty||i.invalid?(C(),P("small",e4,[fe($(b(t)("validation.password.requirements"))+": ",1),v("ul",t4,[v("li",{class:pe({"text-red-500":!o.value.length})},$(b(t)("validation.password.minLength")),3),v("li",{class:pe({"text-red-500":!o.value.uppercase})},$(b(t)("validation.password.uppercase")),3),v("li",{class:pe({"text-red-500":!o.value.lowercase})},$(b(t)("validation.password.lowercase")),3),v("li",{class:pe({"text-red-500":!o.value.number})},$(b(t)("validation.password.number")),3),v("li",{class:pe({"text-red-500":!o.value.special})},$(b(t)("validation.password.special")),3)])])):H("",!0)])]),_:1}),R(b(ai),{name:"confirmPassword",class:"flex flex-col gap-2"},{default:W(i=>[v("label",a4,$(b(t)("auth.login.confirmPasswordLabel")),1),R(b(oi),{name:"confirmPassword","input-id":"comfy-org-sign-up-confirm-password","pt:pc-input-text:root:autocomplete":"new-password",feedback:!1,"toggle-mask":"",placeholder:b(t)("auth.login.confirmPasswordPlaceholder"),class:pe([{"p-invalid":i.invalid},"h-10"]),fluid:""},null,8,["placeholder","class"]),i.error?(C(),P("small",o4,$(i.error.message),1)):H("",!0)]),_:1})],64))}}),Nm=n4,s4={class:"mb-2 text-base font-medium opacity-80",for:"comfy-org-sign-up-email"},r4={key:0,class:"text-red-500"},i4=J({__name:"SignUpForm",emits:["submit"],setup(e,{emit:t}){const{t:a}=Fe(),o=Pa(),s=E(()=>o.loading),r=t,i=xd(l=>{l.valid&&r("submit",l.values)},1500);return(l,u)=>(C(),X(b(Qs),{class:"flex flex-col gap-6",resolver:b(er)(b(SB)),onSubmit:b(i)},{default:W(c=>[R(b(ai),{name:"email",class:"flex flex-col gap-2"},{default:W(d=>[v("label",s4,$(b(a)("auth.signup.emailLabel")),1),R(b(ca),{"pt:root:id":"comfy-org-sign-up-email","pt:root:autocomplete":"email",class:"h-10",type:"text",placeholder:b(a)("auth.signup.emailPlaceholder"),invalid:d.invalid},null,8,["placeholder","invalid"]),d.error?(C(),P("small",r4,$(d.error.message),1)):H("",!0)]),_:1}),R(Nm),s.value?(C(),X(b(Io),{key:0,class:"mx-auto h-8 w-8"})):(C(),X(se,{key:1,type:"submit",class:"mt-4 h-10 font-medium",disabled:!c.valid},{default:W(()=>[fe($(b(a)("auth.signup.signUpButton")),1)]),_:2},1032,["disabled"]))]),_:1},8,["resolver","onSubmit"]))}}),l4=i4,u4={class:"w-96 overflow-x-hidden p-2"},c4={class:"mb-8 flex flex-col gap-4"},d4={class:"my-0 text-2xl leading-normal font-medium"},p4={class:"my-0 text-base"},f4={class:"text-muted"},m4={class:"text-muted"},g4={class:"flex flex-col gap-6"},h4=["alt"],v4={class:"text-center text-muted"},y4=["href"],w4={class:"mt-8 text-xs text-muted"},b4={href:"https://www.comfy.org/terms-of-service",target:"_blank",class:"cursor-pointer text-blue-500"},_4={href:"https://www.comfy.org/privacy",target:"_blank",class:"cursor-pointer text-blue-500"},k4=J({__name:"SignInContent",props:{onSuccess:{type:Function}},setup(e){const{t}=Fe(),a=To(),o=window.isSecureContext,s=A(!0),r=A(!1),i=dB(Ni(window.location.hostname)),l=E(()=>or(Eo.value,"comfy_platform_base_url",nl())),u=n(()=>{s.value=!s.value,r.value=!1},"toggleState"),c=n(async()=>{await a.signInWithGoogle()&&e.onSuccess()},"signInWithGoogle"),d=n(async()=>{await a.signInWithGithub()&&e.onSuccess()},"signInWithGithub"),p=n(async m=>{await a.signInWithEmail(m.email,m.password)&&e.onSuccess()},"signInWithEmail"),f=n(async m=>{await a.signUpWithEmail(m.email,m.password)&&e.onSuccess()},"signUpWithEmail"),g=A(!1);return it(async()=>{g.value=await kB()}),St(()=>{a.accessError.value=!1}),(m,h)=>(C(),P("div",u4,[r.value?(C(),X(WB,{key:0,onBack:h[0]||(h[0]=y=>r.value=!1),onSuccess:m.onSuccess},null,8,["onSuccess"])):(C(),P(Se,{key:1},[v("div",c4,[v("h1",d4,$(s.value?b(t)("auth.login.title"):b(t)("auth.signup.title")),1),v("p",p4,[v("span",f4,$(s.value?b(t)("auth.login.newUser"):b(t)("auth.signup.alreadyHaveAccount")),1),v("span",{class:"ml-1 cursor-pointer text-blue-500",onClick:u},$(s.value?b(t)("auth.login.signUp"):b(t)("auth.signup.signIn")),1)])]),b(o)?H("",!0):(C(),X(b(Ea),{key:0,severity:"warn",class:"mb-4"},{default:W(()=>[fe($(b(t)("auth.login.insecureContextWarning")),1)]),_:1})),s.value?(C(),X(XB,{key:1,onSubmit:p})):(C(),P(Se,{key:2},[g.value?(C(),X(b(Ea),{key:0,severity:"warn",class:"mb-4"},{default:W(()=>[fe($(b(t)("auth.signup.regionRestrictionChina")),1)]),_:1})):(C(),X(l4,{key:1,onSubmit:f}))],64)),R(b(la),{align:"center",layout:"horizontal",class:"my-8"},{default:W(()=>[v("span",m4,$(b(t)("auth.login.orContinueWith")),1)]),_:1}),v("div",g4,[b(i)?(C(),P(Se,{key:0},[R(se,{type:"button",class:"h-10",variant:"secondary",onClick:c},{default:W(()=>[h[2]||(h[2]=v("i",{class:"pi pi-google mr-2"},null,-1)),fe(" "+$(s.value?b(t)("auth.login.loginWithGoogle"):b(t)("auth.signup.signUpWithGoogle")),1)]),_:1}),R(se,{type:"button",class:"h-10",variant:"secondary",onClick:d},{default:W(()=>[h[3]||(h[3]=v("i",{class:"pi pi-github mr-2"},null,-1)),fe(" "+$(s.value?b(t)("auth.login.loginWithGithub"):b(t)("auth.signup.signUpWithGithub")),1)]),_:1})],64)):H("",!0),R(se,{type:"button",class:"h-10",variant:"secondary",onClick:h[1]||(h[1]=y=>r.value=!0)},{default:W(()=>[v("img",{src:uB,class:"mr-2 h-5 w-5",alt:m.$t("g.comfy")},null,8,h4),fe(" "+$(b(t)("auth.login.useApiKey")),1)]),_:1}),v("small",v4,[fe($(b(t)("auth.apiKey.helpText"))+" ",1),v("a",{href:`${l.value}/login`,target:"_blank",class:"cursor-pointer text-blue-500"},$(b(t)("auth.apiKey.generateKey")),9,y4)]),b(a).accessError.value?(C(),X(b(Ea),{key:1,severity:"info",icon:"pi pi-info-circle",variant:"outlined",closable:""},{default:W(()=>[fe($(b(t)("toastMessages.useApiKeyTip")),1)]),_:1})):H("",!0)]),v("p",w4,[fe($(b(t)("auth.login.termsText"))+" ",1),v("a",b4,$(b(t)("auth.login.termsLink")),1),fe(" "+$(b(t)("auth.login.andText"))+" ",1),v("a",_4,$(b(t)("auth.login.privacyLink")),1),fe(". "+$(b(t)("auth.login.questionsContactPrefix"))+" ",1),h[4]||(h[4]=v("a",{href:"mailto:hello@comfy.org",class:"cursor-pointer text-blue-500"}," hello@comfy.org",-1)),h[5]||(h[5]=fe(". "))])],64))]))}}),C4=k4,x4={minimumFractionDigits:2,maximumFractionDigits:2},I4=n(({value:e,locale:t,options:a})=>{const o={...x4,...a};return typeof o.maximumFractionDigits=="number"&&typeof o.minimumFractionDigits=="number"&&o.maximumFractionDigits<o.minimumFractionDigits&&(o.minimumFractionDigits=o.maximumFractionDigits),new Intl.NumberFormat(t,o).format(e)},"formatNumber");const S4=211/100,E4=n(e=>Math.round(e*S4),"centsToCredits"),Uo=n(e=>Math.round(e*211),"usdToCredits"),Jc=n(e=>Math.round(e/211*100)/100,"creditsToUsd"),$m=n(({value:e,locale:t,numberOptions:a})=>I4({value:e,locale:t,options:a}),"formatCredits"),d6=n(({cents:e,locale:t,numberOptions:a})=>$m({value:E4(e),locale:t,numberOptions:a}),"formatCreditsFromCents"),p6=n(({usd:e,locale:t,numberOptions:a})=>$m({value:Uo(e),locale:t,numberOptions:a}),"formatCreditsFromUsd");var T4=["for"],A4=["disabled","aria-label"],M4={class:"flex flex-1 items-center justify-center gap-0.5 overflow-hidden"},P4=["id","disabled"],D4=["disabled","aria-label"],L4=J({__name:"FormattedNumberStepper",props:_t({min:{default:0},max:{default:n(()=>1/0,"default")},step:{type:[Number,Function],default:1},formatOptions:{default:n(()=>({useGrouping:!0}),"default")},disabled:{type:Boolean,default:!1}},{modelValue:{required:!0},modelModifiers:{}}),emits:_t(["max-reached"],["update:modelValue"]),setup(e,{emit:t}){const a=t,o=rt(e,"modelValue"),s=$s(),r=A(null),i=A(u(o.value)),l=E(()=>Math.min(Math.max(i.value.length,1)+.5,9));be(o,k=>{document.activeElement!==r.value&&(i.value=u(k))});function u(k){return k.toLocaleString("en-US",e.formatOptions)}n(u,"formatNumber$1");function c(k){const S=k.replace(/[^0-9]/g,"");return S===""?0:parseInt(S,10)}n(c,"parseFormattedNumber");function d(k,S,_){return Math.min(Math.max(k,S),_)}n(d,"clamp$2");function p(k,S){const _=u(c(k)),I=k.slice(0,S).replace(/[^0-9]/g,"").length;let w=0,x=0;for(let D=0;D<_.length;D++)if(/[0-9]/.test(_[D])&&w++,w>=I){x=D+1;break}return w<I&&(x=_.length),{formatted:_,newCursor:x}}n(p,"formatWithCursor");function f(){return typeof e.step=="function"?e.step(o.value):e.step}n(f,"getStepAmount");function g(k){const S=k.target,_=S.value,I=S.selectionStart??_.length,w=c(_),x=Math.min(w,e.max),D=w>e.max;D&&a("max-reached"),o.value=x;const{formatted:T,newCursor:N}=p(D?u(x):_,D?u(x).length:I);i.value=T,requestAnimationFrame(()=>{r.value?.setSelectionRange(N,N)})}n(g,"handleInputChange");function m(){const k=d(o.value,e.min,e.max);o.value=k,i.value=u(k)}n(m,"handleInputBlur");function h(k){const S=k.target,_=S.value.length;S.setSelectionRange(_,_)}n(h,"handleInputFocus");function y(k){const S=f(),_=d(o.value+S*k,e.min,e.max);o.value=_,i.value=u(_)}return n(y,"handleStep"),(k,S)=>(C(),P("label",{for:b(s),class:pe(b(Pe)("flex h-10 cursor-text items-center rounded-lg bg-secondary-background text-secondary-foreground hover:bg-secondary-background-hover focus-within:ring-1 focus-within:ring-secondary-foreground",k.disabled&&"opacity-50 pointer-events-none"))},[v("button",{type:"button",class:"flex h-full w-8 cursor-pointer items-center justify-center rounded-l-lg border-none bg-transparent text-muted-foreground transition-colors hover:text-base-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-secondary-foreground disabled:opacity-30",disabled:k.disabled||o.value<=k.min,"aria-label":k.$t("g.decrement"),onClick:S[0]||(S[0]=_=>y(-1))},S[3]||(S[3]=[v("i",{class:"icon-[lucide--minus] size-4"},null,-1)]),8,A4),v("div",M4,[tt(k.$slots,"prefix"),ze(v("input",{id:b(s),ref_key:"inputRef",ref:r,"onUpdate:modelValue":S[1]||(S[1]=_=>i.value=_),type:"text",inputmode:"numeric",style:nt({width:`${l.value}ch`}),class:"min-w-0 rounded border-none bg-transparent text-center text-base-foreground font-medium text-lg focus-visible:outline-none",disabled:k.disabled,onInput:g,onBlur:m,onFocus:h},null,44,P4),[[io,i.value]]),tt(k.$slots,"suffix")]),v("button",{type:"button",class:"flex h-full w-8 cursor-pointer items-center justify-center rounded-r-lg border-none bg-transparent text-muted-foreground transition-colors hover:text-base-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-secondary-foreground disabled:opacity-30",disabled:k.disabled||o.value>=k.max,"aria-label":k.$t("g.increment"),onClick:S[2]||(S[2]=_=>y(1))},S[4]||(S[4]=[v("i",{class:"icon-[lucide--plus] size-4"},null,-1)]),8,D4)],10,T4))}}),Qc=L4,O4={class:"flex min-w-[460px] flex-col rounded-2xl border border-border-default bg-base-background shadow-[1px_1px_8px_0_rgba(0,0,0,0.4)]"},N4={class:"flex py-8 items-center justify-between px-8"},$4={class:"text-lg font-bold text-base-foreground m-0"},R4={key:0,class:"text-sm text-muted-foreground m-0 px-8"},B4={class:"px-8"},F4={class:"m-0 text-sm font-normal text-muted-foreground"},U4={class:"flex gap-2 pt-3"},W4={class:"flex gap-2 px-8 pt-8"},z4={class:"flex flex-1 flex-col gap-3"},V4={class:"text-sm text-muted-foreground"},G4={class:"flex flex-1 flex-col gap-3"},H4={class:"text-sm text-muted-foreground"},j4={key:1,class:"text-sm text-red-500 m-0 px-8 pt-4 text-center flex items-center justify-center gap-1"},K4={key:2,class:"text-sm text-gold-500 m-0 px-8 pt-4 text-center flex items-center justify-center gap-1"},Y4={href:"https://www.comfy.org/cloud/enterprise",target:"_blank",class:"ml-1 text-inherit"},q4={class:"pt-8 pb-8 flex flex-col gap-8 px-8"},X4={class:"flex items-center justify-center gap-1"},Z4=["href"],Qr=5,ys=1e4,J4=J({__name:"TopUpCreditsDialogContent",props:{isInsufficientCredits:{type:Boolean,default:!1}},setup(e){const{t}=Fe(),a=To(),o=Ct(),s=pt(),r=yt(),i=tn(),{buildDocsUrl:l,docsPaths:u}=nr(),{isSubscriptionEnabled:c}=nn(),d=[10,25,50,100],p=A(50),f=A(50),g=A(!1),m=A(!1),h=E(()=>l(u.partnerNodesPricing,{includeLocale:!0})),y=E({get:n(()=>Uo(f.value),"get"),set:n(M=>{f.value=Math.round(Jc(M)),p.value=null},"set")}),k=E(()=>f.value>=Qr&&f.value<=ys),S=E(()=>f.value<Qr);function _(M){return M.toLocaleString("en-US")}n(_,"formatNumber$1");function I(M){return M<100?5:M<1e3?50:100}n(I,"getStepAmount");function w(M){return Uo(I(Jc(M)))}n(w,"getCreditsStepAmount");function x(M){f.value=M,p.value=null,g.value=!1}n(x,"handlePayAmountChange");function D(M){g.value=!1,f.value=M,p.value=M}n(D,"handlePresetClick");function T(M=!0){M&&Jd(),o.closeDialog({key:"top-up-credits"})}n(T,"handleClose");async function N(){if(!(m.value||!k.value)){m.value=!0;try{r?.trackApiCreditTopupButtonPurchaseClicked(f.value),await a.purchaseCredits(f.value),T(!1),s.showSettingsDialog(c()?"subscription":"credits")}catch(M){console.error("Purchase failed:",M);const O=M instanceof Error?M.message:t("credits.topUp.unknownError");i.add({severity:"error",summary:t("credits.topUp.purchaseError"),detail:t("credits.topUp.purchaseErrorDetail",{error:O}),life:5e3})}finally{m.value=!1}}}return n(N,"handleBuy"),(M,O)=>(C(),P("div",O4,[v("div",N4,[v("h2",$4,$(M.isInsufficientCredits?M.$t("credits.topUp.addMoreCreditsToRun"):M.$t("credits.topUp.addMoreCredits")),1),v("button",{class:"cursor-pointer rounded border-none bg-transparent p-0 text-muted-foreground transition-colors hover:text-base-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-secondary-foreground",onClick:O[0]||(O[0]=()=>T())},O[4]||(O[4]=[v("i",{class:"icon-[lucide--x] size-6"},null,-1)]))]),M.isInsufficientCredits?(C(),P("p",R4,$(M.$t("credits.topUp.insufficientWorkflowMessage")),1)):H("",!0),v("div",B4,[v("h3",F4,$(M.$t("credits.topUp.selectAmount")),1),v("div",U4,[(C(),P(Se,null,Ze(d,L=>R(se,{key:L,autofocus:L===50,variant:"secondary",size:"lg",class:pe(b(Pe)("h-10 text-base font-medium w-full focus-visible:ring-secondary-foreground",p.value===L&&"bg-secondary-background-selected")),onClick:n(F=>D(L),"onClick")},{default:W(()=>[fe(" $"+$(L),1)]),_:2},1032,["autofocus","class","onClick"])),64))])]),v("div",W4,[v("div",z4,[v("div",V4,$(M.$t("credits.topUp.youPay")),1),R(Qc,{"model-value":f.value,min:0,max:ys,step:I,"onUpdate:modelValue":x,onMaxReached:O[1]||(O[1]=L=>g.value=!0)},{prefix:W(()=>O[5]||(O[5]=[v("span",{class:"shrink-0 text-base font-semibold text-base-foreground"},"$",-1)])),_:1},8,["model-value"])]),v("div",G4,[v("div",H4,$(M.$t("credits.topUp.youGet")),1),R(Qc,{modelValue:y.value,"onUpdate:modelValue":O[2]||(O[2]=L=>y.value=L),min:0,max:b(Uo)(ys),step:w,onMaxReached:O[3]||(O[3]=L=>g.value=!0)},{prefix:W(()=>O[6]||(O[6]=[v("i",{class:"icon-[lucide--component] size-4 shrink-0 text-gold-500"},null,-1)])),_:1},8,["modelValue","max"])])]),S.value?(C(),P("p",j4,[O[7]||(O[7]=v("i",{class:"icon-[lucide--component] size-4"},null,-1)),fe(" "+$(M.$t("credits.topUp.minRequired",{credits:_(b(Uo)(Qr))})),1)])):H("",!0),g.value?(C(),P("p",K4,[O[8]||(O[8]=v("i",{class:"icon-[lucide--component] size-4"},null,-1)),fe(" "+$(M.$t("credits.topUp.maxAllowed",{credits:_(b(Uo)(ys))}))+" ",1),v("span",null,$(M.$t("credits.topUp.needMore")),1),v("a",Y4,$(M.$t("credits.topUp.contactUs")),1)])):H("",!0),v("div",q4,[R(se,{disabled:!k.value||m.value,loading:m.value,variant:"primary",size:"lg",class:"h-10 justify-center",onClick:N},{default:W(()=>[fe($(M.$t("credits.topUp.buyCredits")),1)]),_:1},8,["disabled","loading"]),v("div",X4,[v("a",{href:h.value,target:"_blank",class:"flex items-center gap-1 text-sm text-muted-foreground no-underline transition-colors hover:text-base-foreground"},[fe($(M.$t("credits.topUp.viewPricing"))+" ",1),O[9]||(O[9]=v("i",{class:"icon-[lucide--external-link] size-4"},null,-1))],8,Z4)])])]))}}),Q4=J4,eF=J({__name:"UpdatePasswordContent",props:{onSuccess:{type:Function}},setup(e){const t=To(),a=A(!1),o=n(async s=>{if(s.valid){a.value=!0;try{await t.updatePassword(s.values.password),e.onSuccess()}finally{a.value=!1}}},"onSubmit");return(s,r)=>(C(),X(b(Qs),{class:"flex w-96 flex-col gap-6",resolver:b(er)(b(IB)),onSubmit:o},{default:W(()=>[R(Nm),R(se,{type:"submit",class:"mt-4 h-10 font-medium",loading:a.value},{default:W(()=>[fe($(s.$t("userSettings.updatePassword")),1)]),_:1},8,["loading"])]),_:1},8,["resolver"]))}}),tF=eF,aF=""+new URL("images/comfy-logo-single.svg",import.meta.url).href,oF={},nF={class:"px-2 py-4"},sF=["alt"];function rF(e,t){return C(),P("div",nF,[v("img",{src:aF,alt:e.$t("g.comfyOrgLogoAlt"),width:"32",height:"32"},null,8,sF)])}n(rF,"_sfc_render$2");var ei=ot(oF,[["render",rF]]),ed=!1;const iF=E(()=>qe?Eo.value.firebase_config?.projectId?.includes("-dev")??ed:ed);var lF={class:"px-4"},uF=J({__name:"SettingDialogHeader",setup(e){return(t,a)=>(C(),P("div",null,[v("h2",lF,[a[0]||(a[0]=v("i",{class:"pi pi-cog"},null,-1)),v("span",null,$(t.$t("g.settings")),1),b(iF)?(C(),X(b(Mn),{key:0,value:"staging",severity:"warn",class:"ml-2 text-xs"})):H("",!0)])]))}}),td=ot(uF,[["__scopeId","data-v-dcb7c822"]]),cF={class:"flex items-center justify-between"},dF={"data-testid":"current-user-indicator"},pF=J({__name:"CurrentUserMessage",setup(e){const t=bv(),a=n(async()=>{await t.logout(),window.location.reload()},"logout");return(o,s)=>b(t).isMultiUserServer?(C(),X(b(Ea),{key:0,severity:"info",icon:"pi pi-user","pt:text":"w-full"},{default:W(()=>[v("div",cF,[v("div",dF,$(o.$t("g.currentUser"))+": "+$(b(t).currentUser?.username),1),R(se,{class:"text-inherit",variant:"textonly",size:"icon","aria-label":o.$t("menuLabels.Sign Out"),onClick:a},{default:W(()=>s[0]||(s[0]=[v("i",{class:"pi pi-sign-out"},null,-1)])),_:1},8,["aria-label"])])]),_:1})):H("",!0)}}),fF=pF,mF={class:"flex items-center justify-between"},gF={class:"actions"},hF=J({__name:"ColorPaletteMessage",setup(e){const t=Me(),a=za(),o=vp(),{palettes:s,activePaletteId:r}=Vn(a),i=n(async()=>{const l=await o.importColorPalette();l&&await t.set("Comfy.ColorPalette",l.id)},"importCustomPalette");return(l,u)=>(C(),X(b(Ea),{severity:"info",icon:"pi pi-palette","pt:text":"w-full"},{default:W(()=>[v("div",mF,[v("div",null,$(l.$t("settingsCategories.ColorPalette")),1),v("div",gF,[R(b(Aa),{modelValue:b(r),"onUpdate:modelValue":u[0]||(u[0]=c=>ua(r)?r.value=c:null),class:"w-44",options:b(s),"option-label":"name","option-value":"id"},null,8,["modelValue","options"]),R(se,{size:"icon",variant:"textonly",title:l.$t("g.export"),onClick:u[1]||(u[1]=c=>b(o).exportColorPalette(b(r)))},{default:W(()=>u[3]||(u[3]=[v("i",{class:"pi pi-file-export"},null,-1)])),_:1},8,["title"]),R(se,{size:"icon",variant:"textonly",title:l.$t("g.import"),onClick:i},{default:W(()=>u[4]||(u[4]=[v("i",{class:"pi pi-file-import"},null,-1)])),_:1},8,["title"]),R(se,{size:"icon",variant:"destructive-textonly",title:l.$t("g.delete"),disabled:!b(a).isCustomPalette(b(r)),onClick:u[2]||(u[2]=c=>b(o).deleteCustomColorPalette(b(r)))},{default:W(()=>u[5]||(u[5]=[v("i",{class:"pi pi-trash"},null,-1)])),_:1},8,["title","disabled"])])])]),_:1}))}}),vF=hF,yF={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"};function wF(e,t){return C(),P("svg",yF,[...t[0]||(t[0]=[v("path",{fill:"currentColor",d:"M5 21q-1.275 0-1.812-1.137t.262-2.113L9 11V5H8q-.425 0-.712-.288T7 4t.288-.712T8 3h8q.425 0 .713.288T17 4t-.288.713T16 5h-1v6l5.55 6.75q.8.975.263 2.113T19 21zm2-3h10l-3.4-4h-3.2zm-2 1h14l-6-7.3V5h-2v6.7zm7-7"},null,-1)])])}n(wF,"render");var bF=bt({name:"material-symbols-experiment-outline",render:wF}),_F={class:"flex gap-2"},kF=J({__name:"BackgroundImageUpload",props:{modelValue:{},modelModifiers:{}},emits:["update:modelValue"],setup(e){const t=rt(e,"modelValue"),a=A(null),o=A(!1),s=n(()=>{a.value?.click()},"triggerFileInput"),r=n(async u=>{const c=new FormData;c.append("image",u),c.append("subfolder","backgrounds");const d=await oe.fetchApi("/upload/image",{method:"POST",body:c});if(d.status!==200)return Oe().addAlert(`Upload failed: ${d.status} - ${d.statusText}`),null;const p=await d.json();return p.subfolder?`${p.subfolder}/${p.name}`:p.name},"uploadFile$2"),i=n(async u=>{const c=u.target;if(c.files&&c.files[0]){const d=c.files[0];o.value=!0;try{const p=await r(d);p&&(t.value=`/api/view?${new URLSearchParams({filename:p,type:"input",subfolder:"backgrounds"}).toString()}`)}catch(p){Oe().addAlert(`Upload error: ${String(p)}`)}finally{o.value=!1}}},"handleFileUpload"),l=n(()=>{t.value="",a.value&&(a.value.value="")},"clearImage");return(u,c)=>{const d=ht("tooltip");return C(),P("div",_F,[R(b(ca),{modelValue:t.value,"onUpdate:modelValue":c[0]||(c[0]=p=>t.value=p),class:"flex-1",placeholder:u.$t("g.imageUrl")},null,8,["modelValue","placeholder"]),ze((C(),X(se,{variant:"secondary",size:"sm","aria-label":u.$t("g.upload"),disabled:o.value,onClick:s},{default:W(()=>[v("i",{class:pe(o.value?"pi pi-spin pi-spinner":"pi pi-upload")},null,2)]),_:1},8,["aria-label","disabled"])),[[d,u.$t("g.upload")]]),ze((C(),X(se,{variant:"destructive",size:"sm","aria-label":u.$t("g.clear"),disabled:!t.value,onClick:l},{default:W(()=>c[1]||(c[1]=[v("i",{class:"pi pi-trash"},null,-1)])),_:1},8,["aria-label","disabled"])),[[d,u.$t("g.clear")]]),v("input",{ref_key:"fileInput",ref:a,type:"file",class:"hidden",accept:"image/*",onChange:i},null,544)])}}}),CF=kF,xF=J({__name:"CustomFormValue",props:{renderFunction:{type:Function}},setup(e){const t=e,a=A(null);function o(){if(a.value){a.value.innerHTML="";const s=t.renderFunction();a.value.appendChild(s)}}return n(o,"renderContent"),it(o),be(()=>t.renderFunction,o),(s,r)=>(C(),P("div",{ref_key:"container",ref:a},null,512))}}),IF=xF,SF={class:"color-picker-wrapper flex items-center gap-2"},EF=J({inheritAttrs:!1,__name:"FormColorPicker",props:_t({label:{}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=rt(e,"modelValue");return(a,o)=>(C(),P("div",SF,[R(b(id),Ht({modelValue:t.value,"onUpdate:modelValue":o[0]||(o[0]=s=>t.value=s)},a.$attrs),null,16,["modelValue"]),R(b(ca),{modelValue:t.value,"onUpdate:modelValue":o[1]||(o[1]=s=>t.value=s),class:"w-28",placeholder:a.label},null,8,["modelValue","placeholder"])]))}}),TF=EF,AF={class:"image-upload-wrapper"},MF={class:"flex items-center gap-2"},PF=["src"],DF={key:1,class:"pi pi-image text-xl text-smoke-400"},LF={class:"flex flex-col gap-2"},OF=J({__name:"FormImageUpload",props:{modelValue:{}},emits:["update:modelValue"],setup(e,{emit:t}){const a=t,o=A(null),s=n(()=>{o.value?.click()},"triggerFileInput"),r=n(l=>{const u=l.target;if(u.files&&u.files[0]){const c=u.files[0],d=new FileReader;d.onload=p=>{a("update:modelValue",p.target?.result)},d.readAsDataURL(c)}},"handleFileUpload"),i=n(()=>{a("update:modelValue",""),o.value&&(o.value.value="")},"clearImage");return(l,u)=>(C(),P("div",AF,[v("div",MF,[v("div",{class:pe(["preview-box flex h-16 w-16 items-center justify-center rounded border p-2",{"bg-base-background":!l.modelValue}])},[l.modelValue?(C(),P("img",{key:0,src:l.modelValue,class:"max-h-full max-w-full object-contain"},null,8,PF)):(C(),P("i",DF))],2),v("div",LF,[R(se,{size:"sm",onClick:s},{default:W(()=>[u[0]||(u[0]=v("i",{class:"pi pi-upload"},null,-1)),fe(" "+$(l.$t("g.upload")),1)]),_:1}),l.modelValue?(C(),X(se,{key:0,class:"w-full",variant:"destructive",size:"sm","aria-label":l.$t("g.delete"),onClick:i},{default:W(()=>u[1]||(u[1]=[v("i",{class:"pi pi-trash"},null,-1)])),_:1},8,["aria-label"])):H("",!0)])]),v("input",{ref_key:"fileInput",ref:o,type:"file",class:"hidden",accept:"image/*",onChange:r},null,544)]))}}),NF=OF,$F={class:"flex flex-row gap-4"},RF=["for"],BF=J({__name:"FormRadioGroup",props:{modelValue:{},options:{},optionLabel:{},optionValue:{},id:{}},emits:["update:modelValue"],setup(e){const t=e,a=E(()=>t.options?t.options.map(o=>typeof o=="string"?{text:o,value:o}:"text"in o?{text:o.text,value:o.value??o.text}:{text:o[t.optionLabel||"text"]||"Unknown",value:o[t.optionValue||"value"]}):[]);return(o,s)=>(C(),P("div",$F,[(C(!0),P(Se,null,Ze(a.value,r=>(C(),P("div",{key:r.value,class:"flex items-center"},[R(b(Hm),{"input-id":`${o.id}-${r.value}`,name:o.id,value:r.value,"model-value":o.modelValue,"aria-describedby":`${r.text}-label`,"onUpdate:modelValue":s[0]||(s[0]=i=>o.$emit("update:modelValue",i))},null,8,["input-id","name","value","model-value","aria-describedby"]),v("label",{for:`${o.id}-${r.value}`,class:"ml-2 cursor-pointer"},$(r.text),9,RF)]))),128))]))}}),FF=BF,UF={class:"input-knob flex flex-row items-center gap-2"},WF=J({inheritAttrs:!1,__name:"InputKnob",props:{modelValue:{},inputClass:{},knobClass:{},min:{},max:{},step:{},resolution:{}},emits:["update:modelValue"],setup(e,{emit:t}){const a=e,o=t,s=A(a.modelValue);be(()=>a.modelValue,l=>{s.value=l});const r=n(l=>{l===null&&(l=Number(a.min)||0);const u=Number(a.min??Number.NEGATIVE_INFINITY),c=Number(a.max??Number.POSITIVE_INFINITY),d=Number(a.step)||1;l=Math.max(u,Math.min(c,l)),l=Math.round(l/d)*d,s.value=l,o("update:modelValue",l)},"updateValue"),i=n(l=>{r(l);const u=(a.step??1).toString(),c=u.includes(".")?u.split(".")[1].length:0;return l.toFixed(a.resolution??c)},"displayValue");return(l,u)=>(C(),P("div",UF,[R(b(Ym),Ht({"model-value":l.modelValue,"value-template":i,class:["knob-part",l.knobClass],min:l.min,max:l.max,step:l.step},l.$attrs,{"onUpdate:modelValue":r}),null,16,["model-value","class","min","max","step"]),R(b(Ri),{"model-value":l.modelValue,class:pe(["input-part",l.inputClass]),"max-fraction-digits":3,min:l.min,max:l.max,step:l.step,"allow-empty":!1,"onUpdate:modelValue":r},null,8,["model-value","class","min","max","step"])]))}}),zF=WF,VF={class:"input-slider flex flex-row items-center gap-2"},GF=J({inheritAttrs:!1,__name:"InputSlider",props:{modelValue:{},inputClass:{},sliderClass:{},min:{},max:{},step:{}},emits:["update:modelValue"],setup(e,{emit:t}){const a=e,o=t,s=A(a.modelValue);be(()=>a.modelValue,i=>{s.value=i});const r=n(i=>{i===null&&(i=Number(a.min)||0);const l=Number(a.min??Number.NEGATIVE_INFINITY),u=Number(a.max??Number.POSITIVE_INFINITY),c=Number(a.step)||1;i=Math.max(l,Math.min(u,i)),i=Math.round(i/c)*c,s.value=i,o("update:modelValue",i)},"updateValue");return(i,l)=>(C(),P("div",VF,[R(b(Bi),Ht({"model-value":i.modelValue,class:["slider-part",i.sliderClass],min:i.min,max:i.max,step:i.step},i.$attrs,{"onUpdate:modelValue":l[0]||(l[0]=u=>r(u))}),null,16,["model-value","class","min","max","step"]),R(b(Ri),{"model-value":i.modelValue,class:pe(["input-part",i.inputClass]),"max-fraction-digits":3,min:i.min,max:i.max,step:i.step,"allow-empty":!1,"onUpdate:modelValue":r},null,8,["model-value","class","min","max","step"])]))}}),HF=GF;let oa=(function(e){return e.IDLE="IDLE",e.LOADING="LOADING",e.VALID="VALID",e.INVALID="INVALID",e})({});var jF=J({inheritAttrs:!1,__name:"UrlInput",props:{modelValue:{},validateUrlFn:{type:Function}},emits:["update:modelValue","state-change"],setup(e,{emit:t}){const a=e,o=t,s=A(oa.IDLE),r=n(p=>p?p.replace(/\s+/g,""):"","cleanInput"),i=A(r(a.modelValue));be(()=>a.modelValue,async p=>{i.value=r(p),await d(p)}),be(s,p=>{o("state-change",p)}),it(async()=>{await d(a.modelValue)});const l=n(p=>{i.value=r(p??""),s.value=oa.IDLE},"handleInput"),u=n(async()=>{const p=r(i.value);let f=p;try{f=new URL(p).toString()}catch{}o("update:modelValue",f)},"handleBlur"),c=n(async p=>{if(!xs(p))return!1;try{return await _B(p)}catch{return!1}},"defaultValidateUrl"),d=n(async p=>{if(s.value===oa.LOADING)return;const f=r(p);if(s.value=oa.IDLE,!!f){s.value=oa.LOADING;try{s.value=await(a.validateUrlFn??c)(f)?oa.VALID:oa.INVALID}catch{s.value=oa.INVALID}}},"validateUrl");return(p,f)=>(C(),X(b(Xm),{class:"w-full"},{default:W(()=>[R(b(ca),Ht(p.$attrs,{"model-value":i.value,class:"w-full",invalid:s.value===b(oa).INVALID,"onUpdate:modelValue":l,onBlur:u}),null,16,["model-value","invalid"]),R(b(ud),{class:pe({"pi pi-spin pi-spinner text-neutral-400":s.value===b(oa).LOADING,"pi pi-check cursor-pointer text-green-500":s.value===b(oa).VALID,"pi pi-times cursor-pointer text-red-500":s.value===b(oa).INVALID}),onClick:f[0]||(f[0]=g=>d(a.modelValue))},null,8,["class"])]),_:1}))}}),KF=jF,YF={class:"flex flex-row items-center gap-2"},qF={class:"form-label flex grow items-center"},XF=["id"],ZF={key:0,class:"pi pi-info-circle bg-transparent"},JF={class:"form-input flex justify-end"},QF=J({__name:"FormItem",props:_t({item:{},id:{},labelClass:{}},{formValue:{},formValueModifiers:{}}),emits:["update:formValue"],setup(e){const t=rt(e,"formValue"),a=e;function o(r){const i={...r.attrs||{}},l=r.type;switch(typeof l=="function"&&(i.renderFunction=()=>l(a.item.name,u=>t.value=u,t.value,r.attrs)),r.type){case"combo":case"radio":i.options=typeof r.options=="function"?r.options(t.value):r.options,typeof r.options?.[0]!="string"&&(i.optionLabel="text",i.optionValue="value");break}return i}n(o,"getFormAttrs");function s(r){if(typeof r.type=="function")return IF;switch(r.type){case"boolean":return ti;case"number":return Ri;case"slider":return HF;case"knob":return zF;case"combo":return Aa;case"radio":return FF;case"image":return NF;case"color":return TF;case"url":return KF;case"backgroundImage":return CF;default:return ca}}return n(s,"getFormComponent"),(r,i)=>{const l=ht("tooltip");return C(),P("div",YF,[v("div",qF,[v("span",{id:`${a.id}-label`,class:pe(["text-muted",a.labelClass])},[tt(r.$slots,"name-prefix",{},void 0,!0),fe(" "+$(a.item.name)+" ",1),a.item.tooltip?ze((C(),P("i",ZF,null,512)),[[l,a.item.tooltip]]):H("",!0),tt(r.$slots,"name-suffix",{},void 0,!0)],10,XF)]),v("div",JF,[(C(),X(Wn(bt(s(a.item))),Ht({id:a.id,"model-value":t.value,"onUpdate:modelValue":i[0]||(i[0]=u=>t.value=u),"aria-labelledby":`${a.id}-label`},o(a.item)),null,16,["id","model-value","aria-labelledby"]))])])}}}),eU=ot(QF,[["__scopeId","data-v-cd19ee1f"]]),tU=J({__name:"SettingItem",props:{setting:{}},setup(e){const t=e,{t:a}=Fe();function o(u){return typeof u=="function"?o(u(t.setting.value??"")):u.map(c=>{const d=typeof c=="string"?c:c.text,p=typeof c=="string"?c:c.value;return{text:a(`settings.${dt(t.setting.id)}.options.${dt(d)}`,d),value:p}})}n(o,"translateOptions");const s=E(()=>{const u=dt(t.setting.id);return{...t.setting,name:a(`settings.${u}.name`,t.setting.name),tooltip:t.setting.tooltip?De(`settings.${u}.tooltip`,t.setting.tooltip):void 0,options:t.setting.options?o(t.setting.options):void 0}}),r=Me(),i=E(()=>r.get(t.setting.id)),l=n(async u=>{const c=yt(),d=t.setting.id,p=i.value;await r.set(d,u);const f=r.get(d);p!==f&&c?.trackSettingChanged({setting_id:d,previous_value:p,new_value:f})},"updateSettingValue");return(u,c)=>{const d=bF,p=ht("tooltip");return C(),X(eU,{id:u.setting.id,item:s.value,"form-value":i.value,"onUpdate:formValue":l},{"name-prefix":W(()=>[u.setting.id==="Comfy.Locale"?(C(),X(b(Mn),{key:0,class:"pi pi-language"})):H("",!0),u.setting.experimental?ze((C(),X(b(Mn),{key:1},{icon:W(()=>[R(d)]),_:1})),[[p,{value:u.$t("g.experimental"),showDelay:600}]]):H("",!0)]),_:1},8,["id","item","form-value"])}}}),aU=tU,oU={class:"setting-group"},nU=J({__name:"SettingGroup",props:{group:{},divider:{type:Boolean}},setup(e){return(t,a)=>(C(),P("div",oU,[t.divider?(C(),X(b(la),{key:0})):H("",!0),v("h3",null,$(t.$t(`settingsCategories.${b(dt)(t.group.label)}`,t.group.label)),1),(C(!0),P(Se,null,Ze(t.group.settings.filter(o=>!o.deprecated),o=>(C(),P("div",{key:o.id,class:"setting-item mb-4"},[R(aU,{setting:o},null,8,["setting"])]))),128))]))}}),sU=nU,rU={key:0},iU=J({__name:"SettingsPanel",props:{settingGroups:{}},setup(e){const t=e;return(a,o)=>t.settingGroups.length>0?(C(),P("div",rU,[(C(!0),P(Se,null,Ze(t.settingGroups,(s,r)=>(C(),X(sU,{key:s.label,divider:r!==0,group:s},null,8,["divider","group"]))),128))])):(C(),X(Va,{key:1,icon:"pi pi-search",title:a.$t("g.noResultsFound"),message:a.$t("g.searchFailedMessage")},null,8,["title","message"]))}}),ad=iU;function lU(){const e=Me(),{shouldRenderVueNodes:t}=vr(),a=A(""),o=A([]),s=A(!1);be(a,()=>s.value=!0);const r=E(()=>new Set(o.value.map(d=>Mr(e.settingsById[d]).category))),i=E(()=>a.value.length===0),l=E(()=>!i.value&&!s.value);return{searchQuery:a,filteredSettingIds:o,searchInProgress:s,searchResultsCategories:r,queryIsEmpty:i,inSearch:l,handleSearch:n(d=>{if(!d){o.value=[];return}const p=d.toLocaleLowerCase();o.value=Object.values(e.settingsById).filter(f=>{if(f.type==="hidden"||f.deprecated||t.value&&f.hideInVueNodes)return!1;const g=f.id.toLowerCase(),m=f.name.toLowerCase(),h=De(`settings.${dt(f.id)}.name`,f.name).toLocaleLowerCase(),y=Mr(f),k=De(`settingsCategories.${dt(y.category)}`,y.category).toLocaleLowerCase(),S=De(`settingsCategories.${dt(y.subCategory)}`,y.subCategory).toLocaleLowerCase();return g.includes(p)||m.includes(p)||h.includes(p)||k.includes(p)||S.includes(p)}).map(f=>f.id),s.value=!1},"handleSearch"),getSearchResults:n(d=>{const p={};return o.value.forEach(f=>{const g=e.settingsById[f],m=Mr(g),h=m.subCategory;(d===null||d.label===m.category)&&(p[h]||(p[h]=[]),p[h].push(g))}),Object.entries(p).map(([f,g])=>({label:f,settings:g}))},"getSearchResults")}}n(lU,"useSettingSearch");function uU(e){const{t}=Fe(),{isLoggedIn:a}=Ko(),o=Me(),s=A(null),{shouldRenderVueNodes:r}=vr(),{isActiveSubscription:i}=nn(),l=E(()=>{const w=yo(Object.values(o.settingsById).filter(D=>D.type!=="hidden"&&!(r.value&&D.hideInVueNodes)),D=>D.category||D.id.split(".")),x=(w.children??[]).filter(D=>D.leaf);return x.length&&(w.children=(w.children??[]).filter(D=>!D.leaf),w.children.push({key:"Other",label:"Other",leaf:!1,children:x})),w}),u=E(()=>l.value.children??[]),c={node:{key:"about",label:"About",children:[]},component:ft(()=>ut(()=>import("./AboutPanel-CHse5rOA.js"),__vite__mapDeps([64,1,2,3,4,10,9,11,12,13]),import.meta.url))},d={node:{key:"credits",label:"Credits",children:[]},component:ft(()=>ut(()=>import("./LegacyCreditsPanel-6vR8koQy.js"),__vite__mapDeps([65,1,2,3,4,10,5,6,7,8,9,11,12,13,17,18,16,20,21,24,25]),import.meta.url))},p=!qe||!window.__CONFIG__?.subscription_required?null:{node:{key:"subscription",label:"PlanCredits",children:[]},component:ft(()=>ut(()=>import("./SubscriptionPanel-D9uv7z8f.js"),__vite__mapDeps([66,15,1,2,3,4,10,5,6,7,8,9,11,12,13,16,67,68,17,18,20,21,69,24,25,70]),import.meta.url))},f=E(()=>p?i.value:!1),g={node:{key:"user",label:"User",children:[]},component:ft(()=>ut(()=>import("./UserPanel-Su6NtJ5q.js"),__vite__mapDeps([71,1,2,3,4,5,6,7,8,9,10,11,12,13,72,17,18,16,20,21,24,25]),import.meta.url))},m={node:{key:"keybinding",label:"Keybinding",children:[]},component:ft(()=>ut(()=>import("./KeybindingPanel-CAXL5TlV.js"),__vite__mapDeps([73,15,1,2,3,4,10,5,6,7,8,9,11,12,13,17,18,16,20,21,74,24,25,75]),import.meta.url))},h={node:{key:"extension",label:"Extension",children:[]},component:ft(()=>ut(()=>import("./ExtensionPanel-CrWVGUtg.js"),__vite__mapDeps([76,1,2,3,4,10,5,6,7,8,9,11,12,13,17,18,16,20,21,24,25]),import.meta.url))},y={node:{key:"server-config",label:"Server-Config",children:[]},component:ft(()=>ut(()=>import("./ServerConfigPanel-CxovH9Qk.js"),__vite__mapDeps([77,1,2,3,4,10,5,6,7,8,9,11,12,13,17,18,16,20,21,78,24,25]),import.meta.url))},k=E(()=>[c,d,g,m,h,...Qa()?[y]:[],...f.value&&p?[p]:[]].filter(w=>w.component)),S=E(()=>{if(!e)return u.value[0];for(const w of I.value){const x=w.children?.find(D=>D.key===e);if(x)return x}return u.value[0]}),_=n(w=>({...w,translatedLabel:t(`settingsCategories.${dt(w.label)}`,w.label)}),"translateCategory"),I=E(()=>[{key:"account",label:"Account",children:[g.node,...a.value&&f.value&&p?[p.node]:[],...a.value&&!(qe&&window.__CONFIG__?.subscription_required)?[d.node]:[]].map(_)},{key:"settings",label:"Application Settings",children:u.value.map(_)},{key:"specialSettings",label:"Special Settings",children:[m.node,h.node,c.node,...Qa()?[y.node]:[]].map(_)}]);return it(()=>{s.value=S.value}),{panels:k,activeCategory:s,defaultCategory:S,groupedMenuTreeNodes:I,settingCategories:u}}n(uU,"useSettingUI");var cU={class:"settings-container"},dU=J({__name:"SettingDialogContent",props:{defaultPanel:{}},setup(e){const{activeCategory:t,defaultCategory:a,settingCategories:o,groupedMenuTreeNodes:s,panels:r}=uU(e.defaultPanel),{searchQuery:i,searchResultsCategories:l,queryIsEmpty:u,inSearch:c,handleSearch:d,getSearchResults:p}=lU(),f=To(),g=n(S=>Math.max(0,...nc(S).map(_=>_.sortOrder??0)),"getGroupSortOrder"),m=n(S=>[...S.children??[]].sort((_,I)=>{const w=g(I)-g(_);return w!==0?w:_.label.localeCompare(I.label)}).map(_=>({label:_.label,settings:nc(_).sort((I,w)=>{const x=I.sortOrder??0;return(w.sortOrder??0)-x})})),"sortedGroups"),h=n(S=>{d(S.trim()),t.value=S?null:a.value},"handleSearch"),y=E(()=>p(t.value)),k=E(()=>c.value?"Search Results":t.value?.label??"");return be(t,(S,_)=>{k.value||(t.value=_),t.value?.key==="credits"&&f.fetchBalance()}),(S,_)=>(C(),P("div",cU,[R(b(zi),{class:"settings-sidebar w-48 shrink-0 p-2 2xl:w-64"},{default:W(()=>[R(Ao,{"model-value":b(i),"onUpdate:modelValue":_[0]||(_[0]=I=>ua(i)?i.value=I:null),class:"settings-search-box mb-2 w-full",placeholder:S.$t("g.searchSettings")+"...","debounce-time":128,autofocus:"",onSearch:h},null,8,["model-value","placeholder"]),R(b(Fi),{modelValue:b(t),"onUpdate:modelValue":_[1]||(_[1]=I=>ua(t)?t.value=I:null),options:b(s),"option-label":"translatedLabel","option-group-label":"label","option-group-children":"children","scroll-height":"100%","option-disabled":n(I=>!b(u)&&!b(l).has(I.label??""),"option-disabled"),class:"w-full border-none"},{optiongroup:W(()=>[R(b(la),{class:"my-0"})]),_:1},8,["modelValue","options","option-disabled"])]),_:1}),R(b(la),{layout:"vertical",class:"mx-1 hidden md:flex 2xl:mx-4"}),R(b(la),{layout:"horizontal",class:"flex md:hidden"}),R(b(md),{value:k.value,lazy:!0,class:"settings-content h-full w-full"},{default:W(()=>[R(b(cd),{class:"settings-tab-panels h-full w-full pr-0"},{default:W(()=>[R(eu,{value:"Search Results"},{default:W(()=>[R(ad,{"setting-groups":y.value},null,8,["setting-groups"])]),_:1}),(C(!0),P(Se,null,Ze(b(o),I=>(C(),X(eu,{key:I.key,value:I.label??""},{header:W(()=>[k.value==="Comfy"?(C(),X(fF,{key:0})):H("",!0),k.value==="Appearance"?(C(),X(vF,{key:1})):H("",!0)]),default:W(()=>[R(ad,{"setting-groups":m(I)},null,8,["setting-groups"])]),_:2},1032,["value"]))),128)),(C(!0),P(Se,null,Ze(b(r),I=>(C(),X(vd,{key:I.node.key},{fallback:W(()=>[v("div",null,$(S.$t("g.loadingPanel",{panel:I.node.label})),1)]),default:W(()=>[(C(),X(Wn(I.component)))]),_:2},1024))),128))]),_:1})]),_:1},8,["value"])]))}}),od=ot(dU,[["__scopeId","data-v-54ba910a"]]),pU={class:"flex w-[490px] flex-col border-t-1 border-border-default"},fU={class:"flex h-full w-full flex-col gap-4 p-4"},mU={key:0,class:"flex flex-col gap-3"},gU=["aria-label"],hU={key:0,class:"text-xs p-4 rounded-md bg-secondary-background font-mono"},vU=J({__name:"ImportFailedNodeContent",props:{conflictedPackages:{}},setup(e){const t=E(()=>e.conflictedPackages.filter(a=>a.conflicts.some(o=>o.type==="import_failed")).map(a=>{const o=a.conflicts.find(s=>s.type==="import_failed");return o?{packageId:a.package_id,packageName:a.package_name,errorMessage:o.current_value||"Unknown import error",traceback:o.required_value||""}:{packageId:a.package_id,packageName:a.package_name,errorMessage:"Unknown import error",traceback:""}}));return(a,o)=>(C(),P("div",pU,[v("div",fU,[t.value.length>0?(C(),P("div",mU,[(C(!0),P(Se,null,Ze(t.value,s=>(C(),P("div",{key:s.packageId,class:"flex flex-col gap-2 max-h-60 overflow-x-hidden overflow-y-auto scrollbar-custom",role:"region","aria-label":`Error traceback for ${s.packageId}`,tabindex:"0"},[s.traceback||s.errorMessage?(C(),P("div",hU,$(s.traceback||s.errorMessage),1)):H("",!0)],8,gU))),128))])):H("",!0)])]))}}),yU=vU,wU={class:"flex w-full items-center justify-between px-3 pb-4"},bU={class:"flex w-full items-start justify-end gap-2 pr-1"},_U=J({__name:"ImportFailedNodeFooter",props:{conflictedPackages:{default:n(()=>[],"default")}},setup(e){const{copyToClipboard:t}=sn(),a=E(()=>{const s=[];return e.conflictedPackages.forEach(r=>{const i=r.conflicts.find(l=>l.type==="import_failed");i?.required_value&&s.push(i.required_value)}),s.join(`
|
|
244
|
+
`}n(P3,"generateErrorReport");var D3={class:"comfy-error-report flex flex-col gap-4"},L3={class:"font-bold"},O3={class:"flex justify-center gap-2"},N3={class:"break-words whitespace-pre-wrap"},$3={class:"flex justify-end gap-4"},R3="comfyanonymous",B3="ComfyUI",F3=J({__name:"ErrorDialogContent",props:{error:{}},setup(e){const t=A(""),a=A(!1),o=n(()=>{yt()?.trackUiButtonClicked({button_id:"error_dialog_show_report_clicked"}),a.value=!0},"showReport"),s=tn(),{t:r}=Fe(),i=Qo(),l=yt(),u=E(()=>e.error.nodeType??e.error.exceptionType??r("errorDialog.defaultTitle")),c=n(async()=>{l?.trackHelpResourceClicked({resource_type:"help_feedback",is_external:!0,source:"error_dialog"}),await Pt().execute("Comfy.ContactSupport")},"showContactSupport");it(async()=>{i.systemStats||await i.refetchSystemStats();try{const[f]=await Promise.all([oe.getLogs()]);t.value=P3({systemStats:i.systemStats,serverLogs:f,workflow:Z.rootGraph.serialize(),exceptionType:e.error.exceptionType,exceptionMessage:e.error.exceptionMessage,traceback:e.error.traceback,nodeId:e.error.nodeId,nodeType:e.error.nodeType})}catch(f){console.error("Error fetching logs:",f),s.add({severity:"error",summary:r("g.error"),detail:r("toastMessages.failedToFetchLogs"),life:5e3})}});const{copyToClipboard:d}=sn(),p=n(async()=>{await d(t.value)},"copyReportToClipboard");return(f,g)=>(C(),P("div",D3,[R(Va,{class:"pb-0",icon:"pi pi-exclamation-circle",title:u.value,message:f.error.exceptionMessage,"text-class":"break-words max-w-[60vw]"},null,8,["title","message"]),f.error.extensionFile?(C(),P(Se,{key:0},[v("span",null,$(b(r)("errorDialog.extensionFileHint"))+":",1),g[0]||(g[0]=v("br",null,null,-1)),v("span",L3,$(f.error.extensionFile),1)],64)):H("",!0),v("div",O3,[ze(R(se,{variant:"textonly",onClick:o},{default:W(()=>[fe($(f.$t("g.showReport")),1)]),_:1},512),[[_o,!a.value]]),ze(R(se,{variant:"textonly",onClick:c},{default:W(()=>[fe($(f.$t("issueReport.helpFix")),1)]),_:1},512),[[_o,!a.value]])]),a.value?(C(),P(Se,{key:1},[R(b(la)),R(b(zi),{class:"h-[400px] w-full max-w-[80vw]"},{default:W(()=>[v("pre",N3,$(t.value),1)]),_:1}),R(b(la))],64)):H("",!0),v("div",$3,[R(M3,{"error-message":f.error.exceptionMessage,"repo-owner":R3,"repo-name":B3},null,8,["error-message"]),a.value?(C(),X(se,{key:0,onClick:p},{default:W(()=>[g[1]||(g[1]=v("i",{class:"pi pi-copy"},null,-1)),fe(" "+$(f.$t("g.copyToClipboard")),1)]),_:1})):H("",!0)])]))}}),Zc=F3;function U3(e){const t=n(u=>`https://civitai.com/api/v1/model-versions/${u}`,"createModelVersionUrl"),a=n(()=>new URL(e).pathname.split("/").pop()||null,"extractModelIdFromUrl"),o=n(async()=>{const u=a();if(!u)return null;const c=t(u);return(await fetch(c)).json()},"fetchModelData"),s=n(()=>{const u=r.value?.files?.find(c=>c.downloadUrl&&e.startsWith(c.downloadUrl));return u?.sizeKB?u.sizeKB<<10:null},"findMatchingFileSize"),{state:r,isLoading:i,error:l}=Xo(o,null,{immediate:!0});return{fileSize:E(()=>i.value?null:s()),isLoading:i,error:l,modelData:r}}n(U3,"useCivitaiModel");function Lm(e,t){const a=A(null),o=A(null),s=n(l=>{a.value=l},"setFileSize"),r=n(async()=>{try{const l=await fetch(e,{method:"HEAD"});if(!l.ok)throw new Error("Failed to fetch file size");const u=l.headers.get("content-length");if(u)s(parseInt(u));else return console.error('"content-length" header not found'),null}catch(l){return console.error("Error fetching file size:",l),o.value=l instanceof Error?l:new Error(String(l)),null}},"fetchFileSize"),i=n(()=>{const l=document.createElement("a");e.includes("huggingface.co")&&o.value?l.href=$h(e):(l.href=e,l.download=t||e.split("/").pop()||"download"),l.target="_blank",l.rel="noopener noreferrer",l.click()},"triggerBrowserDownload");return it(()=>{if(Oh(e)){const{fileSize:l,error:u}=U3(e);Mt(l,s),Mt(u,r,{once:!0})}else r()}),{triggerBrowserDownload:i,fileSize:a}}n(Lm,"useDownload");var W3={class:"flex flex-col"},z3={class:"flex flex-row items-center gap-2"},V3={key:0,class:"pi pi-check text-green-500"},G3={class:"file-info"},H3={class:"file-details"},j3=["title"],K3={key:0,class:"file-error"},Y3={class:"file-action flex flex-row items-center gap-2"},q3={key:0,class:"flex flex-row items-center gap-2"},X3=J({__name:"ElectronFileDownload",props:{url:{},hint:{},label:{},error:{}},setup(e){const t=e,{t:a}=Fe(),o=E(()=>t.label||t.url.split("/").pop()),s=E(()=>t.hint||t.url),r=Lm(t.url),i=A(0),l=A(null),u=E(()=>r.fileSize.value?rr(r.fileSize.value):"?"),{copyToClipboard:c}=sn(),d=gr(),[p,f]=t.label.split("/");d.$subscribe((S,{downloads:_})=>{const I=_.find(w=>t.url===w.url);I&&(i.value=Number((I.progress*100).toFixed(1)),l.value=I.status)});const g=n(async()=>{await d.start({url:t.url,savePath:p.trim(),filename:f.trim()})},"triggerDownload"),m=n(()=>d.cancel(t.url),"triggerCancelDownload"),h=n(()=>d.pause(t.url),"triggerPauseDownload"),y=n(()=>d.resume(t.url),"triggerResumeDownload"),k=n(async()=>{await c(t.url)},"copyURL");return(S,_)=>{const I=ht("tooltip");return C(),P("div",W3,[v("div",z3,[l.value==="completed"?(C(),P("i",V3)):H("",!0),v("div",G3,[v("div",H3,[v("span",{class:"file-type",title:s.value},$(o.value),9,j3)]),t.error?(C(),P("div",K3,$(t.error),1)):H("",!0)]),v("div",Y3,[l.value===null||l.value==="error"?(C(),X(se,{key:0,class:"file-action-button",variant:"secondary",size:"sm",disabled:!!t.error,onClick:g},{default:W(()=>[_[0]||(_[0]=v("i",{class:"pi pi-download"},null,-1)),fe(" "+$(S.$t("g.download")+" ("+u.value+")"),1)]),_:1},8,["disabled"])):H("",!0),(l.value===null||l.value==="error")&&t.url?(C(),X(se,{key:1,variant:"secondary",size:"sm",onClick:k},{default:W(()=>[fe($(S.$t("g.copyURL")),1)]),_:1})):H("",!0)])]),l.value==="in_progress"||l.value==="paused"?(C(),P("div",q3,[R(b(sd),{class:"flex-1",value:i.value,"show-value":i.value>10},null,8,["value","show-value"]),l.value==="in_progress"?ze((C(),X(se,{key:0,class:"file-action-button",variant:"secondary",size:"sm",disabled:!!t.error,onClick:h},{default:W(()=>_[1]||(_[1]=[v("i",{class:"pi pi-pause-circle"},null,-1)])),_:1},8,["disabled"])),[[I,b(a)("electronFileDownload.pause"),void 0,{top:!0}]]):H("",!0),l.value==="paused"?ze((C(),X(se,{key:1,class:"file-action-button",variant:"secondary",size:"sm","aria-label":b(a)("electronFileDownload.resume"),disabled:!!t.error,onClick:y},{default:W(()=>_[2]||(_[2]=[v("i",{class:"pi pi-play-circle"},null,-1)])),_:1},8,["aria-label","disabled"])),[[I,b(a)("electronFileDownload.resume"),void 0,{top:!0}]]):H("",!0),ze((C(),X(se,{class:"file-action-button",variant:"destructive",size:"sm","aria-label":b(a)("electronFileDownload.cancel"),disabled:!!t.error,onClick:m},{default:W(()=>_[3]||(_[3]=[v("i",{class:"pi pi-times-circle"},null,-1)])),_:1},8,["aria-label","disabled"])),[[I,b(a)("electronFileDownload.cancel"),void 0,{top:!0}]])])):H("",!0)])}}}),Z3=X3,J3={class:"flex flex-row items-center gap-2"},Q3=["title"],eB=J({__name:"FileDownload",props:{url:{},hint:{},label:{},error:{}},setup(e){const t=e,a=E(()=>t.label||t.url.split("/").pop()),o=E(()=>t.hint||t.url),s=Lm(t.url),r=E(()=>s.fileSize.value?rr(s.fileSize.value):"?"),i=n(async()=>{await l(t.url)},"copyURL"),{copyToClipboard:l}=sn();return(u,c)=>(C(),P("div",J3,[v("div",null,[v("div",null,[v("span",{title:o.value},$(a.value),9,Q3)]),t.error?(C(),X(b(Ea),{key:0,severity:"error",icon:"pi pi-exclamation-triangle",size:"small",variant:"outlined",class:"my-2 h-min max-w-xs px-1",title:t.error,pt:{text:{class:"overflow-hidden text-ellipsis"}}},{default:W(()=>[fe($(t.error),1)]),_:1},8,["title"])):H("",!0)]),v("div",null,[R(se,{variant:"secondary",disabled:!!t.error,title:t.url,onClick:b(s).triggerBrowserDownload},{default:W(()=>[fe($(u.$t("g.download")+" ("+r.value+")"),1)]),_:1},8,["disabled","title","onClick"])]),v("div",null,[R(se,{variant:"secondary",disabled:!!t.error,onClick:i},{default:W(()=>[fe($(u.$t("g.copyURL")),1)]),_:1},8,["disabled"])])]))}}),tB=eB,aB={class:"mb-4 flex gap-1"},oB={for:"doNotAskAgain"},nB=J({__name:"MissingModelsWarning",props:{missingModels:{},paths:{}},setup(e){const t=["https://civitai.com/","https://huggingface.co/","http://localhost:"],a=[".safetensors",".sft"],o=new Set(["https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt","https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_depth_sd14v1.pth?download=true","https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth"]),s=e,{t:r}=Fe(),i=A(!1),l=A({}),u=E(()=>s.missingModels.map(c=>{const d=s.paths[c.directory];if(c.directory_invalid||!d)return{label:`${c.directory} / ${c.name}`,url:c.url,error:"Invalid directory specified (does this require custom nodes?)"};const p=l.value[c.name]??{downloading:!1,completed:!1,progress:0,error:null,name:c.name,directory:c.directory,url:c.url,folder_path:d[0]};if(l.value[c.name]=p,!o.has(c.url)){if(!t.some(f=>c.url.startsWith(f)))return{label:`${c.directory} / ${c.name}`,url:c.url,error:`Download not allowed from source '${c.url}', only allowed from '${t.join("', '")}'`};if(!a.some(f=>c.name.endsWith(f)))return{label:`${c.directory} / ${c.name}`,url:c.url,error:`Only allowed suffixes are: '${a.join("', '")}'`}}return{url:c.url,label:`${c.directory} / ${c.name}`,downloading:p.downloading,completed:p.completed,progress:p.progress,error:p.error,name:c.name,paths:d,folderPath:p.folder_path}}));return Wa(async()=>{i.value&&await Me().set("Comfy.Workflow.ShowMissingModelsWarning",!1)}),(c,d)=>(C(),P(Se,null,[R(Va,{class:"pb-0",icon:"pi pi-exclamation-circle",title:b(r)("missingModelsDialog.missingModels"),message:b(r)("missingModelsDialog.missingModelsMessage")},null,8,["title","message"]),v("div",aB,[R(b(Wi),{modelValue:i.value,"onUpdate:modelValue":d[0]||(d[0]=p=>i.value=p),binary:"","input-id":"doNotAskAgain"},null,8,["modelValue"]),v("label",oB,$(b(r)("missingModelsDialog.doNotAskAgain")),1)]),R(b(Fi),{options:u.value,class:"comfy-missing-models"},{option:W(({option:p})=>[b(Qa)()?(C(),X(vd,{key:0},{default:W(()=>[R(Z3,{url:p.url,label:p.label,error:p.error},null,8,["url","label","error"])]),_:2},1024)):(C(),X(tB,{key:1,url:p.url,label:p.label,error:p.error},null,8,["url","label","error"]))]),_:1},8,["options"])],64))}}),sB=ot(nB,[["__scopeId","data-v-520e7481"]]),rB={class:"prompt-dialog-content flex flex-col gap-2 pt-8"},iB=J({__name:"PromptDialogContent",props:{message:{},defaultValue:{},onConfirm:{type:Function},placeholder:{}},setup(e){const t=e,a=A(t.defaultValue),o=n(()=>{t.onConfirm(a.value),Ct().closeDialog()},"onConfirm"),s=A(),r=n(()=>{if(!s.value)return;const i=s.value.$el;i.setSelectionRange(0,i.value.length)},"selectAllText");return(i,l)=>(C(),P("div",rB,[R(b(Km),null,{default:W(()=>[R(b(ca),{ref_key:"inputRef",ref:s,modelValue:a.value,"onUpdate:modelValue":l[0]||(l[0]=u=>a.value=u),placeholder:i.placeholder,autofocus:"",onKeyup:Ja(o,["enter"]),onFocus:r},null,8,["modelValue","placeholder"]),v("label",null,$(i.message),1)]),_:1}),R(se,{onClick:o},{default:W(()=>[fe($(i.$t("g.confirm")),1)]),_:1})]))}}),lB=iB,uB=""+new URL("images/comfy-logo-mono.svg",import.meta.url).href,cB=["localhost"];function Ni(e){let t=(e||"").trim().toLowerCase();t=t.replace(/\.$/,"");const a=t.match(/^\[([^\]]+)\]:(\d+)$/);if(a)t=a[1];else{const o=t.match(/^([^:]+):(\d+)$/);o&&(t=o[1])}return t=t.replace(/^\[|\]$/g,""),t}n(Ni,"normalizeHost");function dB(e){const t=Ni(e);return pB(t)||mB(t)||vB(t)||wB(t)?!0:cB.map(Ni).includes(t)}n(dB,"isHostWhitelisted");function pB(e){return e==="localhost"||e.endsWith(".localhost")}n(pB,"isLocalhostLabel");var fB=new RegExp("^127\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|0?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|0?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|0?\\d?\\d)$");function mB(e){return fB.test(e)}n(mB,"isIPv4Loopback");var gB=/^(?:0{1,4}:){7}0{0,3}1$/i,hB=/^((?:0{1,4}(?::0{1,4}){0,6})?)::((?:0{1,4}:){0,6})0{0,3}1$/i;function vB(e){if(gB.test(e))return!0;const t=e.match(hB);return t?(t[1]?t[1].match(/0{1,4}:/gi)?.length??0:0)+(t[2]?t[2].match(/0{1,4}:/gi)?.length??0:0)<=6:!1}n(vB,"isIPv6Loopback");var yB=/\.comfy\.org$/;function wB(e){return yB.test(e)}n(wB,"isComfyOrgHost");var bB=[200,201,301,302,307,308];const _B=n(async e=>{try{const t=await So.head(e);return bB.includes(t.status)}catch{return!1}},"checkUrlReachable");async function kB(){const e=navigator.language.toLowerCase().startsWith("zh-cn");try{if(await Promise.race([fetch("https://www.google.com",{mode:"no-cors",cache:"no-cache"}),new Promise((t,a)=>setTimeout(()=>a(),2e3))]))return!1}catch{if(e)return!0;try{const t=performance.now();return await fetch("https://www.baidu.com",{mode:"no-cors",cache:"no-cache"}),performance.now()-t<150}catch{return e}}return!1}n(kB,"isInChina");const CB=U.object({apiKey:U.string().trim().startsWith("comfyui-",G("validation.prefix",{prefix:"comfyui-"})).length(72,G("validation.length",{length:72}))}),xB=U.object({email:U.string().email(G("validation.invalidEmail")).min(1,G("validation.required")),password:U.string().min(1,G("validation.required"))});var Om=U.object({password:U.string().min(8,G("validation.minLength",{length:8})).max(32,G("validation.maxLength",{length:32})).regex(/[A-Z]/,G("validation.password.uppercase")).regex(/[a-z]/,G("validation.password.lowercase")).regex(/\d/,G("validation.password.number")).regex(/[^A-Za-z0-9]/,G("validation.password.special")),confirmPassword:U.string().min(1,G("validation.required"))});const IB=Om.refine(e=>e.password===e.confirmPassword,{message:G("validation.password.match"),path:["confirmPassword"]}),SB=Om.extend({email:U.string().email(G("validation.invalidEmail")).min(1,G("validation.required"))}).refine(e=>e.password===e.confirmPassword,{message:G("validation.password.match"),path:["confirmPassword"]});var EB={class:"flex flex-col gap-6"},TB={class:"mb-8 flex flex-col gap-4"},AB={class:"my-0 text-2xl leading-normal font-medium"},MB={class:"flex flex-col gap-2"},PB={class:"my-0 text-base text-muted"},DB={href:"https://docs.comfy.org/interface/user#logging-in-with-an-api-key",target:"_blank",class:"cursor-pointer text-blue-500"},LB={class:"flex flex-col gap-2"},OB={class:"mb-2 text-base font-medium opacity-80",for:"comfy-org-api-key"},NB={class:"flex flex-col gap-2"},$B={class:"text-muted"},RB=["href"],BB={href:"https://docs.comfy.org/tutorials/api-nodes/overview#log-in-with-api-key-on-non-whitelisted-websites",target:"_blank",class:"cursor-pointer text-blue-500"},FB={class:"mt-4 flex items-center justify-between"},UB=J({__name:"ApiKeyForm",emits:["back","success"],setup(e,{emit:t}){const a=Pa(),o=Gn(),s=E(()=>a.loading),r=E(()=>or(Eo.value,"comfy_platform_base_url",nl())),{t:i}=Fe(),l=t,u=n(async c=>{c.valid&&(await o.storeApiKey(c.values.apiKey),l("success"))},"onSubmit");return(c,d)=>(C(),P("div",EB,[v("div",TB,[v("h1",AB,$(b(i)("auth.apiKey.title")),1),v("div",MB,[v("p",PB,$(b(i)("auth.apiKey.description")),1),v("a",DB,$(b(i)("g.learnMore")),1)])]),R(b(Qs),{class:"flex flex-col gap-6",resolver:b(er)(b(CB)),onSubmit:u},{default:W(p=>[p.apiKey?.invalid?(C(),X(b(Ea),{key:0,severity:"error",class:"mb-4"},{default:W(()=>[fe($(p.apiKey.error.message),1)]),_:2},1024)):H("",!0),v("div",LB,[v("label",OB,$(b(i)("auth.apiKey.label")),1),v("div",NB,[R(b(ca),{"pt:root:id":"comfy-org-api-key","pt:root:autocomplete":"off",class:"h-10",name:"apiKey",type:"password",placeholder:b(i)("auth.apiKey.placeholder"),invalid:p.apiKey?.invalid},null,8,["placeholder","invalid"]),v("small",$B,[fe($(b(i)("auth.apiKey.helpText"))+" ",1),v("a",{href:`${r.value}/login`,target:"_blank",class:"cursor-pointer text-blue-500"},$(b(i)("auth.apiKey.generateKey")),9,RB),d[1]||(d[1]=v("span",{class:"mx-1"},"•",-1)),v("a",BB,$(b(i)("auth.apiKey.whitelistInfo")),1)])])]),v("div",FB,[R(se,{type:"button",variant:"textonly",onClick:d[0]||(d[0]=f=>c.$emit("back"))},{default:W(()=>[fe($(b(i)("g.back")),1)]),_:1}),R(se,{type:"submit",variant:"primary",loading:s.value,disabled:s.value},{default:W(()=>[fe($(b(i)("g.save")),1)]),_:1},8,["loading","disabled"])])]),_:1},8,["resolver"])]))}}),WB=UB,zB={class:"flex flex-col gap-2"},VB={key:0,class:"text-red-500"},GB={class:"flex flex-col gap-2"},HB={class:"mb-2 flex items-center justify-between"},jB={class:"text-base font-medium opacity-80",for:"comfy-org-sign-in-password"},KB=["onClick"],YB={key:0,class:"text-red-500"},Jr="comfy-org-sign-in-email",qB=J({__name:"SignInForm",emits:["submit"],setup(e,{emit:t}){const a=Pa(),o=To(),s=E(()=>a.loading),r=tn(),{t:i}=Fe(),l=t,u=xd(d=>{d.valid&&l("submit",d.values)},1500),c=n(async(d,p)=>{if(!d||!p){r.add({severity:"warn",summary:i("auth.login.emailPlaceholder"),life:5e3}),document.getElementById(Jr)?.focus?.();return}await o.sendPasswordReset(d)},"handleForgotPassword");return(d,p)=>(C(),X(b(Qs),{class:"flex flex-col gap-6",resolver:b(er)(b(xB)),onSubmit:b(u)},{default:W(f=>[v("div",zB,[v("label",{class:"mb-2 text-base font-medium opacity-80",for:Jr},$(b(i)("auth.login.emailLabel")),1),R(b(ca),{id:Jr,autocomplete:"email",class:"h-10",name:"email",type:"text",placeholder:b(i)("auth.login.emailPlaceholder"),invalid:f.email?.invalid},null,8,["placeholder","invalid"]),f.email?.invalid?(C(),P("small",VB,$(f.email.error.message),1)):H("",!0)]),v("div",GB,[v("div",HB,[v("label",jB,$(b(i)("auth.login.passwordLabel")),1),v("span",{class:pe(["cursor-pointer text-base font-medium text-muted select-none",{"text-link-disabled":!f.email?.value||f.email?.invalid}]),onClick:n(g=>c(f.email?.value,f.email?.valid),"onClick")},$(b(i)("auth.login.forgotPassword")),11,KB)]),R(b(oi),{"input-id":"comfy-org-sign-in-password","pt:pc-input-text:root:autocomplete":"current-password",name:"password",feedback:!1,"toggle-mask":"",placeholder:b(i)("auth.login.passwordPlaceholder"),class:pe([{"p-invalid":f.password?.invalid},"h-10"]),fluid:""},null,8,["placeholder","class"]),f.password?.invalid?(C(),P("small",YB,$(f.password.error.message),1)):H("",!0)]),s.value?(C(),X(b(Io),{key:0,class:"mx-auto h-8 w-8"})):(C(),X(se,{key:1,type:"submit",class:"mt-4 h-10 font-medium",disabled:!f.valid},{default:W(()=>[fe($(b(i)("auth.login.loginButton")),1)]),_:2},1032,["disabled"]))]),_:1},8,["resolver","onSubmit"]))}}),XB=ot(qB,[["__scopeId","data-v-7fcd01b3"]]),ZB={class:"mb-2 flex items-center justify-between"},JB={class:"text-base font-medium opacity-80",for:"comfy-org-sign-up-password"},QB={class:"flex flex-col gap-1"},e4={key:0,class:"text-sm"},t4={class:"mt-1 space-y-1"},a4={class:"mb-2 text-base font-medium opacity-80",for:"comfy-org-sign-up-confirm-password"},o4={key:0,class:"text-red-500"},n4=J({__name:"PasswordFields",setup(e){const{t}=Fe(),a=A(""),o=E(()=>({length:a.value.length>=8&&a.value.length<=32,uppercase:/[A-Z]/.test(a.value),lowercase:/[a-z]/.test(a.value),number:/\d/.test(a.value),special:/[^A-Za-z0-9]/.test(a.value)}));return(s,r)=>(C(),P(Se,null,[R(b(ai),{name:"password",class:"flex flex-col gap-2"},{default:W(i=>[v("div",ZB,[v("label",JB,$(b(t)("auth.signup.passwordLabel")),1)]),R(b(oi),{modelValue:a.value,"onUpdate:modelValue":r[0]||(r[0]=l=>a.value=l),"input-id":"comfy-org-sign-up-password","pt:pc-input-text:root:autocomplete":"new-password",name:"password",feedback:!1,"toggle-mask":"",placeholder:b(t)("auth.signup.passwordPlaceholder"),class:pe([{"p-invalid":i.invalid},"h-10"]),fluid:""},null,8,["modelValue","placeholder","class"]),v("div",QB,[i.dirty||i.invalid?(C(),P("small",e4,[fe($(b(t)("validation.password.requirements"))+": ",1),v("ul",t4,[v("li",{class:pe({"text-red-500":!o.value.length})},$(b(t)("validation.password.minLength")),3),v("li",{class:pe({"text-red-500":!o.value.uppercase})},$(b(t)("validation.password.uppercase")),3),v("li",{class:pe({"text-red-500":!o.value.lowercase})},$(b(t)("validation.password.lowercase")),3),v("li",{class:pe({"text-red-500":!o.value.number})},$(b(t)("validation.password.number")),3),v("li",{class:pe({"text-red-500":!o.value.special})},$(b(t)("validation.password.special")),3)])])):H("",!0)])]),_:1}),R(b(ai),{name:"confirmPassword",class:"flex flex-col gap-2"},{default:W(i=>[v("label",a4,$(b(t)("auth.login.confirmPasswordLabel")),1),R(b(oi),{name:"confirmPassword","input-id":"comfy-org-sign-up-confirm-password","pt:pc-input-text:root:autocomplete":"new-password",feedback:!1,"toggle-mask":"",placeholder:b(t)("auth.login.confirmPasswordPlaceholder"),class:pe([{"p-invalid":i.invalid},"h-10"]),fluid:""},null,8,["placeholder","class"]),i.error?(C(),P("small",o4,$(i.error.message),1)):H("",!0)]),_:1})],64))}}),Nm=n4,s4={class:"mb-2 text-base font-medium opacity-80",for:"comfy-org-sign-up-email"},r4={key:0,class:"text-red-500"},i4=J({__name:"SignUpForm",emits:["submit"],setup(e,{emit:t}){const{t:a}=Fe(),o=Pa(),s=E(()=>o.loading),r=t,i=xd(l=>{l.valid&&r("submit",l.values)},1500);return(l,u)=>(C(),X(b(Qs),{class:"flex flex-col gap-6",resolver:b(er)(b(SB)),onSubmit:b(i)},{default:W(c=>[R(b(ai),{name:"email",class:"flex flex-col gap-2"},{default:W(d=>[v("label",s4,$(b(a)("auth.signup.emailLabel")),1),R(b(ca),{"pt:root:id":"comfy-org-sign-up-email","pt:root:autocomplete":"email",class:"h-10",type:"text",placeholder:b(a)("auth.signup.emailPlaceholder"),invalid:d.invalid},null,8,["placeholder","invalid"]),d.error?(C(),P("small",r4,$(d.error.message),1)):H("",!0)]),_:1}),R(Nm),s.value?(C(),X(b(Io),{key:0,class:"mx-auto h-8 w-8"})):(C(),X(se,{key:1,type:"submit",class:"mt-4 h-10 font-medium",disabled:!c.valid},{default:W(()=>[fe($(b(a)("auth.signup.signUpButton")),1)]),_:2},1032,["disabled"]))]),_:1},8,["resolver","onSubmit"]))}}),l4=i4,u4={class:"w-96 overflow-x-hidden p-2"},c4={class:"mb-8 flex flex-col gap-4"},d4={class:"my-0 text-2xl leading-normal font-medium"},p4={class:"my-0 text-base"},f4={class:"text-muted"},m4={class:"text-muted"},g4={class:"flex flex-col gap-6"},h4=["alt"],v4={class:"text-center text-muted"},y4=["href"],w4={class:"mt-8 text-xs text-muted"},b4={href:"https://www.comfy.org/terms-of-service",target:"_blank",class:"cursor-pointer text-blue-500"},_4={href:"https://www.comfy.org/privacy",target:"_blank",class:"cursor-pointer text-blue-500"},k4=J({__name:"SignInContent",props:{onSuccess:{type:Function}},setup(e){const{t}=Fe(),a=To(),o=window.isSecureContext,s=A(!0),r=A(!1),i=dB(Ni(window.location.hostname)),l=E(()=>or(Eo.value,"comfy_platform_base_url",nl())),u=n(()=>{s.value=!s.value,r.value=!1},"toggleState"),c=n(async()=>{await a.signInWithGoogle()&&e.onSuccess()},"signInWithGoogle"),d=n(async()=>{await a.signInWithGithub()&&e.onSuccess()},"signInWithGithub"),p=n(async m=>{await a.signInWithEmail(m.email,m.password)&&e.onSuccess()},"signInWithEmail"),f=n(async m=>{await a.signUpWithEmail(m.email,m.password)&&e.onSuccess()},"signUpWithEmail"),g=A(!1);return it(async()=>{g.value=await kB()}),St(()=>{a.accessError.value=!1}),(m,h)=>(C(),P("div",u4,[r.value?(C(),X(WB,{key:0,onBack:h[0]||(h[0]=y=>r.value=!1),onSuccess:m.onSuccess},null,8,["onSuccess"])):(C(),P(Se,{key:1},[v("div",c4,[v("h1",d4,$(s.value?b(t)("auth.login.title"):b(t)("auth.signup.title")),1),v("p",p4,[v("span",f4,$(s.value?b(t)("auth.login.newUser"):b(t)("auth.signup.alreadyHaveAccount")),1),v("span",{class:"ml-1 cursor-pointer text-blue-500",onClick:u},$(s.value?b(t)("auth.login.signUp"):b(t)("auth.signup.signIn")),1)])]),b(o)?H("",!0):(C(),X(b(Ea),{key:0,severity:"warn",class:"mb-4"},{default:W(()=>[fe($(b(t)("auth.login.insecureContextWarning")),1)]),_:1})),s.value?(C(),X(XB,{key:1,onSubmit:p})):(C(),P(Se,{key:2},[g.value?(C(),X(b(Ea),{key:0,severity:"warn",class:"mb-4"},{default:W(()=>[fe($(b(t)("auth.signup.regionRestrictionChina")),1)]),_:1})):(C(),X(l4,{key:1,onSubmit:f}))],64)),R(b(la),{align:"center",layout:"horizontal",class:"my-8"},{default:W(()=>[v("span",m4,$(b(t)("auth.login.orContinueWith")),1)]),_:1}),v("div",g4,[b(i)?(C(),P(Se,{key:0},[R(se,{type:"button",class:"h-10",variant:"secondary",onClick:c},{default:W(()=>[h[2]||(h[2]=v("i",{class:"pi pi-google mr-2"},null,-1)),fe(" "+$(s.value?b(t)("auth.login.loginWithGoogle"):b(t)("auth.signup.signUpWithGoogle")),1)]),_:1}),R(se,{type:"button",class:"h-10",variant:"secondary",onClick:d},{default:W(()=>[h[3]||(h[3]=v("i",{class:"pi pi-github mr-2"},null,-1)),fe(" "+$(s.value?b(t)("auth.login.loginWithGithub"):b(t)("auth.signup.signUpWithGithub")),1)]),_:1})],64)):H("",!0),R(se,{type:"button",class:"h-10",variant:"secondary",onClick:h[1]||(h[1]=y=>r.value=!0)},{default:W(()=>[v("img",{src:uB,class:"mr-2 h-5 w-5",alt:m.$t("g.comfy")},null,8,h4),fe(" "+$(b(t)("auth.login.useApiKey")),1)]),_:1}),v("small",v4,[fe($(b(t)("auth.apiKey.helpText"))+" ",1),v("a",{href:`${l.value}/login`,target:"_blank",class:"cursor-pointer text-blue-500"},$(b(t)("auth.apiKey.generateKey")),9,y4)]),b(a).accessError.value?(C(),X(b(Ea),{key:1,severity:"info",icon:"pi pi-info-circle",variant:"outlined",closable:""},{default:W(()=>[fe($(b(t)("toastMessages.useApiKeyTip")),1)]),_:1})):H("",!0)]),v("p",w4,[fe($(b(t)("auth.login.termsText"))+" ",1),v("a",b4,$(b(t)("auth.login.termsLink")),1),fe(" "+$(b(t)("auth.login.andText"))+" ",1),v("a",_4,$(b(t)("auth.login.privacyLink")),1),fe(". "+$(b(t)("auth.login.questionsContactPrefix"))+" ",1),h[4]||(h[4]=v("a",{href:"mailto:hello@comfy.org",class:"cursor-pointer text-blue-500"}," hello@comfy.org",-1)),h[5]||(h[5]=fe(". "))])],64))]))}}),C4=k4,x4={minimumFractionDigits:2,maximumFractionDigits:2},I4=n(({value:e,locale:t,options:a})=>{const o={...x4,...a};return typeof o.maximumFractionDigits=="number"&&typeof o.minimumFractionDigits=="number"&&o.maximumFractionDigits<o.minimumFractionDigits&&(o.minimumFractionDigits=o.maximumFractionDigits),new Intl.NumberFormat(t,o).format(e)},"formatNumber");const S4=211/100,E4=n(e=>Math.round(e*S4),"centsToCredits"),Uo=n(e=>Math.round(e*211),"usdToCredits"),Jc=n(e=>Math.round(e/211*100)/100,"creditsToUsd"),$m=n(({value:e,locale:t,numberOptions:a})=>I4({value:e,locale:t,options:a}),"formatCredits"),d6=n(({cents:e,locale:t,numberOptions:a})=>$m({value:E4(e),locale:t,numberOptions:a}),"formatCreditsFromCents"),p6=n(({usd:e,locale:t,numberOptions:a})=>$m({value:Uo(e),locale:t,numberOptions:a}),"formatCreditsFromUsd");var T4=["for"],A4=["disabled","aria-label"],M4={class:"flex flex-1 items-center justify-center gap-0.5 overflow-hidden"},P4=["id","disabled"],D4=["disabled","aria-label"],L4=J({__name:"FormattedNumberStepper",props:_t({min:{default:0},max:{default:n(()=>1/0,"default")},step:{type:[Number,Function],default:1},formatOptions:{default:n(()=>({useGrouping:!0}),"default")},disabled:{type:Boolean,default:!1}},{modelValue:{required:!0},modelModifiers:{}}),emits:_t(["max-reached"],["update:modelValue"]),setup(e,{emit:t}){const a=t,o=rt(e,"modelValue"),s=$s(),r=A(null),i=A(u(o.value)),l=E(()=>Math.min(Math.max(i.value.length,1)+.5,9));be(o,k=>{document.activeElement!==r.value&&(i.value=u(k))});function u(k){return k.toLocaleString("en-US",e.formatOptions)}n(u,"formatNumber$1");function c(k){const S=k.replace(/[^0-9]/g,"");return S===""?0:parseInt(S,10)}n(c,"parseFormattedNumber");function d(k,S,_){return Math.min(Math.max(k,S),_)}n(d,"clamp$2");function p(k,S){const _=u(c(k)),I=k.slice(0,S).replace(/[^0-9]/g,"").length;let w=0,x=0;for(let D=0;D<_.length;D++)if(/[0-9]/.test(_[D])&&w++,w>=I){x=D+1;break}return w<I&&(x=_.length),{formatted:_,newCursor:x}}n(p,"formatWithCursor");function f(){return typeof e.step=="function"?e.step(o.value):e.step}n(f,"getStepAmount");function g(k){const S=k.target,_=S.value,I=S.selectionStart??_.length,w=c(_),x=Math.min(w,e.max),D=w>e.max;D&&a("max-reached"),o.value=x;const{formatted:T,newCursor:N}=p(D?u(x):_,D?u(x).length:I);i.value=T,requestAnimationFrame(()=>{r.value?.setSelectionRange(N,N)})}n(g,"handleInputChange");function m(){const k=d(o.value,e.min,e.max);o.value=k,i.value=u(k)}n(m,"handleInputBlur");function h(k){const S=k.target,_=S.value.length;S.setSelectionRange(_,_)}n(h,"handleInputFocus");function y(k){const S=f(),_=d(o.value+S*k,e.min,e.max);o.value=_,i.value=u(_)}return n(y,"handleStep"),(k,S)=>(C(),P("label",{for:b(s),class:pe(b(Pe)("flex h-10 cursor-text items-center rounded-lg bg-secondary-background text-secondary-foreground hover:bg-secondary-background-hover focus-within:ring-1 focus-within:ring-secondary-foreground",k.disabled&&"opacity-50 pointer-events-none"))},[v("button",{type:"button",class:"flex h-full w-8 cursor-pointer items-center justify-center rounded-l-lg border-none bg-transparent text-muted-foreground transition-colors hover:text-base-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-secondary-foreground disabled:opacity-30",disabled:k.disabled||o.value<=k.min,"aria-label":k.$t("g.decrement"),onClick:S[0]||(S[0]=_=>y(-1))},S[3]||(S[3]=[v("i",{class:"icon-[lucide--minus] size-4"},null,-1)]),8,A4),v("div",M4,[tt(k.$slots,"prefix"),ze(v("input",{id:b(s),ref_key:"inputRef",ref:r,"onUpdate:modelValue":S[1]||(S[1]=_=>i.value=_),type:"text",inputmode:"numeric",style:nt({width:`${l.value}ch`}),class:"min-w-0 rounded border-none bg-transparent text-center text-base-foreground font-medium text-lg focus-visible:outline-none",disabled:k.disabled,onInput:g,onBlur:m,onFocus:h},null,44,P4),[[io,i.value]]),tt(k.$slots,"suffix")]),v("button",{type:"button",class:"flex h-full w-8 cursor-pointer items-center justify-center rounded-r-lg border-none bg-transparent text-muted-foreground transition-colors hover:text-base-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-secondary-foreground disabled:opacity-30",disabled:k.disabled||o.value>=k.max,"aria-label":k.$t("g.increment"),onClick:S[2]||(S[2]=_=>y(1))},S[4]||(S[4]=[v("i",{class:"icon-[lucide--plus] size-4"},null,-1)]),8,D4)],10,T4))}}),Qc=L4,O4={class:"flex min-w-[460px] flex-col rounded-2xl border border-border-default bg-base-background shadow-[1px_1px_8px_0_rgba(0,0,0,0.4)]"},N4={class:"flex py-8 items-center justify-between px-8"},$4={class:"text-lg font-bold text-base-foreground m-0"},R4={key:0,class:"text-sm text-muted-foreground m-0 px-8"},B4={class:"px-8"},F4={class:"m-0 text-sm font-normal text-muted-foreground"},U4={class:"flex gap-2 pt-3"},W4={class:"flex gap-2 px-8 pt-8"},z4={class:"flex flex-1 flex-col gap-3"},V4={class:"text-sm text-muted-foreground"},G4={class:"flex flex-1 flex-col gap-3"},H4={class:"text-sm text-muted-foreground"},j4={key:1,class:"text-sm text-red-500 m-0 px-8 pt-4 text-center flex items-center justify-center gap-1"},K4={key:2,class:"text-sm text-gold-500 m-0 px-8 pt-4 text-center flex items-center justify-center gap-1"},Y4={href:"https://www.comfy.org/cloud/enterprise",target:"_blank",class:"ml-1 text-inherit"},q4={class:"pt-8 pb-8 flex flex-col gap-8 px-8"},X4={class:"flex items-center justify-center gap-1"},Z4=["href"],Qr=5,ys=1e4,J4=J({__name:"TopUpCreditsDialogContent",props:{isInsufficientCredits:{type:Boolean,default:!1}},setup(e){const{t}=Fe(),a=To(),o=Ct(),s=pt(),r=yt(),i=tn(),{buildDocsUrl:l,docsPaths:u}=nr(),{isSubscriptionEnabled:c}=nn(),d=[10,25,50,100],p=A(50),f=A(50),g=A(!1),m=A(!1),h=E(()=>l(u.partnerNodesPricing,{includeLocale:!0})),y=E({get:n(()=>Uo(f.value),"get"),set:n(M=>{f.value=Math.round(Jc(M)),p.value=null},"set")}),k=E(()=>f.value>=Qr&&f.value<=ys),S=E(()=>f.value<Qr);function _(M){return M.toLocaleString("en-US")}n(_,"formatNumber$1");function I(M){return M<100?5:M<1e3?50:100}n(I,"getStepAmount");function w(M){return Uo(I(Jc(M)))}n(w,"getCreditsStepAmount");function x(M){f.value=M,p.value=null,g.value=!1}n(x,"handlePayAmountChange");function D(M){g.value=!1,f.value=M,p.value=M}n(D,"handlePresetClick");function T(M=!0){M&&Jd(),o.closeDialog({key:"top-up-credits"})}n(T,"handleClose");async function N(){if(!(m.value||!k.value)){m.value=!0;try{r?.trackApiCreditTopupButtonPurchaseClicked(f.value),await a.purchaseCredits(f.value),T(!1),s.showSettingsDialog(c()?"subscription":"credits")}catch(M){console.error("Purchase failed:",M);const O=M instanceof Error?M.message:t("credits.topUp.unknownError");i.add({severity:"error",summary:t("credits.topUp.purchaseError"),detail:t("credits.topUp.purchaseErrorDetail",{error:O}),life:5e3})}finally{m.value=!1}}}return n(N,"handleBuy"),(M,O)=>(C(),P("div",O4,[v("div",N4,[v("h2",$4,$(M.isInsufficientCredits?M.$t("credits.topUp.addMoreCreditsToRun"):M.$t("credits.topUp.addMoreCredits")),1),v("button",{class:"cursor-pointer rounded border-none bg-transparent p-0 text-muted-foreground transition-colors hover:text-base-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-secondary-foreground",onClick:O[0]||(O[0]=()=>T())},O[4]||(O[4]=[v("i",{class:"icon-[lucide--x] size-6"},null,-1)]))]),M.isInsufficientCredits?(C(),P("p",R4,$(M.$t("credits.topUp.insufficientWorkflowMessage")),1)):H("",!0),v("div",B4,[v("h3",F4,$(M.$t("credits.topUp.selectAmount")),1),v("div",U4,[(C(),P(Se,null,Ze(d,L=>R(se,{key:L,autofocus:L===50,variant:"secondary",size:"lg",class:pe(b(Pe)("h-10 text-base font-medium w-full focus-visible:ring-secondary-foreground",p.value===L&&"bg-secondary-background-selected")),onClick:n(F=>D(L),"onClick")},{default:W(()=>[fe(" $"+$(L),1)]),_:2},1032,["autofocus","class","onClick"])),64))])]),v("div",W4,[v("div",z4,[v("div",V4,$(M.$t("credits.topUp.youPay")),1),R(Qc,{"model-value":f.value,min:0,max:ys,step:I,"onUpdate:modelValue":x,onMaxReached:O[1]||(O[1]=L=>g.value=!0)},{prefix:W(()=>O[5]||(O[5]=[v("span",{class:"shrink-0 text-base font-semibold text-base-foreground"},"$",-1)])),_:1},8,["model-value"])]),v("div",G4,[v("div",H4,$(M.$t("credits.topUp.youGet")),1),R(Qc,{modelValue:y.value,"onUpdate:modelValue":O[2]||(O[2]=L=>y.value=L),min:0,max:b(Uo)(ys),step:w,onMaxReached:O[3]||(O[3]=L=>g.value=!0)},{prefix:W(()=>O[6]||(O[6]=[v("i",{class:"icon-[lucide--component] size-4 shrink-0 text-gold-500"},null,-1)])),_:1},8,["modelValue","max"])])]),S.value?(C(),P("p",j4,[O[7]||(O[7]=v("i",{class:"icon-[lucide--component] size-4"},null,-1)),fe(" "+$(M.$t("credits.topUp.minRequired",{credits:_(b(Uo)(Qr))})),1)])):H("",!0),g.value?(C(),P("p",K4,[O[8]||(O[8]=v("i",{class:"icon-[lucide--component] size-4"},null,-1)),fe(" "+$(M.$t("credits.topUp.maxAllowed",{credits:_(b(Uo)(ys))}))+" ",1),v("span",null,$(M.$t("credits.topUp.needMore")),1),v("a",Y4,$(M.$t("credits.topUp.contactUs")),1)])):H("",!0),v("div",q4,[R(se,{disabled:!k.value||m.value,loading:m.value,variant:"primary",size:"lg",class:"h-10 justify-center",onClick:N},{default:W(()=>[fe($(M.$t("credits.topUp.buyCredits")),1)]),_:1},8,["disabled","loading"]),v("div",X4,[v("a",{href:h.value,target:"_blank",class:"flex items-center gap-1 text-sm text-muted-foreground no-underline transition-colors hover:text-base-foreground"},[fe($(M.$t("credits.topUp.viewPricing"))+" ",1),O[9]||(O[9]=v("i",{class:"icon-[lucide--external-link] size-4"},null,-1))],8,Z4)])])]))}}),Q4=J4,eF=J({__name:"UpdatePasswordContent",props:{onSuccess:{type:Function}},setup(e){const t=To(),a=A(!1),o=n(async s=>{if(s.valid){a.value=!0;try{await t.updatePassword(s.values.password),e.onSuccess()}finally{a.value=!1}}},"onSubmit");return(s,r)=>(C(),X(b(Qs),{class:"flex w-96 flex-col gap-6",resolver:b(er)(b(IB)),onSubmit:o},{default:W(()=>[R(Nm),R(se,{type:"submit",class:"mt-4 h-10 font-medium",loading:a.value},{default:W(()=>[fe($(s.$t("userSettings.updatePassword")),1)]),_:1},8,["loading"])]),_:1},8,["resolver"]))}}),tF=eF,aF=""+new URL("images/comfy-logo-single.svg",import.meta.url).href,oF={},nF={class:"px-2 py-4"},sF=["alt"];function rF(e,t){return C(),P("div",nF,[v("img",{src:aF,alt:e.$t("g.comfyOrgLogoAlt"),width:"32",height:"32"},null,8,sF)])}n(rF,"_sfc_render$2");var ei=ot(oF,[["render",rF]]),ed=!1;const iF=E(()=>qe?Eo.value.firebase_config?.projectId?.includes("-dev")??ed:ed);var lF={class:"px-4"},uF=J({__name:"SettingDialogHeader",setup(e){return(t,a)=>(C(),P("div",null,[v("h2",lF,[a[0]||(a[0]=v("i",{class:"pi pi-cog"},null,-1)),v("span",null,$(t.$t("g.settings")),1),b(iF)?(C(),X(b(Mn),{key:0,value:"staging",severity:"warn",class:"ml-2 text-xs"})):H("",!0)])]))}}),td=ot(uF,[["__scopeId","data-v-dcb7c822"]]),cF={class:"flex items-center justify-between"},dF={"data-testid":"current-user-indicator"},pF=J({__name:"CurrentUserMessage",setup(e){const t=bv(),a=n(async()=>{await t.logout(),window.location.reload()},"logout");return(o,s)=>b(t).isMultiUserServer?(C(),X(b(Ea),{key:0,severity:"info",icon:"pi pi-user","pt:text":"w-full"},{default:W(()=>[v("div",cF,[v("div",dF,$(o.$t("g.currentUser"))+": "+$(b(t).currentUser?.username),1),R(se,{class:"text-inherit",variant:"textonly",size:"icon","aria-label":o.$t("menuLabels.Sign Out"),onClick:a},{default:W(()=>s[0]||(s[0]=[v("i",{class:"pi pi-sign-out"},null,-1)])),_:1},8,["aria-label"])])]),_:1})):H("",!0)}}),fF=pF,mF={class:"flex items-center justify-between"},gF={class:"actions"},hF=J({__name:"ColorPaletteMessage",setup(e){const t=Me(),a=za(),o=vp(),{palettes:s,activePaletteId:r}=Vn(a),i=n(async()=>{const l=await o.importColorPalette();l&&await t.set("Comfy.ColorPalette",l.id)},"importCustomPalette");return(l,u)=>(C(),X(b(Ea),{severity:"info",icon:"pi pi-palette","pt:text":"w-full"},{default:W(()=>[v("div",mF,[v("div",null,$(l.$t("settingsCategories.ColorPalette")),1),v("div",gF,[R(b(Aa),{modelValue:b(r),"onUpdate:modelValue":u[0]||(u[0]=c=>ua(r)?r.value=c:null),class:"w-44",options:b(s),"option-label":"name","option-value":"id"},null,8,["modelValue","options"]),R(se,{size:"icon",variant:"textonly",title:l.$t("g.export"),onClick:u[1]||(u[1]=c=>b(o).exportColorPalette(b(r)))},{default:W(()=>u[3]||(u[3]=[v("i",{class:"pi pi-file-export"},null,-1)])),_:1},8,["title"]),R(se,{size:"icon",variant:"textonly",title:l.$t("g.import"),onClick:i},{default:W(()=>u[4]||(u[4]=[v("i",{class:"pi pi-file-import"},null,-1)])),_:1},8,["title"]),R(se,{size:"icon",variant:"destructive-textonly",title:l.$t("g.delete"),disabled:!b(a).isCustomPalette(b(r)),onClick:u[2]||(u[2]=c=>b(o).deleteCustomColorPalette(b(r)))},{default:W(()=>u[5]||(u[5]=[v("i",{class:"pi pi-trash"},null,-1)])),_:1},8,["title","disabled"])])])]),_:1}))}}),vF=hF,yF={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"};function wF(e,t){return C(),P("svg",yF,[...t[0]||(t[0]=[v("path",{fill:"currentColor",d:"M5 21q-1.275 0-1.812-1.137t.262-2.113L9 11V5H8q-.425 0-.712-.288T7 4t.288-.712T8 3h8q.425 0 .713.288T17 4t-.288.713T16 5h-1v6l5.55 6.75q.8.975.263 2.113T19 21zm2-3h10l-3.4-4h-3.2zm-2 1h14l-6-7.3V5h-2v6.7zm7-7"},null,-1)])])}n(wF,"render");var bF=bt({name:"material-symbols-experiment-outline",render:wF}),_F={class:"flex gap-2"},kF=J({__name:"BackgroundImageUpload",props:{modelValue:{},modelModifiers:{}},emits:["update:modelValue"],setup(e){const t=rt(e,"modelValue"),a=A(null),o=A(!1),s=n(()=>{a.value?.click()},"triggerFileInput"),r=n(async u=>{const c=new FormData;c.append("image",u),c.append("subfolder","backgrounds");const d=await oe.fetchApi("/upload/image",{method:"POST",body:c});if(d.status!==200)return Oe().addAlert(`Upload failed: ${d.status} - ${d.statusText}`),null;const p=await d.json();return p.subfolder?`${p.subfolder}/${p.name}`:p.name},"uploadFile$2"),i=n(async u=>{const c=u.target;if(c.files&&c.files[0]){const d=c.files[0];o.value=!0;try{const p=await r(d);p&&(t.value=`/api/view?${new URLSearchParams({filename:p,type:"input",subfolder:"backgrounds"}).toString()}`)}catch(p){Oe().addAlert(`Upload error: ${String(p)}`)}finally{o.value=!1}}},"handleFileUpload"),l=n(()=>{t.value="",a.value&&(a.value.value="")},"clearImage");return(u,c)=>{const d=ht("tooltip");return C(),P("div",_F,[R(b(ca),{modelValue:t.value,"onUpdate:modelValue":c[0]||(c[0]=p=>t.value=p),class:"flex-1",placeholder:u.$t("g.imageUrl")},null,8,["modelValue","placeholder"]),ze((C(),X(se,{variant:"secondary",size:"sm","aria-label":u.$t("g.upload"),disabled:o.value,onClick:s},{default:W(()=>[v("i",{class:pe(o.value?"pi pi-spin pi-spinner":"pi pi-upload")},null,2)]),_:1},8,["aria-label","disabled"])),[[d,u.$t("g.upload")]]),ze((C(),X(se,{variant:"destructive",size:"sm","aria-label":u.$t("g.clear"),disabled:!t.value,onClick:l},{default:W(()=>c[1]||(c[1]=[v("i",{class:"pi pi-trash"},null,-1)])),_:1},8,["aria-label","disabled"])),[[d,u.$t("g.clear")]]),v("input",{ref_key:"fileInput",ref:a,type:"file",class:"hidden",accept:"image/*",onChange:i},null,544)])}}}),CF=kF,xF=J({__name:"CustomFormValue",props:{renderFunction:{type:Function}},setup(e){const t=e,a=A(null);function o(){if(a.value){a.value.innerHTML="";const s=t.renderFunction();a.value.appendChild(s)}}return n(o,"renderContent"),it(o),be(()=>t.renderFunction,o),(s,r)=>(C(),P("div",{ref_key:"container",ref:a},null,512))}}),IF=xF,SF={class:"color-picker-wrapper flex items-center gap-2"},EF=J({inheritAttrs:!1,__name:"FormColorPicker",props:_t({label:{}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=rt(e,"modelValue");return(a,o)=>(C(),P("div",SF,[R(b(id),Ht({modelValue:t.value,"onUpdate:modelValue":o[0]||(o[0]=s=>t.value=s)},a.$attrs),null,16,["modelValue"]),R(b(ca),{modelValue:t.value,"onUpdate:modelValue":o[1]||(o[1]=s=>t.value=s),class:"w-28",placeholder:a.label},null,8,["modelValue","placeholder"])]))}}),TF=EF,AF={class:"image-upload-wrapper"},MF={class:"flex items-center gap-2"},PF=["src"],DF={key:1,class:"pi pi-image text-xl text-smoke-400"},LF={class:"flex flex-col gap-2"},OF=J({__name:"FormImageUpload",props:{modelValue:{}},emits:["update:modelValue"],setup(e,{emit:t}){const a=t,o=A(null),s=n(()=>{o.value?.click()},"triggerFileInput"),r=n(l=>{const u=l.target;if(u.files&&u.files[0]){const c=u.files[0],d=new FileReader;d.onload=p=>{a("update:modelValue",p.target?.result)},d.readAsDataURL(c)}},"handleFileUpload"),i=n(()=>{a("update:modelValue",""),o.value&&(o.value.value="")},"clearImage");return(l,u)=>(C(),P("div",AF,[v("div",MF,[v("div",{class:pe(["preview-box flex h-16 w-16 items-center justify-center rounded border p-2",{"bg-base-background":!l.modelValue}])},[l.modelValue?(C(),P("img",{key:0,src:l.modelValue,class:"max-h-full max-w-full object-contain"},null,8,PF)):(C(),P("i",DF))],2),v("div",LF,[R(se,{size:"sm",onClick:s},{default:W(()=>[u[0]||(u[0]=v("i",{class:"pi pi-upload"},null,-1)),fe(" "+$(l.$t("g.upload")),1)]),_:1}),l.modelValue?(C(),X(se,{key:0,class:"w-full",variant:"destructive",size:"sm","aria-label":l.$t("g.delete"),onClick:i},{default:W(()=>u[1]||(u[1]=[v("i",{class:"pi pi-trash"},null,-1)])),_:1},8,["aria-label"])):H("",!0)])]),v("input",{ref_key:"fileInput",ref:o,type:"file",class:"hidden",accept:"image/*",onChange:r},null,544)]))}}),NF=OF,$F={class:"flex flex-row gap-4"},RF=["for"],BF=J({__name:"FormRadioGroup",props:{modelValue:{},options:{},optionLabel:{},optionValue:{},id:{}},emits:["update:modelValue"],setup(e){const t=e,a=E(()=>t.options?t.options.map(o=>typeof o=="string"?{text:o,value:o}:"text"in o?{text:o.text,value:o.value??o.text}:{text:o[t.optionLabel||"text"]||"Unknown",value:o[t.optionValue||"value"]}):[]);return(o,s)=>(C(),P("div",$F,[(C(!0),P(Se,null,Ze(a.value,r=>(C(),P("div",{key:r.value,class:"flex items-center"},[R(b(Hm),{"input-id":`${o.id}-${r.value}`,name:o.id,value:r.value,"model-value":o.modelValue,"aria-describedby":`${r.text}-label`,"onUpdate:modelValue":s[0]||(s[0]=i=>o.$emit("update:modelValue",i))},null,8,["input-id","name","value","model-value","aria-describedby"]),v("label",{for:`${o.id}-${r.value}`,class:"ml-2 cursor-pointer"},$(r.text),9,RF)]))),128))]))}}),FF=BF,UF={class:"input-knob flex flex-row items-center gap-2"},WF=J({inheritAttrs:!1,__name:"InputKnob",props:{modelValue:{},inputClass:{},knobClass:{},min:{},max:{},step:{},resolution:{}},emits:["update:modelValue"],setup(e,{emit:t}){const a=e,o=t,s=A(a.modelValue);be(()=>a.modelValue,l=>{s.value=l});const r=n(l=>{l===null&&(l=Number(a.min)||0);const u=Number(a.min??Number.NEGATIVE_INFINITY),c=Number(a.max??Number.POSITIVE_INFINITY),d=Number(a.step)||1;l=Math.max(u,Math.min(c,l)),l=Math.round(l/d)*d,s.value=l,o("update:modelValue",l)},"updateValue"),i=n(l=>{r(l);const u=(a.step??1).toString(),c=u.includes(".")?u.split(".")[1].length:0;return l.toFixed(a.resolution??c)},"displayValue");return(l,u)=>(C(),P("div",UF,[R(b(Ym),Ht({"model-value":l.modelValue,"value-template":i,class:["knob-part",l.knobClass],min:l.min,max:l.max,step:l.step},l.$attrs,{"onUpdate:modelValue":r}),null,16,["model-value","class","min","max","step"]),R(b(Ri),{"model-value":l.modelValue,class:pe(["input-part",l.inputClass]),"max-fraction-digits":3,min:l.min,max:l.max,step:l.step,"allow-empty":!1,"onUpdate:modelValue":r},null,8,["model-value","class","min","max","step"])]))}}),zF=WF,VF={class:"input-slider flex flex-row items-center gap-2"},GF=J({inheritAttrs:!1,__name:"InputSlider",props:{modelValue:{},inputClass:{},sliderClass:{},min:{},max:{},step:{}},emits:["update:modelValue"],setup(e,{emit:t}){const a=e,o=t,s=A(a.modelValue);be(()=>a.modelValue,i=>{s.value=i});const r=n(i=>{i===null&&(i=Number(a.min)||0);const l=Number(a.min??Number.NEGATIVE_INFINITY),u=Number(a.max??Number.POSITIVE_INFINITY),c=Number(a.step)||1;i=Math.max(l,Math.min(u,i)),i=Math.round(i/c)*c,s.value=i,o("update:modelValue",i)},"updateValue");return(i,l)=>(C(),P("div",VF,[R(b(Bi),Ht({"model-value":i.modelValue,class:["slider-part",i.sliderClass],min:i.min,max:i.max,step:i.step},i.$attrs,{"onUpdate:modelValue":l[0]||(l[0]=u=>r(u))}),null,16,["model-value","class","min","max","step"]),R(b(Ri),{"model-value":i.modelValue,class:pe(["input-part",i.inputClass]),"max-fraction-digits":3,min:i.min,max:i.max,step:i.step,"allow-empty":!1,"onUpdate:modelValue":r},null,8,["model-value","class","min","max","step"])]))}}),HF=GF;let oa=(function(e){return e.IDLE="IDLE",e.LOADING="LOADING",e.VALID="VALID",e.INVALID="INVALID",e})({});var jF=J({inheritAttrs:!1,__name:"UrlInput",props:{modelValue:{},validateUrlFn:{type:Function}},emits:["update:modelValue","state-change"],setup(e,{emit:t}){const a=e,o=t,s=A(oa.IDLE),r=n(p=>p?p.replace(/\s+/g,""):"","cleanInput"),i=A(r(a.modelValue));be(()=>a.modelValue,async p=>{i.value=r(p),await d(p)}),be(s,p=>{o("state-change",p)}),it(async()=>{await d(a.modelValue)});const l=n(p=>{i.value=r(p??""),s.value=oa.IDLE},"handleInput"),u=n(async()=>{const p=r(i.value);let f=p;try{f=new URL(p).toString()}catch{}o("update:modelValue",f)},"handleBlur"),c=n(async p=>{if(!xs(p))return!1;try{return await _B(p)}catch{return!1}},"defaultValidateUrl"),d=n(async p=>{if(s.value===oa.LOADING)return;const f=r(p);if(s.value=oa.IDLE,!!f){s.value=oa.LOADING;try{s.value=await(a.validateUrlFn??c)(f)?oa.VALID:oa.INVALID}catch{s.value=oa.INVALID}}},"validateUrl");return(p,f)=>(C(),X(b(Xm),{class:"w-full"},{default:W(()=>[R(b(ca),Ht(p.$attrs,{"model-value":i.value,class:"w-full",invalid:s.value===b(oa).INVALID,"onUpdate:modelValue":l,onBlur:u}),null,16,["model-value","invalid"]),R(b(ud),{class:pe({"pi pi-spin pi-spinner text-neutral-400":s.value===b(oa).LOADING,"pi pi-check cursor-pointer text-green-500":s.value===b(oa).VALID,"pi pi-times cursor-pointer text-red-500":s.value===b(oa).INVALID}),onClick:f[0]||(f[0]=g=>d(a.modelValue))},null,8,["class"])]),_:1}))}}),KF=jF,YF={class:"flex flex-row items-center gap-2"},qF={class:"form-label flex grow items-center"},XF=["id"],ZF={key:0,class:"pi pi-info-circle bg-transparent"},JF={class:"form-input flex justify-end"},QF=J({__name:"FormItem",props:_t({item:{},id:{},labelClass:{}},{formValue:{},formValueModifiers:{}}),emits:["update:formValue"],setup(e){const t=rt(e,"formValue"),a=e;function o(r){const i={...r.attrs||{}},l=r.type;switch(typeof l=="function"&&(i.renderFunction=()=>l(a.item.name,u=>t.value=u,t.value,r.attrs)),r.type){case"combo":case"radio":i.options=typeof r.options=="function"?r.options(t.value):r.options,typeof r.options?.[0]!="string"&&(i.optionLabel="text",i.optionValue="value");break}return i}n(o,"getFormAttrs");function s(r){if(typeof r.type=="function")return IF;switch(r.type){case"boolean":return ti;case"number":return Ri;case"slider":return HF;case"knob":return zF;case"combo":return Aa;case"radio":return FF;case"image":return NF;case"color":return TF;case"url":return KF;case"backgroundImage":return CF;default:return ca}}return n(s,"getFormComponent"),(r,i)=>{const l=ht("tooltip");return C(),P("div",YF,[v("div",qF,[v("span",{id:`${a.id}-label`,class:pe(["text-muted",a.labelClass])},[tt(r.$slots,"name-prefix",{},void 0,!0),fe(" "+$(a.item.name)+" ",1),a.item.tooltip?ze((C(),P("i",ZF,null,512)),[[l,a.item.tooltip]]):H("",!0),tt(r.$slots,"name-suffix",{},void 0,!0)],10,XF)]),v("div",JF,[(C(),X(Wn(bt(s(a.item))),Ht({id:a.id,"model-value":t.value,"onUpdate:modelValue":i[0]||(i[0]=u=>t.value=u),"aria-labelledby":`${a.id}-label`},o(a.item)),null,16,["id","model-value","aria-labelledby"]))])])}}}),eU=ot(QF,[["__scopeId","data-v-cd19ee1f"]]),tU=J({__name:"SettingItem",props:{setting:{}},setup(e){const t=e,{t:a}=Fe();function o(u){return typeof u=="function"?o(u(t.setting.value??"")):u.map(c=>{const d=typeof c=="string"?c:c.text,p=typeof c=="string"?c:c.value;return{text:a(`settings.${dt(t.setting.id)}.options.${dt(d)}`,d),value:p}})}n(o,"translateOptions");const s=E(()=>{const u=dt(t.setting.id);return{...t.setting,name:a(`settings.${u}.name`,t.setting.name),tooltip:t.setting.tooltip?De(`settings.${u}.tooltip`,t.setting.tooltip):void 0,options:t.setting.options?o(t.setting.options):void 0}}),r=Me(),i=E(()=>r.get(t.setting.id)),l=n(async u=>{const c=yt(),d=t.setting.id,p=i.value;await r.set(d,u);const f=r.get(d);p!==f&&c?.trackSettingChanged({setting_id:d,previous_value:p,new_value:f})},"updateSettingValue");return(u,c)=>{const d=bF,p=ht("tooltip");return C(),X(eU,{id:u.setting.id,item:s.value,"form-value":i.value,"onUpdate:formValue":l},{"name-prefix":W(()=>[u.setting.id==="Comfy.Locale"?(C(),X(b(Mn),{key:0,class:"pi pi-language"})):H("",!0),u.setting.experimental?ze((C(),X(b(Mn),{key:1},{icon:W(()=>[R(d)]),_:1})),[[p,{value:u.$t("g.experimental"),showDelay:600}]]):H("",!0)]),_:1},8,["id","item","form-value"])}}}),aU=tU,oU={class:"setting-group"},nU=J({__name:"SettingGroup",props:{group:{},divider:{type:Boolean}},setup(e){return(t,a)=>(C(),P("div",oU,[t.divider?(C(),X(b(la),{key:0})):H("",!0),v("h3",null,$(t.$t(`settingsCategories.${b(dt)(t.group.label)}`,t.group.label)),1),(C(!0),P(Se,null,Ze(t.group.settings.filter(o=>!o.deprecated),o=>(C(),P("div",{key:o.id,class:"setting-item mb-4"},[R(aU,{setting:o},null,8,["setting"])]))),128))]))}}),sU=nU,rU={key:0},iU=J({__name:"SettingsPanel",props:{settingGroups:{}},setup(e){const t=e;return(a,o)=>t.settingGroups.length>0?(C(),P("div",rU,[(C(!0),P(Se,null,Ze(t.settingGroups,(s,r)=>(C(),X(sU,{key:s.label,divider:r!==0,group:s},null,8,["divider","group"]))),128))])):(C(),X(Va,{key:1,icon:"pi pi-search",title:a.$t("g.noResultsFound"),message:a.$t("g.searchFailedMessage")},null,8,["title","message"]))}}),ad=iU;function lU(){const e=Me(),{shouldRenderVueNodes:t}=vr(),a=A(""),o=A([]),s=A(!1);be(a,()=>s.value=!0);const r=E(()=>new Set(o.value.map(d=>Mr(e.settingsById[d]).category))),i=E(()=>a.value.length===0),l=E(()=>!i.value&&!s.value);return{searchQuery:a,filteredSettingIds:o,searchInProgress:s,searchResultsCategories:r,queryIsEmpty:i,inSearch:l,handleSearch:n(d=>{if(!d){o.value=[];return}const p=d.toLocaleLowerCase();o.value=Object.values(e.settingsById).filter(f=>{if(f.type==="hidden"||f.deprecated||t.value&&f.hideInVueNodes)return!1;const g=f.id.toLowerCase(),m=f.name.toLowerCase(),h=De(`settings.${dt(f.id)}.name`,f.name).toLocaleLowerCase(),y=Mr(f),k=De(`settingsCategories.${dt(y.category)}`,y.category).toLocaleLowerCase(),S=De(`settingsCategories.${dt(y.subCategory)}`,y.subCategory).toLocaleLowerCase();return g.includes(p)||m.includes(p)||h.includes(p)||k.includes(p)||S.includes(p)}).map(f=>f.id),s.value=!1},"handleSearch"),getSearchResults:n(d=>{const p={};return o.value.forEach(f=>{const g=e.settingsById[f],m=Mr(g),h=m.subCategory;(d===null||d.label===m.category)&&(p[h]||(p[h]=[]),p[h].push(g))}),Object.entries(p).map(([f,g])=>({label:f,settings:g}))},"getSearchResults")}}n(lU,"useSettingSearch");function uU(e){const{t}=Fe(),{isLoggedIn:a}=Ko(),o=Me(),s=A(null),{shouldRenderVueNodes:r}=vr(),{isActiveSubscription:i}=nn(),l=E(()=>{const w=yo(Object.values(o.settingsById).filter(D=>D.type!=="hidden"&&!(r.value&&D.hideInVueNodes)),D=>D.category||D.id.split(".")),x=(w.children??[]).filter(D=>D.leaf);return x.length&&(w.children=(w.children??[]).filter(D=>!D.leaf),w.children.push({key:"Other",label:"Other",leaf:!1,children:x})),w}),u=E(()=>l.value.children??[]),c={node:{key:"about",label:"About",children:[]},component:ft(()=>ut(()=>import("./AboutPanel-lkjGFasi.js"),__vite__mapDeps([64,1,2,3,4,10,9,11,12,13]),import.meta.url))},d={node:{key:"credits",label:"Credits",children:[]},component:ft(()=>ut(()=>import("./LegacyCreditsPanel-D-CboO8k.js"),__vite__mapDeps([65,1,2,3,4,10,5,6,7,8,9,11,12,13,17,18,16,20,21,24,25]),import.meta.url))},p=!qe||!window.__CONFIG__?.subscription_required?null:{node:{key:"subscription",label:"PlanCredits",children:[]},component:ft(()=>ut(()=>import("./SubscriptionPanel-B6txX4Vm.js"),__vite__mapDeps([66,15,1,2,3,4,10,5,6,7,8,9,11,12,13,16,67,68,17,18,20,21,69,24,25,70]),import.meta.url))},f=E(()=>p?i.value:!1),g={node:{key:"user",label:"User",children:[]},component:ft(()=>ut(()=>import("./UserPanel-7N9QknQj.js"),__vite__mapDeps([71,1,2,3,4,5,6,7,8,9,10,11,12,13,72,17,18,16,20,21,24,25]),import.meta.url))},m={node:{key:"keybinding",label:"Keybinding",children:[]},component:ft(()=>ut(()=>import("./KeybindingPanel-DF-bG4iO.js"),__vite__mapDeps([73,15,1,2,3,4,10,5,6,7,8,9,11,12,13,17,18,16,20,21,74,24,25,75]),import.meta.url))},h={node:{key:"extension",label:"Extension",children:[]},component:ft(()=>ut(()=>import("./ExtensionPanel-Bzb9QtKj.js"),__vite__mapDeps([76,1,2,3,4,10,5,6,7,8,9,11,12,13,17,18,16,20,21,24,25]),import.meta.url))},y={node:{key:"server-config",label:"Server-Config",children:[]},component:ft(()=>ut(()=>import("./ServerConfigPanel-VsC6xlZJ.js"),__vite__mapDeps([77,1,2,3,4,10,5,6,7,8,9,11,12,13,17,18,16,20,21,78,24,25]),import.meta.url))},k=E(()=>[c,d,g,m,h,...Qa()?[y]:[],...f.value&&p?[p]:[]].filter(w=>w.component)),S=E(()=>{if(!e)return u.value[0];for(const w of I.value){const x=w.children?.find(D=>D.key===e);if(x)return x}return u.value[0]}),_=n(w=>({...w,translatedLabel:t(`settingsCategories.${dt(w.label)}`,w.label)}),"translateCategory"),I=E(()=>[{key:"account",label:"Account",children:[g.node,...a.value&&f.value&&p?[p.node]:[],...a.value&&!(qe&&window.__CONFIG__?.subscription_required)?[d.node]:[]].map(_)},{key:"settings",label:"Application Settings",children:u.value.map(_)},{key:"specialSettings",label:"Special Settings",children:[m.node,h.node,c.node,...Qa()?[y.node]:[]].map(_)}]);return it(()=>{s.value=S.value}),{panels:k,activeCategory:s,defaultCategory:S,groupedMenuTreeNodes:I,settingCategories:u}}n(uU,"useSettingUI");var cU={class:"settings-container"},dU=J({__name:"SettingDialogContent",props:{defaultPanel:{}},setup(e){const{activeCategory:t,defaultCategory:a,settingCategories:o,groupedMenuTreeNodes:s,panels:r}=uU(e.defaultPanel),{searchQuery:i,searchResultsCategories:l,queryIsEmpty:u,inSearch:c,handleSearch:d,getSearchResults:p}=lU(),f=To(),g=n(S=>Math.max(0,...nc(S).map(_=>_.sortOrder??0)),"getGroupSortOrder"),m=n(S=>[...S.children??[]].sort((_,I)=>{const w=g(I)-g(_);return w!==0?w:_.label.localeCompare(I.label)}).map(_=>({label:_.label,settings:nc(_).sort((I,w)=>{const x=I.sortOrder??0;return(w.sortOrder??0)-x})})),"sortedGroups"),h=n(S=>{d(S.trim()),t.value=S?null:a.value},"handleSearch"),y=E(()=>p(t.value)),k=E(()=>c.value?"Search Results":t.value?.label??"");return be(t,(S,_)=>{k.value||(t.value=_),t.value?.key==="credits"&&f.fetchBalance()}),(S,_)=>(C(),P("div",cU,[R(b(zi),{class:"settings-sidebar w-48 shrink-0 p-2 2xl:w-64"},{default:W(()=>[R(Ao,{"model-value":b(i),"onUpdate:modelValue":_[0]||(_[0]=I=>ua(i)?i.value=I:null),class:"settings-search-box mb-2 w-full",placeholder:S.$t("g.searchSettings")+"...","debounce-time":128,autofocus:"",onSearch:h},null,8,["model-value","placeholder"]),R(b(Fi),{modelValue:b(t),"onUpdate:modelValue":_[1]||(_[1]=I=>ua(t)?t.value=I:null),options:b(s),"option-label":"translatedLabel","option-group-label":"label","option-group-children":"children","scroll-height":"100%","option-disabled":n(I=>!b(u)&&!b(l).has(I.label??""),"option-disabled"),class:"w-full border-none"},{optiongroup:W(()=>[R(b(la),{class:"my-0"})]),_:1},8,["modelValue","options","option-disabled"])]),_:1}),R(b(la),{layout:"vertical",class:"mx-1 hidden md:flex 2xl:mx-4"}),R(b(la),{layout:"horizontal",class:"flex md:hidden"}),R(b(md),{value:k.value,lazy:!0,class:"settings-content h-full w-full"},{default:W(()=>[R(b(cd),{class:"settings-tab-panels h-full w-full pr-0"},{default:W(()=>[R(eu,{value:"Search Results"},{default:W(()=>[R(ad,{"setting-groups":y.value},null,8,["setting-groups"])]),_:1}),(C(!0),P(Se,null,Ze(b(o),I=>(C(),X(eu,{key:I.key,value:I.label??""},{header:W(()=>[k.value==="Comfy"?(C(),X(fF,{key:0})):H("",!0),k.value==="Appearance"?(C(),X(vF,{key:1})):H("",!0)]),default:W(()=>[R(ad,{"setting-groups":m(I)},null,8,["setting-groups"])]),_:2},1032,["value"]))),128)),(C(!0),P(Se,null,Ze(b(r),I=>(C(),X(vd,{key:I.node.key},{fallback:W(()=>[v("div",null,$(S.$t("g.loadingPanel",{panel:I.node.label})),1)]),default:W(()=>[(C(),X(Wn(I.component)))]),_:2},1024))),128))]),_:1})]),_:1},8,["value"])]))}}),od=ot(dU,[["__scopeId","data-v-54ba910a"]]),pU={class:"flex w-[490px] flex-col border-t-1 border-border-default"},fU={class:"flex h-full w-full flex-col gap-4 p-4"},mU={key:0,class:"flex flex-col gap-3"},gU=["aria-label"],hU={key:0,class:"text-xs p-4 rounded-md bg-secondary-background font-mono"},vU=J({__name:"ImportFailedNodeContent",props:{conflictedPackages:{}},setup(e){const t=E(()=>e.conflictedPackages.filter(a=>a.conflicts.some(o=>o.type==="import_failed")).map(a=>{const o=a.conflicts.find(s=>s.type==="import_failed");return o?{packageId:a.package_id,packageName:a.package_name,errorMessage:o.current_value||"Unknown import error",traceback:o.required_value||""}:{packageId:a.package_id,packageName:a.package_name,errorMessage:"Unknown import error",traceback:""}}));return(a,o)=>(C(),P("div",pU,[v("div",fU,[t.value.length>0?(C(),P("div",mU,[(C(!0),P(Se,null,Ze(t.value,s=>(C(),P("div",{key:s.packageId,class:"flex flex-col gap-2 max-h-60 overflow-x-hidden overflow-y-auto scrollbar-custom",role:"region","aria-label":`Error traceback for ${s.packageId}`,tabindex:"0"},[s.traceback||s.errorMessage?(C(),P("div",hU,$(s.traceback||s.errorMessage),1)):H("",!0)],8,gU))),128))])):H("",!0)])]))}}),yU=vU,wU={class:"flex w-full items-center justify-between px-3 pb-4"},bU={class:"flex w-full items-start justify-end gap-2 pr-1"},_U=J({__name:"ImportFailedNodeFooter",props:{conflictedPackages:{default:n(()=>[],"default")}},setup(e){const{copyToClipboard:t}=sn(),a=E(()=>{const s=[];return e.conflictedPackages.forEach(r=>{const i=r.conflicts.find(l=>l.type==="import_failed");i?.required_value&&s.push(i.required_value)}),s.join(`
|
|
245
245
|
|
|
246
246
|
`)}),o=n(()=>{t(a.value)},"handleCopyError");return(s,r)=>(C(),P("div",wU,[v("div",bU,[R(se,{variant:"secondary",onClick:o},{default:W(()=>[fe($(s.$t("importFailed.copyError")),1)]),_:1})])]))}}),kU=_U,CU={},xU={class:"flex w-full items-center justify-between p-4"},IU={class:"flex items-center gap-2"},SU={class:"m-0 text-sm"};function EU(e,t){return C(),P("div",xU,[v("div",IU,[t[0]||(t[0]=v("i",{class:"icon-[lucide--triangle-alert] text-warning-background"},null,-1)),v("p",SU,$(e.$t("importFailed.title")),1)])])}n(EU,"_sfc_render$1");var TU=ot(CU,[["render",EU]]),AU={class:"flex w-138 flex-col"},MU={class:"flex h-full w-full flex-col gap-2 px-4 py-6"},PU={key:0},DU={class:"m-0 mb-4 text-sm leading-4 text-base-foreground"},LU={key:1,class:"flex min-h-8 w-full flex-col rounded-lg bg-base-background"},OU={class:"flex flex-1"},NU={class:"mr-2 text-xs font-bold text-warning-background"},$U={class:"text-xs font-bold text-base-foreground"},RU={key:0,"data-testid":"conflict-dialog-panel-expanded",class:"flex max-h-35.5 scrollbar-hide flex-col gap-2.5 overflow-y-auto px-4 py-2"},BU=["aria-label"],FU={class:"text-xs text-muted"},UU={key:2,class:"flex min-h-8 w-full flex-col rounded-lg bg-base-background"},WU={class:"flex flex-1"},zU={class:"mr-2 text-xs font-bold text-warning-background"},VU={class:"text-xs font-bold text-base-foreground"},GU={key:0,"data-testid":"conflict-dialog-panel-expanded",class:"flex max-h-[142px] scrollbar-hide flex-col gap-2.5 overflow-y-auto px-4 py-2"},HU=["aria-label"],jU={class:"text-xs text-muted"},KU={key:3,class:"flex min-h-8 w-full flex-col rounded-lg bg-base-background"},YU={class:"flex flex-1"},qU={class:"mr-2 text-xs font-bold text-warning-background"},XU={class:"text-xs font-bold text-base-foreground"},ZU={key:0,"data-testid":"conflict-dialog-panel-expanded",class:"flex max-h-35.5 scrollbar-hide flex-col gap-2.5 overflow-y-auto px-4 py-2"},JU={class:"text-xs text-muted"},QU=J({__name:"NodeConflictDialogContent",props:{showAfterWhatsNew:{type:Boolean,default:!1},conflictedPackages:{}},setup(e){const{t}=Fe(),{conflictedPackages:a}=Po(),o=A(!1),s=A(!1),r=A(!1),i=E(()=>e.conflictedPackages||a.value),l=E(()=>Yl(Cg(i.value,g=>g.conflicts),g=>g.type!=="import_failed")),u=E(()=>Yl(i.value,g=>vg(g.conflicts,m=>m.type==="import_failed"))),c=E(()=>zg(u.value,g=>g.package_name||g.package_id)),d=n(()=>{r.value=!r.value,o.value=!1,s.value=!1},"toggleImportFailedPanel"),p=n(()=>{o.value=!o.value,s.value=!1,r.value=!1},"toggleConflictsPanel"),f=n(()=>{s.value=!s.value,o.value=!1,r.value=!1},"toggleExtensionsPanel");return(g,m)=>(C(),P("div",AU,[R(Oi,{width:1}),v("div",MU,[g.showAfterWhatsNew?(C(),P("div",PU,[v("p",DU,[fe($(g.$t("manager.conflicts.description"))+" ",1),m[0]||(m[0]=v("br",null,null,-1)),m[1]||(m[1]=v("br",null,null,-1)),fe(" "+$(g.$t("manager.conflicts.info")),1)])])):H("",!0),c.value.length>0?(C(),P("div",LU,[v("div",{"data-testid":"conflict-dialog-panel-toggle",class:"flex h-8 w-full items-center justify-between gap-2 pl-4",onClick:d},[v("div",OU,[v("span",NU,$(c.value.length),1),v("span",$U,$(g.$t("manager.conflicts.importFailedExtensions")),1)]),v("div",null,[R(se,{variant:"textonly",class:"bg-transparent text-muted"},{default:W(()=>[v("i",{class:pe(r.value?"pi pi-chevron-down text-xs":"pi pi-chevron-right text-xs")},null,2)]),_:1})])]),r.value?(C(),P("div",RU,[(C(!0),P(Se,null,Ze(c.value,(h,y)=>(C(),P("div",{key:y,"aria-label":`Import failed package: ${h}`,class:"flex min-h-6 shrink-0 hover:bg-node-component-surface-hovered items-center justify-between px-4 py-1"},[v("span",FU,$(h),1),m[2]||(m[2]=v("span",{class:"pi pi-info-circle text-sm"},null,-1))],8,BU))),128))])):H("",!0)])):H("",!0),l.value.length>0?(C(),P("div",UU,[v("div",{"data-testid":"conflict-dialog-panel-toggle",class:"flex h-8 w-full items-center justify-between gap-2 pl-4",onClick:p},[v("div",WU,[v("span",zU,$(l.value.length),1),v("span",VU,$(g.$t("manager.conflicts.conflicts")),1)]),v("div",null,[R(se,{variant:"textonly",class:"bg-transparent text-muted"},{default:W(()=>[v("i",{class:pe(o.value?"pi pi-chevron-down text-xs":"pi pi-chevron-right text-xs")},null,2)]),_:1})])]),o.value?(C(),P("div",GU,[(C(!0),P(Se,null,Ze(l.value,(h,y)=>(C(),P("div",{key:y,"aria-label":`Conflict: ${b(Js)(h,b(t))}`,class:"flex min-h-6 shrink-0 hover:bg-node-component-surface-hovered items-center justify-between px-4 py-1"},[v("span",jU,$(b(Js)(h,b(t))),1),m[3]||(m[3]=v("span",{class:"pi pi-info-circle text-sm"},null,-1))],8,HU))),128))])):H("",!0)])):H("",!0),i.value.length>0?(C(),P("div",KU,[v("div",{"data-testid":"conflict-dialog-panel-toggle",class:"flex h-8 w-full items-center justify-between gap-2 pl-4",onClick:f},[v("div",YU,[v("span",qU,$(i.value.length),1),v("span",XU,$(g.$t("manager.conflicts.extensionAtRisk")),1)]),v("div",null,[R(se,{variant:"textonly",class:"bg-transparent text-muted"},{default:W(()=>[v("i",{class:pe(s.value?"pi pi-chevron-down text-xs":"pi pi-chevron-right text-xs")},null,2)]),_:1})])]),s.value?(C(),P("div",ZU,[(C(!0),P(Se,null,Ze(i.value,h=>(C(),P("div",{key:h.package_id,class:"flex min-h-6 shrink-0 hover:bg-node-component-surface-hovered items-center justify-between px-4 py-1"},[v("span",JU,$(h.package_name),1),m[4]||(m[4]=v("span",{class:"pi pi-info-circle text-sm"},null,-1))]))),128))])):H("",!0)])):H("",!0)]),R(Oi,{width:1})]))}}),e8=QU,t8={class:"flex w-full items-center justify-between px-3 py-4"},a8={class:"flex w-full items-center justify-between gap-2 pr-1"},o8=J({__name:"NodeConflictFooter",props:{buttonText:{default:void 0},onButtonClick:{type:Function,default:void 0}},setup(e){const t=e,{buildDocsUrl:a}=nr(),o=Ct(),s=n(()=>{window.open(a("/troubleshooting/custom-node-issues",{includeLocale:!0}),"_blank")},"handleConflictInfoClick"),r=n(()=>{o.closeDialog({key:"global-node-conflict"}),t.onButtonClick&&t.onButtonClick()},"handleButtonClick");return(i,l)=>(C(),P("div",t8,[v("div",a8,[R(se,{variant:"muted-textonly",size:"sm",class:"text-sm",onClick:s},{default:W(()=>[l[0]||(l[0]=v("i",{class:"pi pi-info-circle"},null,-1)),fe(" "+$(i.$t("manager.conflicts.conflictInfoTitle")),1)]),_:1}),t.buttonText?(C(),X(se,{key:0,variant:"secondary",size:"sm",onClick:r},{default:W(()=>[fe($(t.buttonText),1)]),_:1})):H("",!0)])]))}}),n8=o8,s8={},r8={class:"flex h-12 w-full items-center justify-between pl-6"},i8={class:"flex items-center gap-2"},l8={class:"text-base font-bold"};function u8(e,t){return C(),P("div",r8,[v("div",i8,[t[0]||(t[0]=v("i",{class:"icon-[lucide--triangle-alert] text-warning-background"},null,-1)),v("p",l8,$(e.$t("manager.conflicts.title")),1)])])}n(u8,"_sfc_render");var c8=ot(s8,[["render",u8]]);const pt=n(()=>{const e=Ct();function t(_){e.showDialog({key:"global-missing-nodes",headerComponent:T3,footerComponent:C3,component:w3,dialogComponentProps:{closable:!0,pt:{root:{class:"bg-base-background border-border-default"},header:{class:"!p-0 !m-0"},content:{class:"!p-0 overflow-y-hidden"},footer:{class:"!p-0"},pcCloseButton:{root:{class:"!w-7 !h-7 !border-none !outline-none !p-2 !m-1.5"}}}},props:_})}n(t,"showLoadWorkflowWarning");function a(_){e.showDialog({key:"global-missing-models-warning",component:sB,props:_})}n(a,"showMissingModelsWarning");function o(_){const I=_?{props:{defaultPanel:_}}:void 0;e.showDialog({key:"global-settings",headerComponent:td,component:od,...I})}n(o,"showSettingsDialog");function s(){e.showDialog({key:"global-settings",headerComponent:td,component:od,props:{defaultPanel:"about"}})}n(s,"showAboutDialog");function r(_){const I={error:{exceptionType:_.exception_type,exceptionMessage:_.exception_message,nodeId:_.node_id?.toString(),nodeType:_.node_type,traceback:_.traceback.join(`
|
|
247
|
-
`),reportType:"graphExecutionError"}};e.showDialog({key:"global-execution-error",component:Zc,props:I,dialogComponentProps:{onClose:n(()=>{yt()?.trackUiButtonClicked({button_id:"error_dialog_closed"})},"onClose")}})}n(r,"showExecutionErrorDialog");function i(_){const I="fileName"in _?_.fileName:_.stack?.match(/(\/extensions\/.*\.js)/)?.[1],w=I?I.substring(I.indexOf("/extensions/")):void 0;return{errorMessage:_.toString(),stackTrace:_.stack,extensionFile:w}}n(i,"parseError");function l(_,I={}){const w=_ instanceof Error?i(_):{errorMessage:String(_)},x={error:{exceptionType:I.title??"Unknown Error",exceptionMessage:w.errorMessage,traceback:w.stackTrace??G("errorDialog.noStackTrace"),reportType:I.reportType}};e.showDialog({key:"global-error",component:Zc,props:x,dialogComponentProps:{onClose:n(()=>{yt()?.trackUiButtonClicked({button_id:"error_dialog_closed"})},"onClose")}})}n(l,"showErrorDialog");async function u(_){return new Promise(I=>{e.showDialog({key:"api-nodes-signin",component:Ev,props:{apiNodeNames:_,onLogin:n(()=>c().then(w=>I(w)),"onLogin"),onCancel:n(()=>I(!1),"onCancel")},headerComponent:ei,dialogComponentProps:{closable:!1,onClose:n(()=>I(!1),"onClose")}})}).then(I=>(e.closeDialog({key:"api-nodes-signin"}),I))}n(u,"showApiNodesSignInDialog");async function c(){return new Promise(_=>{e.showDialog({key:"global-signin",component:C4,headerComponent:ei,props:{onSuccess:n(()=>_(!0),"onSuccess")},dialogComponentProps:{closable:!0,onClose:n(()=>_(!1),"onClose")}})}).then(_=>(e.closeDialog({key:"global-signin"}),_))}n(c,"showSignInDialog");async function d({title:_,message:I,defaultValue:w="",placeholder:x}){return new Promise(D=>{e.showDialog({key:"global-prompt",title:_,component:lB,props:{message:I,defaultValue:w,onConfirm:n(T=>{D(T)},"onConfirm"),placeholder:x},dialogComponentProps:{onClose:n(()=>{D(null)},"onClose")}})})}n(d,"prompt");async function p({title:_,message:I,type:w="default",itemList:x=[],hint:D}){return new Promise(T=>{const N={key:"global-prompt",title:_,component:_i,props:{message:I,type:w,itemList:x,onConfirm:T,hint:D},dialogComponentProps:{onClose:n(()=>T(null),"onClose")}};e.showDialog(N)})}n(p,"confirm");function f(_){const{isActiveSubscription:I}=nn();if(I.value)return e.showDialog({key:"top-up-credits",component:Q4,props:_,dialogComponentProps:{headless:!0,pt:{header:{class:"p-0! hidden"},content:{class:"p-0! m-0! rounded-2xl"},root:{class:"rounded-2xl"}}}})}n(f,"showTopUpCreditsDialog");function g(){return e.showDialog({key:"global-update-password",component:tF,headerComponent:ei,props:{onSuccess:n(()=>e.closeDialog({key:"global-update-password"}),"onSuccess")}})}n(g,"showUpdatePasswordDialog");function m(_){return{dialog:e.showExtensionDialog(_),closeDialog:n(()=>e.closeDialog({key:_.key}),"closeDialog")}}n(m,"showExtensionDialog");function h(_){const I={headless:!0,modal:!0,closable:!1,pt:{root:{class:"rounded-2xl overflow-hidden"},header:{class:"p-0! hidden"},content:{class:"p-0! m-0!"}}};return e.showDialog({..._,dialogComponentProps:Hi(I,_.dialogComponentProps||{})})}n(h,"showLayoutDialog");function y(_={}){const{dialogComponentProps:I,conflictedPackages:w}=_;return e.showDialog({key:"global-import-failed",headerComponent:TU,footerComponent:kU,component:yU,dialogComponentProps:{closable:!0,pt:{root:{class:"bg-base-background border-border-default"},header:{class:"!p-0 !m-0"},content:{class:"!p-0 overflow-y-hidden"},footer:{class:"!p-0"},pcCloseButton:{root:{class:"!w-7 !h-7 !border-none !outline-none !p-2 !m-1.5"}}},...I},props:{conflictedPackages:w??[]},footerProps:{conflictedPackages:w??[]}})}n(y,"showImportFailedNodeDialog");function k(_={}){const{dialogComponentProps:I,buttonText:w,onButtonClick:x,showAfterWhatsNew:D,conflictedPackages:T}=_;return e.showDialog({key:"global-node-conflict",headerComponent:c8,footerComponent:n8,component:e8,dialogComponentProps:{closable:!0,pt:{header:{class:"!p-0 !m-0"},content:{class:"!p-0 overflow-y-hidden"},footer:{class:"!p-0"},pcCloseButton:{root:{class:"!w-7 !h-7 !border-none !outline-none !p-2 !m-1.5 bg-dialog-surface text-white"}}},...I},props:{showAfterWhatsNew:D,conflictedPackages:T},footerProps:{buttonText:w,onButtonClick:x}})}n(k,"showNodeConflictDialog");async function S(){if(!qe||!window.__CONFIG__?.subscription_required)return;const{useSubscriptionDialog:_}=await ut(async()=>{const{useSubscriptionDialog:w}=await import("./useSubscriptionDialog-
|
|
247
|
+
`),reportType:"graphExecutionError"}};e.showDialog({key:"global-execution-error",component:Zc,props:I,dialogComponentProps:{onClose:n(()=>{yt()?.trackUiButtonClicked({button_id:"error_dialog_closed"})},"onClose")}})}n(r,"showExecutionErrorDialog");function i(_){const I="fileName"in _?_.fileName:_.stack?.match(/(\/extensions\/.*\.js)/)?.[1],w=I?I.substring(I.indexOf("/extensions/")):void 0;return{errorMessage:_.toString(),stackTrace:_.stack,extensionFile:w}}n(i,"parseError");function l(_,I={}){const w=_ instanceof Error?i(_):{errorMessage:String(_)},x={error:{exceptionType:I.title??"Unknown Error",exceptionMessage:w.errorMessage,traceback:w.stackTrace??G("errorDialog.noStackTrace"),reportType:I.reportType}};e.showDialog({key:"global-error",component:Zc,props:x,dialogComponentProps:{onClose:n(()=>{yt()?.trackUiButtonClicked({button_id:"error_dialog_closed"})},"onClose")}})}n(l,"showErrorDialog");async function u(_){return new Promise(I=>{e.showDialog({key:"api-nodes-signin",component:Ev,props:{apiNodeNames:_,onLogin:n(()=>c().then(w=>I(w)),"onLogin"),onCancel:n(()=>I(!1),"onCancel")},headerComponent:ei,dialogComponentProps:{closable:!1,onClose:n(()=>I(!1),"onClose")}})}).then(I=>(e.closeDialog({key:"api-nodes-signin"}),I))}n(u,"showApiNodesSignInDialog");async function c(){return new Promise(_=>{e.showDialog({key:"global-signin",component:C4,headerComponent:ei,props:{onSuccess:n(()=>_(!0),"onSuccess")},dialogComponentProps:{closable:!0,onClose:n(()=>_(!1),"onClose")}})}).then(_=>(e.closeDialog({key:"global-signin"}),_))}n(c,"showSignInDialog");async function d({title:_,message:I,defaultValue:w="",placeholder:x}){return new Promise(D=>{e.showDialog({key:"global-prompt",title:_,component:lB,props:{message:I,defaultValue:w,onConfirm:n(T=>{D(T)},"onConfirm"),placeholder:x},dialogComponentProps:{onClose:n(()=>{D(null)},"onClose")}})})}n(d,"prompt");async function p({title:_,message:I,type:w="default",itemList:x=[],hint:D}){return new Promise(T=>{const N={key:"global-prompt",title:_,component:_i,props:{message:I,type:w,itemList:x,onConfirm:T,hint:D},dialogComponentProps:{onClose:n(()=>T(null),"onClose")}};e.showDialog(N)})}n(p,"confirm");function f(_){const{isActiveSubscription:I}=nn();if(I.value)return e.showDialog({key:"top-up-credits",component:Q4,props:_,dialogComponentProps:{headless:!0,pt:{header:{class:"p-0! hidden"},content:{class:"p-0! m-0! rounded-2xl"},root:{class:"rounded-2xl"}}}})}n(f,"showTopUpCreditsDialog");function g(){return e.showDialog({key:"global-update-password",component:tF,headerComponent:ei,props:{onSuccess:n(()=>e.closeDialog({key:"global-update-password"}),"onSuccess")}})}n(g,"showUpdatePasswordDialog");function m(_){return{dialog:e.showExtensionDialog(_),closeDialog:n(()=>e.closeDialog({key:_.key}),"closeDialog")}}n(m,"showExtensionDialog");function h(_){const I={headless:!0,modal:!0,closable:!1,pt:{root:{class:"rounded-2xl overflow-hidden"},header:{class:"p-0! hidden"},content:{class:"p-0! m-0!"}}};return e.showDialog({..._,dialogComponentProps:Hi(I,_.dialogComponentProps||{})})}n(h,"showLayoutDialog");function y(_={}){const{dialogComponentProps:I,conflictedPackages:w}=_;return e.showDialog({key:"global-import-failed",headerComponent:TU,footerComponent:kU,component:yU,dialogComponentProps:{closable:!0,pt:{root:{class:"bg-base-background border-border-default"},header:{class:"!p-0 !m-0"},content:{class:"!p-0 overflow-y-hidden"},footer:{class:"!p-0"},pcCloseButton:{root:{class:"!w-7 !h-7 !border-none !outline-none !p-2 !m-1.5"}}},...I},props:{conflictedPackages:w??[]},footerProps:{conflictedPackages:w??[]}})}n(y,"showImportFailedNodeDialog");function k(_={}){const{dialogComponentProps:I,buttonText:w,onButtonClick:x,showAfterWhatsNew:D,conflictedPackages:T}=_;return e.showDialog({key:"global-node-conflict",headerComponent:c8,footerComponent:n8,component:e8,dialogComponentProps:{closable:!0,pt:{header:{class:"!p-0 !m-0"},content:{class:"!p-0 overflow-y-hidden"},footer:{class:"!p-0"},pcCloseButton:{root:{class:"!w-7 !h-7 !border-none !outline-none !p-2 !m-1.5 bg-dialog-surface text-white"}}},...I},props:{showAfterWhatsNew:D,conflictedPackages:T},footerProps:{buttonText:w,onButtonClick:x}})}n(k,"showNodeConflictDialog");async function S(){if(!qe||!window.__CONFIG__?.subscription_required)return;const{useSubscriptionDialog:_}=await ut(async()=>{const{useSubscriptionDialog:w}=await import("./useSubscriptionDialog-B-eGeK3j.js");return{useSubscriptionDialog:w}},__vite__mapDeps([79,1,2,3,4,5,6,7,8,9,10,11,12,13,17,18,16,20,21,69,24,25]),import.meta.url),{show:I}=_();I()}return n(S,"showSubscriptionRequiredDialog"),{showLoadWorkflowWarning:t,showMissingModelsWarning:a,showSettingsDialog:o,showAboutDialog:s,showExecutionErrorDialog:r,showApiNodesSignInDialog:u,showSignInDialog:c,showSubscriptionRequiredDialog:S,showTopUpCreditsDialog:f,showUpdatePasswordDialog:g,showExtensionDialog:m,prompt:d,showErrorDialog:l,confirm:p,showLayoutDialog:h,showImportFailedNodeDialog:y,showNodeConflictDialog:k}},"useDialogService");export{im as $,$n,Vs as $r,Oa as $t,u6 as A,fC as An,ny as Ar,DM as At,r6 as B,j0 as Bn,Bt as Br,Rf as Bt,Nl as C,jp as Cn,ll as Cr,rn as Ct,wN as D,Hn as Dn,Ko as Dr,sP as Dt,wm as E,zp as En,uy as Er,wr as Et,i6 as F,G8 as Fn,qd as Fr,jA as Ft,Yo as G,z8 as Gn,ur as Gr,_E as Gt,n6 as H,v0 as Hn,Yd as Hr,$T as Ht,iN as I,aC as In,qv as Ir,HA as It,qn as J,en as Jn,Ua as Jr,$S as Jt,Dl as K,I_ as Kn,fi as Kr,ec as Kt,Yr as L,tC as Ln,$8 as Lr,LA as Lt,l6 as M,yl as Mn,To as Mr,EM as Mt,Vo as N,dC as Nn,nn as Nr,Vf as Nt,fN as O,PC as On,Pt as Or,JM as Ot,Z as P,Rp as Pn,O8 as Pr,tM as Pt,t6 as Q,Qb as Qn,Gs as Qr,SS as Qt,nN as R,eC as Rn,R8 as Rr,vr as Rt,qa as S,Lt as Sn,np as Sr,jP as St,bm as T,_l as Tn,B8 as Tr,CP as Tt,o6 as U,ao as Un,nl as Ur,hT as Ut,s6 as V,x0 as Vn,Pa as Vr,RT as Vt,HO as W,Ap as Wn,lr as Wr,tc as Wt,Pl as X,Ct as Xn,Hd as Xr,Z8 as Xt,e6 as Y,gl as Yn,Fa as Yr,J8 as Yt,a6 as Z,fl as Zn,Ba as Zr,AS as Zt,Po as _,fx as _n,dr as _r,_a as _t,aF as a,us as an,qw as ar,oD as at,_r as b,H8 as bn,wy as br,T2 as bt,l4 as c,dI as cn,Dr as cr,Z2 as ct,uB as d,Na as dn,aw as dr,Ot as dt,Vd as ei,xS as en,Au as er,Mi as et,It as f,q8 as fn,ow as fr,yt as ft,mt as g,K8 as gn,cp as gr,Ia as gt,Vl as h,_x as hn,Ee as hr,D2 as ht,td as i,fr as in,Ao as ir,AO as it,gt as j,V8 as jn,sl as jr,TM as jt,cN as k,vi as kn,Zd as kr,tP as kt,xB as l,lf as ln,vp as lr,G2 as lt,Vt as m,Hx as mn,gp as mr,zt as mt,od as n,wS as nn,kp as nr,MO as nt,d6 as o,po as on,Fw as or,xt as ot,Dm as p,Yt as pn,mp as pr,wo as pt,OO as q,Zt as qn,On as qr,hE as qt,eU as r,vS as rn,pl as rr,Tt as rt,p6 as s,sn,yp as sr,J2 as st,pt as t,ir as ti,X8 as tn,Cp as tr,Q8 as tt,kB as u,Za as un,za as ur,Gt as ut,GN as v,kl as vn,My as vr,Ra as vt,wt as w,jn as wn,F8 as wr,RP as wt,AN as x,j8 as xn,yy as xr,m2 as xt,Fl as y,Y8 as yn,Me as yr,M2 as yt,tN as z,vl as zn,N8 as zr,$f as zt};
|
|
248
248
|
|
|
249
|
-
//# sourceMappingURL=dialogService-
|
|
249
|
+
//# sourceMappingURL=dialogService-YG0RH337.js.map
|