comfyui-frontend-package 1.37.9__py3-none-any.whl → 1.37.11__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-BudnQURa.js → AboutPanel-B-lCq9HV.js} +2 -2
- comfyui_frontend_package/static/assets/{AboutPanel-BudnQURa.js.map → AboutPanel-B-lCq9HV.js.map} +1 -1
- comfyui_frontend_package/static/assets/{AudioPreviewPlayer-CHjtFZRu.js → AudioPreviewPlayer-CXgr12AM.js} +2 -2
- comfyui_frontend_package/static/assets/{AudioPreviewPlayer-CHjtFZRu.js.map → AudioPreviewPlayer-CXgr12AM.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ComfyQueueButton-QhN0FmOY.js → ComfyQueueButton-C6ttLtL6.js} +2 -2
- comfyui_frontend_package/static/assets/{ComfyQueueButton-QhN0FmOY.js.map → ComfyQueueButton-C6ttLtL6.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ExtensionPanel-D2sITMri.js → ExtensionPanel-uFlj7Yfm.js} +2 -2
- comfyui_frontend_package/static/assets/{ExtensionPanel-D2sITMri.js.map → ExtensionPanel-uFlj7Yfm.js.map} +1 -1
- comfyui_frontend_package/static/assets/GraphView-0U0T8pwU.js +15 -0
- comfyui_frontend_package/static/assets/GraphView-0U0T8pwU.js.map +1 -0
- comfyui_frontend_package/static/assets/GraphView-2T90vQj0.css +1 -0
- comfyui_frontend_package/static/assets/{KeybindingPanel-Dm6H1RN2.js → KeybindingPanel-DtxoTOoX.js} +2 -2
- comfyui_frontend_package/static/assets/{KeybindingPanel-Dm6H1RN2.js.map → KeybindingPanel-DtxoTOoX.js.map} +1 -1
- comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-BSzd4gKh.js +2 -0
- comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-BSzd4gKh.js.map +1 -0
- comfyui_frontend_package/static/assets/{LegacyCreditsPanel-Be7L1Af3.js → LegacyCreditsPanel-CO0JRKfg.js} +2 -2
- comfyui_frontend_package/static/assets/{LegacyCreditsPanel-Be7L1Af3.js.map → LegacyCreditsPanel-CO0JRKfg.js.map} +1 -1
- comfyui_frontend_package/static/assets/{Load3D-BAJ3yM4D.js → Load3D-NG6IeknA.js} +2 -2
- comfyui_frontend_package/static/assets/Load3D-NG6IeknA.js.map +1 -0
- comfyui_frontend_package/static/assets/{Load3D.vue_vue_type_script_setup_true_lang-DMHpkO9N.js → Load3D.vue_vue_type_script_setup_true_lang-DYT5Ecka.js} +2 -2
- comfyui_frontend_package/static/assets/{Load3D.vue_vue_type_script_setup_true_lang-DMHpkO9N.js.map → Load3D.vue_vue_type_script_setup_true_lang-DYT5Ecka.js.map} +1 -1
- comfyui_frontend_package/static/assets/{Media3DTop-DdNgRlQW.js → Media3DTop-iLfJefgN.js} +2 -2
- comfyui_frontend_package/static/assets/{Media3DTop-DdNgRlQW.js.map → Media3DTop-iLfJefgN.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ServerConfigPanel-LtRqEOzu.js → ServerConfigPanel-B8Qy2naY.js} +2 -2
- comfyui_frontend_package/static/assets/{ServerConfigPanel-LtRqEOzu.js.map → ServerConfigPanel-B8Qy2naY.js.map} +1 -1
- comfyui_frontend_package/static/assets/SubscriptionRequiredDialogContent-C1UryadQ.css +1 -0
- comfyui_frontend_package/static/assets/SubscriptionRequiredDialogContent-CIYbxFB5.js +2 -0
- comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent-CDaF1jns.js.map → SubscriptionRequiredDialogContent-CIYbxFB5.js.map} +1 -1
- comfyui_frontend_package/static/assets/{UserAvatar.vue_vue_type_script_setup_true_lang-48WRCWXz.js → UserAvatar.vue_vue_type_script_setup_true_lang-COE-v4cY.js} +2 -2
- comfyui_frontend_package/static/assets/{UserAvatar.vue_vue_type_script_setup_true_lang-48WRCWXz.js.map → UserAvatar.vue_vue_type_script_setup_true_lang-COE-v4cY.js.map} +1 -1
- comfyui_frontend_package/static/assets/{UserPanel-_xK7KdbS.js → UserPanel-D5s95p9f.js} +2 -2
- comfyui_frontend_package/static/assets/{UserPanel-_xK7KdbS.js.map → UserPanel-D5s95p9f.js.map} +1 -1
- comfyui_frontend_package/static/assets/{UserSelectView-B_VOz5XU.js → UserSelectView-TWmqiRNC.js} +2 -2
- comfyui_frontend_package/static/assets/{UserSelectView-B_VOz5XU.js.map → UserSelectView-TWmqiRNC.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ValueControlPopover-BPJIx3_y.js → ValueControlPopover-oFjRn7nT.js} +2 -2
- comfyui_frontend_package/static/assets/{ValueControlPopover-BPJIx3_y.js.map → ValueControlPopover-oFjRn7nT.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetAudioUI-5nP5sugf.js → WidgetAudioUI-DYG-X1jd.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetAudioUI-5nP5sugf.js.map → WidgetAudioUI-DYG-X1jd.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetButton-Cd9G_fIM.js → WidgetButton-pJqn_pIo.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetButton-Cd9G_fIM.js.map → WidgetButton-pJqn_pIo.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetChart-Dz4GcJwO.js → WidgetChart-BntGUEQZ.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetChart-Dz4GcJwO.js.map → WidgetChart-BntGUEQZ.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetColorPicker-x6uZPjSf.js → WidgetColorPicker-JIRhb2dg.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetColorPicker-x6uZPjSf.js.map → WidgetColorPicker-JIRhb2dg.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetGalleria-DHPc3hwg.js → WidgetGalleria-CtUTrKmF.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetGalleria-DHPc3hwg.js.map → WidgetGalleria-CtUTrKmF.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetInputNumber-DPITONSH.js +2 -0
- comfyui_frontend_package/static/assets/WidgetInputNumber-DPITONSH.js.map +1 -0
- comfyui_frontend_package/static/assets/{WidgetInputNumber.vue_vue_type_script_setup_true_lang-vY96bQKz.js → WidgetInputNumber.vue_vue_type_script_setup_true_lang-Cb9Vjdsr.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetInputNumber.vue_vue_type_script_setup_true_lang-vY96bQKz.js.map → WidgetInputNumber.vue_vue_type_script_setup_true_lang-Cb9Vjdsr.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetInputText-BbfUME5C.js → WidgetInputText-C9e7Utok.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetInputText-BbfUME5C.js.map → WidgetInputText-C9e7Utok.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetLayoutField.vue_vue_type_script_setup_true_lang-7bIn_5fI.js → WidgetLayoutField.vue_vue_type_script_setup_true_lang-B2h9BxrZ.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetLayoutField.vue_vue_type_script_setup_true_lang-7bIn_5fI.js.map → WidgetLayoutField.vue_vue_type_script_setup_true_lang-B2h9BxrZ.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetLegacy-DxWXa1q8.js +2 -0
- comfyui_frontend_package/static/assets/WidgetLegacy-DxWXa1q8.js.map +1 -0
- comfyui_frontend_package/static/assets/WidgetMarkdown-BbdYbwjR.js +2 -0
- comfyui_frontend_package/static/assets/{WidgetMarkdown-voa7Ohgp.js.map → WidgetMarkdown-BbdYbwjR.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetRecordAudio-DQzt1Okr.js +2 -0
- comfyui_frontend_package/static/assets/WidgetRecordAudio-DQzt1Okr.js.map +1 -0
- comfyui_frontend_package/static/assets/WidgetSelect-BCeT8JsM.js +2 -0
- comfyui_frontend_package/static/assets/WidgetSelect-BCeT8JsM.js.map +1 -0
- comfyui_frontend_package/static/assets/{WidgetSelect.vue_vue_type_script_setup_true_lang-CT0J0vij.js → WidgetSelect.vue_vue_type_script_setup_true_lang-DnNAGP6n.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetSelect.vue_vue_type_script_setup_true_lang-CT0J0vij.js.map → WidgetSelect.vue_vue_type_script_setup_true_lang-DnNAGP6n.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetTextarea-SHMM72Cj.js → WidgetTextarea-DtdgdYZv.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetTextarea-SHMM72Cj.js.map → WidgetTextarea-DtdgdYZv.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetToggleSwitch-BmT1MQCn.js → WidgetToggleSwitch-BZnc8nGp.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetToggleSwitch-BmT1MQCn.js.map → WidgetToggleSwitch-BZnc8nGp.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetWithControl.vue_vue_type_script_setup_true_lang-CTEGWC4h.js → WidgetWithControl.vue_vue_type_script_setup_true_lang-39lKeCWN.js} +3 -3
- comfyui_frontend_package/static/assets/{WidgetWithControl.vue_vue_type_script_setup_true_lang-CTEGWC4h.js.map → WidgetWithControl.vue_vue_type_script_setup_true_lang-39lKeCWN.js.map} +1 -1
- comfyui_frontend_package/static/assets/{audioService-BcbrJBnn.js → audioService-CxmGtl4K.js} +2 -2
- comfyui_frontend_package/static/assets/{audioService-BcbrJBnn.js.map → audioService-CxmGtl4K.js.map} +1 -1
- comfyui_frontend_package/static/assets/{audioUtils-CJCA0wCG.js → audioUtils-B4fAuqez.js} +2 -2
- comfyui_frontend_package/static/assets/{audioUtils-CJCA0wCG.js.map → audioUtils-B4fAuqez.js.map} +1 -1
- comfyui_frontend_package/static/assets/commands-DHxq3nWN.js +2 -0
- comfyui_frontend_package/static/assets/commands-DHxq3nWN.js.map +1 -0
- comfyui_frontend_package/static/assets/{index-kQCr6fgp.js → index-B7ehZHKU.js} +2 -2
- comfyui_frontend_package/static/assets/{index-kQCr6fgp.js.map → index-B7ehZHKU.js.map} +1 -1
- comfyui_frontend_package/static/assets/{index-DvCHS_f2.js → index-BFHZsBkN.js} +25 -25
- comfyui_frontend_package/static/assets/index-BFHZsBkN.js.map +1 -0
- comfyui_frontend_package/static/assets/index-DJa4hQi7.css +1 -0
- comfyui_frontend_package/static/assets/index-tImAQKwZ.js +5 -0
- comfyui_frontend_package/static/assets/index-tImAQKwZ.js.map +1 -0
- comfyui_frontend_package/static/assets/{keybindingService-D3pQ4cJG.js → keybindingService-B_cUhEnt.js} +2 -2
- comfyui_frontend_package/static/assets/{keybindingService-D3pQ4cJG.js.map → keybindingService-B_cUhEnt.js.map} +1 -1
- comfyui_frontend_package/static/assets/{main-BFC5CmrY.js → main-B3vd7GL1.js} +3 -3
- comfyui_frontend_package/static/assets/main-B3vd7GL1.js.map +1 -0
- comfyui_frontend_package/static/assets/{main-M4YqFlAB.js → main-BKCc2TkD.js} +3 -3
- comfyui_frontend_package/static/assets/main-BKCc2TkD.js.map +1 -0
- comfyui_frontend_package/static/assets/{main-C0iYASPd.js → main-BNvzUx74.js} +3 -3
- comfyui_frontend_package/static/assets/main-BNvzUx74.js.map +1 -0
- comfyui_frontend_package/static/assets/main-BPu7av80.js +17 -0
- comfyui_frontend_package/static/assets/main-BPu7av80.js.map +1 -0
- comfyui_frontend_package/static/assets/{main-Dd3BY3MO.js → main-BQ4z0Xxc.js} +2 -2
- comfyui_frontend_package/static/assets/main-BQ4z0Xxc.js.map +1 -0
- comfyui_frontend_package/static/assets/{main-BI-3llij.js → main-BoyaoV4J.js} +2 -2
- comfyui_frontend_package/static/assets/main-BoyaoV4J.js.map +1 -0
- comfyui_frontend_package/static/assets/{main-DB30B6rY.js → main-CJ1ZmTbz.js} +3 -3
- comfyui_frontend_package/static/assets/main-CJ1ZmTbz.js.map +1 -0
- comfyui_frontend_package/static/assets/{main-D8hMMX5u.js → main-DxByB8u3.js} +2 -2
- comfyui_frontend_package/static/assets/main-DxByB8u3.js.map +1 -0
- comfyui_frontend_package/static/assets/{main-BdVq5c-Q.js → main-Dyk43SJi.js} +2 -2
- comfyui_frontend_package/static/assets/main-Dyk43SJi.js.map +1 -0
- comfyui_frontend_package/static/assets/{main-Cte3FX_T.js → main-QMLeyFJQ.js} +3 -3
- comfyui_frontend_package/static/assets/main-QMLeyFJQ.js.map +1 -0
- comfyui_frontend_package/static/assets/{main-BPVbVwRz.js → main-f7MqrMkx.js} +3 -3
- comfyui_frontend_package/static/assets/main-f7MqrMkx.js.map +1 -0
- comfyui_frontend_package/static/assets/nodeDefs-CqPqVYqF.js +54 -0
- comfyui_frontend_package/static/assets/nodeDefs-CqPqVYqF.js.map +1 -0
- comfyui_frontend_package/static/assets/settings-BDcsAddA.js +6 -0
- comfyui_frontend_package/static/assets/settings-BDcsAddA.js.map +1 -0
- comfyui_frontend_package/static/assets/settings-BscQZApb.js +6 -0
- comfyui_frontend_package/static/assets/settings-BscQZApb.js.map +1 -0
- comfyui_frontend_package/static/assets/settings-BxGvSZQt.js +6 -0
- comfyui_frontend_package/static/assets/settings-BxGvSZQt.js.map +1 -0
- comfyui_frontend_package/static/assets/settings-CRbIyGOx.js +6 -0
- comfyui_frontend_package/static/assets/settings-CRbIyGOx.js.map +1 -0
- comfyui_frontend_package/static/assets/settings-C_M95LcR.js +6 -0
- comfyui_frontend_package/static/assets/settings-C_M95LcR.js.map +1 -0
- comfyui_frontend_package/static/assets/{settings-C83z84hb.js → settings-CfAtcjYG.js} +3 -3
- comfyui_frontend_package/static/assets/settings-CfAtcjYG.js.map +1 -0
- comfyui_frontend_package/static/assets/settings-D1FGfDLO.js +6 -0
- comfyui_frontend_package/static/assets/settings-D1FGfDLO.js.map +1 -0
- comfyui_frontend_package/static/assets/settings-DIhoSYUg.js +6 -0
- comfyui_frontend_package/static/assets/settings-DIhoSYUg.js.map +1 -0
- comfyui_frontend_package/static/assets/settings-DR935Ify.js +6 -0
- comfyui_frontend_package/static/assets/settings-DR935Ify.js.map +1 -0
- comfyui_frontend_package/static/assets/settings-DwzAhg99.js +6 -0
- comfyui_frontend_package/static/assets/settings-DwzAhg99.js.map +1 -0
- comfyui_frontend_package/static/assets/settings-ydiuzS6H.js +6 -0
- comfyui_frontend_package/static/assets/settings-ydiuzS6H.js.map +1 -0
- comfyui_frontend_package/static/assets/{vendor-primevue-Bp7MMXLP.js → vendor-primevue-DeKsC2uk.js} +2 -2
- comfyui_frontend_package/static/assets/{vendor-primevue-Bp7MMXLP.js.map → vendor-primevue-DeKsC2uk.js.map} +1 -1
- comfyui_frontend_package/static/index.html +1 -1
- {comfyui_frontend_package-1.37.9.dist-info → comfyui_frontend_package-1.37.11.dist-info}/METADATA +1 -1
- {comfyui_frontend_package-1.37.9.dist-info → comfyui_frontend_package-1.37.11.dist-info}/RECORD +138 -130
- comfyui_frontend_package/static/assets/GraphView-BZLpyVMl.css +0 -1
- comfyui_frontend_package/static/assets/GraphView-C35zkdNN.js +0 -15
- comfyui_frontend_package/static/assets/GraphView-C35zkdNN.js.map +0 -1
- comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-C58MdJKR.js +0 -2
- comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-C58MdJKR.js.map +0 -1
- comfyui_frontend_package/static/assets/Load3D-BAJ3yM4D.js.map +0 -1
- comfyui_frontend_package/static/assets/SubscriptionRequiredDialogContent-BJ80blC4.css +0 -1
- comfyui_frontend_package/static/assets/SubscriptionRequiredDialogContent-CDaF1jns.js +0 -2
- comfyui_frontend_package/static/assets/WidgetInputNumber-Cnhf4Ann.js +0 -2
- comfyui_frontend_package/static/assets/WidgetInputNumber-Cnhf4Ann.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetLegacy-AkIJRd8v.js +0 -2
- comfyui_frontend_package/static/assets/WidgetLegacy-AkIJRd8v.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetMarkdown-voa7Ohgp.js +0 -2
- comfyui_frontend_package/static/assets/WidgetRecordAudio-DelweXYm.js +0 -2
- comfyui_frontend_package/static/assets/WidgetRecordAudio-DelweXYm.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetSelect-XG4R8CnZ.js +0 -2
- comfyui_frontend_package/static/assets/WidgetSelect-XG4R8CnZ.js.map +0 -1
- comfyui_frontend_package/static/assets/index-BB_8e12C.css +0 -1
- comfyui_frontend_package/static/assets/index-Cm0D-ExL.js +0 -5
- comfyui_frontend_package/static/assets/index-Cm0D-ExL.js.map +0 -1
- comfyui_frontend_package/static/assets/index-DvCHS_f2.js.map +0 -1
- comfyui_frontend_package/static/assets/main-BFC5CmrY.js.map +0 -1
- comfyui_frontend_package/static/assets/main-BI-3llij.js.map +0 -1
- comfyui_frontend_package/static/assets/main-BPVbVwRz.js.map +0 -1
- comfyui_frontend_package/static/assets/main-BdVq5c-Q.js.map +0 -1
- comfyui_frontend_package/static/assets/main-C0iYASPd.js.map +0 -1
- comfyui_frontend_package/static/assets/main-Cte3FX_T.js.map +0 -1
- comfyui_frontend_package/static/assets/main-D8hMMX5u.js.map +0 -1
- comfyui_frontend_package/static/assets/main-DB30B6rY.js.map +0 -1
- comfyui_frontend_package/static/assets/main-Dd3BY3MO.js.map +0 -1
- comfyui_frontend_package/static/assets/main-M4YqFlAB.js.map +0 -1
- comfyui_frontend_package/static/assets/settings-2GCqRrJG.js +0 -6
- comfyui_frontend_package/static/assets/settings-2GCqRrJG.js.map +0 -1
- comfyui_frontend_package/static/assets/settings-BwT6YspU.js +0 -6
- comfyui_frontend_package/static/assets/settings-BwT6YspU.js.map +0 -1
- comfyui_frontend_package/static/assets/settings-C83z84hb.js.map +0 -1
- comfyui_frontend_package/static/assets/settings-CpGAolL8.js +0 -6
- comfyui_frontend_package/static/assets/settings-CpGAolL8.js.map +0 -1
- comfyui_frontend_package/static/assets/settings-DHYEklkf.js +0 -6
- comfyui_frontend_package/static/assets/settings-DHYEklkf.js.map +0 -1
- comfyui_frontend_package/static/assets/settings-DLFPCNJr.js +0 -6
- comfyui_frontend_package/static/assets/settings-DLFPCNJr.js.map +0 -1
- comfyui_frontend_package/static/assets/settings-JVJwzdtf.js +0 -6
- comfyui_frontend_package/static/assets/settings-JVJwzdtf.js.map +0 -1
- comfyui_frontend_package/static/assets/settings-Tg5NBf0t.js +0 -6
- comfyui_frontend_package/static/assets/settings-Tg5NBf0t.js.map +0 -1
- comfyui_frontend_package/static/assets/settings-_tes1LYa.js +0 -6
- comfyui_frontend_package/static/assets/settings-_tes1LYa.js.map +0 -1
- comfyui_frontend_package/static/assets/settings-cav_bQJj.js +0 -6
- comfyui_frontend_package/static/assets/settings-cav_bQJj.js.map +0 -1
- {comfyui_frontend_package-1.37.9.dist-info → comfyui_frontend_package-1.37.11.dist-info}/WHEEL +0 -0
- {comfyui_frontend_package-1.37.9.dist-info → comfyui_frontend_package-1.37.11.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
var ut=Object.defineProperty;var p=(n,e)=>ut(n,"name",{value:e,configurable:!0});import{r as f,cP as S,cQ as et,cR as N,at as C,ax as R,cS as pt,al as Q,aS as ne,cT as gt,cU as ft,bo as tt,ab as ht,w as mt,f as M,a3 as yt,t as _,p as ie,cV as wt,cW as bt,cX as G,cY as P,b9 as vt,cZ as De,c_ as Nt,c$ as It,d0 as kt,d1 as Ct,d2 as Fe,d3 as se,d4 as F,d5 as z,aH as ge,d6 as ot,d7 as Dt,d8 as xt,d9 as _t,da as V,B as Tt,a as A,H as St,db as Mt,dc as nt,dd as Et,aD as Ot,aI as At,e as oe,de as $,cN as de,df as Lt,cM as fe,dg as Se,dh as Me,di as Pt,u as it,cL as Gt,cm as st,dj as ue,dk as Wt,dl as Ue,dm as Rt,c5 as Ft,dn as Ut,dp as Bt,dq as Vt,dr as $t}from"./index-BFHZsBkN.js";import{bz as zt,cD as Be,d4 as Y,n as Ee,eG as jt}from"./vendor-other-B8t_Wf2K.js";import{_ as Oe}from"./Load3D.vue_vue_type_script_setup_true_lang-DYT5Ecka.js";import{g as he,s as rt}from"./audioUtils-B4fAuqez.js";import{u as ee}from"./audioService-CxmGtl4K.js";import"./vendor-primevue-DeKsC2uk.js";import"./vendor-vue-DaLZjKA7.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-DH0o8VQ7.js";import"./vendor-tiptap-VxK0yxkd.js";class O extends et{static{p(this,"ClipspaceDialog")}static items=[];static instance=null;static registerButton(e,t,i){const o=N("button",{type:"button",textContent:e,contextPredicate:t,onclick:i});O.items.push(o)}static invalidatePreview(){if(S.clipspace&&S.clipspace.imgs&&S.clipspace.imgs.length>0){const e=document.getElementById("clipspace_preview");e&&(e.src=S.clipspace.imgs[S.clipspace.selectedIndex].src,e.style.maxHeight="100%",e.style.maxWidth="100%")}}static invalidate(){if(O.instance){const e=O.instance,t=N("div.comfy-modal-content",[e.createImgSettings(),...e.createButtons()]);e.element?(e.element.firstChild&&e.element.removeChild(e.element.firstChild),e.element.appendChild(t)):e.element=N("div.comfy-modal",{parent:document.body},[t]),e.element.children[0].children.length<=1&&e.element.children[0].appendChild(N("p",{},["Unable to find the features to edit content of a format stored in the current Clipspace."])),O.invalidatePreview()}}constructor(){super()}createButtons(){const e=[];for(let t in O.items){const i=O.items[t];(!i.contextPredicate||i.contextPredicate())&&e.push(O.items[t])}return e.push(N("button",{type:"button",textContent:"Close",onclick:p(()=>{this.close()},"onclick")})),e}createImgSettings(){if(S.clipspace?.imgs){const e=[],t=S.clipspace.imgs;for(let d=0;d<t.length;d++)e.push(N("option",{value:d},[`${d}`]));const i=N("select",{id:"clipspace_img_selector",onchange:p(d=>{d.target&&S.clipspace&&(S.clipspace.selectedIndex=d.target.selectedIndex,O.invalidatePreview())},"onchange")},e),o=N("tr",{},[N("td",{},[N("font",{color:"white"},["Select Image"])]),N("td",{},[i])]),s=N("select",{id:"clipspace_img_paste_mode",onchange:p(d=>{d.target&&S.clipspace&&(S.clipspace.img_paste_mode=d.target.value)},"onchange")},[N("option",{value:"selected"},"selected"),N("option",{value:"all"},"all")]);s.value=S.clipspace.img_paste_mode;const r=N("tr",{},[N("td",{},[N("font",{color:"white"},["Paste Mode"])]),N("td",{},[s])]),a=N("td",{align:"center",width:"100px",height:"100px",colSpan:"2"},[N("img",{id:"clipspace_preview",ondragstart:p(()=>!1,"ondragstart")},[])]),l=N("tr",{},[a]);return N("table",{},[o,r,l])}else return[]}createImgPreview(){return S.clipspace?.imgs?N("img",{id:"clipspace_preview",ondragstart:p(()=>!1,"ondragstart")}):[]}show(){O.invalidate(),this.element.style.display="block"}}f.registerExtension({name:"Comfy.Clipspace",init(n){n.openClipspace=function(){O.instance||(O.instance=new O,S.clipspace_invalidate_handler=O.invalidate),S.clipspace?O.instance.show():n.ui.dialog.show("Clipspace is Empty!")}}});window.comfyAPI=window.comfyAPI||{};window.comfyAPI.clipspace=window.comfyAPI.clipspace||{};window.comfyAPI.clipspace.ClipspaceDialog=O;const Ht={name:"Comfy.ContextMenuFilter",init(){const n=C.ContextMenu;C.ContextMenu=function(e,t){const i=new n(e,t);if(t?.className==="dark"&&e?.length>4){const o=document.createElement("input");o.classList.add("comfy-context-menu-filter"),o.placeholder="Filter list",i.root.prepend(o);const s=Array.from(i.root.querySelectorAll(".litemenu-entry"));let r=[...s],a=r.length;requestAnimationFrame(()=>{const d=R.active_canvas.current_node?.widgets?.filter(u=>pt(u)&&u.options.values?.length===e.length).find(u=>u.options.values?.every((y,b)=>y===e[b]))?.value;let c=d?e.findIndex(u=>u===d):0;c<0&&(c=0);let h=r[c];m();function m(){h?.style.setProperty("background-color",""),h?.style.setProperty("color",""),h=r[c],h?.style.setProperty("background-color","#ccc","important"),h?.style.setProperty("color","#000","important")}p(m,"updateSelected");const w=p(()=>{if(i.root.getBoundingClientRect().top<0){const y=1-i.root.getBoundingClientRect().height/i.root.clientHeight,b=i.root.clientHeight*y/2;i.root.style.top=-b+"px"}},"positionList");o.addEventListener("keydown",u=>{switch(u.key){case"ArrowUp":u.preventDefault(),c===0?c=a-1:c--,m();break;case"ArrowRight":u.preventDefault(),c=a-1,m();break;case"ArrowDown":u.preventDefault(),c===a-1?c=0:c++,m();break;case"ArrowLeft":u.preventDefault(),c=0,m();break;case"Enter":h?.click();break;case"Escape":i.close();break}}),o.addEventListener("input",()=>{const u=o.value.toLocaleLowerCase();if(r=s.filter(y=>{const b=!u||y.textContent?.toLocaleLowerCase().includes(u);return y.style.display=b?"block":"none",b}),c=0,r.includes(h)&&(c=r.findIndex(y=>y===h)),a=r.length,m(),t.event){let y=t.event.clientY-10;const b=document.body.getBoundingClientRect(),g=i.root.getBoundingClientRect();b.height&&y>b.height-g.height-10&&(y=Math.max(0,b.height-g.height-10)),i.root.style.top=y+"px",w()}}),requestAnimationFrame(()=>{o.focus(),w()})})}return i},C.ContextMenu.prototype=n.prototype}};f.registerExtension(Ht);function qt(n=[]){if(!this.outputs[0].links?.length||!this.graph)return;const e=[...this.outputs[0].links.map(i=>this.graph.links[i]),...n];let t=this.widgets?.[0].value;for(const i of e){const o=this.graph?.getNodeById(i.target_id),s=o?.inputs[i.target_slot];if(!s){console.warn("Unable to resolve node or input for link",i);continue}const r=s.widget?.name;if(!r){console.warn("Invalid widget or widget name",s.widget);continue}const a=o.widgets?.find(l=>l.name===r);if(!a){console.warn(`Unable to find widget "${r}" on node [${o.id}]`);continue}a.value=t,a.callback?.(a.value,f.canvas,o,f.canvas.graph_mouse,{})}}p(qt,"applyToGraph");function Yt(){this.applyToGraph=Q(this.applyToGraph,qt);const n=this.widgets[0],e=zt([]);n.options.values=e;const t=p(()=>{e.splice(0,e.length,...this.widgets.filter(o=>o.name.startsWith("option")&&o.value).map(o=>`${o.value}`)),!f.configuringGraph&&(e.includes(`${n.value}`)||(n.value=e[0]??"",n.callback?.(n.value)))},"updateCombo");n.callback=Q(n.callback,()=>this.applyToGraph());function i(o){if(!o.widgets)return;const s=o.widgets.length-1;o.addWidget("string",`option${s}`,"",()=>{});const r=o.widgets.at(-1);if(!r)return;let a="";Object.defineProperty(r,"value",{get(){return a},set(l){if(a=l,t(),!o.widgets)return;const d=o.widgets.at(-1);if(d===this){l&&i(o);return}l||o.widgets.at(-2)!==this||d?.value||(o.widgets.pop(),o.computeSize(o.size),this.callback(l))}})}p(i,"addOption"),i(this)}p(Yt,"onNodeCreated");f.registerExtension({name:"Comfy.CustomCombo",beforeRegisterNodeDef(n,e){e?.name==="CustomCombo"&&(n.prototype.onNodeCreated=Q(n.prototype.onNodeCreated,Yt))}});ne().registerExtension({name:"Comfy.DynamicPrompts",nodeCreated(n){if(n.widgets){const e=n.widgets.filter(t=>t.dynamicPrompts);for(const t of e)t.serializeValue=(i,o)=>{if(typeof t.value!="string")return t.value;const s=gt(t.value);return i?.widgets_values&&(i.widgets_values[o]=s),s}}}});f.registerExtension({name:"Comfy.EditAttention",init(){const n=f.ui.settings.addSetting({id:"Comfy.EditAttention.Delta",category:["Comfy","EditTokenWeight","Delta"],name:"Ctrl+up/down precision",type:"slider",attrs:{min:.01,max:.5,step:.01},defaultValue:.05});function e(s,r){const a=parseFloat(s);if(isNaN(a))return s;const l=a+r;return String(Number(l.toFixed(10)))}p(e,"incrementWeight");function t(s,r){let a=r,l=r,d=0,c=0;for(;a>=0&&(a--,!(s[a]==="("&&d===c));)s[a]==="("&&d++,s[a]===")"&&c++;if(a<0)return null;for(d=0,c=0;l<s.length&&!(s[l]===")"&&d===c);)s[l]==="("&&d++,s[l]===")"&&c++,l++;return l===s.length?null:{start:a+1,end:l}}p(t,"findNearestEnclosure");function i(s){const r=/^\((.*)\)$/,a=s.match(r),l=/:([+-]?(\d*\.)?\d+([eE][+-]?\d+)?)/,d=s.match(l);return a&&!d?`(${a[1]}:1.0)`:s}p(i,"addWeightToParentheses");function o(s){const r=s.composedPath()[0],a=parseFloat(n.value);if(r.tagName!=="TEXTAREA"||!(s.key==="ArrowUp"||s.key==="ArrowDown")||!s.ctrlKey&&!s.metaKey)return;s.preventDefault();let l=r.selectionStart,d=r.selectionEnd,c=r.value.substring(l,d);if(!c){const w=t(r.value,l);if(w)l=w.start,d=w.end,c=r.value.substring(l,d);else{const u=" .,\\/!?%^*;:{}=-_`~()\r\n ";for(;!u.includes(r.value[l-1])&&l>0;)l--;for(;!u.includes(r.value[d])&&d<r.value.length;)d++;if(c=r.value.substring(l,d),!c)return}}c[c.length-1]===" "&&(c=c.substring(0,c.length-1),d-=1),r.value[l-1]==="("&&r.value[d]===")"&&(l-=1,d+=1,c=r.value.substring(l,d)),(c[0]!=="("||c[c.length-1]!==")")&&(c=`(${c})`),c=i(c);const h=s.key==="ArrowUp"?a:-a,m=c.replace(/\((.*):([+-]?\d+(?:\.\d+)?)\)/,(w,u,y)=>(y=e(y,h),y==1?u:`(${u}:${y})`));r.setSelectionRange(l,d),document.execCommand("insertText",!1,m),r.setSelectionRange(l,l+m.length)}p(o,"editAttention"),window.addEventListener("keydown",o)}});const Xt={validationPathSuffix:"/20250115/cpython-3.10.16+20250115-aarch64-apple-darwin-debug-full.tar.zst.sha256"},Ne=p(async n=>ft(n)&&await tt().NetWork.canAccessUrl(n),"checkMirrorReachable");(async()=>{if(!ht())return;const n=tt(),e=await n.getElectronVersion(),t=mt(),i=M(),{staticUrls:o,buildDocsUrl:s}=yt(),r=p((a,l)=>{l!==void 0&&a!==l&&n.restartApp("Restart ComfyUI to apply changes.",1500)},"onChangeRestartApp");f.registerExtension({name:"Comfy.ElectronAdapter",settings:[{id:"Comfy-Desktop.AutoUpdate",category:["Comfy-Desktop","General","AutoUpdate"],name:"Automatically check for updates",type:"boolean",defaultValue:!0,onChange:r},{id:"Comfy-Desktop.SendStatistics",category:["Comfy-Desktop","General","Send Statistics"],name:"Send anonymous usage metrics",type:"boolean",defaultValue:!0,onChange:r},{id:"Comfy-Desktop.WindowStyle",category:["Comfy-Desktop","General","Window Style"],name:"Window Style",tooltip:"Custom: Replace the system title bar with ComfyUI's Top menu",type:"combo",experimental:!0,defaultValue:"default",options:["default","custom"],onChange:p((a,l)=>{l&&n.Config.setWindowStyle(a)},"onChange")},{id:"Comfy-Desktop.UV.PythonInstallMirror",name:"Python Install Mirror",tooltip:"Managed Python installations are downloaded from the Astral python-build-standalone project. This variable can be set to a mirror URL to use a different source for Python installations. The provided URL will replace https://github.com/astral-sh/python-build-standalone/releases/download in, e.g., https://github.com/astral-sh/python-build-standalone/releases/download/20240713/cpython-3.12.4%2B20240713-aarch64-apple-darwin-install_only.tar.gz. Distributions can be read from a local directory by using the file:// URL scheme.",type:"url",defaultValue:"",attrs:{validateUrlFn(a){return Ne(a+Xt.validationPathSuffix)}}},{id:"Comfy-Desktop.UV.PypiInstallMirror",name:"Pypi Install Mirror",tooltip:"Default pip install mirror",type:"url",defaultValue:"",attrs:{validateUrlFn:Ne}},{id:"Comfy-Desktop.UV.TorchInstallMirror",name:"Torch Install Mirror",tooltip:"Pip install mirror for pytorch",type:"url",defaultValue:"",attrs:{validateUrlFn:Ne}}],commands:[{id:"Comfy-Desktop.Folders.OpenLogsFolder",label:"Open Logs Folder",icon:"pi pi-folder-open",function(){n.openLogsFolder()}},{id:"Comfy-Desktop.Folders.OpenModelsFolder",label:"Open Models Folder",icon:"pi pi-folder-open",function(){n.openModelsFolder()}},{id:"Comfy-Desktop.Folders.OpenOutputsFolder",label:"Open Outputs Folder",icon:"pi pi-folder-open",function(){n.openOutputsFolder()}},{id:"Comfy-Desktop.Folders.OpenInputsFolder",label:"Open Inputs Folder",icon:"pi pi-folder-open",function(){n.openInputsFolder()}},{id:"Comfy-Desktop.Folders.OpenCustomNodesFolder",label:"Open Custom Nodes Folder",icon:"pi pi-folder-open",function(){n.openCustomNodesFolder()}},{id:"Comfy-Desktop.Folders.OpenModelConfig",label:"Open extra_model_paths.yaml",icon:"pi pi-file",function(){n.openModelConfig()}},{id:"Comfy-Desktop.OpenDevTools",label:"Open DevTools",icon:"pi pi-code",function(){n.openDevTools()}},{id:"Comfy-Desktop.OpenUserGuide",label:"Desktop User Guide",icon:"pi pi-book",function(){window.open(s("/installation/desktop",{includeLocale:!0,platform:!0}),"_blank")}},{id:"Comfy-Desktop.CheckForUpdates",label:"Check for Updates",icon:"pi pi-sync",async function(){try{const a=await n.checkForUpdates({disableUpdateReadyAction:!0});if(!a.isUpdateAvailable){i.add({severity:"info",summary:_("desktopUpdate.noUpdateFound"),life:5e3});return}if(await ie().confirm({title:_("desktopUpdate.updateFoundTitle",{version:a.version}),message:_("desktopUpdate.updateAvailableMessage"),type:"default"}))try{n.restartAndInstall()}catch(d){Be.error("Error installing update:",d),i.add({severity:"error",summary:_("g.error"),detail:_("desktopUpdate.errorInstallingUpdate"),life:1e4})}}catch(a){Be.error("Error checking for updates:",a),i.add({severity:"error",summary:_("g.error"),detail:_("desktopUpdate.errorCheckingUpdate"),life:1e4})}}},{id:"Comfy-Desktop.Reinstall",label:"Reinstall",icon:"pi pi-refresh",async function(){await ie().confirm({message:_("desktopMenu.confirmReinstall"),title:_("desktopMenu.reinstall"),type:"reinstall"})&&n.reinstall()}},{id:"Comfy-Desktop.Restart",label:"Restart",icon:"pi pi-refresh",function(){n.restartApp()}},{id:"Comfy-Desktop.Quit",label:"Quit",icon:"pi pi-sign-out",async function(){t.modifiedWorkflows.length>0&&!await ie().confirm({message:_("desktopMenu.confirmQuit"),title:_("desktopMenu.quit"),type:"default"})||n.quit()}}],menuCommands:[{path:["Help"],commands:["Comfy-Desktop.OpenUserGuide"]},{path:["Help"],commands:["Comfy-Desktop.OpenDevTools"]},{path:["Help","Open Folder"],commands:["Comfy-Desktop.Folders.OpenLogsFolder","Comfy-Desktop.Folders.OpenModelsFolder","Comfy-Desktop.Folders.OpenOutputsFolder","Comfy-Desktop.Folders.OpenInputsFolder","Comfy-Desktop.Folders.OpenCustomNodesFolder","Comfy-Desktop.Folders.OpenModelConfig"]},{path:["Help"],commands:["Comfy-Desktop.CheckForUpdates","Comfy-Desktop.Reinstall"]}],keybindings:[{commandId:"Workspace.CloseWorkflow",combo:{key:"w",ctrl:!0}}],aboutPageBadges:[{label:"ComfyUI_desktop v"+e,url:o.githubElectron,icon:"pi pi-github"}]})})();class Kt extends wt{static{p(this,"ExecutableGroupNodeChildDTO")}groupNodeHandler;constructor(e,t,i,o,s){super(e,t,i,o),this.groupNodeHandler=s}resolveInput(e){if(this.id.split(":").length>2)throw new Error("Group nodes inside subgraphs are not supported. Please convert the group node to a subgraph instead.");const t=this.node.getInputNode(e);if(!t)return;const i=this.node.getInputLink(e);if(!i)throw new Error("Failed to get input link");const o=String(t.id);let s=this.nodesByExecutionId?.get(o);if(!s){const r=o.split(":").at(-1);r!==void 0&&(s=this.nodesByExecutionId?.get(r))}if(!s)throw new Error(`Failed to get input node ${o} for group node child ${this.id} with slot ${e}`);return{node:s,origin_id:o,origin_slot:i.origin_slot}}}const Ie=Symbol();function at(n,e){if(typeof n=="object"&&typeof e=="object")for(const t in e){const i=e[t];if(typeof i=="object"){let o=n[t];o||(o=n[t]={}),at(o,e[t])}else n[t]=i}return n}p(at,"merge");class lt extends bt{static{p(this,"ManageGroupDialog")}tabs;selectedNodeIndex;selectedTab="Inputs";selectedGroup;modifications={};nodeItems;app;groupNodeType;groupNodeDef;groupData;innerNodesList;widgetsPage;inputsPage;outputsPage;draggable;get selectedNodeInnerIndex(){return+this.nodeItems[this.selectedNodeIndex].dataset.nodeindex}constructor(e){super(),this.app=e,this.element=N("dialog.comfy-group-manage",{parent:document.body})}changeTab(e){this.tabs[this.selectedTab].tab.classList.remove("active"),this.tabs[this.selectedTab].page.classList.remove("active"),this.tabs[e].tab.classList.add("active"),this.tabs[e].page.classList.add("active"),this.selectedTab=e}changeNode(e,t){!t&&this.selectedNodeIndex===e||(this.selectedNodeIndex!=null&&this.nodeItems[this.selectedNodeIndex].classList.remove("selected"),this.nodeItems[e].classList.add("selected"),this.selectedNodeIndex=e,!this.buildInputsPage()&&this.selectedTab==="Inputs"&&this.changeTab("Widgets"),!this.buildWidgetsPage()&&this.selectedTab==="Widgets"&&this.changeTab("Outputs"),!this.buildOutputsPage()&&this.selectedTab==="Outputs"&&this.changeTab("Inputs"),this.changeTab(this.selectedTab))}getGroupData(){this.groupNodeType=C.registered_node_types[`${G}${P}`+this.selectedGroup],this.groupNodeDef=this.groupNodeType.nodeData,this.groupData=E.getGroupData(this.groupNodeType)}changeGroup(e,t=!0){this.selectedGroup=e,this.getGroupData();const i=this.groupData.nodeData.nodes;if(this.nodeItems=i.map((s,r)=>N("li.draggable-item",{dataset:{nodeindex:s.index+""},onclick:p(()=>{this.changeNode(r)},"onclick")},[N("span.drag-handle"),N("div",{textContent:s.title??s.type},s.title?N("span",{textContent:s.type}):[])])),this.innerNodesList.replaceChildren(...this.nodeItems),t)this.selectedNodeIndex=null,this.changeNode(0);else{let r=this.draggable.getAllItems().findIndex(a=>a.classList.contains("selected"));r===-1&&(r=this.selectedNodeIndex),this.changeNode(r,!0)}const o=[...i];this.draggable?.dispose(),this.draggable=new vt(this.innerNodesList,"li"),this.draggable.addEventListener("dragend",({detail:{oldPosition:s,newPosition:r}})=>{if(s!==r){o.splice(r,0,o.splice(s,1)[0]);for(let a=0;a<o.length;a++)this.storeModification({nodeIndex:o[a].index,section:Ie,prop:"order",value:a})}})}storeModification(e){const{nodeIndex:t,section:i,prop:o,value:s}=e,r=this.modifications[this.selectedGroup]??={},a=r.nodes??={},l=a[t??this.selectedNodeInnerIndex]??={},d=l[i]??={};if(typeof s=="object"){const c=d[o]??={};Object.assign(c,s)}else d[o]=s}getEditElement(e,t,i,o,s,r=!0){i===o&&(i="");const a=this.modifications[this.selectedGroup]?.nodes?.[this.selectedNodeInnerIndex]?.[e]?.[t];return a&&(a.name!=null&&(i=a.name),a.visible!=null&&(s=a.visible)),N("div",[N("input",{value:i,placeholder:o,type:"text",onchange:p(l=>{this.storeModification({section:e,prop:t,value:{name:l.target.value}})},"onchange")}),N("label",{textContent:"Visible"},[N("input",{type:"checkbox",checked:s,disabled:!r,onchange:p(l=>{this.storeModification({section:e,prop:t,value:{visible:!!l.target.checked}})},"onchange")})])])}buildWidgetsPage(){const e=this.groupData.oldToNewWidgetMap[this.selectedNodeInnerIndex],t=Object.keys(e??{}),o=f.rootGraph.extra.groupNodes[this.selectedGroup].config?.[this.selectedNodeInnerIndex]?.input;return this.widgetsPage.replaceChildren(...t.map(s=>this.getEditElement("input",s,e[s],s,o?.[s]?.visible!==!1))),!!t.length}buildInputsPage(){const e=this.groupData.nodeInputs[this.selectedNodeInnerIndex],t=Object.keys(e??{}),o=f.rootGraph.extra.groupNodes[this.selectedGroup].config?.[this.selectedNodeInnerIndex]?.input;return this.inputsPage.replaceChildren(...t.map(s=>{let r=e[s];if(r)return this.getEditElement("input",s,r,s,o?.[s]?.visible!==!1)}).filter(Boolean)),!!t.length}buildOutputsPage(){const e=this.groupData.nodeData.nodes,t=this.groupData.getNodeDef(e[this.selectedNodeInnerIndex]),i=t?.output??[],o=this.groupData.oldToNewOutputMap[this.selectedNodeInnerIndex],r=f.rootGraph.extra.groupNodes[this.selectedGroup].config?.[this.selectedNodeInnerIndex]?.output,l=this.groupData.nodeData.nodes[this.selectedNodeInnerIndex].type!=="PrimitiveNode";return this.outputsPage.replaceChildren(...i.map((d,c)=>{const h=o?.[c],m=t.output_name?.[c]??d;let w=r?.[c]?.name;const u=r?.[c]?.visible||h!=null;return(!w||w===m)&&(w=""),this.getEditElement("output",c,w,m,u,l)}).filter(Boolean)),!!i.length}show(e){const t=Object.keys(f.rootGraph.extra?.groupNodes??{}).sort((s,r)=>s.localeCompare(r));this.innerNodesList=N("ul.comfy-group-manage-list-items"),this.widgetsPage=N("section.comfy-group-manage-node-page"),this.inputsPage=N("section.comfy-group-manage-node-page"),this.outputsPage=N("section.comfy-group-manage-node-page");const i=N("div",[this.widgetsPage,this.inputsPage,this.outputsPage]);this.tabs=[["Inputs",this.inputsPage],["Widgets",this.widgetsPage],["Outputs",this.outputsPage]].reduce((s,[r,a])=>(s[r]={tab:N("a",{onclick:p(()=>{this.changeTab(r)},"onclick"),textContent:r}),page:a},s),{});const o=N("div.comfy-group-manage-outer",[N("header",[N("h2","Group Nodes"),N("select",{onchange:p(s=>{this.changeGroup(s.target.value)},"onchange")},t.map(s=>N("option",{textContent:s,selected:`${G}${P}${s}`===e,value:s})))]),N("main",[N("section.comfy-group-manage-list",this.innerNodesList),N("section.comfy-group-manage-node",[N("header",Object.values(this.tabs).map(s=>s.tab)),i])]),N("footer",[N("button.comfy-btn",{onclick:p(()=>{if(f.rootGraph.nodes.find(r=>r.type===`${G}${P}`+this.selectedGroup)){M().addAlert("This group node is in use in the current workflow, please first remove these.");return}confirm(`Are you sure you want to remove the node: "${this.selectedGroup}"`)&&(delete f.rootGraph.extra.groupNodes[this.selectedGroup],C.unregisterNodeType(`${G}${P}`+this.selectedGroup)),this.show()},"onclick")},"Delete Group Node"),N("button.comfy-btn",{onclick:p(async()=>{let s,r=[];const a={};for(const l in this.modifications){const d=f.rootGraph.extra.groupNodes[l];let c=d.config??={},h=this.modifications[l]?.nodes;if(h){const w=Object.keys(h);if(h[w[0]][Ie]){const u=[],y={},b={};for(const g of w){const v=h[g][Ie].order;u[v]=d.nodes[+g],y[v]=h[g],u[v].index=v}for(const g of d.links)g[0]!=null&&(g[0]=d.nodes[g[0]].index),g[2]!=null&&(g[2]=d.nodes[g[2]].index);if(d.external)for(const g of d.external)g[0]!=null&&(g[0]=d.nodes[g[0]].index);for(const g of w)c[g]&&(b[d.nodes[g].index]=c[g]),delete c[g];d.nodes=u,h=y,d.config=c=b}at(c,h)}a[l]=d,s||(s=f.rootGraph.nodes.reduce((w,u)=>(w[u.type]??=[],w[u.type].push(u),w),{}));const m=s[`${G}${P}`+l];m&&r.push(...m)}await K.registerFromWorkflow(a,[]);for(const l of r)l.recreate();this.modifications={},this.app.canvas.setDirty(!0,!0),this.changeGroup(this.selectedGroup,!1)},"onclick")},"Save"),N("button.comfy-btn",{onclick:p(()=>this.element.close(),"onclick")},"Close")])]);this.element.replaceChildren(o),this.changeGroup(e?t.find(s=>`${G}${P}${s}`===e)??t[0]:t[0]),this.element.showModal(),this.element.addEventListener("close",()=>{this.draggable?.dispose(),this.element.remove()})}}window.comfyAPI=window.comfyAPI||{};window.comfyAPI.groupNodeManage=window.comfyAPI.groupNodeManage||{};window.comfyAPI.groupNodeManage.ManageGroupDialog=lt;const Jt=new Set(["default","forceInput","defaultInput","control_after_generate","multiline","tooltip","dynamicPrompts"]),Ve=p(n=>{const e=n.min??-1/0,t=n.max??1/0;return{min:e,max:t}},"getRange"),Qt=p((n,e)=>{const t=n[0],i=n[1]??{},o=e[1]??{},s=Ve(i),r=Ve(o);if(s.min>r.max||s.max<r.min)return null;const a=i.step??1,l=o.step??1,d={min:Math.max(s.min,r.min),max:Math.min(s.max,r.max),step:Ct(a,l)};return Ae([t,{...i,...d}],[t,{...o,...d}])},"mergeNumericInputSpec"),Zt=p((n,e)=>{const t=n[1]??{},i=e[1]??{},o=Fe(n),s=Fe(e),r=Y.intersection(o,s);return r.length===0?null:Ae(["COMBO",{...t,options:r}],["COMBO",{...i,options:r}])},"mergeComboInputSpec"),Ae=p((n,e)=>{const t=De(n),i=n[1]??{},o=e[1]??{};return Y.union(Y.keys(i),Y.keys(o)).filter(a=>!Jt.has(a)).every(a=>{const l=i[a],d=o[a];return l===d||Y.isNil(l)&&Y.isNil(d)})?[t,{...i,...o}]:null},"mergeCommonInputSpec"),eo=p((n,e)=>{const t=De(n),i=De(e);return t!==i?null:Nt(n)||It(n)?Qt(n,e):kt(n)?Zt(n,e):Ae(n,e)},"mergeInputSpec"),to=p(n=>n.type==="PrimitiveNode","isPrimitiveNode"),ke="Run widget replace on values";class xe extends ge{static{p(this,"PrimitiveNode")}controlValues;lastType;static category;constructor(e){super(e),this.addOutput("connect to widget input","*"),this.serialize_widgets=!0,this.isVirtualNode=!0,(!this.properties||!(ke in this.properties))&&this.addProperty(ke,!1,"boolean")}applyToGraph(e=[]){if(!this.outputs[0].links?.length||!this.graph)return;const t=[...this.outputs[0].links.map(o=>this.graph.links[o]),...e];let i=this.widgets?.[0].value;i&&this.properties[ke]&&(i=ot(this.graph,i));for(const o of t){const s=this.graph?.getNodeById(o.target_id),r=s?.inputs[o.target_slot];if(!r){console.warn("Unable to resolve node or input for link",o);continue}const a=r.widget?.name;if(!a){console.warn("Invalid widget or widget name",r.widget);continue}const l=s.widgets?.find(d=>d.name===a);if(!l){console.warn(`Unable to find widget "${a}" on node [${s.id}]`);continue}l.value=i,l.callback?.(l.value,f.canvas,s,f.canvas.graph_mouse,{})}}refreshComboInNode(){const e=this.widgets?.[0];e?.type==="combo"&&(e.options.values=this.outputs[0].widget[F]()[0],e.options.values.includes(e.value)||(e.value=e.options.values[0],e.callback(e.value)))}onAfterGraphConfigured(){if(this.outputs[0].links?.length&&!this.widgets?.length){if(this.#e(),this.widgets&&this.widgets_values)for(let e=0;e<this.widgets_values.length;e++){const t=this.widgets[e];t&&(t.value=this.widgets_values[e])}this.#t()}}onConnectionsChange(e,t,i){if(f.configuringGraph)return;const o=this.outputs[0].links;i?o?.length&&!this.widgets?.length&&this.#e():(this.#t(),o?.length||this.onLastDisconnect())}onConnectOutput(e,t,i,o,s){if(!i.widget&&!(i.type in z))return!1;if(this.outputs[e].links?.length){const r=this.#o(i);return r&&this.applyToGraph([{target_id:o.id,target_slot:s}]),r}return!0}#e(e){if(!this.outputs[0].links||!this.graph){this.onLastDisconnect();return}const t=this.outputs[0].links[0],i=this.graph.links[t];if(!i)return;const o=this.graph.getNodeById(i.target_id);if(!o||!o.inputs)return;const s=o.inputs[i.target_slot];if(!s)return;let r;if(s.widget)r=s.widget;else{if(!(s.type in z))return;r={name:s.name,[F]:()=>[s.type,{}]}}const a=r[F]?.();if(!a)return;const{type:l}=no(a);this.outputs[0].type=l,this.outputs[0].name=l,this.outputs[0].widget=r,this.#i(r[se]??a,o,r.name,e)}#i(e,t,i,o){let s=e[0];s instanceof Array&&(s="COMBO");const[r,a]=this.size;let l;if(Dt(s)?l=(z[s](this,"value",e,f)||{}).widget:l=this.addWidget(s,"value",null,()=>{},{}),t?.widgets&&l){const c=t.widgets.find(h=>h.name===i);c&&(l.value=c.value)}if(!e?.[1]?.control_after_generate&&(l.type==="number"||l.type==="combo")){let c=this.widgets_values?.[1];c||(c="fixed"),xt(this,l,c,void 0,e),this.widgets?.[1]&&(l.linkedWidgets=[this.widgets[1]]);let h=this.widgets_values?.[2];h&&this.widgets&&this.widgets.length===3&&(this.widgets[2].value=h)}const d=this.controlValues;if(this.widgets&&this.lastType===this.widgets[0]?.type&&d?.length===this.widgets.length-1)for(let c=0;c<d.length;c++)this.widgets[c+1].value=d[c];if(l.callback=Q(l.callback,()=>{this.applyToGraph()}),this.setSize([Math.max(this.size[0],r),Math.max(this.size[1],a)]),!o){const c=this.computeSize();this.size[0]<c[0]&&(this.size[0]=c[0]),this.size[1]<c[1]&&(this.size[1]=c[1]),requestAnimationFrame(()=>{this.onResize?.(this.size)})}}recreateWidget(){const e=this.widgets?.map(t=>t.value);if(this.#n(),this.#e(!0),e?.length&&this.widgets)for(let t=0;t<this.widgets.length;t++)this.widgets[t].value=e[t];return this.widgets?.[0]}#t(){const e=this.outputs[0],t=e.links??[],i=!!e.widget?.[se];if(i&&delete e.widget?.[se],t?.length<2&&i){t.length&&this.recreateWidget();return}const o=e.widget?.[F]?.();if(!(!o||!(o[0]==="INT"||o[0]==="FLOAT")||!this.graph))for(const r of t){const a=this.graph.links[r];if(!a)continue;const l=this.graph.getNodeById(a.target_id);if(!l)continue;const d=l.inputs[a.target_slot];this.#o(d,i)}}#o(e,t){const i=this.outputs?.[0],o=e.widget?.[F]?.();return o?!!ce.call(this,i,o,t,this.recreateWidget):!1}#n(){if(this.widgets){for(const e of this.widgets)e.onRemove&&e.onRemove();this.controlValues=[],this.lastType=this.widgets[0]?.type;for(let e=1;e<this.widgets.length;e++)this.controlValues.push(this.widgets[e].value);setTimeout(()=>{delete this.lastType,delete this.controlValues},15),this.widgets.length=0}}onLastDisconnect(){this.outputs[0].type="*",this.outputs[0].name="connect to widget input",delete this.outputs[0].widget,this.#n()}}function Le(n){return n.widget?.[se]??n.widget?.[F]?.()??["*",{}]}p(Le,"getWidgetConfig");function $e(n){const{nodeData:e}=this.constructor;return e?.input?.required?.[n]??e?.input?.optional?.[n]}p($e,"getConfig");function oo(n,e){return console.warn("Please remove call to convertToInput. Widget to socket conversion is no longer necessary, as they co-exist now."),n.inputs.find(t=>t.widget?.name===e.name)}p(oo,"convertToInput");function no(n){let e=n[0];return e instanceof Array&&(e="COMBO"),{type:e}}p(no,"getWidgetType");function _e(n,e){if(!n.widget||(e?n.widget[F]=()=>e:delete n.widget,!(n instanceof _t)))return;const t=n.node.graph;if(!t)return;const i=t.links[n.link??-1];if(!i)return;const o=t.getNodeById(i.origin_id);!o||!to(o)||(e?o.recreateWidget():f.configuringGraph||(o.disconnectOutput(0),o.onLastDisconnect()))}p(_e,"setWidgetConfig");function ce(n,e,t,i,o){o||(o=Le(n));const s=eo(o,e);if(s||t){s&&(n.widget[se]=s);const r=i?.call(this);if(r){const a=r.options.min,l=r.options.max;a!=null&&r.value<a&&(r.value=a),l!=null&&r.value>l&&(r.value=l),r.callback(r.value)}}return{customConfig:s?.[1]??{}}}p(ce,"mergeIfValid");f.registerExtension({name:"Comfy.WidgetInputs",async beforeRegisterNodeDef(n,e,t){n.prototype.convertWidgetToInput=function(){return console.warn("Please remove call to convertWidgetToInput. Widget to socket conversion is no longer necessary, as they co-exist now."),!1},n.prototype.onGraphConfigured=Q(n.prototype.onGraphConfigured,function(){if(this.inputs){this.widgets??=[];for(const o of this.inputs)if(o.widget){const s=o.widget.name;o.widget[F]||(o.widget[F]=()=>$e.call(this,s)),this.widgets?.find(a=>a.name===s)||this.removeInput(this.inputs.findIndex(a=>a===o))}}}),n.prototype.onConfigure=Q(n.prototype.onConfigure,function(){if(!t.configuringGraph&&this.inputs){for(const o of this.inputs)if(o.widget&&!o.widget[F]){const s=o.widget.name;o.widget[F]=()=>$e.call(this,s)}}});const i=n.prototype.onInputDblClick;n.prototype.onInputDblClick=function(...[o,...s]){const r=i?.apply(this,[o,...s]),a=this.inputs[o];if(!a.widget&&!(a.type in z)&&!(a.widget?.[F]?.()?.[0]instanceof Array))return r;const l=C.createNode("PrimitiveNode"),d=t.canvas.graph;if(!l||!d)return r;d?.add(l);const c=[this.pos[0]-l.size[0]-30,this.pos[1]];for(;d.getNodeOnPos(c[0],c[1],d.nodes);)c[1]+=C.NODE_TITLE_HEIGHT;return l.pos=c,l.connect(0,this,o),l.title=a.name,r}},registerCustomNodes(){C.registerNodeType("PrimitiveNode",Object.assign(xe,{title:"Primitive"})),xe.category="utils"}});window.comfyAPI=window.comfyAPI||{};window.comfyAPI.widgetInputs=window.comfyAPI.widgetInputs||{};window.comfyAPI.widgetInputs.PrimitiveNode=xe;window.comfyAPI.widgetInputs.getWidgetConfig=Le;window.comfyAPI.widgetInputs.convertToInput=oo;window.comfyAPI.widgetInputs.setWidgetConfig=_e;window.comfyAPI.widgetInputs.mergeIfValid=ce;const X={InUse:{Free:0,Registered:1,InWorkflow:2},isInUseGroupNode(n){const e=`${G}${P}${n}`;return f.rootGraph.extra?.groupNodes?.[n]?f.rootGraph.nodes.find(t=>t.type===e)?X.InUse.InWorkflow:X.InUse.Registered:X.InUse.Free},storeGroupNode(n,e){let t=f.rootGraph.extra;t||(f.rootGraph.extra=t={});let i=t.groupNodes;i||(t.groupNodes=i={}),i[n]=e}};class ze{static{p(this,"GroupNodeBuilder")}nodes;nodeData;constructor(e){this.nodes=e}async build(){const e=await this.getName();if(e)return this.sortNodes(),this.nodeData=this.getNodeData(),X.storeGroupNode(e,this.nodeData),{name:e,nodeData:this.nodeData}}async getName(){const e=await ie().prompt({title:_("groupNode.create"),message:_("groupNode.enterName"),defaultValue:""});if(!e)return;switch(X.isInUseGroupNode(e)){case X.InUse.InWorkflow:M().addAlert("An in use group node with this name already exists embedded in this workflow, please remove any instances or use a new name.");return;case X.InUse.Registered:if(!confirm("A group node with this name already exists embedded in this workflow, are you sure you want to overwrite it?"))return;break}return e}sortNodes(){const e=f.rootGraph.computeExecutionOrder(!1);this.nodes=this.nodes.map(t=>({index:e.indexOf(t),node:t})).sort((t,i)=>t.index-i.index||String(t.node.id).localeCompare(String(i.node.id))).map(({node:t})=>t)}getNodeData(){const e=p(r=>{for(const a of r.links){const d=f.rootGraph.getNodeById(a[4])?.outputs?.[Number(a[1])]?.type;d!==void 0&&a.push(d)}},"storeLinkTypes"),t=p(r=>{r.external=[];for(let a=0;a<this.nodes.length;a++){const l=this.nodes[a];if(l.outputs?.length)for(let d=0;d<l.outputs.length;d++){let c=!1;const h=l.outputs[d];let m=h.type;if(h.links?.length){for(const w of h.links){const u=f.rootGraph.links[w];if(u&&(m==="*"&&(m=u.type),!f.canvas.selected_nodes[u.target_id])){c=!0;break}}c&&r.external.push([a,d,String(m)])}}}},"storeExternalLinks"),i=f.canvas?.graph;if(!i)return{nodes:[],links:[],external:[]};const o=Et(this.nodes,i),s=JSON.parse(o);return s.external=[],e(s),t(s),s}}class K{static{p(this,"GroupNodeConfig")}name;nodeData;inputCount;oldToNewOutputMap;newToOldOutputMap;oldToNewInputMap;oldToNewWidgetMap;newToOldWidgetMap;primitiveDefs;widgetToPrimitive;primitiveToWidget;nodeInputs;outputVisibility;nodeDef;inputs;linksFrom;linksTo;externalFrom;constructor(e,t){this.name=e,this.nodeData=t,this.getLinks(),this.inputCount=0,this.oldToNewOutputMap={},this.newToOldOutputMap={},this.oldToNewInputMap={},this.oldToNewWidgetMap={},this.newToOldWidgetMap={},this.primitiveDefs={},this.widgetToPrimitive={},this.primitiveToWidget={},this.nodeInputs={},this.outputVisibility=[]}async registerType(e=G){this.nodeDef={output:[],output_name:[],output_is_list:[],output_node:!1,name:e+P+this.name,display_name:this.name,category:"group nodes"+(P+e),input:{required:{}},description:`Group node combining ${this.nodeData.nodes.map(o=>o.type).join(", ")}`,python_module:"custom_nodes."+this.name,[V]:this},this.inputs=[];const t={},i={};for(let o=0;o<this.nodeData.nodes.length;o++){const s=this.nodeData.nodes[o];s.index=o,this.processNode(s,t,i)}for(const o of this.#e)o();this.#e=[],this.nodeDef&&(await f.registerNodeDef(`${G}${P}`+this.name,this.nodeDef),St().addNodeDef(this.nodeDef))}getLinks(){this.linksFrom={},this.linksTo={},this.externalFrom={};for(const e of this.nodeData.links){const[t,i,o,s]=e;if(t==null||i==null||o==null||s==null)continue;const r=Number(t),a=Number(i),l=Number(o),d=Number(s);this.linksFrom[r]||(this.linksFrom[r]={}),this.linksFrom[r][a]||(this.linksFrom[r][a]=[]),this.linksFrom[r][a].push(e),this.linksTo[l]||(this.linksTo[l]={}),this.linksTo[l][d]=e}if(this.nodeData.external)for(const e of this.nodeData.external){const t=Number(e[0]),i=Number(e[1]),o=e[2];o!=null&&(this.externalFrom[t]?this.externalFrom[t][i]=o:this.externalFrom[t]={[i]:o})}}processNode(e,t,i){const o=this.getNodeDef(e);if(!o)return;const s={...o.input?.required,...o.input?.optional};this.inputs.push(this.processNodeInputs(e,t,s)),o.output?.length&&this.processNodeOutputs(e,i,o)}getNodeDef(e){if(e.type){const o=re[e.type];if(o)return o}const t=e.index;if(t==null)return;const i=this.linksFrom[t];if(e.type==="PrimitiveNode"){if(!i)return;let o=i[0]?.[0]?.[5]??null;if(o==="COMBO"){const r=e.outputs?.[0]?.widget?.name,a=i[0]?.[0]?.[2];if(r&&a!=null){const l=this.nodeData.nodes[Number(a)]?.type;if(l){const d=re[l],h=(d?.input?.required?.[r]??d?.input?.optional?.[r])?.[0];o=typeof h=="string"||typeof h=="number"?h:null}}}return this.primitiveDefs[t]={input:{required:{value:[o,{}]}},output:[o],output_name:[],output_is_list:[]}}else if(e.type==="Reroute"){const o=this.linksTo[t];if(o&&i&&!this.externalFrom[t]?.[0])return null;let s={},r="*";if(i){const a=i[0]??[];for(const l of a){const d=l[2],c=l[3];if(d==null||c==null)continue;const h=this.nodeData.nodes[Number(d)],m=h?.inputs?.[Number(c)];if(m?.type&&r==="*"&&(r=m.type),m?.widget&&h?.type){const w=re[h.type],u=w?.input?.required?.[m.widget.name]??w?.input?.optional?.[m.widget.name];if(u){const y=[u[0],s];s=ce({widget:y},u,!1,void 0,y)?.customConfig??s}}}}else if(o){const a=o[0];if(a){const l=a[0],d=a[1];if(l!=null&&d!=null){const c=this.nodeData.nodes[Number(l)]?.outputs?.[Number(d)];c&&typeof c=="object"&&"type"in c&&(r=String(c.type??"*"))}}}else{for(const a of this.nodeData.links)if(a[2]===e.index){const l=a[5];l!=null&&(r=String(l));break}if(r==="*"){const a=this.externalFrom[t]?.[0];a&&(r=String(a))}}return s.forceInput=!0,{input:{required:{[r]:[r,s]}},output:[r],output_name:[],output_is_list:[]}}console.warn("Skipping virtual node "+e.type+" when building group node "+this.name)}getInputConfig(e,t,i,o,s){const a=this.nodeData.config?.[e.index??-1]?.input?.[t];let l=a?.name??e.inputs?.find(h=>h.name===t)?.label??t,d=l,c="";if((e.type==="PrimitiveNode"&&e.title||l in i)&&(c=`${e.title??e.type} `,d=l=`${c}${t}`,l in i&&(l=`${c}${i[l]} ${t}`)),i[d]=(i[d]??1)+1,(t==="seed"||t==="noise_seed")&&(s||(s={}),s.control_after_generate=`${c}control_after_generate`),o[0]==="IMAGEUPLOAD"){s||(s={});const h=e.index??-1,m=typeof o[1]=="object"&&o[1]!==null?o[1]:{},w="widget"in m&&typeof m.widget=="string"?m.widget:"image";s.widget=this.oldToNewWidgetMap[h]?.[w]??"image"}if(s){const h=typeof o[1]=="object"&&o[1]?o[1]:{};o=[o[0],{...h,...s}]}return{name:l,config:o,customConfig:a}}processWidgetInputs(e,t,i,o){const s=[],r=new Map,a=t.index??-1,l=this.oldToNewWidgetMap[a]={};for(const d of i){const c=e[d];if(Array.isArray(c)&&c.length>=1&&typeof c[0]=="string"&&Mt().inputIsWidget(c)){const m=t.inputs?.findIndex(w=>w.name===d&&w.widget?.name===d)??-1;if(m>-1)r.set(m,d),l[d]=null;else{const{name:w,config:u}=this.getInputConfig(t,d,o,e[d]);this.nodeDef?.input?.required&&(this.nodeDef.input.required[w]=u),l[d]=w,this.newToOldWidgetMap[w]={node:t,inputName:d}}}else s.push(d)}return{converted:r,slots:s}}checkPrimitiveConnection(e,t,i){const o=e[0];if(o==null)return;if(this.nodeData.nodes[Number(o)]?.type==="PrimitiveNode"){const r=Number(e[0]),a=Number(e[2]),l=this.primitiveDefs[r];if(!l)return;const d=i[t],c=l.input.required.value,m=ce({widget:c},d,!1,void 0,c),w=i[t]?.[1];c[1]=m?.customConfig??w?{...typeof w=="object"?w:{}}:{};const u=this.oldToNewWidgetMap[r]?.value;if(u){const v=u.substring(0,u.length-6);c[1].control_after_generate=!0,c[1].control_prefix=v}let y=this.widgetToPrimitive[a];y||(y=this.widgetToPrimitive[a]={});const b=y[t];Array.isArray(b)?b.push(r):typeof b=="number"?y[t]=[b,r]:y[t]=r;let g=this.primitiveToWidget[r];g||(g=this.primitiveToWidget[r]=[]),g.push({nodeId:a,inputName:t})}}processInputSlots(e,t,i,o,s,r){const a=t.index??-1;this.nodeInputs[a]={};for(let l=0;l<i.length;l++){const d=i[l];if(o[l]){this.checkPrimitiveConnection(o[l],d,e);continue}const{name:c,config:h,customConfig:m}=this.getInputConfig(t,d,r,e[d]);this.nodeInputs[a][d]=c,m?.visible!==!1&&(this.nodeDef?.input?.required&&(this.nodeDef.input.required[c]=h),s[l]=this.inputCount++)}}processConvertedWidgets(e,t,i,o,s,r,a){const l=[...o.keys()].sort().map(d=>o.get(d));for(let d=0;d<l.length;d++){const c=l[d];if(!c)continue;if(s[i.length+d]){this.checkPrimitiveConnection(s[i.length+d],c,e);continue}const{name:h,config:m}=this.getInputConfig(t,c,a,e[c],{defaultInput:!0});this.nodeDef?.input?.required&&(this.nodeDef.input.required[h]=m),this.newToOldWidgetMap[h]={node:t,inputName:c};const w=t.index??-1;this.oldToNewWidgetMap[w]||(this.oldToNewWidgetMap[w]={}),this.oldToNewWidgetMap[w][c]=h,r[i.length+d]=this.inputCount++}}#e=[];processNodeInputs(e,t,i){const o=[],s=Object.keys(i);if(!s.length)return;const{converted:r,slots:a}=this.processWidgetInputs(i,e,s,t),l=e.index??-1,d=this.linksTo[l]??{},c=this.oldToNewInputMap[l]={};return this.processInputSlots(i,e,a,d,c,t),this.#e.push(()=>this.processConvertedWidgets(i,e,a,r,d,c,t)),o}processNodeOutputs(e,t,i){const o=e.index??-1,s=this.oldToNewOutputMap[o]={},r=i.output??[];for(let a=0;a<r.length;a++){const d=this.linksFrom[o]?.[a]&&!this.externalFrom[o]?.[a],h=this.nodeData.config?.[e.index??-1]?.output?.[a],m=h?.visible??!d;if(this.outputVisibility.push(m),!m)continue;this.nodeDef?.output&&(s[a]=this.nodeDef.output.length,this.newToOldOutputMap[this.nodeDef.output.length]={node:e,slot:a},this.nodeDef.output.push(r[a]),this.nodeDef.output_is_list?.push(i.output_is_list?.[a]??!1));let w=h?.name;if(!w){const y=r[a];w=i.output_name?.[a]??(typeof y=="string"?y:void 0);const b=e.outputs?.find(g=>g.name===w);b?.label&&(w=b.label)}let u=String(w??`output_${a}`);if(u in t){const y=`${e.title??e.type} `;u=`${y}${w??a}`,u in t&&(u=`${y}${e.index} ${w??a}`)}t[u]=1,this.nodeDef?.output_name?.push(u)}}static async registerFromWorkflow(e,t){for(const i in e){const o=e[i];let s=!1;for(const a of o.nodes)(!a.type||!(a.type in C.registered_node_types))&&(t.push({type:a.type??"unknown",hint:` (In group node '${G}${P}${i}')`}),t.push({type:`${G}${P}`+i,action:{text:"Remove from workflow",callback:p(l=>{delete e[i];const d=l.target;d.textContent="Removed",d.style.pointerEvents="none",d.style.opacity="0.7"},"callback")}}),s=!0);if(s)continue;await new K(i,o).registerType()}}}class E{static{p(this,"GroupNodeHandler")}node;groupData;innerNodes=null;constructor(e){this.node=e,this.groupData=e.constructor?.nodeData?.[V],this.node.setInnerNodes=u=>{this.innerNodes=u;for(let y=0;y<this.innerNodes.length;y++){const b=this.innerNodes[y];b.graph??=this.node.graph;for(const g of b.widgets??[])g.type==="converted-widget"&&(g.serializeValue=g.origSerializeValue);b.index=y,b.getInputNode=g=>{const v=b.index??0,I=this.groupData.oldToNewInputMap[v]?.[g];if(I!=null)return this.node.getInputNode(I);const k=this.groupData.linksTo[v]?.[g];if(!k)return null;const D=k[0];if(D==null)return null;const x=u[Number(D)];return x.type==="PrimitiveNode"?null:x},b.getInputLink=g=>{const v=b.index??0,I=this.groupData.oldToNewInputMap[v]?.[g];if(I!=null){const x=this.node.inputs[I].link;if(x==null)return null;const T=f.rootGraph.links[x];return T?{...T,target_id:b.id,target_slot:+g}:null}const k=this.groupData.linksTo[v]?.[g];if(!k)return null;const D=k[0];return D==null?null:{origin_id:u[Number(D)].id,origin_slot:k[1],target_id:b.id,target_slot:+g}}}},this.node.updateLink=u=>{u={...u};const y=this.groupData.newToOldOutputMap[u.origin_slot];if(!y||!this.innerNodes)return null;const b=y.node.index??0;let g=this.innerNodes[b],v;for(;g?.type==="Reroute";)v=g.getInputLink(0),g=g.getInputNode(0);return g?v&&E.isGroupNode(g)&&g.updateLink?g.updateLink(v):(u.origin_id=g.id,u.origin_slot=v?.origin_slot??y.slot,u):null},this.node.getInnerNodes=(u,y=[],b=[],g=new Set)=>{if(g.has(this.node))throw new Error("RecursionError: while flattening subgraph");if(g.add(this.node),!this.innerNodes){const k=this.groupData.nodeData.nodes.map((D,x)=>{if(!D.type)return null;const T=C.createNode(D.type);return T?(T.configure(D),T.id=`${this.node.id}:${x}`,T.graph=this.node.graph,T):null}).filter(D=>D!==null);this.node.setInnerNodes?.(k)}this.updateInnerWidgets();const v=[...y,this.node.id],I=this.node.graph?.getNodeById(y.at(-1))??void 0;for(const k of this.innerNodes??[]){k.graph??=this.node.graph;const D=String(k.id);k.id=D.split(":").at(-1);const x=new Kt(k,v,u,I);k.id=D,x.groupNodeHandler=this,b.push(x)}return b},this.node.recreate=async()=>{const u=this.node.id,y=this.node.size,b=this.node.convertToNodes?.();if(!b)return null;const g=C.createNode(this.node.type);if(!g)return null;g.id=u,g.setInnerNodes?.(b);const v=E.getHandler(g);v?.populateWidgets(),f.rootGraph.add(g),g.setSize?.([Math.max(g.size[0],y[0]),Math.max(g.size[1],y[1])]);const k=new ze(b).getNodeData();return v&&(v.groupData.nodeData.links=k.links,v.replaceNodes(b)),g},this.node.convertToNodes=()=>{const u=p(()=>{const g={...this.groupData.nodeData};g.nodes=[...g.nodes];const v=this.node.getInnerNodes?.(),I=[];for(let L=0;L<g.nodes.length;L++){let q=v?.[L]?.id;q==null||typeof q=="number"&&isNaN(q)?q=void 0:I.push(q),g.nodes[L]={...g.nodes[L],id:q}}nt(JSON.stringify(g),f.canvas);const[k,D]=this.node.pos;let x,T;const j=I.length?I:Object.keys(f.canvas.selected_nodes),H=[];for(let L=0;L<j.length;L++){const q=j[L],U=f.rootGraph.getNodeById(q),ye=v?.[L];if(!U||(H.push(U),(T==null||U.pos[0]<T)&&(T=U.pos[0]),(x==null||U.pos[1]<x)&&(x=U.pos[1]),!U.widgets||!ye))continue;const we=this.groupData.oldToNewWidgetMap[ye.index??0];if(we){const ct=Object.keys(we);for(const Ge of ct){const We=we[Ge];if(!We)continue;const be=this.node.widgets?.findIndex(B=>B.name===We)??-1;if(be!==-1)if(ye.type==="PrimitiveNode")for(let B=0;B<U.widgets.length;B++){const Z=this.node.widgets?.[be+B];Z&&(U.widgets[B].value=Z.value)}else{const B=this.node.widgets?.[be],Z=U.widgets.find(J=>J.name===Ge);if(!Z||!B)continue;Z.value=B.value;const ve=B.linkedWidgets??[];for(let J=0;J<ve.length;J++){const Re=Z.linkedWidgets?.[J];Re&&ve[J]&&(Re.value=ve[J].value)}}}}}for(const L of H)L.pos[0]-=(T??0)-k,L.pos[1]-=(x??0)-D;return{newNodes:H,selectedIds:j}},"addInnerNodes"),y=p(g=>{for(const v in this.groupData.oldToNewInputMap){const I=g[Number(v)],k=f.rootGraph.getNodeById(I);if(!k)continue;const D=this.groupData.oldToNewInputMap[Number(v)];for(const x in D){const T=D[Number(x)];if(T==null)continue;const j=e.inputs[T];if(j.link==null)continue;const H=f.rootGraph.links[j.link];if(!H)continue;f.rootGraph.getNodeById(H.origin_id)?.connect(H.origin_slot,k,+x)}}},"reconnectInputs"),b=p(g=>{for(let v=0;v<e.outputs?.length;v++){const I=e.outputs[v];if(!I.links)continue;const k=[...I.links];for(const D of k){const x=this.groupData.newToOldOutputMap[v];if(!x)continue;const T=f.rootGraph.links[D];if(!T)continue;const j=f.rootGraph.getNodeById(T.target_id),H=f.rootGraph.getNodeById(g[x.node.index??0]);j&&H?.connect(x.slot,j,T.target_slot)}}},"reconnectOutputs");f.canvas.emitBeforeChange();try{const{newNodes:g,selectedIds:v}=u();return y(v),b(v),f.rootGraph.remove(this.node),g}finally{f.canvas.emitAfterChange()}};const t=this.node.getExtraMenuOptions,i=this.node;this.node.getExtraMenuOptions=function(u,y){t?.call(this,u,y);let b=y.findIndex(g=>g?.content==="Outputs");return b===-1?b=y.length:b++,y.splice(b,0,null,{content:"Convert to nodes",callback:p(async()=>{const g=i.convertToNodes;return g?.()},"callback")},{content:"Manage Group Node",callback:p(()=>Te(this.type),"callback")}),[]};const o=this.node.onDrawTitleBox;this.node.onDrawTitleBox=function(u,y,b,g){o?.call(this,u,y,b,g);const v=u.fillStyle;u.beginPath(),u.rect(11,-y+11,2,2),u.rect(14,-y+11,2,2),u.rect(17,-y+11,2,2),u.rect(11,-y+14,2,2),u.rect(14,-y+14,2,2),u.rect(17,-y+14,2,2),u.rect(11,-y+17,2,2),u.rect(14,-y+17,2,2),u.rect(17,-y+17,2,2),u.fillStyle=this.boxcolor||C.NODE_DEFAULT_BOXCOLOR,u.fill(),u.fillStyle=v};const s=e.onDrawForeground,r=this.groupData.nodeData;e.onDrawForeground=function(u,y,b){s?.call(this,u,y,b);const g=Tt().nodeProgressStates[this.id];if(g&&g.state==="running"&&this.runningInternalNodeId!==null){const v=typeof this.runningInternalNodeId=="number"?this.runningInternalNodeId:parseInt(String(this.runningInternalNodeId),10),I=r.nodes[v];if(!I)return;const k=`Running ${I.title||I.type} (${this.runningInternalNodeId}/${r.nodes.length})`;u.save(),u.font="12px sans-serif";const D=u.measureText(k);u.fillStyle=e.boxcolor||C.NODE_DEFAULT_BOXCOLOR,u.beginPath(),u.roundRect(0,-C.NODE_TITLE_HEIGHT-20,D.width+12,20,5),u.fill(),u.fillStyle="#fff",u.fillText(k,6,-C.NODE_TITLE_HEIGHT-6),u.restore()}};const a=this.node.onExecutionStart;this.node.onExecutionStart=function(){return this.resetExecution=!0,a?.call(this)};const l=this.node.onNodeCreated,d=this.groupData;this.node.onNodeCreated=function(){if(!this.widgets)return;const u=d.nodeData.config;if(u)for(const y in u){const b=u[y]?.input;if(b)for(const g in b){if(b[g]?.visible!==!1)continue;const v=d.oldToNewWidgetMap[Number(y)]?.[g],I=this.widgets.find(k=>k.name===v);I&&(I.type="hidden",I.computeSize=()=>[0,-4])}}return l?.call(this)};const c=p((u,y,b)=>{const g=p(({detail:v})=>{const I=y(v);if(!I||f.rootGraph.getNodeById(I))return;const D=this.innerNodes?.findIndex(x=>x.id==I)??-1;D>-1&&(this.node.runningInternalNodeId=D,A.dispatchCustomEvent(u,b(v,`${this.node.id}`,this.node)))},"handler");return A.addEventListener(u,g),g},"handleEvent"),h=c("executing",u=>typeof u=="string"?u:void 0,(u,y)=>y),m=c("executed",u=>typeof u=="object"?u?.display_node||u?.node:void 0,(u,y,b)=>({...typeof u=="object"?u:{},node:y,display_node:y,merge:!b.resetExecution})),w=e.onRemoved;this.node.onRemoved=function(){w?.call(this),A.removeEventListener("executing",h),A.removeEventListener("executed",m)},this.node.refreshComboInNode=u=>{for(const y in this.groupData.newToOldWidgetMap){const b=this.node.widgets?.find(g=>g.name===y);if(b?.type==="combo"){const g=this.groupData.newToOldWidgetMap[y];if(!g.node.type)continue;const v=u[g.node.type],I=v?.input?.required?.[g.inputName]??v?.input?.optional?.[g.inputName];if(!I)continue;b.options.values=I[0];const k=b.options.values;g.inputName!=="image"&&!k.includes(b.value)&&(b.value=k[0],b.callback?.(b.value))}}}}updateInnerWidgets(){if(this.innerNodes)for(const e in this.groupData.newToOldWidgetMap){const t=this.node.widgets?.find(l=>l.name===e);if(!t)continue;const i=t.value,o=this.groupData.newToOldWidgetMap[e],s=o.node.index??0,r=this.innerNodes[s];if(!r)continue;if(r.type==="PrimitiveNode"){r.primitiveValue=i;const l=this.groupData.primitiveToWidget[s];for(const d of l??[]){const c=typeof d.nodeId=="number"?d.nodeId:Number(d.nodeId),m=this.innerNodes[c]?.widgets?.find(w=>w.name===d.inputName);m&&(m.value=i)}continue}else if(r.type==="Reroute"){const l=this.groupData.linksFrom[s];if(l)for(const[,,d,c]of l[0]??[]){if(d==null||c==null)continue;const h=this.innerNodes[Number(d)];if(!h)continue;const m=h.inputs?.[Number(c)];if(m?.widget){const w=m.widget.name,u=h.widgets?.find(y=>y.name===w);u&&(u.value=i)}}}const a=r.widgets?.find(l=>l.name===o.inputName);a&&(a.value=i)}}populatePrimitive(e,t,i){const o=this.groupData.widgetToPrimitive[t]?.[i];if(o==null)return!1;const s=this.groupData.oldToNewWidgetMap[Array.isArray(o)?o[0]:o]?.value;if(!s)return!1;const r=this.node.widgets?.findIndex(a=>a.name===s)??-1;if(r>-1&&this.innerNodes){const a=Array.isArray(o)?o[0]:o,l=this.innerNodes[a];if(!l?.widgets)return!0;let d=l.widgets.length;d-1!==(this.node.widgets?.[r]?.linkedWidgets?.length??0)&&(d=1);for(let c=0;c<d;c++){const h=this.node.widgets?.[r+c],m=l.widgets[c];h&&m&&(h.value=m.value)}}return!0}populateReroute(e,t,i){if(e.type!=="Reroute")return;const o=this.groupData.linksFrom[t]?.[0]?.[0];if(!o)return;const s=o[2],r=o[3];if(s==null||r==null)return;const a=this.groupData.nodeData.nodes[Number(s)],l=a?.inputs;if(!l?.[Number(r)]?.widget)return;const c=(l?.length??0)-(a?.widgets_values?.length??0),h=a?.widgets_values?.[Number(r)-c];if(h==null)return;const m=Object.values(i)[0],w=this.node.widgets?.find(u=>u.name===m);w&&(w.value=h)}populateWidgets(){if(this.node.widgets)for(let e=0;e<this.groupData.nodeData.nodes.length;e++){const t=this.groupData.nodeData.nodes[e],i=this.groupData.oldToNewWidgetMap[e]??{},o=Object.keys(i);if(!t.widgets_values?.length){this.populateReroute(t,e,i);continue}let s=0;for(let r=0;r<o.length;r++){const a=o[r],l=i[a],d=this.node.widgets.findIndex(m=>m.name===l),c=this.node.widgets[d];if(this.populatePrimitive(t,e,a)||d===-1){const m=this.innerNodes?.[e]?.widgets?.find(w=>w.name===a);s+=m?.linkedWidgets?.length??0}if(d===-1)continue;c.value=t.widgets_values?.[r+s];const h=c.linkedWidgets??[];for(let m=0;m<h.length;m++)this.node.widgets[d+m+1].value=t.widgets_values?.[r+ ++s]}}}replaceNodes(e){let t,i;for(let o=0;o<e.length;o++){const s=e[o];(i==null||s.pos[0]<i)&&(i=s.pos[0]),(t==null||s.pos[1]<t)&&(t=s.pos[1]),this.linkOutputs(s,o),f.rootGraph.remove(s),s.id=`${this.node.id}:${o}`}this.linkInputs(),this.node.pos=[i??0,t??0]}linkOutputs(e,t){if(e.outputs)for(const i of e.outputs){if(!i.links)continue;const o=[...i.links];for(const s of o){const r=f.rootGraph.links[s];if(!r)continue;const a=f.rootGraph.getNodeById(r.target_id),l=this.groupData.oldToNewOutputMap[t]?.[r.origin_slot];l!=null&&a&&this.node.connect(l,a,r.target_slot)}}}linkInputs(){for(const e of this.groupData.nodeData.links??[]){const[,t,i,o,s]=e;if(s==null||typeof s=="object")continue;const r=f.rootGraph.getNodeById(s);if(!r||i==null||o==null)continue;const a=this.groupData.oldToNewInputMap[Number(i)]?.[Number(o)];a!=null&&(typeof t=="number"||typeof t=="string")&&r.connect(t,this.node.id,a)}}static getGroupData(e){if(typeof e=="function")return e.nodeData?.[V];const t=e.nodeData;return t?.[V]?t[V]:e.constructor?.nodeData?.[V]}static getHandler(e){let t=e[V];return!t&&E.isGroupNode(e)&&(t=new E(e),e[V]=t),t}static isGroupNode(e){return!!e.constructor?.nodeData?.[V]}static async fromNodes(e){const t=new ze(e),i=await t.build();if(!i)return;const{name:o,nodeData:s}=i;await new K(o,s).registerType();const a=C.createNode(`${G}${P}${o}`);if(!a)return;a.setInnerNodes?.(t.nodes);const l=E.getHandler(a);return l?.populateWidgets(),f.rootGraph.add(a),l?.replaceNodes(t.nodes),a}}const io=p(n=>{for(const e of n)typeof e.type=="string"&&e.type.startsWith("workflow/")&&(e.type=e.type.replace(/^workflow\//,`${G}${P}`))},"replaceLegacySeparators");async function Ce(){const n=Object.values(f.canvas.selected_nodes??{});if(n.length===0)throw new Error("No nodes selected");if(n.length===1)throw new Error("Please select multiple nodes to convert to group node");for(const e of n){if(e instanceof Ot)throw new Error("Selected nodes contain a subgraph node");if(E.isGroupNode(e))throw new Error("Selected nodes contain a group node")}return await E.fromNodes(n)}p(Ce,"convertSelectedNodesToGroupNode");const je=p(n=>n.length<2||!!n.find(e=>E.isGroupNode(e)),"convertDisabled");function so(){const n=Object.values(f.canvas.selected_nodes??{});for(const e of n)E.isGroupNode(e)&&e.convertToNodes?.()}p(so,"ungroupSelectedGroupNodes");function Te(n){new lt(f).show(n)}p(Te,"manageGroupNodes");const ro="Comfy.GroupNode";let re;const ao={name:ro,commands:[{id:"Comfy.GroupNode.ConvertSelectedNodesToGroupNode",label:"Convert selected nodes to group node",icon:"pi pi-sitemap",versionAdded:"1.3.17",function:p(()=>Ce(),"function")},{id:"Comfy.GroupNode.UngroupSelectedGroupNodes",label:"Ungroup selected group nodes",icon:"pi pi-sitemap",versionAdded:"1.3.17",function:p(()=>so(),"function")},{id:"Comfy.GroupNode.ManageGroupNodes",label:"Manage group nodes",icon:"pi pi-cog",versionAdded:"1.3.17",function:p((...n)=>Te(n[0]),"function")}],keybindings:[{commandId:"Comfy.GroupNode.ConvertSelectedNodesToGroupNode",combo:{alt:!0,key:"g"}},{commandId:"Comfy.GroupNode.UngroupSelectedGroupNodes",combo:{alt:!0,shift:!0,key:"G"}}],getCanvasMenuItems(n){const e=[],t=Object.values(n.selected_nodes??{}),i=!je(t);e.push({content:"Convert to Group Node (Deprecated)",disabled:!i,callback:p(async()=>Ce(),"callback")});const o=n.graph?.extra?.groupNodes,s=!o||!Object.keys(o).length;return e.push({content:"Manage Group Nodes",disabled:s,callback:p(()=>Te(),"callback")}),e},getNodeMenuItems(n){if(E.isGroupNode(n))return[];const e=Object.values(f.canvas.selected_nodes??{});return[{content:"Convert to Group Node (Deprecated)",disabled:!!je(e),callback:p(async()=>Ce(),"callback")}]},async beforeConfigureGraph(n,e){const t=n?.extra?.groupNodes;t&&(io(n.nodes),await K.registerFromWorkflow(t,e))},addCustomNodeDefs(n){re=n},nodeCreated(n){if(E.isGroupNode(n)){n[V]=new E(n);const e=E.getHandler(n);n.title&&e?.groupData?.nodeData&&X.storeGroupNode(n.title,e.groupData.nodeData)}},async refreshComboInNodes(n){Object.assign(re,n);const e=f.rootGraph.extra?.groupNodes;e&&await K.registerFromWorkflow(e,[])}};f.registerExtension(ao);window.comfyAPI=window.comfyAPI||{};window.comfyAPI.groupNode=window.comfyAPI.groupNode||{};window.comfyAPI.groupNode.GroupNodeConfig=K;window.comfyAPI.groupNode.GroupNodeHandler=E;function W(n,e){n.mode=e,n.graph?.change()}p(W,"setNodeMode");function He(n,e){const t=oe().get("Comfy.GroupSelectedNodes.Padding");n.resizeTo([...n.children,...e],t)}p(He,"addNodesToGroup");const lo={name:"Comfy.GroupOptions",getCanvasMenuItems(n){const e=[],t=n.graph.getGroupOnPos(n.graph_mouse[0],n.graph_mouse[1]);if(!t)return n.selectedItems.size>0&&e.push({content:"Add Group For Selected Nodes",callback:p(()=>{const s=new At;He(s,n.selectedItems),n.graph.add(s),n.graph.change(),s.recomputeInsideNodes()},"callback")}),e;t.recomputeInsideNodes();const i=t.nodes;if(e.push({content:"Add Selected Nodes To Group",disabled:!n.selectedItems?.size,callback:p(()=>{He(t,n.selectedItems),n.graph.change()},"callback")}),i.length===0)return e;e.push(null);let o=!0;for(let s=1;s<i.length;s++)if(i[s].mode!==i[0].mode){o=!1;break}if(e.push({content:"Fit Group To Nodes",callback:p(()=>{t.recomputeInsideNodes();const s=oe().get("Comfy.GroupSelectedNodes.Padding");t.resizeTo(t.children,s),n.graph.change()},"callback")}),e.push({content:"Select Nodes",callback:p(()=>{n.selectNodes(i),n.graph.change(),n.canvas.focus()},"callback")}),o)switch(i[0].mode){case 0:e.push({content:"Set Group Nodes to Never",callback:p(()=>{for(const r of i)W(r,2)},"callback")}),e.push({content:"Bypass Group Nodes",callback:p(()=>{for(const r of i)W(r,4)},"callback")});break;case 2:e.push({content:"Set Group Nodes to Always",callback:p(()=>{for(const r of i)W(r,0)},"callback")}),e.push({content:"Bypass Group Nodes",callback:p(()=>{for(const r of i)W(r,4)},"callback")});break;case 4:e.push({content:"Set Group Nodes to Always",callback:p(()=>{for(const r of i)W(r,0)},"callback")}),e.push({content:"Set Group Nodes to Never",callback:p(()=>{for(const r of i)W(r,2)},"callback")});break;default:e.push({content:"Set Group Nodes to Always",callback:p(()=>{for(const r of i)W(r,0)},"callback")}),e.push({content:"Set Group Nodes to Never",callback:p(()=>{for(const r of i)W(r,2)},"callback")}),e.push({content:"Bypass Group Nodes",callback:p(()=>{for(const r of i)W(r,4)},"callback")});break}else e.push({content:"Set Group Nodes to Always",callback:p(()=>{for(const s of i)W(s,0)},"callback")}),e.push({content:"Set Group Nodes to Never",callback:p(()=>{for(const s of i)W(s,2)},"callback")}),e.push({content:"Bypass Group Nodes",callback:p(()=>{for(const s of i)W(s,4)},"callback")});return e}};f.registerExtension(lo);ne().registerExtension({name:"Comfy.ImageCompare",async nodeCreated(n){if(n.constructor.comfyClass!=="ImageCompare")return;const[e,t]=n.size;n.setSize([Math.max(e,400),Math.max(t,350)]);const i=n.onExecuted;n.onExecuted=function(o){i?.call(this,o);const s=o.a_images,r=o.b_images,a=f.getRandParam(),l=s&&s.length>0?A.apiURL(`/view?${new URLSearchParams(s[0])}${a}`):"",d=r&&r.length>0?A.apiURL(`/view?${new URLSearchParams(r[0])}${a}`):"",c=n.widgets?.find(h=>h.type==="imagecompare");c&&(c.value={before:l,after:d},c.callback?.(c.value))}}});const co=[{label:"GLB",value:"glb"},{label:"OBJ",value:"obj"},{label:"STL",value:"stl"}];function me(n){return[null,{content:"Save",has_submenu:!0,callback:p((e,t,i,o)=>{const s=co.map(r=>({content:r.label,callback:p(()=>{(async()=>{try{await n.exportModel(r.value),M().add({severity:"success",summary:_("toastMessages.exportSuccess",{format:r.label})})}catch(a){console.error("Export failed:",a),M().addAlert(_("toastMessages.failedToExportModel",{format:r.label}))}})()},"callback")}));new C.ContextMenu(s,{event:i,parentMenu:o})},"callback")}]}p(me,"createExportMenuItems");window.comfyAPI=window.comfyAPI||{};window.comfyAPI.exportMenuHelper=window.comfyAPI.exportMenuHelper||{};window.comfyAPI.exportMenuHelper.createExportMenuItems=me;class Pe{static{p(this,"Load3DConfiguration")}constructor(e,t){this.load3d=e,this.properties=t}configureForSaveMesh(e,t){this.setupModelHandlingForSaveMesh(t,e),this.setupDefaultProperties()}configure(e){this.setupModelHandling(e.modelWidget,e.loadFolder,e.cameraState),this.setupTargetSize(e.width,e.height),this.setupDefaultProperties(e.bgImagePath)}setupTargetSize(e,t){e&&t&&(this.load3d.setTargetSize(e.value,t.value),e.callback=i=>{this.load3d.setTargetSize(i,t.value)},t.callback=i=>{this.load3d.setTargetSize(e.value,i)})}setupModelHandlingForSaveMesh(e,t){const i=this.createModelUpdateHandler(t);e&&i(e)}setupModelHandling(e,t,i){const o=this.createModelUpdateHandler(t,i);e.value&&o(e.value);const s=e.callback;let r=e.value;Object.defineProperty(e,"value",{get(){return r},set(a){r=a,e.callback&&a!==void 0&&a!==""&&e.callback(a)},enumerable:!0,configurable:!0}),e.callback=a=>{o(a),s&&s(a)}}setupDefaultProperties(e){const t=this.loadSceneConfig();this.applySceneConfig(t,e);const i=this.loadCameraConfig();this.applyCameraConfig(i);const o=this.loadLightConfig();this.applyLightConfig(o)}loadSceneConfig(){return this.properties&&"Scene Config"in this.properties?this.properties["Scene Config"]:{showGrid:oe().get("Comfy.Load3D.ShowGrid"),backgroundColor:"#"+oe().get("Comfy.Load3D.BackgroundColor"),backgroundImage:""}}loadCameraConfig(){return this.properties&&"Camera Config"in this.properties?this.properties["Camera Config"]:{cameraType:oe().get("Comfy.Load3D.CameraType"),fov:35}}loadLightConfig(){return this.properties&&"Light Config"in this.properties?this.properties["Light Config"]:{intensity:oe().get("Comfy.Load3D.LightIntensity")}}loadModelConfig(){return this.properties&&"Model Config"in this.properties?this.properties["Model Config"]:{upDirection:"original",materialMode:"original",showSkeleton:!1}}applySceneConfig(e,t){if(this.load3d.toggleGrid(e.showGrid),this.load3d.setBackgroundColor(e.backgroundColor),e.backgroundImage){if(t&&t!=e.backgroundImage)return;this.load3d.setBackgroundImage(e.backgroundImage),e.backgroundRenderMode&&this.load3d.setBackgroundRenderMode(e.backgroundRenderMode)}}applyCameraConfig(e){this.load3d.toggleCamera(e.cameraType),this.load3d.setFOV(e.fov),e.state&&this.load3d.setCameraState(e.state)}applyLightConfig(e){this.load3d.setLightIntensity(e.intensity)}applyModelConfig(e){this.load3d.setUpDirection(e.upDirection),this.load3d.setMaterialMode(e.materialMode)}createModelUpdateHandler(e,t){let i=!0;return async o=>{if(!o)return;const s=o;this.setResourceFolder(s);const r=A.apiURL($.getResourceURL(...$.splitFilePath(s),e));await this.load3d.loadModel(r,s);const a=this.loadModelConfig();if(this.applyModelConfig(a),i&&t){try{this.load3d.setCameraState(t)}catch(l){console.warn("Failed to restore camera state:",l)}i=!1}}}setResourceFolder(e){const t=e.split("/").filter(s=>s.trim());if(t.length<=2)return;const o=t.slice(1,-1).join("/");o&&this.properties&&(this.properties["Resource Folder"]=o)}}const uo={name:"image",type:"Load3D",isPreview:!1},qe={name:"image",type:"Preview3D",isPreview:!0};async function po(n,e){if(!n?.length)return;const t=e.widgets?.find(i=>i.name==="model_file");try{const i=e.properties["Resource Folder"]||"",o=i.trim()?`3d/${i.trim()}`:"3d",s=await $.uploadFile(n[0],o);if(!s){M().addAlert(_("toastMessages.fileUploadFailed"));return}const r=A.apiURL($.getResourceURL(...$.splitFilePath(s),"input"));de(e).waitForLoad3d(a=>{try{a.loadModel(r)}catch{M().addAlert(_("toastMessages.failedToLoadModel"))}}),s&&t&&(t.options?.values?.includes(s)||t.options?.values?.push(s),t.value=s)}catch(i){console.error("Model upload failed:",i),M().addAlert(_("toastMessages.fileUploadFailed"))}}p(po,"handleModelUpload");async function go(n,e){if(n?.length)try{const t=e.properties["Resource Folder"]||"",i=t.trim()?`3d/${t.trim()}`:"3d";await $.uploadMultipleFiles(n,i)}catch(t){console.error("Extra resources upload failed:",t),M().addAlert(_("toastMessages.extraResourcesUploadFailed"))}}p(go,"handleResourcesUpload");function Ye(n,e=!1){const t=document.createElement("input");return t.type="file",t.accept=n,t.multiple=e,t.style.display="none",t}p(Ye,"createFileInput");ne().registerExtension({name:"Comfy.Load3D",settings:[{id:"Comfy.Load3D.ShowGrid",category:["3D","Scene","Initial Grid Visibility"],name:"Initial Grid Visibility",tooltip:"Controls whether the grid is visible by default when a new 3D widget is created. This default can still be toggled individually for each widget after creation.",type:"boolean",defaultValue:!0,experimental:!0},{id:"Comfy.Load3D.BackgroundColor",category:["3D","Scene","Initial Background Color"],name:"Initial Background Color",tooltip:"Controls the default background color of the 3D scene. This setting determines the background appearance when a new 3D widget is created, but can be adjusted individually for each widget after creation.",type:"color",defaultValue:"282828",experimental:!0},{id:"Comfy.Load3D.CameraType",category:["3D","Camera","Initial Camera Type"],name:"Initial Camera Type",tooltip:"Controls whether the camera is perspective or orthographic by default when a new 3D widget is created. This default can still be toggled individually for each widget after creation.",type:"combo",options:["perspective","orthographic"],defaultValue:"perspective",experimental:!0},{id:"Comfy.Load3D.LightIntensity",category:["3D","Light","Initial Light Intensity"],name:"Initial Light Intensity",tooltip:"Sets the default brightness level of lighting in the 3D scene. This value determines how intensely lights illuminate objects when a new 3D widget is created, but can be adjusted individually for each widget after creation.",type:"number",defaultValue:3,experimental:!0},{id:"Comfy.Load3D.LightIntensityMaximum",category:["3D","Light","Light Intensity Maximum"],name:"Light Intensity Maximum",tooltip:"Sets the maximum allowable light intensity value for 3D scenes. This defines the upper brightness limit that can be set when adjusting lighting in any 3D widget.",type:"number",defaultValue:10,experimental:!0},{id:"Comfy.Load3D.LightIntensityMinimum",category:["3D","Light","Light Intensity Minimum"],name:"Light Intensity Minimum",tooltip:"Sets the minimum allowable light intensity value for 3D scenes. This defines the lower brightness limit that can be set when adjusting lighting in any 3D widget.",type:"number",defaultValue:1,experimental:!0},{id:"Comfy.Load3D.LightAdjustmentIncrement",category:["3D","Light","Light Adjustment Increment"],name:"Light Adjustment Increment",tooltip:"Controls the increment size when adjusting light intensity in 3D scenes. A smaller step value allows for finer control over lighting adjustments, while a larger value results in more noticeable changes per adjustment.",type:"slider",attrs:{min:.1,max:1,step:.1},defaultValue:.5,experimental:!0},{id:"Comfy.Load3D.3DViewerEnable",category:["3D","3DViewer","Enable"],name:"Enable 3D Viewer (Beta)",tooltip:"Enables the 3D Viewer (Beta) for selected nodes. This feature allows you to visualize and interact with 3D models directly within the full size 3d viewer.",type:"boolean",defaultValue:!1,experimental:!0},{id:"Comfy.Load3D.PLYEngine",category:["3D","PLY","PLY Engine"],name:"PLY Engine",tooltip:'Select the engine for loading PLY files. "threejs" uses the native Three.js PLYLoader (best for mesh PLY files). "fastply" uses an optimized loader for ASCII point cloud PLY files. "sparkjs" uses Spark.js for 3D Gaussian Splatting PLY files.',type:"combo",options:["threejs","fastply","sparkjs"],defaultValue:"threejs",experimental:!0}],commands:[{id:"Comfy.3DViewer.Open3DViewer",icon:"pi pi-pencil",label:"Open 3D Viewer (Beta) for Selected Node",function:p(()=>{const n=f.canvas.selected_nodes;if(!n||Object.keys(n).length!==1)return;const e=n[Object.keys(n)[0]];if(!Pt(e))return;S.copyToClipspace(e),S.clipspace_return_node=e;const t={node:e};it().showDialog({key:"global-load3d-viewer",title:_("load3d.viewer.title"),component:Gt,props:t,dialogComponentProps:{style:"width: 80vw; height: 80vh;",maximizable:!0,onClose:p(async()=>{await fe().handleViewerClose(t.node)},"onClose")}})},"function")}],getCustomWidgets(){return{LOAD_3D(n){const e=Ye(".gltf,.glb,.obj,.fbx,.stl,.ply,.spz,.splat,.ksplat",!1);n.properties["Resource Folder"]="",e.onchange=async()=>{await po(e.files,n)},n.addWidget("button","upload 3d model","upload3dmodel",()=>{e.click()});const t=Ye("*",!0);t.onchange=async()=>{await go(t.files,n),t.value=""},n.addWidget("button","upload extra resources","uploadExtraResources",()=>{t.click()}),n.addWidget("button","clear","clear",()=>{de(n).waitForLoad3d(s=>{s.clearModel()});const o=n.widgets?.find(s=>s.name==="model_file");o&&(o.value="")});const i=new Se({node:n,name:"image",component:Oe,inputSpec:uo,options:{}});return i.type="load3D",Me(n,i),{widget:i}}}},getNodeMenuItems(n){if(n.constructor.comfyClass!=="Load3D")return[];const e=fe().getLoad3d(n);return e?e.isSplatModel()?[]:me(e):[]},async nodeCreated(n){if(n.constructor.comfyClass!=="Load3D")return;const[e,t]=n.size;n.setSize([Math.max(e,300),Math.max(t,600)]),await Ee(),de(n).waitForLoad3d(i=>{const s=n.properties["Camera Config"]?.state,r=new Pe(i,n.properties),a=n.widgets?.find(h=>h.name==="model_file"),l=n.widgets?.find(h=>h.name==="width"),d=n.widgets?.find(h=>h.name==="height"),c=n.widgets?.find(h=>h.name==="image");if(a&&l&&d&&c){const h={loadFolder:"input",modelWidget:a,cameraState:s,width:l,height:d};r.configure(h),c.serializeValue=async()=>{const m=Lt.get(n);if(!m)return console.error("No load3d instance found for node"),null;const w=n.properties["Camera Config"]||{cameraType:m.getCurrentCameraType(),fov:m.cameraManager.perspectiveCamera.fov};w.state=m.getCameraState(),n.properties["Camera Config"]=w,m.stopRecording();const{scene:u,mask:y,normal:b}=await m.captureScene(l.value,d.value),[g,v,I]=await Promise.all([$.uploadTempImage(u,"scene"),$.uploadTempImage(y,"scene_mask"),$.uploadTempImage(b,"scene_normal")]);m.handleResize();const k={image:`threed/${g.name} [temp]`,mask:`threed/${v.name} [temp]`,normal:`threed/${I.name} [temp]`,camera_info:n.properties["Camera Config"]?.state||null,recording:""},D=m.getRecordingData();if(D){const[x]=await Promise.all([$.uploadTempImage(D,"recording","mp4")]);k.recording=`threed/${x.name} [temp]`}return k}}})}});ne().registerExtension({name:"Comfy.Preview3D",async beforeRegisterNodeDef(n,e){e.name==="Preview3D"&&(e.input.required.image=["PREVIEW_3D"])},getNodeMenuItems(n){if(n.constructor.comfyClass!=="Preview3D")return[];const e=fe().getLoad3d(n);return e?e.isSplatModel()?[]:me(e):[]},getCustomWidgets(){return{PREVIEW_3D(n){const e=new Se({node:n,name:qe.name,component:Oe,inputSpec:qe,options:{}});return e.type="load3D",Me(n,e),{widget:e}}}},async nodeCreated(n){if(n.constructor.comfyClass!=="Preview3D")return;const[e,t]=n.size;n.setSize([Math.max(e,400),Math.max(t,550)]),await Ee();const i=n.onExecuted;de(n).waitForLoad3d(o=>{const s=new Pe(o,n.properties),r=n.widgets?.find(a=>a.name==="model_file");if(r){const a=n.properties["Last Time Model File"];if(a){r.value=a;const d=n.properties["Camera Config"]?.state,c={loadFolder:"output",modelWidget:r,cameraState:d};s.configure(c)}n.onExecuted=function(l){i?.apply(this,arguments);let d=l.result[0];if(!d){const w=_("toastMessages.unableToGetModelFilePath");console.error(w),M().addAlert(w)}let c=l.result[1],h=l.result[2];r.value=d.replaceAll("\\","/"),n.properties["Last Time Model File"]=r.value;const m={loadFolder:"output",modelWidget:r,cameraState:c,bgImagePath:h};s.configure(m),h&&o.setBackgroundImage(h)}}})}});function dt(n){if(!n){console.error("[MaskEditor] No node provided");return}if(!n.imgs?.length&&n.previewMediaType!=="image"){console.error("[MaskEditor] Node has no images");return}Wt().openMaskEditor(n)}p(dt,"openMaskEditor");function fo(){const n=S.clipspace_return_node;if(!n){console.error("[MaskEditor] No clipspace_return_node found");return}dt(n)}p(fo,"openMaskEditorFromClipspace");function te(){return it().isDialogOpen("global-mask-editor")}p(te,"isOpened");const Xe=p(async n=>{if(!te())return;const e=st(),t=e.brushSettings.size,i=n(t);e.setBrushSize(i)},"changeBrushSize");f.registerExtension({name:"Comfy.MaskEditor",settings:[{id:"Comfy.MaskEditor.BrushAdjustmentSpeed",category:["Mask Editor","BrushAdjustment","Sensitivity"],name:"Brush adjustment speed multiplier",tooltip:"Controls how quickly the brush size and hardness change when adjusting. Higher values mean faster changes.",type:"slider",attrs:{min:.1,max:2,step:.1},defaultValue:1,versionAdded:"1.0.0"},{id:"Comfy.MaskEditor.UseDominantAxis",category:["Mask Editor","BrushAdjustment","UseDominantAxis"],name:"Lock brush adjustment to dominant axis",tooltip:"When enabled, brush adjustments will only affect size OR hardness based on which direction you move more",type:"boolean",defaultValue:!0}],commands:[{id:"Comfy.MaskEditor.OpenMaskEditor",icon:"pi pi-pencil",label:"Open Mask Editor for Selected Node",function:p(()=>{const n=f.canvas.selected_nodes;if(!n||Object.keys(n).length!==1)return;const e=n[Object.keys(n)[0]];dt(e)},"function")},{id:"Comfy.MaskEditor.BrushSize.Increase",icon:"pi pi-plus-circle",label:"Increase Brush Size in MaskEditor",function:p(()=>Xe(n=>Y.clamp(n+2,1,250)),"function")},{id:"Comfy.MaskEditor.BrushSize.Decrease",icon:"pi pi-minus-circle",label:"Decrease Brush Size in MaskEditor",function:p(()=>Xe(n=>Y.clamp(n-2,1,250)),"function")},{id:"Comfy.MaskEditor.ColorPicker",icon:"pi pi-palette",label:"Open Color Picker in MaskEditor",function:p(()=>{if(!te())return;st().colorInput?.click()},"function")},{id:"Comfy.MaskEditor.Rotate.Right",icon:"pi pi-refresh",label:"Rotate Right in MaskEditor",function:p(async()=>{te()&&await ue().rotateClockwise()},"function")},{id:"Comfy.MaskEditor.Rotate.Left",icon:"pi pi-undo",label:"Rotate Left in MaskEditor",function:p(async()=>{te()&&await ue().rotateCounterclockwise()},"function")},{id:"Comfy.MaskEditor.Mirror.Horizontal",icon:"pi pi-arrows-h",label:"Mirror Horizontal in MaskEditor",function:p(async()=>{te()&&await ue().mirrorHorizontal()},"function")},{id:"Comfy.MaskEditor.Mirror.Vertical",icon:"pi pi-arrows-v",label:"Mirror Vertical in MaskEditor",function:p(async()=>{te()&&await ue().mirrorVertical()},"function")}],init(){S.open_maskeditor=fo,console.warn("[MaskEditor] ComfyApp.open_maskeditor is deprecated. Plugins should migrate to using the command system or direct node context menu integration.")}});const ho="Comfy.NodeTemplates",Ke="comfy.templates.json";class mo extends et{static{p(this,"ManageTemplates")}templates;draggedEl;saveVisualCue;emptyImg;importInput;constructor(){super(),this.load().then(e=>{this.templates=e}),this.element.classList.add("comfy-manage-templates"),this.draggedEl=null,this.saveVisualCue=null,this.emptyImg=new Image,this.emptyImg.src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=",this.importInput=N("input",{type:"file",accept:".json",multiple:!0,style:{display:"none"},parent:document.body,onchange:p(()=>this.importAll(),"onchange")})}createButtons(){const e=super.createButtons();return e[0].textContent="Close",e[0].onclick=()=>{clearTimeout(this.saveVisualCue),this.close()},e.unshift(N("button",{type:"button",textContent:"Export",onclick:p(()=>this.exportAll(),"onclick")})),e.unshift(N("button",{type:"button",textContent:"Import",onclick:p(()=>{this.importInput.click()},"onclick")})),e}async load(){let e=[];const t=await A.getUserData(Ke);if(t.status===200)try{e=await t.json()}catch{}else t.status!==404&&console.error(t.status+" "+t.statusText);return e??[]}async store(){const e=JSON.stringify(this.templates,void 0,4);try{await A.storeUserData(Ke,e,{stringify:!1})}catch(t){console.error(t),M().addAlert(t.message)}}async importAll(){for(const e of this.importInput.files)if(e.type==="application/json"||e.name.endsWith(".json")){const t=new FileReader;t.onload=async()=>{const i=JSON.parse(t.result);if(i?.templates){for(const o of i.templates)o?.name&&o?.data&&this.templates.push(o);await this.store()}},await t.readAsText(e)}this.importInput.value=null,this.close()}exportAll(){if(this.templates.length==0){M().addAlert(_("toastMessages.noTemplatesToExport"));return}const e=JSON.stringify({templates:this.templates},null,2),t=new Blob([e],{type:"application/json"});Ue("node_templates.json",t)}show(){super.show(N("div",{},this.templates.flatMap((e,t)=>{let i;return[N("div",{dataset:{id:t.toString()},className:"templateManagerRow",style:{display:"grid",gridTemplateColumns:"1fr auto",border:"1px dashed transparent",gap:"5px",backgroundColor:"var(--comfy-menu-bg)"},ondragstart:p(o=>{this.draggedEl=o.currentTarget,o.currentTarget.style.opacity="0.6",o.currentTarget.style.border="1px dashed yellow",o.dataTransfer.effectAllowed="move",o.dataTransfer.setDragImage(this.emptyImg,0,0)},"ondragstart"),ondragend:p(o=>{o.target.style.opacity="1",o.currentTarget.style.border="1px dashed transparent",o.currentTarget.removeAttribute("draggable"),this.element.querySelectorAll(".templateManagerRow").forEach((s,r)=>{var a=Number.parseInt(s.dataset.id);s==this.draggedEl&&a!=r&&this.templates.splice(r,0,this.templates.splice(a,1)[0]),s.dataset.id=r.toString()}),this.store()},"ondragend"),ondragover:p(o=>{if(o.preventDefault(),o.currentTarget==this.draggedEl)return;let s=o.currentTarget.getBoundingClientRect();o.clientY>s.top+s.height/2?o.currentTarget.parentNode.insertBefore(this.draggedEl,o.currentTarget.nextSibling):o.currentTarget.parentNode.insertBefore(this.draggedEl,o.currentTarget)},"ondragover")},[N("label",{textContent:"Name: ",style:{cursor:"grab"},onmousedown:p(o=>{o.target.localName=="label"&&(o.currentTarget.parentNode.draggable="true")},"onmousedown")},[N("input",{value:e.name,dataset:{name:e.name},style:{transitionProperty:"background-color",transitionDuration:"0s"},onchange:p(o=>{clearTimeout(this.saveVisualCue);var s=o.target,r=s.parentNode.parentNode;this.templates[r.dataset.id].name=s.value.trim()||"untitled",this.store(),s.style.backgroundColor="rgb(40, 95, 40)",s.style.transitionDuration="0s",this.saveVisualCue=setTimeout(function(){s.style.transitionDuration=".7s",s.style.backgroundColor="var(--comfy-input-bg)"},15)},"onchange"),onkeypress:p(o=>{var s=o.target;clearTimeout(this.saveVisualCue),s.style.transitionDuration="0s",s.style.backgroundColor="var(--comfy-input-bg)"},"onkeypress"),$:p(o=>i=o,"$")})]),N("div",{},[N("button",{textContent:"Export",style:{fontSize:"12px",fontWeight:"normal"},onclick:p(()=>{const o=JSON.stringify({templates:[e]},null,2),s=new Blob([o],{type:"application/json"}),r=(i.value||e.name)+".json";Ue(r,s)},"onclick")}),N("button",{textContent:"Delete",style:{fontSize:"12px",color:"red",fontWeight:"normal"},onclick:p(o=>{const s=o.target.parentNode.parentNode;s.parentNode.removeChild(s),this.templates.splice(s.dataset.id*1,1),this.store();var r=this;setTimeout(function(){r.element.querySelectorAll(".templateManagerRow").forEach((a,l)=>{a.dataset.id=l.toString()})},0)},"onclick")})])])]})))}}const pe=new mo,Je=p(async n=>{const e=localStorage.getItem("litegrapheditor_clipboard");await n(),localStorage.setItem("litegrapheditor_clipboard",e)},"clipboardAction"),yo={name:ho,getCanvasMenuItems(n){const e=[];e.push(null),e.push({content:"Save Selected as Template",disabled:!Object.keys(f.canvas.selected_nodes||{}).length,callback:p(async()=>{const i=await ie().prompt({title:_("nodeTemplates.saveAsTemplate"),message:_("nodeTemplates.enterName"),defaultValue:""});i?.trim()&&Je(()=>{f.canvas.copyToClipboard();let o=localStorage.getItem("litegrapheditor_clipboard");o=JSON.parse(o||"{}");const s=Object.keys(f.canvas.selected_nodes);for(let r=0;r<s.length;r++){const a=f.canvas.graph?.getNodeById(s[r]),l=a?.constructor.nodeData;if(!a)continue;const d=E.getGroupData(a);if(d){const c=d.nodeData;if(o.groupNodes||(o.groupNodes={}),l==null)throw new TypeError("nodeData is not set");o.groupNodes[l.name]=c,o.nodes[r].type=l.name}}pe.templates.push({name:i,data:JSON.stringify(o)}),pe.store()})},"callback")});const t=pe.templates.map(i=>({content:i.name,callback:p(()=>{Je(async()=>{const o=JSON.parse(i.data);await K.registerFromWorkflow(o.groupNodes??{},[]),o.reroutes?(localStorage.setItem("litegrapheditor_clipboard",i.data),f.canvas.pasteFromClipboard()):nt(i.data,f.canvas)})},"callback")}));return t.push(null,{content:"Manage",callback:p(()=>pe.show(),"callback")}),e.push({content:"Node Templates",submenu:{options:t}}),e}};f.registerExtension(yo);f.registerExtension({name:"Comfy.NoteNode",registerCustomNodes(){class n extends ge{static{p(this,"NoteNode")}static category;static collapsable;static title_mode;groupcolor=R.node_colors.yellow.groupcolor;isVirtualNode;constructor(i){super(i),this.color=R.node_colors.yellow.color,this.bgcolor=R.node_colors.yellow.bgcolor,this.properties||(this.properties={text:""}),z.STRING(this,"text",["STRING",{default:this.properties.text,multiline:!0}],f),this.serialize_widgets=!0,this.isVirtualNode=!0}}C.registerNodeType("Note",Object.assign(n,{title_mode:C.NORMAL_TITLE,title:"Note",collapsable:!0})),n.category="utils";class e extends ge{static{p(this,"MarkdownNoteNode")}static title="Markdown Note";groupcolor=R.node_colors.yellow.groupcolor;constructor(i){super(i),this.color=R.node_colors.yellow.color,this.bgcolor=R.node_colors.yellow.bgcolor,this.properties||(this.properties={text:""}),z.MARKDOWN(this,"text",["STRING",{default:this.properties.text}],f),this.serialize_widgets=!0,this.isVirtualNode=!0}}C.registerNodeType("MarkdownNote",e),e.category="utils"}});ne().registerExtension({name:"Comfy.PreviewAny",async beforeRegisterNodeDef(n,e){if(e.name==="PreviewAny"){const t=n.prototype.onNodeCreated;n.prototype.onNodeCreated=function(){t&&t.apply(this,[]);const o=z.MARKDOWN(this,"preview",["MARKDOWN",{}],f).widget,s=z.STRING(this,"preview",["STRING",{multiline:!0}],f).widget,r=z.BOOLEAN(this,"previewMode",["BOOLEAN",{label_on:"Markdown",label_off:"Plaintext",default:!1}],f);r.widget.callback=a=>{o.hidden=!a,o.options.hidden=!a,s.hidden=a,s.options.hidden=a},o.hidden=!0,o.options.hidden=!0,o.options.read_only=!0,o.element.readOnly=!0,o.element.disabled=!0,o.serialize=!1,s.hidden=!1,s.options.hidden=!1,s.options.read_only=!0,s.element.readOnly=!0,s.element.disabled=!0,s.serialize=!1};const i=n.prototype.onExecuted;n.prototype.onExecuted=function(o){i?.apply(this,[o]);const s=this.widgets?.filter(r=>r.name==="preview")??[];for(const r of s){const a=o.text??"";r.value=Array.isArray(a)?a[0]??"":a}}}}});f.registerExtension({name:"Comfy.RerouteNode",registerCustomNodes(n){class e extends ge{static{p(this,"RerouteNode")}static category;static defaultVisibility=!1;constructor(i){super(i??""),this.properties||(this.properties={}),this.properties.showOutputText=e.defaultVisibility,this.properties.horizontal=!1,this.addInput("","*"),this.addOutput(this.properties.showOutputText?"*":"","*"),this.isVirtualNode=!0}onAfterGraphConfigured(){requestAnimationFrame(()=>{this.onConnectionsChange(C.INPUT,void 0,!0)})}clone(){const i=super.clone();return i&&(i.removeOutput(0),i.addOutput(this.properties.showOutputText?"*":"","*"),i.setSize(i.computeSize()),i)}onConnectionsChange(i,o,s){const{graph:r}=this;if(!r||n.configuringGraph)return;if(s&&i===C.OUTPUT&&new Set(this.outputs[0].links?.map(v=>r.links[v]?.type)?.filter(v=>v&&v!=="*")??[]).size>1){const v=[];for(const I of this.outputs[0].links??[]){const k=r.links[I];v.push(k)}v.pop();for(const I of v)r.getNodeById(I.target_id)?.disconnectInput(I.target_slot)}let a=this,l=[],d=null,c=null;for(;a;){l.unshift(a);const g=a.inputs[0].link;if(g!==null){const v=r.links[g];if(!v)return;const I=r.getNodeById(v.origin_id);if(!I)return;if(I instanceof e)I===this?(a.disconnectInput(v.target_slot),a=null):a=I;else{c=a,d=I.outputs[v.origin_slot]?.type??null;break}}else{a=null;break}}const h=[this];let m=null;for(;h.length;){a=h.pop();const g=a.outputs?.[0]?.links??[];for(const v of g){const I=r.links[v];if(!I)continue;const k=r.getNodeById(I.target_id);if(k)if(k instanceof e)h.push(k),l.push(k);else{const D=k.inputs[I.target_slot],x=D.type,T=!d||!x||C.isValidConnection(d,x);if(!T){k.disconnectInput(I.target_slot);continue}k.onConnectionsChange?.(C.INPUT,I.target_slot,T,I,D),m=k.inputs[I.target_slot].type}}}const w=d||m||"*",u=R.link_type_colors[w];let y,b;for(const g of l){g.outputs[0].type=d||"*",g.__outputType=w,g.outputs[0].name=g.properties.showOutputText?`${w}`:"",g.setSize(g.computeSize());for(const v of g.outputs[0].links||[]){const I=r.links[v];if(!I||(I.color=u,n.configuringGraph))continue;const k=r.getNodeById(I.target_id);if(!k)continue;const D=k.inputs?.[I.target_slot];if(D?.widget){const x=Le(D);y||(y=x[1]??{},b=x[0]);const T=ce(D,[x[0],y]);T.customConfig&&(y=T.customConfig)}}}for(const g of l)y&&m?(g.inputs[0].widget={name:"value"},_e(g.inputs[0],[b??`${w}`,y])):_e(g.inputs[0],void 0);if(c?.inputs?.[0]?.link){const g=r.links[c.inputs[0].link];g&&(g.color=u)}}getExtraMenuOptions(i,o){return o.unshift({content:(this.properties.showOutputText?"Hide":"Show")+" Type",callback:p(()=>{this.properties.showOutputText=!this.properties.showOutputText,this.properties.showOutputText?this.outputs[0].name=`${this.__outputType||this.outputs[0].type}`:this.outputs[0].name="",this.setSize(this.computeSize()),n.canvas.setDirty(!0,!0)},"callback")},{content:(e.defaultVisibility?"Hide":"Show")+" Type By Default",callback:p(()=>{e.setDefaultTextVisibility(!e.defaultVisibility)},"callback")}),[]}computeSize(){return[this.properties.showOutputText&&this.outputs&&this.outputs.length?Math.max(75,C.NODE_TEXT_SIZE*this.outputs[0].name.length*.6+40):75,26]}static setDefaultTextVisibility(i){e.defaultVisibility=i,i?localStorage["Comfy.RerouteNode.DefaultVisibility"]="true":delete localStorage["Comfy.RerouteNode.DefaultVisibility"]}}e.setDefaultTextVisibility(!!localStorage["Comfy.RerouteNode.DefaultVisibility"]),C.registerNodeType("Reroute",Object.assign(e,{title_mode:C.NO_TITLE,title:"Reroute",collapsable:!1})),e.category="utils"}});const wo=new Set(["SaveImage","SaveVideo","SaveAnimatedWEBP","SaveWEBM","SaveAudio","SaveGLB","SaveAnimatedPNG","CLIPSave","VAESave","ModelSave","LoraSave","SaveLatent"]);f.registerExtension({name:"Comfy.SaveImageExtraOutput",async beforeRegisterNodeDef(n,e,t){if(wo.has(e.name)){const i=n.prototype.onNodeCreated;n.prototype.onNodeCreated=function(){const o=i?i.apply(this,arguments):void 0,s=this.widgets.find(r=>r.name==="filename_prefix");return s.serializeValue=()=>ot(t.graph,s.value),o}}else{const i=n.prototype.onNodeCreated;n.prototype.onNodeCreated=function(){const o=i?i.apply(this,arguments):void 0;return(!this.properties||!("Node name for S&R"in this.properties))&&this.addProperty("Node name for S&R",this.constructor.type,"string"),o}}}});const Qe={name:"image",type:"Preview3D",isPreview:!0};ne().registerExtension({name:"Comfy.SaveGLB",async beforeRegisterNodeDef(n,e){e.name==="SaveGLB"&&(e.input.required.image=["PREVIEW_3D"])},getCustomWidgets(){return{PREVIEW_3D(n){const e=new Se({node:n,name:Qe.name,component:Oe,inputSpec:Qe,options:{}});return e.type="load3D",Me(n,e),{widget:e}}}},getNodeMenuItems(n){if(n.constructor.comfyClass!=="SaveGLB")return[];const e=fe().getLoad3d(n);return e?e.isSplatModel()?[]:me(e):[]},async nodeCreated(n){if(n.constructor.comfyClass!=="SaveGLB")return;const[e,t]=n.size;n.setSize([Math.max(e,400),Math.max(t,550)]),await Ee();const i=n.onExecuted;n.onExecuted=function(o){i?.apply(this,arguments);const s=o["3d"][0];de(n).waitForLoad3d(r=>{const a=n.widgets?.find(l=>l.name==="image");if(r&&a){const l=s.subfolder+"/"+s.filename;a.value=l,new Pe(r,n.properties).configureForSaveMesh(s.type,l)}})}}});function bo(n,e){const t=e.selectedItems;if(t.size<=1)return;const i=Rt(t,10);if(!i)return;const[o,s,r,a]=i;n.save();const l=2/e.ds.scale;n.lineWidth=l,n.strokeStyle=getComputedStyle(document.documentElement).getPropertyValue("--border-color").trim()||"#ffffff66";const d=5/e.ds.scale;n.setLineDash([d,d]),n.beginPath(),n.roundRect(o,s,r,a,8/e.ds.scale),n.stroke(),n.restore()}p(bo,"drawSelectionBorder");const vo={name:"Comfy.SelectionBorder",async init(){const n=f.canvas.onDrawForeground;f.canvas.onDrawForeground=function(e,t){n?.call(this,e,t),bo(e,f.canvas)}}};f.registerExtension(vo);let ae=!1,le=0;f.registerExtension({name:"Comfy.SimpleTouchSupport",setup(){let n=null,e=null,t=null,i=null;function o(a){return Math.hypot(a.touches[0].clientX-a.touches[1].clientX,a.touches[0].clientY-a.touches[1].clientY)}p(o,"getMultiTouchPos");function s(a){return{clientX:(a.touches[0].clientX+a.touches[1].clientX)/2,clientY:(a.touches[0].clientY+a.touches[1].clientY)/2}}p(s,"getMultiTouchCenter"),f.canvasEl.parentElement?.addEventListener("touchstart",a=>{le+=a.changedTouches.length,t=null,i=null,a.touches?.length===1?(e=new Date,t=a.touches[0]):(e=null,a.touches?.length===2&&(i=f.canvas.ds.scale,t=s(a),n=o(a),f.canvas.pointer.isDown=!1))},!0),f.canvasEl.parentElement?.addEventListener("touchend",a=>{if(le-=a.changedTouches.length,a.touches?.length!==1&&(ae=!1),e&&!a.touches?.length){if(new Date().getTime()-e.getTime()>600&&a.target===f.canvasEl){const l={button:2,clientX:a.changedTouches[0].clientX,clientY:a.changedTouches[0].clientY,pointerId:1,isPrimary:!0};f.canvasEl.dispatchEvent(new PointerEvent("pointerdown",l)),setTimeout(()=>{f.canvasEl.dispatchEvent(new PointerEvent("pointerup",l))}),a.preventDefault()}e=null}});const r=p(()=>{le=0,ae=!1,e=null,t=null,i=null,n=null},"resetTouchState");document.addEventListener("visibilitychange",()=>{document.hidden&&r()}),f.canvasEl.parentElement?.addEventListener("touchcancel",r),f.canvasEl.parentElement?.addEventListener("touchmove",a=>{if(e&&t&&a.touches?.length===1){const c=a.touches[0],h=c.clientX-t.clientX,m=c.clientY-t.clientY;h*h+m*m>30&&(e=null)}if(a.touches?.length===2&&t&&!a.ctrlKey&&!a.shiftKey){a.preventDefault(),f.canvas.pointer.isDown=!1,ae=!0,C.closeAllContextMenus(window),f.canvas.search_box?.close();const c=o(a),h=s(a);if(i===null||n===null)return;let m=i*c/n;const w=(h.clientX-t.clientX)/m,u=(h.clientY-t.clientY)/m;m<f.canvas.ds.min_scale?m=f.canvas.ds.min_scale:m>f.canvas.ds.max_scale&&(m=f.canvas.ds.max_scale);const y=f.canvas.ds.scale;f.canvas.ds.scale=m,Math.abs(f.canvas.ds.scale-1)<.01&&(f.canvas.ds.scale=1);const b=f.canvas.ds.scale,g=p(v=>[h.clientX/v-f.canvas.ds.offset[0],h.clientY/v-f.canvas.ds.offset[1]],"convertScaleToOffset");var l=g(y),d=g(b);f.canvas.ds.offset[0]+=w+d[0]-l[0],f.canvas.ds.offset[1]+=u+d[1]-l[1],t.clientX=h.clientX,t.clientY=h.clientY,f.canvas.setDirty(!0,!0)}},!0)}});const No=R.prototype.processMouseDown;R.prototype.processMouseDown=function(n){if(!(ae||le))return f.canvas.pointer.isDown=!1,No.apply(this,[n])};const Io=R.prototype.processMouseMove;R.prototype.processMouseMove=function(n){if(!(ae||le>1))return Io.apply(this,[n])};f.registerExtension({name:"Comfy.SlotDefaults",suggestionsNumber:null,init(){C.search_filter_enabled=!0,C.middle_click_slot_add_default_node=!0,this.suggestionsNumber=f.ui.settings.addSetting({id:"Comfy.NodeSuggestions.number",category:["Comfy","Node Search Box","NodeSuggestions"],name:"Number of nodes suggestions",tooltip:"Only for litegraph searchbox/context menu",type:"slider",attrs:{min:1,max:100,step:1},defaultValue:5,onChange:p(n=>{this.setDefaults(n)},"onChange")})},slot_types_default_out:{},slot_types_default_in:{},async beforeRegisterNodeDef(n,e){var t=e.name;const i=e.input?.required;for(const d in i){var o=i[d];if(typeof o[0]!="string")continue;var s=o[0];if(s in z){var r=o[1];if(!r?.forceInput)continue}if(s in this.slot_types_default_out||(this.slot_types_default_out[s]=["Reroute"]),this.slot_types_default_out[s].includes(t))continue;this.slot_types_default_out[s].push(t);const c=s.toLocaleLowerCase();c in C.registered_slot_in_types||(C.registered_slot_in_types[c]={nodes:[]}),C.registered_slot_in_types[c].nodes.push(n.comfyClass)}var a=e.output??[];for(const d of a){const c=d;c in this.slot_types_default_in||(this.slot_types_default_in[c]=["Reroute"]),!this.slot_types_default_in[c].includes(t)&&(this.slot_types_default_in[c].push(t),c in C.registered_slot_out_types||(C.registered_slot_out_types[c]={nodes:[]}),C.registered_slot_out_types[c].nodes.push(n.comfyClass),C.slot_types_out.includes(c)||C.slot_types_out.push(c))}var l=this.suggestionsNumber.value;this.setDefaults(l)},setDefaults(n){C.slot_types_default_out={},C.slot_types_default_in={};for(const e in this.slot_types_default_out)C.slot_types_default_out[e]=this.slot_types_default_out[e].slice(0,n);for(const e in this.slot_types_default_in)C.slot_types_default_in[e]=this.slot_types_default_in[e].slice(0,n)}});async function ko(n,e,t,i,o=!1){try{const s=new FormData;s.append("image",t),o&&s.append("subfolder","pasted");const r=await A.fetchApi("/upload/image",{method:"POST",body:s});if(r.status===200){const a=await r.json();let l=a.name;a.subfolder&&(l=a.subfolder+"/"+l),n.options.values.includes(l)||n.options.values.push(l),i&&(e.element.src=A.apiURL(he(...rt(l))),n.value=l,n.callback?.(l))}else M().addAlert(r.status+" - "+r.statusText)}catch(s){M().addAlert(s)}}p(ko,"uploadFile");f.registerExtension({name:"Comfy.AudioWidget",async beforeRegisterNodeDef(n,e){["LoadAudio","SaveAudio","PreviewAudio","SaveAudioMP3","SaveAudioOpus"].includes(n.prototype.comfyClass)&&(e.input.required.audioUI=["AUDIO_UI",{}])},getCustomWidgets(){return{AUDIO_UI(n,e){const t=document.createElement("audio");t.controls=!0,t.classList.add("comfy-audio"),t.setAttribute("name","media");const i=n.addDOMWidget(e,"audioUI",t);i.serialize=!1;const{nodeData:o}=n.constructor;if(o==null)throw new TypeError("nodeData is null");if(o.output_node){i.element.classList.add("empty-audio-widget");const r=n.onExecuted;n.onExecuted=function(a){r?.apply(this,arguments);const l=a.audio;if(!l)return;const d=l[0];i.element.src=A.apiURL(he(d.subfolder,d.filename,d.type)),i.element.classList.remove("empty-audio-widget")}}return i.onRemove=Q(i.onRemove,()=>{i.element&&(i.element.pause(),i.element.src="",i.element.remove())}),{widget:i}}}},onNodeOutputsUpdated(n){for(const[e,t]of Object.entries(n))if("audio"in t){const i=Ft(f.rootGraph,e);if(!i)continue;const o=i.widgets.find(r=>r.name==="audioUI"),s=t.audio[0];o.element.src=A.apiURL(he(s.subfolder,s.filename,s.type)),o.element.classList.remove("empty-audio-widget")}}});f.registerExtension({name:"Comfy.UploadAudio",async beforeRegisterNodeDef(n,e){e?.input?.required?.audio?.[1]?.audio_upload===!0&&(e.input.required.upload=["AUDIOUPLOAD",{}])},getCustomWidgets(){return{AUDIOUPLOAD(n,e){const t=n.widgets.find(c=>c.name==="audio"),i=n.widgets.find(c=>c.name==="audioUI");i.options.canvasOnly=!0;const o=p(()=>{typeof t.value=="string"&&(i.element.src=A.apiURL(he(...rt(t.value))))},"onAudioWidgetUpdate");t.value&&o(),t.callback=o;const s=n.onGraphConfigured;n.onGraphConfigured=function(){s?.apply(this,arguments),t.value&&o()};const r=p(async c=>(c?.length&&ko(t,i,c[0],!0),c),"handleUpload"),a=p(c=>c.type.startsWith("audio/"),"isAudioFile"),{openFileSelection:l}=Ut(n,{accept:"audio/*",onSelect:r}),d=n.addWidget("button",e,"",l,{serialize:!1,canvasOnly:!0});return d.label=_("g.choose_file_to_upload"),Bt(n,{fileFilter:a,onDrop:r}),Vt(n,{fileFilter:a,onPaste:r}),n.previewMediaType="audio",{widget:d}}}}});f.registerExtension({name:"Comfy.RecordAudio",getCustomWidgets(){return{AUDIO_RECORD(n,e){const t=document.createElement("audio");t.controls=!0,t.classList.add("comfy-audio"),t.setAttribute("name","media");const i=n.addDOMWidget(e,"audioUI",t);i.options.canvasOnly=!1;let o=null,s=!1,r=[],a=null,l=null,d=null,c=null;i.serializeValue=async()=>{s&&o&&(d=new Promise(u=>{c=u}),o.stop(),await d);const m=i.element.src;if(!m)return M().addAlert(_("g.noAudioRecorded")),"";const w=await fetch(m).then(u=>u.blob());return await ee().convertBlobToFileAndSubmit(w)},l=n.addWidget("button",e,"",async()=>{if(s)o&&s&&o.stop();else try{a=await navigator.mediaDevices.getUserMedia({audio:!0}),o=new jt(a,{mimeType:"audio/wav"}),r=[],o.ondataavailable=m=>{r.push(m.data)},o.onstop=async()=>{const m=new Blob(r,{type:"audio/wav"});ee().stopAllTracks(a),i.element.src&&i.element.src.startsWith("blob:")&&URL.revokeObjectURL(i.element.src),i.element.src=URL.createObjectURL(m),s=!1,l&&(l.label=_("g.startRecording")),c&&(c(),c=null,d=null)},o.onerror=m=>{console.error("MediaRecorder error:",m),ee().stopAllTracks(a),s=!1,l&&(l.label=_("g.startRecording")),c&&(c(),c=null,d=null)},o.start(),s=!0,l&&(l.label=_("g.stopRecording"))}catch(m){if(console.error("Error accessing microphone:",m),M().addAlert(_("g.micPermissionDenied")),o)try{o.stop()}catch{}ee().stopAllTracks(a),a=null,s=!1,l&&(l.label=_("g.startRecording"))}},{serialize:!1,canvasOnly:!1}),l.label=_("g.startRecording"),l.type="audiorecord";const h=n.onRemoved;return n.onRemoved=function(){s&&o&&o.stop(),ee().stopAllTracks(a),i.element.src?.startsWith("blob:")&&URL.revokeObjectURL(i.element.src),h?.call(this)},{widget:l}}}},async nodeCreated(n){n.constructor.comfyClass==="RecordAudio"&&await ee().registerWavEncoder()}});const Co=p(n=>{const[e,t]=n;return t?(t.image_upload===!0||t.video_upload===!0||t.animated_image_upload===!0)&&($t(n)||e==="COMBO"):!1},"isMediaUploadComboInput"),Do=p((n,e)=>["IMAGEUPLOAD",{...e[1],imageInputName:n}],"createUploadInput");f.registerExtension({name:"Comfy.UploadImage",beforeRegisterNodeDef(n,e){const{input:t}=e??{},{required:i}=t??{};if(!i)return;const o=Object.entries(i).find(([s,r])=>Co(r));if(o){const[s,r]=o;i.upload=Do(s,r)}}});const Ze=Symbol();f.registerExtension({name:"Comfy.WebcamCapture",getCustomWidgets(){return{WEBCAM(n,e){let t;n[Ze]=new Promise(r=>t=r);const i=document.createElement("div");i.style.background="rgba(0,0,0,0.25)",i.style.textAlign="center";const o=document.createElement("video");return o.style.height=o.style.width="100%",p(async()=>{try{const r=await navigator.mediaDevices.getUserMedia({video:!0,audio:!1});i.replaceChildren(o),setTimeout(()=>t(o),500),o.addEventListener("loadedmetadata",()=>t(o),!1),o.srcObject=r,o.play()}catch(r){const a=document.createElement("div");a.style.color="red",a.style.overflow="auto",a.style.maxHeight="100%",a.style.whiteSpace="pre-wrap",window.isSecureContext?a.textContent=`Unable to load webcam, please ensure access is granted:
|
|
2
|
+
`+r.message:a.textContent=`Unable to load webcam. A secure context is required, if you are not accessing ComfyUI on localhost (127.0.0.1) you will have to enable TLS (https)
|
|
3
|
+
|
|
4
|
+
`+r.message,i.replaceChildren(a)}},"loadVideo")(),{widget:n.addDOMWidget(e,"WEBCAM",i)}}}},nodeCreated(n){if(n.type,n.constructor.comfyClass!=="WebcamCapture")return;let e;const t=n.widgets.find(d=>d.name==="image"),i=n.widgets.find(d=>d.name==="width"),o=n.widgets.find(d=>d.name==="height"),s=n.widgets.find(d=>d.name==="capture_on_queue"),r=document.createElement("canvas"),a=p(()=>{r.width=i.value,r.height=o.value,r.getContext("2d").drawImage(e,0,0,i.value,o.value);const c=r.toDataURL("image/png"),h=new Image;h.onload=()=>{n.imgs=[h],f.canvas.setDirty(!0)},h.src=c},"capture"),l=n.addWidget("button","waiting for camera...","capture",a,{canvasOnly:!0});l.disabled=!0,l.serializeValue=()=>{},t.serializeValue=async()=>{if(s.value)a();else if(!n.imgs?.length){const u="No webcam image captured";throw M().addAlert(u),new Error(u)}const d=await new Promise(u=>r.toBlob(u)),c=`${+new Date}.png`,h=new File([d],c),m=new FormData;m.append("image",h),m.append("subfolder","webcam"),m.append("type","temp");const w=await A.fetchApi("/upload/image",{method:"POST",body:m});if(w.status!==200){const u=`Error uploading camera image: ${w.status} - ${w.statusText}`;throw M().addAlert(u),new Error(u)}return`webcam/${c} [temp]`},n[Ze].then(d=>{e=d,i.value||(i.value=e.videoWidth||640,o.value=e.videoHeight||480),l.disabled=!1,l.label=_("g.capture")})}});
|
|
5
|
+
//# sourceMappingURL=index-tImAQKwZ.js.map
|