psutil's virtual_memory().used counts only active+wired on macOS, while
.percent is defined as (total - available) / total. Showing one next to
the other produced readings like 10.1/24GB (68%). Derive the used figure
from total - available so both describe the same thing; it also lines up
with Activity Monitor's Memory Used.
The monitor ran a resident asyncio task that sampled psutil/nvml every
0.5–2s and pushed the result over ComfyUI's WebSocket — whether or not
any panel was open, whether or not the tab was even in the foreground.
It is now a plain GET /kaytool/resources that the panel polls at the same
adaptive rate while it is visible and the page is in the foreground. A
200ms cache dedupes concurrent tabs and keeps cpu_percent's "since last
call" baseline sane.
The RemBG loader stopped setting U2NET_HOME. rembg offers no other way to
choose its model directory, and mutating the process environment reached
every other rembg-based extension in the same ComfyUI. Models now live
where rembg puts them by default; the changelog carries the migration
note.
Event listeners in gululu.js and nodealign.js use arrow functions instead
of .bind(this).
Together these remove every finding the registry's policy-v0.2 scanner
raised against 0.71.0 except the translators' HTTP calls.
The guard around the pynvml import was written as
except (ImportError, pynvml.NVMLError):
but when the import is what failed, the name pynvml is unbound, so
evaluating the except clause raises NameError — which that clause does not
catch. The handler blew up in precisely the situation it existed for:
Linux or Windows without pynvml installed.
It propagates out of the collector's constructor into monitor_loop, which
runs as a bare create_task, so nothing reports it beyond a "Task exception
was never retrieved" at GC time. The monitor just never produces data, and
running stays True, so a later start() takes the already-running branch.
Catch Exception instead, and wrap the loop so any failure is logged and
running is reset.