Features: BV Text node with management-gated writing assistance (translate,
improve, undo, prompt profiles); reuse of prepared MODEL/CLIP state for Krea 2
and Anima LLLite consumers; Regional refactoring.
Security boundaries: one wall-clock budget per Remote LLM request enforced by
a socket-closing watchdog across connect, TLS handshake, headers, chunk framing
and body; writing assistance uses the profile's configured timeout; a shared
bounded JSON reader with route-specific limits on every JSON route; endpoint
binding negative tests for the assist path.
Release and packaging: SECURITY.md; bundled-library notices and a readable
bundle header; Registry scan replica as a hard test with a pinned count; a
packaged-file-set test; publish only from a validated push to main with
provenance checks, pinned comfy-cli, an input manifest and a byte-exact
comparison of the stored archive; npm audit and a whole js/ rebuild gate in
Validate; design references, brand sources and a type declaration excluded
from the package. README and changelog for 1.4.4.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Backend: plain imports and one download-host constant replace the three
literals the Registry's automated scan reported (environment lookup for the
autocomplete dataset, aiohttp session in the LUT downloader, catalog source
URLs built from the host constant, byte-identical). No behaviour changes.
- Frontend: own call sites no longer spell the scanner's socket literals
(queuePrompt captured once and invoked with call, Connector.wire, optional
connect); Prism is imported as core + JSON grammar, dropping the unused file
loader from the bundle. Remaining match: Function.prototype.bind inside the
vendored React production builds.
- BV Seed: action buttons take over the press via widget.onPointerDown and
fire on release inside the button, so normal clicks work again although the
ComfyUI frontend (1.49+) classifies any movement later than 32 ms after the
press as a drag.
- Tests: Registry scan replica with a checked-in baseline (report only),
queue-wrapper and negative routing tests, seed pointer sequence tests.
- Version 1.4.3, changelog and upgrade notes.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Raster masks are bounded per document as well as per mask (96 megapixels
and 128 MiB of embedded data), with a decoder spy test proving that the
header check runs before any pixel is decoded. The README and wiki now
state precisely what is migrated, that the response cache is deleted and
rebuilt, that old public files remain on a ComfyUI without the System
User API, and that the containment rule covers the listed consumers, not
arbitrary plugins. package-lock.json carries the 1.4.2 version.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Bump the version, add the 1.4.2 changelog and update notes, describe the
private storage, the local-only management gate and the download host in
the README. Exclude .github/ from Registry packages and remove the outdated
example workflows, regional fixtures, images and scripts from the runtime
repository; the workflows and documents that tests need now live under
tests/fixtures. The Remote LLM node shows when key management is unavailable
or local-only instead of failing on a 403.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The LUT install directory is checked before it is created, so a linked
parent never causes a directory outside models/; installs check for an
existing file before downloading, run at most two in parallel with one per
entry, and parse off the event loop. Autocomplete searches each selected
dataset once and truncates terms. Raster masks are validated against a
32 megapixel budget before decoding, and text logs validate the name
before creating the log directory.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Only the migration's own staging file is removed; a stage left by another
process is neither promoted nor deleted, because it cannot be told apart
from one still being written. contained_file and resolve_lora_path now run
the root check before is_file, matching the documented order.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A shared path_roots helper now implements the lexical-then-realpath check
that LoRA loading already used. LoRA resolution rejects files whose link
leaves the configured LoRA folders; previews and sidecars are read only
from inside those folders; model hashes for Civitai metadata require the
file inside the configured folders of the model's category and skip
hashing when no folder registry is known; the LUT install directory must
resolve inside models/. Format rules stay per consumer.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The final private name is created only by linking a staging file that was
fully written, synced and verified, so other processes never observe an
unverified file under the final name and a publication is never replaced
or removed afterwards. Stale staging files from a crash are cleaned on the
next run and are never promoted. Tests cover a process that fails after
flushing while another one migrates concurrently.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Catalog sources and every catalog download_url must be plain HTTPS URLs
on the single approved host, checked before any connection is opened and
again on the snapshot entry before an install fetch. Catalog fetches use
an opener that refuses redirects; LUT downloads request without redirect
following and treat any 3xx as an error. Foreign catalogs are deliberately
unsupported; local LUT files go straight into the LUT folder.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
ComfyUI binds every comma-separated --listen entry, including empty ones,
so the gate no longer filters them: any empty entry makes the listener
non-local. The module docstring names the same-host reverse proxy as the
accepted limit of the token-less model, and the tests cover both.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The migration now creates private files with O_EXCL, verifies the bytes
it wrote and removes its own file on any failure, so a concurrent start
can never overwrite existing private state and a failed run retries
from the same state. When a private file already exists, the public file
is removed only if the bytes are identical; otherwise its content is
preserved as a uniquely named private recovery file that is never loaded
automatically. Public files are deleted only after verified retention.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Mirror ComfyUI-Manager's local mode: setting or deleting API keys,
installing LUTs and switching the LUT catalog channel are accepted only
when every ComfyUI listen address and the request's socket peer are
loopback addresses. Forwarded headers are ignored. Operators of a
--listen server opt in through admin_settings.json in BV's private
storage; that is a deliberate opening, not an authentication. Read
routes and the fixed-source catalog refresh stay open, and the provider
and LUT status responses report the management state for the UI.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Remote LLM settings and secrets, the response cache, LUT working catalogs
and channel selection, and the LoRA header cache now live below
user/__bv_nodepack/, which ComfyUI never serves through /userdata. Files
from the public user/default/bv_nodepack/ tree are migrated once at
startup: verified copy, then removal, never overwriting private state.
Without the System User API the pack fails closed: no public fallback,
API-key storage and custom bearer providers refuse with a clear message,
LUT catalogs are served from the bundled files read-only, caches stay in
memory. Fixed-catalog and local providers keep working.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Text logs accept only .txt, .json and .log names; other endings are
rejected before any write.
- LoRA paths from workflows are approved by one shared rule: inside the
configured ComfyUI LoRA folders and .safetensors only, for loading and
for the Civitai metadata hashes alike. Metadata fails closed when the
folders are unknown.
- BV Remote LLM Provider no longer has an endpoint widget. The destination
is resolved by the backend from the provider catalog, the approved
API-key binding or the local settings file; the Configure dialog takes
the destination for custom bearer profiles and workflows saved before
this change drop the stale widget value on load.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Capture Nodes 2 and Classic DOM surfaces without selection artifacts, preserve preview images and live form state across serialization, and cover the renderer boundaries with focused regression tests.
- synchronize Python and private UI package metadata on version 1.2.2
- document the prepared, not-yet-released presentation, Regional Canvas, and LoRA changes
- remove the completed titlebar-port Canary experiment and its tests
Validated with npm ci, 455 Python tests, 634 Node tests, compileall, TypeScript typecheck, production build, bundle comparison, and secret scan.
- unify presentation lifecycle, port projection, and native node sizing
- add Regional Canvas image sources and the shared compact image picker
- align LoRA Registry outputs and 0.05 strength scrubbing
- retain the titlebar-port Canary as branch-only experiment evidence
Validated: 458 Python tests, 655 Node tests, TypeScript typecheck, compileall, production build, staged bundle match, and secret scan.
The titlebar-port Canary is throw-away experiment code and must be removed before merge or release.