fix: keep bypass/mute state on frontend 1.53+ node shell state (#1123)

ComfyUI frontend 1.53 turned LGraphNode.mode into a prototype accessor
backed by node._state, and serialize() now reads that state directly.
Redefining mode on the instance shadowed the setter, so bypass/mute
never reached the serialized workflow and silently reverted to Always
on save/reload or workflow tab switch.

Add interceptModeChange() in web/comfyui/utils.js: it delegates to the
prototype accessor when one exists (observing changes only), and falls
back to the legacy closure accessor on older frontends. Use it in
lora_loader.js and in the Vue widgets' setupModeChangeHandler, which
covers the LoRA provider/aggregator nodes with the same latent bug.
This commit is contained in:
Will Miao
2026-09-25 18:12:01 +08:00
parent dae18b3d1d
commit 067e605e75
8 changed files with 360 additions and 120 deletions
@@ -50,6 +50,22 @@ vi.mock(UTILS_MODULE, () => ({
chainCallback: (proto, property, callback) => {
proto[property] = callback;
},
interceptModeChange: (node, onModeChange) => {
let currentMode = node.mode;
Object.defineProperty(node, "mode", {
configurable: true,
get() {
return currentMode;
},
set(value) {
const oldValue = currentMode;
currentMode = value;
if (oldValue !== value) {
onModeChange(value, oldValue);
}
},
});
},
getAllGraphNodes,
getNodeFromGraph,
getWidgetByName,