/** * ComfyUI Model Resolver Extension - Frontend * * Provides a menu button and dialog interface for relinking missing models in workflows. */ import { app } from "../../../scripts/app.js"; import { MODEL_RESOLVER_NODE_TOOLBOX_COMMAND_ID, MODEL_RESOLVER_OPEN_COMMAND_ID, MODEL_RESOLVER_OPEN_DEFAULT_KEYBINDING, ModelResolver as ModelResolverClass, } from "./resolver/model_resolver.js"; import { registerGlobalHelpers } from "./resolver/globals.js"; registerGlobalHelpers(); const modelResolver = new ModelResolverClass(); app.registerExtension({ name: "Model Resolver", commands: [ { id: MODEL_RESOLVER_OPEN_COMMAND_ID, label: "Open Model Resolver", function: () => modelResolver.activateResolverButton(), }, { id: MODEL_RESOLVER_NODE_TOOLBOX_COMMAND_ID, label: "Model Resolver", icon: "mr-node-toolbar-icon", function: () => modelResolver.handleNodeSelectionToolboxClick(), }, ], getSelectionToolboxCommands(item) { if (modelResolver.isNodeToolboxIconEnabled() && modelResolver.isNodeWithModels(item)) { modelResolver.lastSelectionToolboxNode = item; return [MODEL_RESOLVER_NODE_TOOLBOX_COMMAND_ID]; } return []; }, keybindings: [ MODEL_RESOLVER_OPEN_DEFAULT_KEYBINDING, ], setup: modelResolver.setup, beforeRegisterNodeDef(nodeType, nodeData) { modelResolver.configureWorkflowDependencyMarkerNodeType(nodeType, nodeData); modelResolver.configureNodeContextMenu(nodeType); }, nodeCreated(node) { modelResolver.configureNodeContextMenu(node?.constructor); modelResolver.configureNodeContextMenu(node); queueMicrotask(() => modelResolver.configureNodeContextMenu(node)); modelResolver.configureWorkflowDependencyMarkerNode(node); modelResolver.configureCustomNodeModelAdapter(node); modelResolver.configureWorkflowNodeLifecycle(node); modelResolver.dialog?.scheduleActiveWorkflowRefresh?.('node-created'); }, loadedGraphNode(node) { modelResolver.configureNodeContextMenu(node?.constructor); modelResolver.configureNodeContextMenu(node); queueMicrotask(() => modelResolver.configureNodeContextMenu(node)); modelResolver.configureWorkflowDependencyMarkerNode(node); modelResolver.configureCustomNodeModelAdapter(node); modelResolver.configureWorkflowNodeLifecycle(node); }, afterConfigureGraph() { modelResolver.handleGraphConfigured(); modelResolver.configureWorkflowDependencyMarkerNodes(); }, });