Previously the index was built only from the live registry, so a custom node
that wasn't installed (a red "missing" node in a downloaded workflow) was
invisible — the main point of the tool. Now:
- Backend: utfcn_core split into build_context / build_index / match. build_index
also emits curated candidates for uninstalled source types (curated-only), and
a new POST /utfcn/match matches missing nodes by their serialized signature
against installed core/other-pack nodes.
- Frontend: nodeType() reads a missing placeholder's last_serialization.type;
matchMissing() feeds serialized slots to /utfcn/match and merges the results;
the right-click item moved to a canvas-level getNodeMenuOptions patch so it
reaches missing placeholders too. Bulk dialog labels them "not installed".
Replace a missing node with core without installing its pack. Links are rewired
losslessly; widget values can't be carried for a node whose def is absent.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>