From 5cbf79787fe56fdd78476fdbc8ed03231be30c50 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sun, 5 Jan 2025 01:46:11 -0500 Subject: [PATCH 01/12] Add advanced device option to clip loader nodes. Right click the "Load CLIP" or DualCLIPLoader node and "Show Advanced". --- nodes.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/nodes.py b/nodes.py index 7f9f5aa5..82b1575b 100644 --- a/nodes.py +++ b/nodes.py @@ -913,6 +913,7 @@ class CLIPLoader: def INPUT_TYPES(s): return {"required": { "clip_name": (folder_paths.get_filename_list("text_encoders"), ), "type": (["stable_diffusion", "stable_cascade", "sd3", "stable_audio", "mochi", "ltxv", "pixart"], ), + "device": (["default", "cpu"], {"advanced": True}), }} RETURN_TYPES = ("CLIP",) FUNCTION = "load_clip" @@ -921,7 +922,7 @@ class CLIPLoader: DESCRIPTION = "[Recipes]\n\nstable_diffusion: clip-l\nstable_cascade: clip-g\nsd3: t5 / clip-g / clip-l\nstable_audio: t5\nmochi: t5" - def load_clip(self, clip_name, type="stable_diffusion"): + def load_clip(self, clip_name, type="stable_diffusion", device="default"): if type == "stable_cascade": clip_type = comfy.sd.CLIPType.STABLE_CASCADE elif type == "sd3": @@ -937,8 +938,12 @@ class CLIPLoader: else: clip_type = comfy.sd.CLIPType.STABLE_DIFFUSION + model_options = {} + if device == "cpu": + model_options["load_device"] = model_options["offload_device"] = torch.device("cpu") + clip_path = folder_paths.get_full_path_or_raise("text_encoders", clip_name) - clip = comfy.sd.load_clip(ckpt_paths=[clip_path], embedding_directory=folder_paths.get_folder_paths("embeddings"), clip_type=clip_type) + clip = comfy.sd.load_clip(ckpt_paths=[clip_path], embedding_directory=folder_paths.get_folder_paths("embeddings"), clip_type=clip_type, model_options=model_options) return (clip,) class DualCLIPLoader: @@ -947,6 +952,7 @@ class DualCLIPLoader: return {"required": { "clip_name1": (folder_paths.get_filename_list("text_encoders"), ), "clip_name2": (folder_paths.get_filename_list("text_encoders"), ), "type": (["sdxl", "sd3", "flux", "hunyuan_video"], ), + "device": (["default", "cpu"], {"advanced": True}), }} RETURN_TYPES = ("CLIP",) FUNCTION = "load_clip" @@ -955,7 +961,7 @@ class DualCLIPLoader: DESCRIPTION = "[Recipes]\n\nsdxl: clip-l, clip-g\nsd3: clip-l, clip-g / clip-l, t5 / clip-g, t5\nflux: clip-l, t5" - def load_clip(self, clip_name1, clip_name2, type): + def load_clip(self, clip_name1, clip_name2, type, device="default"): clip_path1 = folder_paths.get_full_path_or_raise("text_encoders", clip_name1) clip_path2 = folder_paths.get_full_path_or_raise("text_encoders", clip_name2) if type == "sdxl": @@ -967,7 +973,11 @@ class DualCLIPLoader: elif type == "hunyuan_video": clip_type = comfy.sd.CLIPType.HUNYUAN_VIDEO - clip = comfy.sd.load_clip(ckpt_paths=[clip_path1, clip_path2], embedding_directory=folder_paths.get_folder_paths("embeddings"), clip_type=clip_type) + model_options = {} + if device == "cpu": + model_options["load_device"] = model_options["offload_device"] = torch.device("cpu") + + clip = comfy.sd.load_clip(ckpt_paths=[clip_path1, clip_path2], embedding_directory=folder_paths.get_folder_paths("embeddings"), clip_type=clip_type, model_options=model_options) return (clip,) class CLIPVisionLoader: From c8a3492c22ad5ff711e24db3a03756fec022afde Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sun, 5 Jan 2025 04:29:36 -0500 Subject: [PATCH 02/12] Make the device an optional parameter in the clip loaders. --- nodes.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nodes.py b/nodes.py index 82b1575b..1b796ced 100644 --- a/nodes.py +++ b/nodes.py @@ -913,6 +913,8 @@ class CLIPLoader: def INPUT_TYPES(s): return {"required": { "clip_name": (folder_paths.get_filename_list("text_encoders"), ), "type": (["stable_diffusion", "stable_cascade", "sd3", "stable_audio", "mochi", "ltxv", "pixart"], ), + }, + "optional": { "device": (["default", "cpu"], {"advanced": True}), }} RETURN_TYPES = ("CLIP",) @@ -952,6 +954,8 @@ class DualCLIPLoader: return {"required": { "clip_name1": (folder_paths.get_filename_list("text_encoders"), ), "clip_name2": (folder_paths.get_filename_list("text_encoders"), ), "type": (["sdxl", "sd3", "flux", "hunyuan_video"], ), + }, + "optional": { "device": (["default", "cpu"], {"advanced": True}), }} RETURN_TYPES = ("CLIP",) From b65b83af6f5b0aef55f27160d5c1b86400cc79b5 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Sun, 5 Jan 2025 04:32:11 -0500 Subject: [PATCH 03/12] Add update-frontend github action (#6336) * Add update-frontend github action * Update secrets * nit --- .github/workflows/update-frontend.yml | 58 +++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .github/workflows/update-frontend.yml diff --git a/.github/workflows/update-frontend.yml b/.github/workflows/update-frontend.yml new file mode 100644 index 00000000..0c577478 --- /dev/null +++ b/.github/workflows/update-frontend.yml @@ -0,0 +1,58 @@ +name: Update Frontend Release + +on: + workflow_dispatch: + inputs: + version: + description: "Frontend version to update to (e.g., 1.0.0)" + required: true + type: string + +jobs: + update-frontend: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - name: Checkout ComfyUI + uses: actions/checkout@v4 + - uses: actions/setup-python@v4 + with: + python-version: '3.10' + - name: Install requirements + run: | + python -m pip install --upgrade pip + pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu + pip install -r requirements.txt + pip install wait-for-it + # Frontend asset will be downloaded to ComfyUI/web_custom_versions/Comfy-Org_ComfyUI_frontend/{version} + - name: Start ComfyUI server + run: | + python main.py --cpu --front-end-version Comfy-Org/ComfyUI_frontend@${{ github.event.inputs.version }} 2>&1 | tee console_output.log & + wait-for-it --service 127.0.0.1:8188 -t 30 + - name: Configure Git + run: | + git config --global user.name "GitHub Action" + git config --global user.email "action@github.com" + # Replace existing frontend content with the new version and remove .js.map files + # See https://github.com/Comfy-Org/ComfyUI_frontend/issues/2145 for why we remove .js.map files + - name: Update frontend content + run: | + rm -rf web/ + cp -r web_custom_versions/Comfy-Org_ComfyUI_frontend/${{ github.event.inputs.version }} web/ + rm web/**/*.js.map + - name: Create Pull Request + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.PR_BOT_PAT }} + commit-message: "Update frontend to v${{ github.event.inputs.version }}" + title: "Frontend Update: v${{ github.event.inputs.version }}" + body: | + Automated PR to update frontend content to version ${{ github.event.inputs.version }} + + This PR was created automatically by the frontend update workflow. + branch: release-${{ github.event.inputs.version }} + base: master + labels: Frontend,dependencies From 7da85fac3fab3d303558643e30500496f420bd41 Mon Sep 17 00:00:00 2001 From: Yoland Yan <4950057+yoland68@users.noreply.github.com> Date: Sun, 5 Jan 2025 01:33:49 -0800 Subject: [PATCH 04/12] Update CODEOWNERS (#6338) Adding yoland and robin to web dir --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 07ac5ab8..814d1ecd 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -17,7 +17,7 @@ /app/ @yoland68 @robinjhuang @huchenlei @webfiltered @pythongosssss @ltdrdata # Frontend assets -/web/ @huchenlei @webfiltered @pythongosssss +/web/ @huchenlei @webfiltered @pythongosssss @yoland68 @robinjhuang # Extra nodes /comfy_extras/ @yoland68 @robinjhuang @huchenlei @pythongosssss @ltdrdata @Kosinkadink From c496e535195c384c46e8b78049be29e69ae380a8 Mon Sep 17 00:00:00 2001 From: Jedrzej Kosinski Date: Mon, 6 Jan 2025 00:36:47 -0600 Subject: [PATCH 05/12] In inner_sample, change "sigmas" to "sampler_sigmas" in transformer_options to not conflict with the "sigmas" that will overwrite "sigmas" in _calc_cond_batch (#6360) --- comfy/hooks.py | 2 +- comfy/samplers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/comfy/hooks.py b/comfy/hooks.py index 79a7090b..3cb0f396 100644 --- a/comfy/hooks.py +++ b/comfy/hooks.py @@ -442,7 +442,7 @@ class HookKeyframeGroup: return False if curr_t == self._curr_t: return False - max_sigma = torch.max(transformer_options["sigmas"]) + max_sigma = torch.max(transformer_options["sample_sigmas"]) prev_index = self._current_index prev_strength = self._current_strength # if met guaranteed steps, look for next keyframe in case need to switch diff --git a/comfy/samplers.py b/comfy/samplers.py index 89464a42..af2b8e11 100644 --- a/comfy/samplers.py +++ b/comfy/samplers.py @@ -849,7 +849,7 @@ class CFGGuider: self.conds = process_conds(self.inner_model, noise, self.conds, device, latent_image, denoise_mask, seed) extra_model_options = comfy.model_patcher.create_model_options_clone(self.model_options) - extra_model_options.setdefault("transformer_options", {})["sigmas"] = sigmas + extra_model_options.setdefault("transformer_options", {})["sample_sigmas"] = sigmas extra_args = {"model_options": extra_model_options, "seed": seed} executor = comfy.patcher_extension.WrapperExecutor.new_class_executor( From 916d1e14a93ef331adef7c0deff2fdcf443b05cf Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Mon, 6 Jan 2025 03:01:04 -0500 Subject: [PATCH 06/12] Make ancestral samplers more deterministic. --- comfy/k_diffusion/sampling.py | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/comfy/k_diffusion/sampling.py b/comfy/k_diffusion/sampling.py index 0f7cc4ca..d37d7dd9 100644 --- a/comfy/k_diffusion/sampling.py +++ b/comfy/k_diffusion/sampling.py @@ -70,8 +70,14 @@ def get_ancestral_step(sigma_from, sigma_to, eta=1.): return sigma_down, sigma_up -def default_noise_sampler(x): - return lambda sigma, sigma_next: torch.randn_like(x) +def default_noise_sampler(x, seed=None): + if seed is not None: + generator = torch.Generator(device=x.device) + generator.manual_seed(seed) + else: + generator = None + + return lambda sigma, sigma_next: torch.randn(x.size(), dtype=x.dtype, layout=x.layout, device=x.device, generator=generator) class BatchedBrownianTree: @@ -168,7 +174,8 @@ def sample_euler_ancestral(model, x, sigmas, extra_args=None, callback=None, dis return sample_euler_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler) """Ancestral sampling with Euler method steps.""" extra_args = {} if extra_args is None else extra_args - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + seed = extra_args.get("seed", None) + noise_sampler = default_noise_sampler(x, seed=seed) if noise_sampler is None else noise_sampler s_in = x.new_ones([x.shape[0]]) for i in trange(len(sigmas) - 1, disable=disable): denoised = model(x, sigmas[i] * s_in, **extra_args) @@ -189,7 +196,8 @@ def sample_euler_ancestral(model, x, sigmas, extra_args=None, callback=None, dis def sample_euler_ancestral_RF(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1.0, s_noise=1., noise_sampler=None): """Ancestral sampling with Euler method steps.""" extra_args = {} if extra_args is None else extra_args - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + seed = extra_args.get("seed", None) + noise_sampler = default_noise_sampler(x, seed=seed) if noise_sampler is None else noise_sampler s_in = x.new_ones([x.shape[0]]) for i in trange(len(sigmas) - 1, disable=disable): denoised = model(x, sigmas[i] * s_in, **extra_args) @@ -290,7 +298,8 @@ def sample_dpm_2_ancestral(model, x, sigmas, extra_args=None, callback=None, dis """Ancestral sampling with DPM-Solver second-order steps.""" extra_args = {} if extra_args is None else extra_args - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + seed = extra_args.get("seed", None) + noise_sampler = default_noise_sampler(x, seed=seed) if noise_sampler is None else noise_sampler s_in = x.new_ones([x.shape[0]]) for i in trange(len(sigmas) - 1, disable=disable): denoised = model(x, sigmas[i] * s_in, **extra_args) @@ -318,7 +327,8 @@ def sample_dpm_2_ancestral(model, x, sigmas, extra_args=None, callback=None, dis def sample_dpm_2_ancestral_RF(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None): """Ancestral sampling with DPM-Solver second-order steps.""" extra_args = {} if extra_args is None else extra_args - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + seed = extra_args.get("seed", None) + noise_sampler = default_noise_sampler(x, seed=seed) if noise_sampler is None else noise_sampler s_in = x.new_ones([x.shape[0]]) for i in trange(len(sigmas) - 1, disable=disable): denoised = model(x, sigmas[i] * s_in, **extra_args) @@ -591,7 +601,8 @@ def sample_dpmpp_2s_ancestral(model, x, sigmas, extra_args=None, callback=None, """Ancestral sampling with DPM-Solver++(2S) second-order steps.""" extra_args = {} if extra_args is None else extra_args - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + seed = extra_args.get("seed", None) + noise_sampler = default_noise_sampler(x, seed=seed) if noise_sampler is None else noise_sampler s_in = x.new_ones([x.shape[0]]) sigma_fn = lambda t: t.neg().exp() t_fn = lambda sigma: sigma.log().neg() @@ -625,7 +636,8 @@ def sample_dpmpp_2s_ancestral(model, x, sigmas, extra_args=None, callback=None, def sample_dpmpp_2s_ancestral_RF(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None): """Ancestral sampling with DPM-Solver++(2S) second-order steps.""" extra_args = {} if extra_args is None else extra_args - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + seed = extra_args.get("seed", None) + noise_sampler = default_noise_sampler(x, seed=seed) if noise_sampler is None else noise_sampler s_in = x.new_ones([x.shape[0]]) sigma_fn = lambda lbda: (lbda.exp() + 1) ** -1 lambda_fn = lambda sigma: ((1-sigma)/sigma).log() @@ -1153,7 +1165,8 @@ def sample_euler_cfg_pp(model, x, sigmas, extra_args=None, callback=None, disabl def sample_euler_ancestral_cfg_pp(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None): """Ancestral sampling with Euler method steps.""" extra_args = {} if extra_args is None else extra_args - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + seed = extra_args.get("seed", None) + noise_sampler = default_noise_sampler(x, seed=seed) if noise_sampler is None else noise_sampler temp = [0] def post_cfg_function(args): @@ -1179,7 +1192,8 @@ def sample_euler_ancestral_cfg_pp(model, x, sigmas, extra_args=None, callback=No def sample_dpmpp_2s_ancestral_cfg_pp(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None): """Ancestral sampling with DPM-Solver++(2S) second-order steps.""" extra_args = {} if extra_args is None else extra_args - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + seed = extra_args.get("seed", None) + noise_sampler = default_noise_sampler(x, seed=seed) if noise_sampler is None else noise_sampler temp = [0] def post_cfg_function(args): From eeab420c7059f9e77af8300abfe6774f5e772e45 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Mon, 6 Jan 2025 18:42:45 -0500 Subject: [PATCH 07/12] Update frontend to v1.6.18 (#6368) --- ...EJhGbv.js => BaseViewTemplate-BNGF4K22.js} | 4 +- ...P1MIWYX.js => DownloadGitView-DeC7MBzG.js} | 6 +- ...CxijYN47.js => ExtensionPanel-D4Phn0Zr.js} | 10 ++-- ...View-DswvqURL.js => GraphView-HVeNbkaW.js} | 14 ++--- ...ew-AV2llYNm.js => InstallView-CAcYt0HL.js} | 6 +- ...xaJ1IiJ.js => KeybindingPanel-Dc3C4lG1.js} | 12 ++-- ...js => ManualConfigurationView-Bi_qHE-n.js} | 10 ++-- ...aD8u74.js => NotSupportedView-Drz3x2d-.js} | 6 +- ...4HMGK.js => ServerConfigPanel-Be4StJmv.js} | 6 +- ...iO_acWT.js => ServerStartView-CIDTUh4x.js} | 6 +- ...2l9Kbchu.js => UserSelectView-B3jYchWu.js} | 6 +- ...ew-CB7Th_kO.js => WelcomeView-N0ZXLjdi.js} | 6 +- .../{index-B7ycxfFq.js => index-5HFeZax4.js} | 4 +- .../{index-lMQBwSDj.js => index-B-aVupP5.js} | 4 +- .../{index-CK0rrCYF.js => index-B5F0uxTQ.js} | 8 +-- .../{index-5Sv744Dr.js => index-Bordpmzt.js} | 4 +- .../{index-C4Fk50Nx.js => index-DjNHn37O.js} | 60 +++++++++++-------- .../{index-hdfnBvYs.js => index-jXPKy3pP.js} | 6 +- ...{index-DmMtlpqz.css => index-t-sFBuUC.css} | 2 +- ...fkLBy.js => keybindingService-Bx7YdkXn.js} | 8 +-- ...YAb1j.js => serverConfigStore-CvyKFVuP.js} | 4 +- web/index.html | 4 +- 22 files changed, 104 insertions(+), 92 deletions(-) rename web/assets/{BaseViewTemplate-CsEJhGbv.js => BaseViewTemplate-BNGF4K22.js} (84%) rename web/assets/{DownloadGitView-DP1MIWYX.js => DownloadGitView-DeC7MBzG.js} (94%) rename web/assets/{ExtensionPanel-CxijYN47.js => ExtensionPanel-D4Phn0Zr.js} (96%) rename web/assets/{GraphView-DswvqURL.js => GraphView-HVeNbkaW.js} (99%) rename web/assets/{InstallView-AV2llYNm.js => InstallView-CAcYt0HL.js} (99%) rename web/assets/{KeybindingPanel-CxaJ1IiJ.js => KeybindingPanel-Dc3C4lG1.js} (97%) rename web/assets/{ManualConfigurationView-BA4Vtud8.js => ManualConfigurationView-Bi_qHE-n.js} (94%) rename web/assets/{NotSupportedView-CRaD8u74.js => NotSupportedView-Drz3x2d-.js} (95%) rename web/assets/{ServerConfigPanel-TLv4HMGK.js => ServerConfigPanel-Be4StJmv.js} (97%) rename web/assets/{ServerStartView-CiO_acWT.js => ServerStartView-CIDTUh4x.js} (95%) rename web/assets/{UserSelectView-2l9Kbchu.js => UserSelectView-B3jYchWu.js} (97%) rename web/assets/{WelcomeView-CB7Th_kO.js => WelcomeView-N0ZXLjdi.js} (90%) rename web/assets/{index-B7ycxfFq.js => index-5HFeZax4.js} (93%) rename web/assets/{index-lMQBwSDj.js => index-B-aVupP5.js} (94%) rename web/assets/{index-CK0rrCYF.js => index-B5F0uxTQ.js} (99%) rename web/assets/{index-5Sv744Dr.js => index-Bordpmzt.js} (99%) rename web/assets/{index-C4Fk50Nx.js => index-DjNHn37O.js} (99%) rename web/assets/{index-hdfnBvYs.js => index-jXPKy3pP.js} (97%) rename web/assets/{index-DmMtlpqz.css => index-t-sFBuUC.css} (99%) rename web/assets/{keybindingService-D48fkLBy.js => keybindingService-Bx7YdkXn.js} (96%) rename web/assets/{serverConfigStore-BawYAb1j.js => serverConfigStore-CvyKFVuP.js} (97%) diff --git a/web/assets/BaseViewTemplate-CsEJhGbv.js b/web/assets/BaseViewTemplate-BNGF4K22.js similarity index 84% rename from web/assets/BaseViewTemplate-CsEJhGbv.js rename to web/assets/BaseViewTemplate-BNGF4K22.js index d254b402..b0395614 100644 --- a/web/assets/BaseViewTemplate-CsEJhGbv.js +++ b/web/assets/BaseViewTemplate-BNGF4K22.js @@ -1,4 +1,4 @@ -import { d as defineComponent, o as openBlock, f as createElementBlock, J as renderSlot, T as normalizeClass } from "./index-C4Fk50Nx.js"; +import { d as defineComponent, o as openBlock, f as createElementBlock, J as renderSlot, T as normalizeClass } from "./index-DjNHn37O.js"; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "BaseViewTemplate", props: { @@ -20,4 +20,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ export { _sfc_main as _ }; -//# sourceMappingURL=BaseViewTemplate-CsEJhGbv.js.map +//# sourceMappingURL=BaseViewTemplate-BNGF4K22.js.map diff --git a/web/assets/DownloadGitView-DP1MIWYX.js b/web/assets/DownloadGitView-DeC7MBzG.js similarity index 94% rename from web/assets/DownloadGitView-DP1MIWYX.js rename to web/assets/DownloadGitView-DeC7MBzG.js index fff3e743..6f00b364 100644 --- a/web/assets/DownloadGitView-DP1MIWYX.js +++ b/web/assets/DownloadGitView-DeC7MBzG.js @@ -1,7 +1,7 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, l as script, bW as useRouter } from "./index-C4Fk50Nx.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-CsEJhGbv.js"; +import { d as defineComponent, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, l as script, bW as useRouter } from "./index-DjNHn37O.js"; +import { _ as _sfc_main$1 } from "./BaseViewTemplate-BNGF4K22.js"; const _hoisted_1 = { class: "max-w-screen-sm flex flex-col gap-8 p-8 bg-[url('/assets/images/Git-Logo-White.svg')] bg-no-repeat bg-right-top bg-origin-padding" }; const _hoisted_2 = { class: "mt-24 text-4xl font-bold text-red-500" }; const _hoisted_3 = { class: "space-y-4" }; @@ -55,4 +55,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ export { _sfc_main as default }; -//# sourceMappingURL=DownloadGitView-DP1MIWYX.js.map +//# sourceMappingURL=DownloadGitView-DeC7MBzG.js.map diff --git a/web/assets/ExtensionPanel-CxijYN47.js b/web/assets/ExtensionPanel-D4Phn0Zr.js similarity index 96% rename from web/assets/ExtensionPanel-CxijYN47.js rename to web/assets/ExtensionPanel-D4Phn0Zr.js index 6cf7706c..02baf6e1 100644 --- a/web/assets/ExtensionPanel-CxijYN47.js +++ b/web/assets/ExtensionPanel-D4Phn0Zr.js @@ -1,9 +1,9 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, ab as ref, cn as FilterMatchMode, cs as useExtensionStore, a as useSettingStore, m as onMounted, c as computed, o as openBlock, k as createBlock, M as withCtx, N as createVNode, co as SearchBox, j as unref, bZ as script, H as createBaseVNode, f as createElementBlock, E as renderList, X as toDisplayString, aE as createTextVNode, F as Fragment, l as script$1, I as createCommentVNode, aI as script$3, bO as script$4, c4 as script$5, cp as _sfc_main$1 } from "./index-C4Fk50Nx.js"; -import { s as script$2, a as script$6 } from "./index-CK0rrCYF.js"; -import "./index-lMQBwSDj.js"; -import "./index-B7ycxfFq.js"; +import { d as defineComponent, ab as ref, cn as FilterMatchMode, cs as useExtensionStore, a as useSettingStore, m as onMounted, c as computed, o as openBlock, k as createBlock, M as withCtx, N as createVNode, co as SearchBox, j as unref, bZ as script, H as createBaseVNode, f as createElementBlock, E as renderList, X as toDisplayString, aE as createTextVNode, F as Fragment, l as script$1, I as createCommentVNode, aI as script$3, bO as script$4, c4 as script$5, cp as _sfc_main$1 } from "./index-DjNHn37O.js"; +import { s as script$2, a as script$6 } from "./index-B5F0uxTQ.js"; +import "./index-B-aVupP5.js"; +import "./index-5HFeZax4.js"; const _hoisted_1 = { class: "flex justify-end" }; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "ExtensionPanel", @@ -180,4 +180,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ export { _sfc_main as default }; -//# sourceMappingURL=ExtensionPanel-CxijYN47.js.map +//# sourceMappingURL=ExtensionPanel-D4Phn0Zr.js.map diff --git a/web/assets/GraphView-DswvqURL.js b/web/assets/GraphView-HVeNbkaW.js similarity index 99% rename from web/assets/GraphView-DswvqURL.js rename to web/assets/GraphView-HVeNbkaW.js index 14d9f192..648d3aab 100644 --- a/web/assets/GraphView-DswvqURL.js +++ b/web/assets/GraphView-HVeNbkaW.js @@ -1,11 +1,11 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, u as useExecutionStore, c as computed, a as useSettingStore, b as useWorkflowStore, e as useTitle, o as openBlock, f as createElementBlock, g as useWorkspaceStore, w as watchEffect, h as app, r as resolveDirective, i as withDirectives, v as vShow, j as unref, k as createBlock, n as normalizeStyle, s as showNativeMenu, l as script$d, _ as _export_sfc, m as onMounted, p as onBeforeUnmount, B as BaseStyle, q as script$e, t as getWidth, x as getHeight, y as getOuterWidth, z as getOuterHeight, A as getVNodeProp, C as isArray, D as mergeProps, F as Fragment, E as renderList, G as resolveDynamicComponent, H as createBaseVNode, I as createCommentVNode, J as renderSlot, K as useSidebarTabStore, L as useBottomPanelStore, M as withCtx, N as createVNode, O as getAttribute, P as findSingle, Q as focus, R as equals, S as Ripple, T as normalizeClass, U as getOffset, V as script$f, W as script$g, X as toDisplayString, Y as script$h, Z as markRaw, $ as defineStore, a0 as shallowRef, a1 as useI18n, a2 as useCommandStore, a3 as LiteGraph, a4 as useColorPaletteStore, a5 as watch, a6 as useNodeDefStore, a7 as BadgePosition, a8 as LGraphBadge, a9 as _, aa as NodeBadgeMode, ab as ref, ac as useEventListener, ad as nextTick, ae as st, af as normalizeI18nKey, ag as LGraphGroup, ah as LGraphNode, ai as EditableText, aj as isNotEmpty, ak as UniqueComponentId, al as ZIndex, am as resolveFieldData, an as OverlayEventBus, ao as isEmpty, ap as addStyle, aq as relativePosition, ar as absolutePosition, as as ConnectedOverlayScrollHandler, at as isTouchDevice, au as findLastIndex, av as script$i, aw as script$j, ax as script$k, ay as script$l, az as script$m, aA as script$n, aB as resolveComponent, aC as Transition, aD as createSlots, aE as createTextVNode, aF as useNodeFrequencyStore, aG as useNodeBookmarkStore, aH as highlightQuery, aI as script$o, aJ as formatNumberWithSuffix, aK as NodeSourceType, aL as pushScopeId, aM as popScopeId, aN as NodePreview, aO as NodeSearchFilter, aP as script$p, aQ as SearchFilterChip, aR as useLitegraphService, aS as storeToRefs, aT as isRef, aU as toRaw, aV as LinkReleaseTriggerAction, aW as script$q, aX as useUserStore, aY as useDialogStore, aZ as SettingDialogHeader, a_ as SettingDialogContent, a$ as useKeybindingStore, b0 as Teleport, b1 as LinkMarkerShape, b2 as useModelToNodeStore, b3 as CanvasPointer, b4 as IS_CONTROL_WIDGET, b5 as updateControlWidgetLabel, b6 as useColorPaletteService, b7 as setStorageValue, b8 as api, b9 as usePragmaticDroppable, ba as LGraph, bb as LLink, bc as DragAndScale, bd as LGraphCanvas, be as ContextMenu, bf as ChangeTracker, bg as useWorkflowService, bh as ComfyNodeDefImpl, bi as ComfyModelDef, bj as script$r, bk as script$s, bl as script$t, bm as script$u, bn as script$v, bo as normalizeProps, bp as ToastEventBus, bq as setAttribute, br as TransitionGroup, bs as useToast, bt as useToastStore, bu as resolve, bv as nestedPosition, bw as script$w, bx as isPrintableCharacter, by as useQueueSettingsStore, bz as script$x, bA as useQueuePendingTaskCountStore, bB as useLocalStorage, bC as useDraggable, bD as watchDebounced, bE as inject, bF as useElementBounding, bG as lodashExports, bH as useEventBus, bI as script$z, bJ as guardReactiveProps, bK as useMenuItemStore, bL as usePragmaticDraggable, bM as withModifiers, bN as script$B, bO as script$C, bP as provide, bQ as script$D, bR as useDialogService, bS as LGraphEventMode, bT as useQueueStore, bU as i18n, bV as useModelStore } from "./index-C4Fk50Nx.js"; -import { s as script$y } from "./index-hdfnBvYs.js"; -import { s as script$A } from "./index-lMQBwSDj.js"; -import { u as useKeybindingService } from "./keybindingService-D48fkLBy.js"; -import { u as useServerConfigStore } from "./serverConfigStore-BawYAb1j.js"; -import "./index-B7ycxfFq.js"; +import { d as defineComponent, u as useExecutionStore, c as computed, a as useSettingStore, b as useWorkflowStore, e as useTitle, o as openBlock, f as createElementBlock, g as useWorkspaceStore, w as watchEffect, h as app, r as resolveDirective, i as withDirectives, v as vShow, j as unref, k as createBlock, n as normalizeStyle, s as showNativeMenu, l as script$d, _ as _export_sfc, m as onMounted, p as onBeforeUnmount, B as BaseStyle, q as script$e, t as getWidth, x as getHeight, y as getOuterWidth, z as getOuterHeight, A as getVNodeProp, C as isArray, D as mergeProps, F as Fragment, E as renderList, G as resolveDynamicComponent, H as createBaseVNode, I as createCommentVNode, J as renderSlot, K as useSidebarTabStore, L as useBottomPanelStore, M as withCtx, N as createVNode, O as getAttribute, P as findSingle, Q as focus, R as equals, S as Ripple, T as normalizeClass, U as getOffset, V as script$f, W as script$g, X as toDisplayString, Y as script$h, Z as markRaw, $ as defineStore, a0 as shallowRef, a1 as useI18n, a2 as useCommandStore, a3 as LiteGraph, a4 as useColorPaletteStore, a5 as watch, a6 as useNodeDefStore, a7 as BadgePosition, a8 as LGraphBadge, a9 as _, aa as NodeBadgeMode, ab as ref, ac as useEventListener, ad as nextTick, ae as st, af as normalizeI18nKey, ag as LGraphGroup, ah as LGraphNode, ai as EditableText, aj as isNotEmpty, ak as UniqueComponentId, al as ZIndex, am as resolveFieldData, an as OverlayEventBus, ao as isEmpty, ap as addStyle, aq as relativePosition, ar as absolutePosition, as as ConnectedOverlayScrollHandler, at as isTouchDevice, au as findLastIndex, av as script$i, aw as script$j, ax as script$k, ay as script$l, az as script$m, aA as script$n, aB as resolveComponent, aC as Transition, aD as createSlots, aE as createTextVNode, aF as useNodeFrequencyStore, aG as useNodeBookmarkStore, aH as highlightQuery, aI as script$o, aJ as formatNumberWithSuffix, aK as NodeSourceType, aL as pushScopeId, aM as popScopeId, aN as NodePreview, aO as NodeSearchFilter, aP as script$p, aQ as SearchFilterChip, aR as useLitegraphService, aS as storeToRefs, aT as isRef, aU as toRaw, aV as LinkReleaseTriggerAction, aW as script$q, aX as useUserStore, aY as useDialogStore, aZ as SettingDialogHeader, a_ as SettingDialogContent, a$ as useKeybindingStore, b0 as Teleport, b1 as LinkMarkerShape, b2 as useModelToNodeStore, b3 as CanvasPointer, b4 as IS_CONTROL_WIDGET, b5 as updateControlWidgetLabel, b6 as useColorPaletteService, b7 as setStorageValue, b8 as api, b9 as usePragmaticDroppable, ba as LGraph, bb as LLink, bc as DragAndScale, bd as LGraphCanvas, be as ContextMenu, bf as ChangeTracker, bg as useWorkflowService, bh as ComfyNodeDefImpl, bi as ComfyModelDef, bj as script$r, bk as script$s, bl as script$t, bm as script$u, bn as script$v, bo as normalizeProps, bp as ToastEventBus, bq as setAttribute, br as TransitionGroup, bs as useToast, bt as useToastStore, bu as resolve, bv as nestedPosition, bw as script$w, bx as isPrintableCharacter, by as useQueueSettingsStore, bz as script$x, bA as useQueuePendingTaskCountStore, bB as useLocalStorage, bC as useDraggable, bD as watchDebounced, bE as inject, bF as useElementBounding, bG as lodashExports, bH as useEventBus, bI as script$z, bJ as guardReactiveProps, bK as useMenuItemStore, bL as usePragmaticDraggable, bM as withModifiers, bN as script$B, bO as script$C, bP as provide, bQ as script$D, bR as useDialogService, bS as LGraphEventMode, bT as useQueueStore, bU as i18n, bV as useModelStore } from "./index-DjNHn37O.js"; +import { s as script$y } from "./index-jXPKy3pP.js"; +import { s as script$A } from "./index-B-aVupP5.js"; +import { u as useKeybindingService } from "./keybindingService-Bx7YdkXn.js"; +import { u as useServerConfigStore } from "./serverConfigStore-CvyKFVuP.js"; +import "./index-5HFeZax4.js"; const DEFAULT_TITLE = "ComfyUI"; const TITLE_SUFFIX = " - ComfyUI"; const _sfc_main$t = /* @__PURE__ */ defineComponent({ @@ -9891,4 +9891,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ export { _sfc_main as default }; -//# sourceMappingURL=GraphView-DswvqURL.js.map +//# sourceMappingURL=GraphView-HVeNbkaW.js.map diff --git a/web/assets/InstallView-AV2llYNm.js b/web/assets/InstallView-CAcYt0HL.js similarity index 99% rename from web/assets/InstallView-AV2llYNm.js rename to web/assets/InstallView-CAcYt0HL.js index 0b455d93..2cf9e7f1 100644 --- a/web/assets/InstallView-AV2llYNm.js +++ b/web/assets/InstallView-CAcYt0HL.js @@ -1,7 +1,7 @@ var __defProp = Object.defineProperty; var __name = (target, value2) => __defProp(target, "name", { value: value2, configurable: true }); -import { B as BaseStyle, q as script$6, o as openBlock, f as createElementBlock, D as mergeProps, c1 as findIndexInList, c2 as find, aB as resolveComponent, k as createBlock, G as resolveDynamicComponent, M as withCtx, H as createBaseVNode, X as toDisplayString, J as renderSlot, I as createCommentVNode, T as normalizeClass, P as findSingle, F as Fragment, aC as Transition, i as withDirectives, v as vShow, ak as UniqueComponentId, d as defineComponent, ab as ref, c3 as useModel, N as createVNode, j as unref, c4 as script$7, bQ as script$8, bM as withModifiers, aP as script$9, a1 as useI18n, c as computed, aI as script$a, aE as createTextVNode, c0 as electronAPI, m as onMounted, r as resolveDirective, av as script$b, c5 as script$c, c6 as script$d, l as script$e, bZ as script$f, c7 as MigrationItems, w as watchEffect, E as renderList, c8 as script$g, bW as useRouter, aL as pushScopeId, aM as popScopeId, aU as toRaw, _ as _export_sfc } from "./index-C4Fk50Nx.js"; -import { _ as _sfc_main$5 } from "./BaseViewTemplate-CsEJhGbv.js"; +import { B as BaseStyle, q as script$6, o as openBlock, f as createElementBlock, D as mergeProps, c1 as findIndexInList, c2 as find, aB as resolveComponent, k as createBlock, G as resolveDynamicComponent, M as withCtx, H as createBaseVNode, X as toDisplayString, J as renderSlot, I as createCommentVNode, T as normalizeClass, P as findSingle, F as Fragment, aC as Transition, i as withDirectives, v as vShow, ak as UniqueComponentId, d as defineComponent, ab as ref, c3 as useModel, N as createVNode, j as unref, c4 as script$7, bQ as script$8, bM as withModifiers, aP as script$9, a1 as useI18n, c as computed, aI as script$a, aE as createTextVNode, c0 as electronAPI, m as onMounted, r as resolveDirective, av as script$b, c5 as script$c, c6 as script$d, l as script$e, bZ as script$f, c7 as MigrationItems, w as watchEffect, E as renderList, c8 as script$g, bW as useRouter, aL as pushScopeId, aM as popScopeId, aU as toRaw, _ as _export_sfc } from "./index-DjNHn37O.js"; +import { _ as _sfc_main$5 } from "./BaseViewTemplate-BNGF4K22.js"; var classes$4 = { root: /* @__PURE__ */ __name(function root(_ref) { var instance = _ref.instance; @@ -1285,4 +1285,4 @@ const InstallView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data- export { InstallView as default }; -//# sourceMappingURL=InstallView-AV2llYNm.js.map +//# sourceMappingURL=InstallView-CAcYt0HL.js.map diff --git a/web/assets/KeybindingPanel-CxaJ1IiJ.js b/web/assets/KeybindingPanel-Dc3C4lG1.js similarity index 97% rename from web/assets/KeybindingPanel-CxaJ1IiJ.js rename to web/assets/KeybindingPanel-Dc3C4lG1.js index f165f9a5..6cf204dd 100644 --- a/web/assets/KeybindingPanel-CxaJ1IiJ.js +++ b/web/assets/KeybindingPanel-Dc3C4lG1.js @@ -1,10 +1,10 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, c as computed, o as openBlock, f as createElementBlock, F as Fragment, E as renderList, N as createVNode, M as withCtx, aE as createTextVNode, X as toDisplayString, j as unref, aI as script, I as createCommentVNode, ab as ref, cn as FilterMatchMode, a$ as useKeybindingStore, a2 as useCommandStore, a1 as useI18n, af as normalizeI18nKey, w as watchEffect, bs as useToast, r as resolveDirective, k as createBlock, co as SearchBox, H as createBaseVNode, l as script$2, av as script$4, bM as withModifiers, bZ as script$5, aP as script$6, i as withDirectives, cp as _sfc_main$2, aL as pushScopeId, aM as popScopeId, cq as KeyComboImpl, cr as KeybindingImpl, _ as _export_sfc } from "./index-C4Fk50Nx.js"; -import { s as script$1, a as script$3 } from "./index-CK0rrCYF.js"; -import { u as useKeybindingService } from "./keybindingService-D48fkLBy.js"; -import "./index-lMQBwSDj.js"; -import "./index-B7ycxfFq.js"; +import { d as defineComponent, c as computed, o as openBlock, f as createElementBlock, F as Fragment, E as renderList, N as createVNode, M as withCtx, aE as createTextVNode, X as toDisplayString, j as unref, aI as script, I as createCommentVNode, ab as ref, cn as FilterMatchMode, a$ as useKeybindingStore, a2 as useCommandStore, a1 as useI18n, af as normalizeI18nKey, w as watchEffect, bs as useToast, r as resolveDirective, k as createBlock, co as SearchBox, H as createBaseVNode, l as script$2, av as script$4, bM as withModifiers, bZ as script$5, aP as script$6, i as withDirectives, cp as _sfc_main$2, aL as pushScopeId, aM as popScopeId, cq as KeyComboImpl, cr as KeybindingImpl, _ as _export_sfc } from "./index-DjNHn37O.js"; +import { s as script$1, a as script$3 } from "./index-B5F0uxTQ.js"; +import { u as useKeybindingService } from "./keybindingService-Bx7YdkXn.js"; +import "./index-B-aVupP5.js"; +import "./index-5HFeZax4.js"; const _hoisted_1$1 = { key: 0, class: "px-2" @@ -281,4 +281,4 @@ const KeybindingPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "d export { KeybindingPanel as default }; -//# sourceMappingURL=KeybindingPanel-CxaJ1IiJ.js.map +//# sourceMappingURL=KeybindingPanel-Dc3C4lG1.js.map diff --git a/web/assets/ManualConfigurationView-BA4Vtud8.js b/web/assets/ManualConfigurationView-Bi_qHE-n.js similarity index 94% rename from web/assets/ManualConfigurationView-BA4Vtud8.js rename to web/assets/ManualConfigurationView-Bi_qHE-n.js index 122da4e9..233f20fa 100644 --- a/web/assets/ManualConfigurationView-BA4Vtud8.js +++ b/web/assets/ManualConfigurationView-Bi_qHE-n.js @@ -1,9 +1,9 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, a1 as useI18n, ab as ref, m as onMounted, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, aI as script, l as script$2, c0 as electronAPI } from "./index-C4Fk50Nx.js"; -import { s as script$1 } from "./index-hdfnBvYs.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-CsEJhGbv.js"; -import "./index-B7ycxfFq.js"; +import { d as defineComponent, a1 as useI18n, ab as ref, m as onMounted, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, aI as script, l as script$2, c0 as electronAPI } from "./index-DjNHn37O.js"; +import { s as script$1 } from "./index-jXPKy3pP.js"; +import { _ as _sfc_main$1 } from "./BaseViewTemplate-BNGF4K22.js"; +import "./index-5HFeZax4.js"; const _hoisted_1 = { class: "comfy-installer grow flex flex-col gap-4 text-neutral-300 max-w-110" }; const _hoisted_2 = { class: "text-2xl font-semibold text-neutral-100" }; const _hoisted_3 = { class: "m-1 text-neutral-300" }; @@ -72,4 +72,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ export { _sfc_main as default }; -//# sourceMappingURL=ManualConfigurationView-BA4Vtud8.js.map +//# sourceMappingURL=ManualConfigurationView-Bi_qHE-n.js.map diff --git a/web/assets/NotSupportedView-CRaD8u74.js b/web/assets/NotSupportedView-Drz3x2d-.js similarity index 95% rename from web/assets/NotSupportedView-CRaD8u74.js rename to web/assets/NotSupportedView-Drz3x2d-.js index 07e3eca6..a24af84a 100644 --- a/web/assets/NotSupportedView-CRaD8u74.js +++ b/web/assets/NotSupportedView-Drz3x2d-.js @@ -1,7 +1,7 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, bW as useRouter, r as resolveDirective, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, l as script, i as withDirectives } from "./index-C4Fk50Nx.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-CsEJhGbv.js"; +import { d as defineComponent, bW as useRouter, r as resolveDirective, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, l as script, i as withDirectives } from "./index-DjNHn37O.js"; +import { _ as _sfc_main$1 } from "./BaseViewTemplate-BNGF4K22.js"; const _imports_0 = "" + new URL("images/sad_girl.png", import.meta.url).href; const _hoisted_1 = { class: "sad-container" }; const _hoisted_2 = /* @__PURE__ */ createBaseVNode("img", { @@ -83,4 +83,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ export { _sfc_main as default }; -//# sourceMappingURL=NotSupportedView-CRaD8u74.js.map +//# sourceMappingURL=NotSupportedView-Drz3x2d-.js.map diff --git a/web/assets/ServerConfigPanel-TLv4HMGK.js b/web/assets/ServerConfigPanel-Be4StJmv.js similarity index 97% rename from web/assets/ServerConfigPanel-TLv4HMGK.js rename to web/assets/ServerConfigPanel-Be4StJmv.js index 6489eb66..e84d2d43 100644 --- a/web/assets/ServerConfigPanel-TLv4HMGK.js +++ b/web/assets/ServerConfigPanel-Be4StJmv.js @@ -1,7 +1,7 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { H as createBaseVNode, o as openBlock, f as createElementBlock, Z as markRaw, d as defineComponent, a as useSettingStore, aS as storeToRefs, a5 as watch, cO as useCopyToClipboard, a1 as useI18n, k as createBlock, M as withCtx, j as unref, bZ as script, X as toDisplayString, E as renderList, F as Fragment, N as createVNode, l as script$1, I as createCommentVNode, bQ as script$2, cP as FormItem, cp as _sfc_main$1, c0 as electronAPI } from "./index-C4Fk50Nx.js"; -import { u as useServerConfigStore } from "./serverConfigStore-BawYAb1j.js"; +import { H as createBaseVNode, o as openBlock, f as createElementBlock, Z as markRaw, d as defineComponent, a as useSettingStore, aS as storeToRefs, a5 as watch, cO as useCopyToClipboard, a1 as useI18n, k as createBlock, M as withCtx, j as unref, bZ as script, X as toDisplayString, E as renderList, F as Fragment, N as createVNode, l as script$1, I as createCommentVNode, bQ as script$2, cP as FormItem, cp as _sfc_main$1, c0 as electronAPI } from "./index-DjNHn37O.js"; +import { u as useServerConfigStore } from "./serverConfigStore-CvyKFVuP.js"; const _hoisted_1$1 = { viewBox: "0 0 24 24", width: "1.2em", @@ -155,4 +155,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ export { _sfc_main as default }; -//# sourceMappingURL=ServerConfigPanel-TLv4HMGK.js.map +//# sourceMappingURL=ServerConfigPanel-Be4StJmv.js.map diff --git a/web/assets/ServerStartView-CiO_acWT.js b/web/assets/ServerStartView-CIDTUh4x.js similarity index 95% rename from web/assets/ServerStartView-CiO_acWT.js rename to web/assets/ServerStartView-CIDTUh4x.js index 1abcb36a..6567eea2 100644 --- a/web/assets/ServerStartView-CiO_acWT.js +++ b/web/assets/ServerStartView-CIDTUh4x.js @@ -1,7 +1,7 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, a1 as useI18n, ab as ref, b_ as ProgressStatus, m as onMounted, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, aE as createTextVNode, X as toDisplayString, j as unref, f as createElementBlock, I as createCommentVNode, N as createVNode, l as script, i as withDirectives, v as vShow, b$ as BaseTerminal, aL as pushScopeId, aM as popScopeId, c0 as electronAPI, _ as _export_sfc } from "./index-C4Fk50Nx.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-CsEJhGbv.js"; +import { d as defineComponent, a1 as useI18n, ab as ref, b_ as ProgressStatus, m as onMounted, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, aE as createTextVNode, X as toDisplayString, j as unref, f as createElementBlock, I as createCommentVNode, N as createVNode, l as script, i as withDirectives, v as vShow, b$ as BaseTerminal, aL as pushScopeId, aM as popScopeId, c0 as electronAPI, _ as _export_sfc } from "./index-DjNHn37O.js"; +import { _ as _sfc_main$1 } from "./BaseViewTemplate-BNGF4K22.js"; const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-42c1131d"), n = n(), popScopeId(), n), "_withScopeId"); const _hoisted_1 = { class: "text-2xl font-bold" }; const _hoisted_2 = { key: 0 }; @@ -95,4 +95,4 @@ const ServerStartView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "d export { ServerStartView as default }; -//# sourceMappingURL=ServerStartView-CiO_acWT.js.map +//# sourceMappingURL=ServerStartView-CIDTUh4x.js.map diff --git a/web/assets/UserSelectView-2l9Kbchu.js b/web/assets/UserSelectView-B3jYchWu.js similarity index 97% rename from web/assets/UserSelectView-2l9Kbchu.js rename to web/assets/UserSelectView-B3jYchWu.js index 554218e5..9d2dda86 100644 --- a/web/assets/UserSelectView-2l9Kbchu.js +++ b/web/assets/UserSelectView-B3jYchWu.js @@ -1,7 +1,7 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, aX as useUserStore, bW as useRouter, ab as ref, c as computed, m as onMounted, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, bX as withKeys, j as unref, av as script, bQ as script$1, bY as script$2, bZ as script$3, aE as createTextVNode, I as createCommentVNode, l as script$4 } from "./index-C4Fk50Nx.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-CsEJhGbv.js"; +import { d as defineComponent, aX as useUserStore, bW as useRouter, ab as ref, c as computed, m as onMounted, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, bX as withKeys, j as unref, av as script, bQ as script$1, bY as script$2, bZ as script$3, aE as createTextVNode, I as createCommentVNode, l as script$4 } from "./index-DjNHn37O.js"; +import { _ as _sfc_main$1 } from "./BaseViewTemplate-BNGF4K22.js"; const _hoisted_1 = { id: "comfy-user-selection", class: "min-w-84 relative rounded-lg bg-[var(--comfy-menu-bg)] p-5 px-10 shadow-lg" @@ -99,4 +99,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ export { _sfc_main as default }; -//# sourceMappingURL=UserSelectView-2l9Kbchu.js.map +//# sourceMappingURL=UserSelectView-B3jYchWu.js.map diff --git a/web/assets/WelcomeView-CB7Th_kO.js b/web/assets/WelcomeView-N0ZXLjdi.js similarity index 90% rename from web/assets/WelcomeView-CB7Th_kO.js rename to web/assets/WelcomeView-N0ZXLjdi.js index d5adbd55..bec1292e 100644 --- a/web/assets/WelcomeView-CB7Th_kO.js +++ b/web/assets/WelcomeView-N0ZXLjdi.js @@ -1,7 +1,7 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, bW as useRouter, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, l as script, aL as pushScopeId, aM as popScopeId, _ as _export_sfc } from "./index-C4Fk50Nx.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-CsEJhGbv.js"; +import { d as defineComponent, bW as useRouter, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, l as script, aL as pushScopeId, aM as popScopeId, _ as _export_sfc } from "./index-DjNHn37O.js"; +import { _ as _sfc_main$1 } from "./BaseViewTemplate-BNGF4K22.js"; const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-7dfaf74c"), n = n(), popScopeId(), n), "_withScopeId"); const _hoisted_1 = { class: "flex flex-col items-center justify-center gap-8 p-8" }; const _hoisted_2 = { class: "animated-gradient-text text-glow select-none" }; @@ -37,4 +37,4 @@ const WelcomeView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data- export { WelcomeView as default }; -//# sourceMappingURL=WelcomeView-CB7Th_kO.js.map +//# sourceMappingURL=WelcomeView-N0ZXLjdi.js.map diff --git a/web/assets/index-B7ycxfFq.js b/web/assets/index-5HFeZax4.js similarity index 93% rename from web/assets/index-B7ycxfFq.js rename to web/assets/index-5HFeZax4.js index 2cfff2fa..b4bc111e 100644 --- a/web/assets/index-B7ycxfFq.js +++ b/web/assets/index-5HFeZax4.js @@ -1,6 +1,6 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { ct as script$1, H as createBaseVNode, o as openBlock, f as createElementBlock, D as mergeProps } from "./index-C4Fk50Nx.js"; +import { ct as script$1, H as createBaseVNode, o as openBlock, f as createElementBlock, D as mergeProps } from "./index-DjNHn37O.js"; var script = { name: "PlusIcon", "extends": script$1 @@ -24,4 +24,4 @@ script.render = render; export { script as s }; -//# sourceMappingURL=index-B7ycxfFq.js.map +//# sourceMappingURL=index-5HFeZax4.js.map diff --git a/web/assets/index-lMQBwSDj.js b/web/assets/index-B-aVupP5.js similarity index 94% rename from web/assets/index-lMQBwSDj.js rename to web/assets/index-B-aVupP5.js index c10ea2de..2f4957c2 100644 --- a/web/assets/index-lMQBwSDj.js +++ b/web/assets/index-B-aVupP5.js @@ -1,6 +1,6 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { ct as script$1, H as createBaseVNode, o as openBlock, f as createElementBlock, D as mergeProps } from "./index-C4Fk50Nx.js"; +import { ct as script$1, H as createBaseVNode, o as openBlock, f as createElementBlock, D as mergeProps } from "./index-DjNHn37O.js"; var script = { name: "BarsIcon", "extends": script$1 @@ -26,4 +26,4 @@ script.render = render; export { script as s }; -//# sourceMappingURL=index-lMQBwSDj.js.map +//# sourceMappingURL=index-B-aVupP5.js.map diff --git a/web/assets/index-CK0rrCYF.js b/web/assets/index-B5F0uxTQ.js similarity index 99% rename from web/assets/index-CK0rrCYF.js rename to web/assets/index-B5F0uxTQ.js index a483ee10..78222d18 100644 --- a/web/assets/index-CK0rrCYF.js +++ b/web/assets/index-B5F0uxTQ.js @@ -1,8 +1,8 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { B as BaseStyle, q as script$s, ct as script$t, H as createBaseVNode, o as openBlock, f as createElementBlock, D as mergeProps, X as toDisplayString, S as Ripple, r as resolveDirective, i as withDirectives, k as createBlock, G as resolveDynamicComponent, bY as script$u, aB as resolveComponent, T as normalizeClass, aD as createSlots, M as withCtx, bz as script$v, bw as script$w, F as Fragment, E as renderList, aE as createTextVNode, bq as setAttribute, ak as UniqueComponentId, bo as normalizeProps, J as renderSlot, I as createCommentVNode, R as equals, bk as script$x, c8 as script$y, cu as getFirstFocusableElement, an as OverlayEventBus, A as getVNodeProp, am as resolveFieldData, cv as invokeElementMethod, O as getAttribute, cw as getNextElementSibling, y as getOuterWidth, cx as getPreviousElementSibling, l as script$z, ay as script$A, W as script$B, bn as script$D, aj as isNotEmpty, bM as withModifiers, z as getOuterHeight, cy as _default, al as ZIndex, Q as focus, ap as addStyle, ar as absolutePosition, as as ConnectedOverlayScrollHandler, at as isTouchDevice, cz as FilterOperator, ax as script$E, cA as FocusTrap, N as createVNode, aC as Transition, bX as withKeys, cB as getIndex, aW as script$G, cC as isClickable, cD as clearSelection, cE as localeComparator, cF as sort, cG as FilterService, cn as FilterMatchMode, P as findSingle, c1 as findIndexInList, c2 as find, cH as exportCSV, U as getOffset, cI as getHiddenElementOuterWidth, cJ as getHiddenElementOuterHeight, cK as reorderArray, cL as getWindowScrollTop, cM as removeClass, cN as addClass, ao as isEmpty, aw as script$H, az as script$I } from "./index-C4Fk50Nx.js"; -import { s as script$C } from "./index-lMQBwSDj.js"; -import { s as script$F } from "./index-B7ycxfFq.js"; +import { B as BaseStyle, q as script$s, ct as script$t, H as createBaseVNode, o as openBlock, f as createElementBlock, D as mergeProps, X as toDisplayString, S as Ripple, r as resolveDirective, i as withDirectives, k as createBlock, G as resolveDynamicComponent, bY as script$u, aB as resolveComponent, T as normalizeClass, aD as createSlots, M as withCtx, bz as script$v, bw as script$w, F as Fragment, E as renderList, aE as createTextVNode, bq as setAttribute, ak as UniqueComponentId, bo as normalizeProps, J as renderSlot, I as createCommentVNode, R as equals, bk as script$x, c8 as script$y, cu as getFirstFocusableElement, an as OverlayEventBus, A as getVNodeProp, am as resolveFieldData, cv as invokeElementMethod, O as getAttribute, cw as getNextElementSibling, y as getOuterWidth, cx as getPreviousElementSibling, l as script$z, ay as script$A, W as script$B, bn as script$D, aj as isNotEmpty, bM as withModifiers, z as getOuterHeight, cy as _default, al as ZIndex, Q as focus, ap as addStyle, ar as absolutePosition, as as ConnectedOverlayScrollHandler, at as isTouchDevice, cz as FilterOperator, ax as script$E, cA as FocusTrap, N as createVNode, aC as Transition, bX as withKeys, cB as getIndex, aW as script$G, cC as isClickable, cD as clearSelection, cE as localeComparator, cF as sort, cG as FilterService, cn as FilterMatchMode, P as findSingle, c1 as findIndexInList, c2 as find, cH as exportCSV, U as getOffset, cI as getHiddenElementOuterWidth, cJ as getHiddenElementOuterHeight, cK as reorderArray, cL as getWindowScrollTop, cM as removeClass, cN as addClass, ao as isEmpty, aw as script$H, az as script$I } from "./index-DjNHn37O.js"; +import { s as script$C } from "./index-B-aVupP5.js"; +import { s as script$F } from "./index-5HFeZax4.js"; var ColumnStyle = BaseStyle.extend({ name: "column" }); @@ -8783,4 +8783,4 @@ export { script as a, script$r as s }; -//# sourceMappingURL=index-CK0rrCYF.js.map +//# sourceMappingURL=index-B5F0uxTQ.js.map diff --git a/web/assets/index-5Sv744Dr.js b/web/assets/index-Bordpmzt.js similarity index 99% rename from web/assets/index-5Sv744Dr.js rename to web/assets/index-Bordpmzt.js index 5ec1cf8e..85a75572 100644 --- a/web/assets/index-5Sv744Dr.js +++ b/web/assets/index-Bordpmzt.js @@ -1,6 +1,6 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { ca as ComfyDialog, cb as $el, cc as ComfyApp, h as app, a3 as LiteGraph, bd as LGraphCanvas, cd as useExtensionService, ce as processDynamicPrompt, cf as isElectron, c0 as electronAPI, bR as useDialogService, cg as t, ch as DraggableList, bt as useToastStore, ah as LGraphNode, ci as applyTextReplacements, cj as ComfyWidgets, ck as addValueControlWidgets, a6 as useNodeDefStore, cl as serialise, cm as deserialiseAndCreate, b8 as api, a as useSettingStore, ag as LGraphGroup, ad as nextTick } from "./index-C4Fk50Nx.js"; +import { ca as ComfyDialog, cb as $el, cc as ComfyApp, h as app, a3 as LiteGraph, bd as LGraphCanvas, cd as useExtensionService, ce as processDynamicPrompt, cf as isElectron, c0 as electronAPI, bR as useDialogService, cg as t, ch as DraggableList, bt as useToastStore, ah as LGraphNode, ci as applyTextReplacements, cj as ComfyWidgets, ck as addValueControlWidgets, a6 as useNodeDefStore, cl as serialise, cm as deserialiseAndCreate, b8 as api, a as useSettingStore, ag as LGraphGroup, ad as nextTick } from "./index-DjNHn37O.js"; class ClipspaceDialog extends ComfyDialog { static { __name(this, "ClipspaceDialog"); @@ -53211,4 +53211,4 @@ app.registerExtension({ }); } }); -//# sourceMappingURL=index-5Sv744Dr.js.map +//# sourceMappingURL=index-Bordpmzt.js.map diff --git a/web/assets/index-C4Fk50Nx.js b/web/assets/index-DjNHn37O.js similarity index 99% rename from web/assets/index-C4Fk50Nx.js rename to web/assets/index-DjNHn37O.js index 0da0e4c9..fff8484b 100644 --- a/web/assets/index-C4Fk50Nx.js +++ b/web/assets/index-DjNHn37O.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./GraphView-DswvqURL.js","./index-hdfnBvYs.js","./index-B7ycxfFq.js","./index-lMQBwSDj.js","./keybindingService-D48fkLBy.js","./serverConfigStore-BawYAb1j.js","./GraphView-CIRWBKTm.css","./UserSelectView-2l9Kbchu.js","./BaseViewTemplate-CsEJhGbv.js","./ServerStartView-CiO_acWT.js","./ServerStartView-CnyN4Ib6.css","./InstallView-AV2llYNm.js","./InstallView-CwQdoH-C.css","./WelcomeView-CB7Th_kO.js","./WelcomeView-Brz3-luE.css","./NotSupportedView-CRaD8u74.js","./NotSupportedView-bFzHmqNj.css","./DownloadGitView-DP1MIWYX.js","./ManualConfigurationView-BA4Vtud8.js","./ManualConfigurationView-B6ecEClB.css","./KeybindingPanel-CxaJ1IiJ.js","./index-CK0rrCYF.js","./KeybindingPanel-DvrUYZ4S.css","./ExtensionPanel-CxijYN47.js","./ServerConfigPanel-TLv4HMGK.js","./index-5Sv744Dr.js","./index-BRhY6FpL.css"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./GraphView-HVeNbkaW.js","./index-jXPKy3pP.js","./index-5HFeZax4.js","./index-B-aVupP5.js","./keybindingService-Bx7YdkXn.js","./serverConfigStore-CvyKFVuP.js","./GraphView-CIRWBKTm.css","./UserSelectView-B3jYchWu.js","./BaseViewTemplate-BNGF4K22.js","./ServerStartView-CIDTUh4x.js","./ServerStartView-CnyN4Ib6.css","./InstallView-CAcYt0HL.js","./InstallView-CwQdoH-C.css","./WelcomeView-N0ZXLjdi.js","./WelcomeView-Brz3-luE.css","./NotSupportedView-Drz3x2d-.js","./NotSupportedView-bFzHmqNj.css","./DownloadGitView-DeC7MBzG.js","./ManualConfigurationView-Bi_qHE-n.js","./ManualConfigurationView-B6ecEClB.css","./KeybindingPanel-Dc3C4lG1.js","./index-B5F0uxTQ.js","./KeybindingPanel-DvrUYZ4S.css","./ExtensionPanel-D4Phn0Zr.js","./ServerConfigPanel-Be4StJmv.js","./index-Bordpmzt.js","./index-BRhY6FpL.css"])))=>i.map(i=>d[i]); var __defProp2 = Object.defineProperty; var __name = (target, value4) => __defProp2(target, "name", { value: value4, configurable: true }); (/* @__PURE__ */ __name(function polyfill() { @@ -38279,7 +38279,7 @@ class LGraphCanvas { } else if (e2.type == "keyup") { if (e2.keyCode == 32) { this.read_only = false; - this.dragging_canvas = this._previously_dragging_canvas ?? false; + this.dragging_canvas = (this._previously_dragging_canvas ?? false) && this.pointer.isDown; this._previously_dragging_canvas = null; } if (this.selected_nodes) { @@ -46123,7 +46123,7 @@ const router = createRouter({ { path: "", name: "GraphView", - component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./GraphView-DswvqURL.js"), true ? __vite__mapDeps([0,1,2,3,4,5,6]) : void 0, import.meta.url), "component"), + component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./GraphView-HVeNbkaW.js"), true ? __vite__mapDeps([0,1,2,3,4,5,6]) : void 0, import.meta.url), "component"), beforeEnter: /* @__PURE__ */ __name(async (to, from2, next2) => { const userStore = useUserStore(); await userStore.initialize(); @@ -46137,42 +46137,42 @@ const router = createRouter({ { path: "user-select", name: "UserSelectView", - component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./UserSelectView-2l9Kbchu.js"), true ? __vite__mapDeps([7,8]) : void 0, import.meta.url), "component") + component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./UserSelectView-B3jYchWu.js"), true ? __vite__mapDeps([7,8]) : void 0, import.meta.url), "component") }, { path: "server-start", name: "ServerStartView", - component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./ServerStartView-CiO_acWT.js"), true ? __vite__mapDeps([9,8,10]) : void 0, import.meta.url), "component"), + component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./ServerStartView-CIDTUh4x.js"), true ? __vite__mapDeps([9,8,10]) : void 0, import.meta.url), "component"), beforeEnter: guardElectronAccess }, { path: "install", name: "InstallView", - component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./InstallView-AV2llYNm.js"), true ? __vite__mapDeps([11,8,12]) : void 0, import.meta.url), "component"), + component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./InstallView-CAcYt0HL.js"), true ? __vite__mapDeps([11,8,12]) : void 0, import.meta.url), "component"), beforeEnter: guardElectronAccess }, { path: "welcome", name: "WelcomeView", - component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./WelcomeView-CB7Th_kO.js"), true ? __vite__mapDeps([13,8,14]) : void 0, import.meta.url), "component"), + component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./WelcomeView-N0ZXLjdi.js"), true ? __vite__mapDeps([13,8,14]) : void 0, import.meta.url), "component"), beforeEnter: guardElectronAccess }, { path: "not-supported", name: "NotSupportedView", - component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./NotSupportedView-CRaD8u74.js"), true ? __vite__mapDeps([15,8,16]) : void 0, import.meta.url), "component"), + component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./NotSupportedView-Drz3x2d-.js"), true ? __vite__mapDeps([15,8,16]) : void 0, import.meta.url), "component"), beforeEnter: guardElectronAccess }, { path: "download-git", name: "DownloadGitView", - component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./DownloadGitView-DP1MIWYX.js"), true ? __vite__mapDeps([17,8]) : void 0, import.meta.url), "component"), + component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./DownloadGitView-DeC7MBzG.js"), true ? __vite__mapDeps([17,8]) : void 0, import.meta.url), "component"), beforeEnter: guardElectronAccess }, { path: "manual-configuration", name: "ManualConfigurationView", - component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./ManualConfigurationView-BA4Vtud8.js"), true ? __vite__mapDeps([18,1,2,8,19]) : void 0, import.meta.url), "component"), + component: /* @__PURE__ */ __name(() => __vitePreload(() => import("./ManualConfigurationView-Bi_qHE-n.js"), true ? __vite__mapDeps([18,1,2,8,19]) : void 0, import.meta.url), "component"), beforeEnter: guardElectronAccess } ] @@ -58027,7 +58027,7 @@ const _sfc_main$Z = /* @__PURE__ */ defineComponent({ }); const config$1 = { app_title: "ComfyUI", - app_version: "1.6.17" + app_version: "1.6.18" }; /*! * shared v9.13.1 @@ -116940,7 +116940,11 @@ const useSettingStore = /* @__PURE__ */ defineStore("setting", () => { } __name(exists, "exists"); async function set3(key, value4) { - const newValue2 = tryMigrateDeprecatedValue(settingsById.value[key], value4); + const clonedValue = _.cloneDeep(value4); + const newValue2 = tryMigrateDeprecatedValue( + settingsById.value[key], + clonedValue + ); const oldValue2 = get3(key); if (newValue2 === oldValue2) return; onChange(settingsById.value[key], newValue2, oldValue2); @@ -116949,7 +116953,7 @@ const useSettingStore = /* @__PURE__ */ defineStore("setting", () => { } __name(set3, "set"); function get3(key) { - return settingValues.value[key] ?? getDefaultValue(key); + return _.cloneDeep(settingValues.value[key] ?? getDefaultValue(key)); } __name(get3, "get"); function getDefaultValue(key) { @@ -117954,7 +117958,7 @@ const useSystemStatsStore = /* @__PURE__ */ defineStore("systemStats", () => { }; }); const useAboutPanelStore = /* @__PURE__ */ defineStore("aboutPanel", () => { - const frontendVersion = "1.6.17"; + const frontendVersion = "1.6.18"; const extensionStore = useExtensionStore(); const systemStatsStore = useSystemStatsStore(); const coreVersion = computed( @@ -123467,13 +123471,13 @@ const _sfc_main$x = /* @__PURE__ */ defineComponent({ setup(__props) { const props = __props; const KeybindingPanel = /* @__PURE__ */ defineAsyncComponent( - () => __vitePreload(() => import("./KeybindingPanel-CxaJ1IiJ.js"), true ? __vite__mapDeps([20,21,3,2,4,22]) : void 0, import.meta.url) + () => __vitePreload(() => import("./KeybindingPanel-Dc3C4lG1.js"), true ? __vite__mapDeps([20,21,3,2,4,22]) : void 0, import.meta.url) ); const ExtensionPanel = /* @__PURE__ */ defineAsyncComponent( - () => __vitePreload(() => import("./ExtensionPanel-CxijYN47.js"), true ? __vite__mapDeps([23,21,3,2]) : void 0, import.meta.url) + () => __vitePreload(() => import("./ExtensionPanel-D4Phn0Zr.js"), true ? __vite__mapDeps([23,21,3,2]) : void 0, import.meta.url) ); const ServerConfigPanel = /* @__PURE__ */ defineAsyncComponent( - () => __vitePreload(() => import("./ServerConfigPanel-TLv4HMGK.js"), true ? __vite__mapDeps([24,5]) : void 0, import.meta.url) + () => __vitePreload(() => import("./ServerConfigPanel-Be4StJmv.js"), true ? __vite__mapDeps([24,5]) : void 0, import.meta.url) ); const aboutPanelNode = { key: "about", @@ -124637,7 +124641,7 @@ const useWorkflowTemplatesStore = /* @__PURE__ */ defineStore( }; } ); -const _withScopeId$e = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-2d616ed7"), n = n(), popScopeId(), n), "_withScopeId$e"); +const _withScopeId$e = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-fc26284b"), n = n(), popScopeId(), n), "_withScopeId$e"); const _hoisted_1$w = { class: "flex h-96", "data-testid": "template-workflows-content" @@ -124694,7 +124698,7 @@ const _sfc_main$u = /* @__PURE__ */ defineComponent({ workflowLoading.value = id3; let json; if (selectedTab.value.moduleName === "default") { - json = await fetch(api.fileURL(`templates/${id3}.json`)).then( + json = await fetch(api.fileURL(`/templates/${id3}.json`)).then( (r) => r.json() ); } else { @@ -124751,7 +124755,7 @@ const _sfc_main$u = /* @__PURE__ */ defineComponent({ }; } }); -const TemplateWorkflowsContent = /* @__PURE__ */ _export_sfc(_sfc_main$u, [["__scopeId", "data-v-2d616ed7"]]); +const TemplateWorkflowsContent = /* @__PURE__ */ _export_sfc(_sfc_main$u, [["__scopeId", "data-v-fc26284b"]]); const useDialogService = /* @__PURE__ */ __name(() => { const dialogStore = useDialogStore(); function showLoadWorkflowWarning(props) { @@ -124946,6 +124950,14 @@ const useKeybindingStore = /* @__PURE__ */ defineStore("keybinding", () => { const defaultKeybindings = ref({}); const userKeybindings = ref({}); const userUnsetKeybindings = ref({}); + function getUserKeybindings() { + return userKeybindings.value; + } + __name(getUserKeybindings, "getUserKeybindings"); + function getUserUnsetKeybindings() { + return userUnsetKeybindings.value; + } + __name(getUserUnsetKeybindings, "getUserUnsetKeybindings"); const keybindingByKeyCombo = computed(() => { const result = { ...defaultKeybindings.value @@ -125065,8 +125077,8 @@ const useKeybindingStore = /* @__PURE__ */ defineStore("keybinding", () => { __name(isCommandKeybindingModified, "isCommandKeybindingModified"); return { keybindings, - userKeybindings, - userUnsetKeybindings, + getUserKeybindings, + getUserUnsetKeybindings, getKeybinding, getKeybindingsByCommandId, getKeybindingByCommandId, @@ -164042,7 +164054,7 @@ const useExtensionService = /* @__PURE__ */ __name(() => { settingStore.get("Comfy.Extension.Disabled") ); const extensions = await api.getExtensions(); - await __vitePreload(() => import("./index-5Sv744Dr.js"), true ? __vite__mapDeps([25,26]) : void 0, import.meta.url); + await __vitePreload(() => import("./index-Bordpmzt.js"), true ? __vite__mapDeps([25,26]) : void 0, import.meta.url); extensionStore.captureCoreExtensions(); await Promise.all( extensions.filter((extension) => !extension.includes("extensions/core")).map(async (ext) => { @@ -184710,4 +184722,4 @@ export { getOuterWidth as y, getOuterHeight as z }; -//# sourceMappingURL=index-C4Fk50Nx.js.map +//# sourceMappingURL=index-DjNHn37O.js.map diff --git a/web/assets/index-hdfnBvYs.js b/web/assets/index-jXPKy3pP.js similarity index 97% rename from web/assets/index-hdfnBvYs.js rename to web/assets/index-jXPKy3pP.js index 6208586b..1efdf332 100644 --- a/web/assets/index-hdfnBvYs.js +++ b/web/assets/index-jXPKy3pP.js @@ -1,7 +1,7 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { B as BaseStyle, q as script$2, ak as UniqueComponentId, c9 as script$4, l as script$5, S as Ripple, aB as resolveComponent, o as openBlock, f as createElementBlock, D as mergeProps, H as createBaseVNode, J as renderSlot, T as normalizeClass, X as toDisplayString, I as createCommentVNode, k as createBlock, M as withCtx, G as resolveDynamicComponent, N as createVNode, aC as Transition, i as withDirectives, v as vShow } from "./index-C4Fk50Nx.js"; -import { s as script$3 } from "./index-B7ycxfFq.js"; +import { B as BaseStyle, q as script$2, ak as UniqueComponentId, c9 as script$4, l as script$5, S as Ripple, aB as resolveComponent, o as openBlock, f as createElementBlock, D as mergeProps, H as createBaseVNode, J as renderSlot, T as normalizeClass, X as toDisplayString, I as createCommentVNode, k as createBlock, M as withCtx, G as resolveDynamicComponent, N as createVNode, aC as Transition, i as withDirectives, v as vShow } from "./index-DjNHn37O.js"; +import { s as script$3 } from "./index-5HFeZax4.js"; var theme = /* @__PURE__ */ __name(function theme2(_ref) { var dt = _ref.dt; return "\n.p-panel {\n border: 1px solid ".concat(dt("panel.border.color"), ";\n border-radius: ").concat(dt("panel.border.radius"), ";\n background: ").concat(dt("panel.background"), ";\n color: ").concat(dt("panel.color"), ";\n}\n\n.p-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: ").concat(dt("panel.header.padding"), ";\n background: ").concat(dt("panel.header.background"), ";\n color: ").concat(dt("panel.header.color"), ";\n border-style: solid;\n border-width: ").concat(dt("panel.header.border.width"), ";\n border-color: ").concat(dt("panel.header.border.color"), ";\n border-radius: ").concat(dt("panel.header.border.radius"), ";\n}\n\n.p-panel-toggleable .p-panel-header {\n padding: ").concat(dt("panel.toggleable.header.padding"), ";\n}\n\n.p-panel-title {\n line-height: 1;\n font-weight: ").concat(dt("panel.title.font.weight"), ";\n}\n\n.p-panel-content {\n padding: ").concat(dt("panel.content.padding"), ";\n}\n\n.p-panel-footer {\n padding: ").concat(dt("panel.footer.padding"), ";\n}\n"); @@ -170,4 +170,4 @@ script.render = render; export { script as s }; -//# sourceMappingURL=index-hdfnBvYs.js.map +//# sourceMappingURL=index-jXPKy3pP.js.map diff --git a/web/assets/index-DmMtlpqz.css b/web/assets/index-t-sFBuUC.css similarity index 99% rename from web/assets/index-DmMtlpqz.css rename to web/assets/index-t-sFBuUC.css index dbcdad37..f588a35c 100644 --- a/web/assets/index-DmMtlpqz.css +++ b/web/assets/index-t-sFBuUC.css @@ -3886,7 +3886,7 @@ audio.comfy-audio.empty-audio-widget { text-align: center; } -.carousel[data-v-2d616ed7] { +.carousel[data-v-fc26284b] { width: 66vw; } /** diff --git a/web/assets/keybindingService-D48fkLBy.js b/web/assets/keybindingService-Bx7YdkXn.js similarity index 96% rename from web/assets/keybindingService-D48fkLBy.js rename to web/assets/keybindingService-Bx7YdkXn.js index 7ceae65c..37b5d01c 100644 --- a/web/assets/keybindingService-D48fkLBy.js +++ b/web/assets/keybindingService-Bx7YdkXn.js @@ -1,6 +1,6 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { a$ as useKeybindingStore, a2 as useCommandStore, a as useSettingStore, cq as KeyComboImpl, cr as KeybindingImpl } from "./index-C4Fk50Nx.js"; +import { a$ as useKeybindingStore, a2 as useCommandStore, a as useSettingStore, cq as KeyComboImpl, cr as KeybindingImpl } from "./index-DjNHn37O.js"; const CORE_KEYBINDINGS = [ { combo: { @@ -229,11 +229,11 @@ const useKeybindingService = /* @__PURE__ */ __name(() => { async function persistUserKeybindings() { await settingStore.set( "Comfy.Keybinding.NewBindings", - Object.values(keybindingStore.userKeybindings.value) + Object.values(keybindingStore.getUserKeybindings()) ); await settingStore.set( "Comfy.Keybinding.UnsetBindings", - Object.values(keybindingStore.userUnsetKeybindings.value) + Object.values(keybindingStore.getUserUnsetKeybindings()) ); } __name(persistUserKeybindings, "persistUserKeybindings"); @@ -247,4 +247,4 @@ const useKeybindingService = /* @__PURE__ */ __name(() => { export { useKeybindingService as u }; -//# sourceMappingURL=keybindingService-D48fkLBy.js.map +//# sourceMappingURL=keybindingService-Bx7YdkXn.js.map diff --git a/web/assets/serverConfigStore-BawYAb1j.js b/web/assets/serverConfigStore-CvyKFVuP.js similarity index 97% rename from web/assets/serverConfigStore-BawYAb1j.js rename to web/assets/serverConfigStore-CvyKFVuP.js index 90b3fe9a..65cc6b7f 100644 --- a/web/assets/serverConfigStore-BawYAb1j.js +++ b/web/assets/serverConfigStore-CvyKFVuP.js @@ -1,6 +1,6 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { $ as defineStore, ab as ref, c as computed } from "./index-C4Fk50Nx.js"; +import { $ as defineStore, ab as ref, c as computed } from "./index-DjNHn37O.js"; const useServerConfigStore = defineStore("serverConfig", () => { const serverConfigById = ref({}); const serverConfigs = computed(() => { @@ -87,4 +87,4 @@ const useServerConfigStore = defineStore("serverConfig", () => { export { useServerConfigStore as u }; -//# sourceMappingURL=serverConfigStore-BawYAb1j.js.map +//# sourceMappingURL=serverConfigStore-CvyKFVuP.js.map diff --git a/web/index.html b/web/index.html index ecf50f28..a79b584c 100644 --- a/web/index.html +++ b/web/index.html @@ -6,8 +6,8 @@ - - + +
From d055325783ef30956d5af8a2b0add775c37caa6d Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Mon, 6 Jan 2025 20:12:22 -0500 Subject: [PATCH 08/12] Document get_attr and get_model_object (#6357) * Document get_attr and get_model_object * Update model_patcher.py * Update model_patcher.py * Update model_patcher.py --- comfy/model_patcher.py | 15 ++++++++++++++- comfy/utils.py | 20 +++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/comfy/model_patcher.py b/comfy/model_patcher.py index 4597ce11..e886bdbb 100644 --- a/comfy/model_patcher.py +++ b/comfy/model_patcher.py @@ -402,7 +402,20 @@ class ModelPatcher: def add_object_patch(self, name, obj): self.object_patches[name] = obj - def get_model_object(self, name): + def get_model_object(self, name: str) -> torch.nn.Module: + """Retrieves a nested attribute from an object using dot notation considering + object patches. + + Args: + name (str): The attribute path using dot notation (e.g. "model.layer.weight") + + Returns: + The value of the requested attribute + + Example: + patcher = ModelPatcher() + weight = patcher.get_model_object("layer1.conv.weight") + """ if name in self.object_patches: return self.object_patches[name] else: diff --git a/comfy/utils.py b/comfy/utils.py index ea666ae5..b486b2de 100644 --- a/comfy/utils.py +++ b/comfy/utils.py @@ -693,7 +693,25 @@ def copy_to_param(obj, attr, value): prev = getattr(obj, attrs[-1]) prev.data.copy_(value) -def get_attr(obj, attr): +def get_attr(obj, attr: str): + """Retrieves a nested attribute from an object using dot notation. + + Args: + obj: The object to get the attribute from + attr (str): The attribute path using dot notation (e.g. "model.layer.weight") + + Returns: + The value of the requested attribute + + Example: + model = MyModel() + weight = get_attr(model, "layer1.conv.weight") + # Equivalent to: model.layer1.conv.weight + + Important: + Always prefer `comfy.model_patcher.ModelPatcher.get_model_object` when + accessing nested model objects under `ModelPatcher.model`. + """ attrs = attr.split(".") for name in attrs: obj = getattr(obj, name) From 4209edf48dcb72ff73580b7fb19b72b9b8ebba01 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 7 Jan 2025 02:12:12 -0500 Subject: [PATCH 09/12] Make a few more samplers deterministic. --- comfy/k_diffusion/sampling.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/comfy/k_diffusion/sampling.py b/comfy/k_diffusion/sampling.py index d37d7dd9..413ad5aa 100644 --- a/comfy/k_diffusion/sampling.py +++ b/comfy/k_diffusion/sampling.py @@ -475,7 +475,7 @@ class DPMSolver(nn.Module): return x_3, eps_cache def dpm_solver_fast(self, x, t_start, t_end, nfe, eta=0., s_noise=1., noise_sampler=None): - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + noise_sampler = default_noise_sampler(x, seed=self.extra_args.get("seed", None)) if noise_sampler is None else noise_sampler if not t_end > t_start and eta: raise ValueError('eta must be 0 for reverse sampling') @@ -514,7 +514,7 @@ class DPMSolver(nn.Module): return x def dpm_solver_adaptive(self, x, t_start, t_end, order=3, rtol=0.05, atol=0.0078, h_init=0.05, pcoeff=0., icoeff=1., dcoeff=0., accept_safety=0.81, eta=0., s_noise=1., noise_sampler=None): - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + noise_sampler = default_noise_sampler(x, seed=self.extra_args.get("seed", None)) if noise_sampler is None else noise_sampler if order not in {2, 3}: raise ValueError('order should be 2 or 3') forward = t_end > t_start @@ -894,7 +894,8 @@ def DDPMSampler_step(x, sigma, sigma_prev, noise, noise_sampler): def generic_step_sampler(model, x, sigmas, extra_args=None, callback=None, disable=None, noise_sampler=None, step_function=None): extra_args = {} if extra_args is None else extra_args - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + seed = extra_args.get("seed", None) + noise_sampler = default_noise_sampler(x, seed=seed) if noise_sampler is None else noise_sampler s_in = x.new_ones([x.shape[0]]) for i in trange(len(sigmas) - 1, disable=disable): @@ -914,7 +915,8 @@ def sample_ddpm(model, x, sigmas, extra_args=None, callback=None, disable=None, @torch.no_grad() def sample_lcm(model, x, sigmas, extra_args=None, callback=None, disable=None, noise_sampler=None): extra_args = {} if extra_args is None else extra_args - noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + seed = extra_args.get("seed", None) + noise_sampler = default_noise_sampler(x, seed=seed) if noise_sampler is None else noise_sampler s_in = x.new_ones([x.shape[0]]) for i in trange(len(sigmas) - 1, disable=disable): denoised = model(x, sigmas[i] * s_in, **extra_args) From c515bdf3710e77233e5b4baa24e038de8e86f56e Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" <128333288+ltdrdata@users.noreply.github.com> Date: Wed, 8 Jan 2025 06:03:56 +0900 Subject: [PATCH 10/12] fixed: robust loading `comfy.settings.json` (#6383) https://github.com/comfyanonymous/ComfyUI/issues/6371 --- app/app_settings.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/app_settings.py b/app/app_settings.py index efe87adb..a545df92 100644 --- a/app/app_settings.py +++ b/app/app_settings.py @@ -1,6 +1,7 @@ import os import json from aiohttp import web +import logging class AppSettings(): @@ -11,8 +12,12 @@ class AppSettings(): file = self.user_manager.get_request_user_filepath( request, "comfy.settings.json") if os.path.isfile(file): - with open(file) as f: - return json.load(f) + try: + with open(file) as f: + return json.load(f) + except: + logging.error(f"The user settings file is corrupted: {file}") + return {} else: return {} From d0f3752e332ad9b2d8ee6f9c4317868aa685a62e Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 7 Jan 2025 17:32:29 -0500 Subject: [PATCH 11/12] Properly calculate inner dim for t5 model. This is required to support some different types of t5 models. --- comfy/text_encoders/t5.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/comfy/text_encoders/t5.py b/comfy/text_encoders/t5.py index 38d8d523..7405528e 100644 --- a/comfy/text_encoders/t5.py +++ b/comfy/text_encoders/t5.py @@ -227,8 +227,9 @@ class T5(torch.nn.Module): super().__init__() self.num_layers = config_dict["num_layers"] model_dim = config_dict["d_model"] + inner_dim = config_dict["d_kv"] * config_dict["num_heads"] - self.encoder = T5Stack(self.num_layers, model_dim, model_dim, config_dict["d_ff"], config_dict["dense_act_fn"], config_dict["is_gated_act"], config_dict["num_heads"], config_dict["model_type"] != "umt5", dtype, device, operations) + self.encoder = T5Stack(self.num_layers, model_dim, inner_dim, config_dict["d_ff"], config_dict["dense_act_fn"], config_dict["is_gated_act"], config_dict["num_heads"], config_dict["model_type"] != "umt5", dtype, device, operations) self.dtype = dtype self.shared = operations.Embedding(config_dict["vocab_size"], model_dim, device=device, dtype=dtype) From 2307ff6746177cd84c5cf84dc0a97e967e9012e3 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 8 Jan 2025 19:05:22 -0500 Subject: [PATCH 12/12] Improve some logging messages. --- comfy/sd.py | 4 ++-- ruff.toml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/comfy/sd.py b/comfy/sd.py index c6d6236b..f3c65f9e 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -111,7 +111,7 @@ class CLIP: model_management.load_models_gpu([self.patcher], force_full_load=True) self.layer_idx = None self.use_clip_schedule = False - logging.info("CLIP model load device: {}, offload device: {}, current: {}, dtype: {}".format(load_device, offload_device, params['device'], dtype)) + logging.info("CLIP/text encoder model load device: {}, offload device: {}, current: {}, dtype: {}".format(load_device, offload_device, params['device'], dtype)) def clone(self): n = CLIP(no_init=True) @@ -898,7 +898,7 @@ def load_state_dict_guess_config(sd, output_vae=True, output_clip=True, output_c if output_model: model_patcher = comfy.model_patcher.ModelPatcher(model, load_device=load_device, offload_device=model_management.unet_offload_device()) if inital_load_device != torch.device("cpu"): - logging.info("loaded straight to GPU") + logging.info("loaded diffusion model directly to GPU") model_management.load_models_gpu([model_patcher], force_full_load=True) return (model_patcher, clip, vae, clipvision) diff --git a/ruff.toml b/ruff.toml index 660831f2..808a2ad0 100644 --- a/ruff.toml +++ b/ruff.toml @@ -4,7 +4,8 @@ lint.ignore = ["ALL"] # Enable specific rules lint.select = [ "S307", # suspicious-eval-usage - "T201", # print-usage + "S102", # exec + "T", # print-usage "W", # The "F" series in Ruff stands for "Pyflakes" rules, which catch various Python syntax errors and undefined names. # See all rules here: https://docs.astral.sh/ruff/rules/#pyflakes-f