Displays a connected STRING input on the node via a flex-fill DOM
widget with header, length badge, monospace body, scrollbar styling,
and wheel-to-scroll capture so wheel events scroll the body instead
of zooming the canvas. The same string is passed through to the
output socket.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Four-node pipeline that partitions an image or video into uniform-area
Voronoi regions, optionally captions each region via OpenRouter vision
models, encodes per-region prompts through CLIP, and composites
per-region diffusion via cascade-paint:
- FL KSampler SEG Regions: grid-init + Lloyd relaxation Voronoi cells,
feathered overlapping soft masks for guaranteed coverage, on-node
preview with overlay or coverage-heatmap modes
- FL KSampler SEG Captioner: per-region vision-LLM captioning via
OpenRouter (gpt-4o-mini / gemini-flash / claude-haiku), with on-node
thumbnail grid that fills as captions arrive
- FL KSampler SEG Encoder: caption -> per-region CONDITIONING via CLIP
with prompt deduplication caching
- FL KSampler SEG: corner-anchored nearest-neighbor cascade-paint
composite, auto-detects model latent_format.spacial_downscale_ratio
so video models like LTX-Video (32x) and Hunyuan-Video (16x) work
out of the box, supports both 4D image and 5D video latents
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
FL KSampler Sigma: custom sampler with an on-node sigma curve editor.
Draw your own sigma schedule (monotone-cubic/PCHIP interpolation),
with log-Y axis, user-set axis bounds that preserve curve shape on
rescale, and a SIGMAS output for composability.
FL Fal GPT-Image-2 Edit: wraps openai/gpt-image-2/edit on fal.ai with
dynamic reference-image sockets (1-10), custom image sizes, optional
mask input, and exponential-backoff retries.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Race condition: Continue/Cancel button handlers were firing submitBlocking()
without awaiting it, then immediately calling close() which tore down the
modal. If the fetch got delayed or dropped by the DOM teardown, the Python
thread would stay blocked on event.wait() until the full timeout.
Symptoms: "sometimes Continue gets stuck and doesn't advance the workflow."
Fixes:
- PathAnimator: All exit paths (Continue, Cancel, ESC, overlay click, header
close) now await submitBlocking() before close(). On Continue failure,
the modal stays open with buttons re-enabled so user can retry.
- PathAnimator: submitBlocking now checks response.ok and throws on non-2xx,
surfacing 404 "Session not found" errors instead of swallowing them.
- PathAnimator: close() safeguard still uses fire-and-forget but now with
.catch() to log errors (it's a last-resort path after primary handlers).
- ImagePicker: sendSelection now checks response.ok and throws on non-2xx.
- ImagePicker: All callers wrapped in try/catch so failed submits don't
leave the modal in a half-closed state. Confirm failures keep the modal
open with a user-visible alert.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
FL Path Animator now supports interactive image-driven workflow:
- New optional IMAGE input — when wired, execution blocks and auto-opens
the path editor with the image as canvas background at native resolution
- New Continue button saves drawn paths and unblocks execution
- Cancel button aborts the workflow via InterruptProcessing
- Countdown timer in footer shows remaining timeout
- Transitions existing edit-mode modal in place if one is already open
(preserves any paths the user already drew)
- ESC, overlay click, and header close all treated as Cancel in blocking mode
- Fully backward compatible: without image, behaves exactly as before
Pattern mirrors FL_ImagePicker (threading.Event, WebSocket dispatch, POST
endpoint). New endpoint: POST /fl_path_animator/submit. New WS event:
fl_path_animator_show.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New node that replaces images or masks at a specific index within a batch.
Includes a grid preview with green border highlighting on replaced positions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use api.fetchApi() instead of raw fetch() so the request reaches
the correct backend URL in Desktop/Electron environments.
Fixes#88
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fixed incorrect relative import path for widget.js that was causing
ComfyUI to crash with infinite browser refresh on startup.
Closes#99
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>