feat: classify missing nodes by replacement availability

This commit is contained in:
Jin Yi
2026-01-30 15:59:23 +09:00
parent 4c2f2a910f
commit 7a7a1a5e70
2 changed files with 26 additions and 16 deletions

View File

@@ -1119,25 +1119,32 @@ export class ComfyApp {
return
}
for (let n of nodes) {
// Patch T2IAdapterLoader to ControlNetLoader since they are the same node now
if (n.type == 'T2IAdapterLoader') n.type = 'ControlNetLoader'
if (n.type == 'ConditioningAverage ') n.type = 'ConditioningAverage' //typo fix
if (n.type == 'SDV_img2vid_Conditioning')
n.type = 'SVD_img2vid_Conditioning' //typo fix
if (n.type == 'Load3DAnimation') n.type = 'Load3D' // Animation node merged into Load3D
if (n.type == 'Preview3DAnimation') n.type = 'Preview3D' // Animation node merged into Load3D
// TODO: Remove hardcoded patches after node replacement API is implemented
// if (n.type == 'T2IAdapterLoader') n.type = 'ControlNetLoader'
// if (n.type == 'ConditioningAverage ') n.type = 'ConditioningAverage'
// if (n.type == 'SDV_img2vid_Conditioning') n.type = 'SVD_img2vid_Conditioning'
// if (n.type == 'Load3DAnimation') n.type = 'Load3D'
// if (n.type == 'Preview3DAnimation') n.type = 'Preview3D'
// Find missing node types
if (!(n.type in LiteGraph.registered_node_types)) {
// Include context about subgraph location if applicable
if (path) {
missingNodeTypes.push({
type: n.type,
hint: `in subgraph '${path}'`
})
} else {
missingNodeTypes.push(n.type)
}
const nodeReplacementStore = useNodeReplacementStore()
const replacement = nodeReplacementStore.getReplacementFor(n.type)
// TODO: Remove debug log
console.log('[MissingNode]', n.type, {
isReplaceable: replacement !== null,
replacement,
allReplacements: nodeReplacementStore.replacements
})
missingNodeTypes.push({
type: n.type,
...(path && { hint: `in subgraph '${path}'` }),
isReplaceable: replacement !== null,
replacement: replacement ?? undefined
})
n.type = sanitizeNodeName(n.type)
}

View File

@@ -3,6 +3,7 @@ import type {
Positionable
} from '@/lib/litegraph/src/interfaces'
import type { LGraphCanvas, LGraphNode } from '@/lib/litegraph/src/litegraph'
import type { NodeReplacement } from '@/platform/nodeReplacement/types'
import type { SettingParams } from '@/platform/settings/types'
import type { ComfyWorkflowJSON } from '@/platform/workflow/validation/schemas/workflowSchema'
import type { Keybinding } from '@/platform/keybindings/types'
@@ -93,6 +94,8 @@ export type MissingNodeType =
text: string
callback: () => void
}
isReplaceable?: boolean
replacement?: NodeReplacement
}
export interface ComfyExtension {