- nodes/image/image_tools_nodes.py (1776 lines) split into save_image_path,
folder_loaders, layer_composite, image_label, image_compare and
image_resize_unit; folder helpers in core/image_folders.py (set-based
dedupe), image helpers in core/image_ops.py
- One tensor -> PIL converter (core.utils.tensor_to_pil, rgb=/keep_alpha=)
that keeps the tensor's dtype; bf16 supported; duplicates removed from grid,
large save and preview cache
- core/mask_ops.mask_bbox replaces five bbox copies; model helpers moved to
core/model_files.py; Pillow fromarray(mode=) uses removed
- Routes moved to core/folder_routes.py: no absolute paths in responses,
recursive honoured, proper status codes, scans off the event loop; large
preview routes reject malformed JSON and hide paths
- web/nh_widget_utils.js shared by all extensions; widgets hidden via the
frontend's `hidden` property when available; folder image count honours
recursive
- A wired Load Images Folder path no longer fingerprints ComfyUI's input folder
- Node ids, inputs and outputs unchanged (69 nodes); new tests for routes,
web helpers, mask ops, channel handling and Pillow usage