* feat(nodes): Easy Image Batch keyframes_insert + insert-over-source + clean batch
- Rename optional input keyframe_batch -> keyframes_insert (node ID unchanged).
- Insert-over-source mode: when keyframes_insert AND source_batch are both
connected, composite the inserts over the source cut window (instead of the
placeholder background). keyframes_insert alone keeps the offset/reconstruct
behaviour over placeholder.
- No image source connected -> clean placeholder batch sized by new
width/height fallback widgets, instead of raising. width/height are appended
LAST so older saved workflows keep their positional widgets_values alignment
(fixes a mid-list insertion that shifted placeholder_color into source_frames).
- alpha_batch marks only inserted/placed positions; source background is not
counted as placed.
- New pure planner plan_source_base_fill (torch-free) alongside
plan_offset_placements; both unit-tested in CI.
- Docs: behavior matrix spec, interactive HTML demo, and a generated
"all versions" ComfyUI demo workflow under docs/designs/.
Not yet implemented (specced as DRAFT in docs/designs, pending maintainer
approval + tie-break decision): image1-4 "super-overwrite" layer across all
modes, and removal of the Mode 2 unconnected-slot source_batch fallback.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(deps): raise aiohttp [test] floor to >=3.14.1
The constraints lock already pins aiohttp 3.14.1 (the CVE-2026-54273..54280
fix line), but pyproject's [test] extra still declared aiohttp>=3.9.
Dependabot keys off pyproject, not the lock, so the open declared range kept
eight range-based alerts open even though the installed version is patched.
Raising the floor to >=3.14.1 aligns the declared range with the lock and
clears the alerts once this reaches the default branch.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(nodes): Easy Image Batch image1-4 super-overwrite + source passthrough
Make the four manual slots the top compositing layer in every mode (select
and insert): a connected imageN overwrites output frame imageN_frame on top
of the sequence/inserts and the background. Higher slot wins a collision
(image4 > image1); a slot beats a sequence pick / insert at the same position.
Extracted as the torch-free plan_slot_overwrites planner + a shared
_apply_slot_overwrites helper used by both code paths.
Two model fixes ride along, per the finalised behaviour matrix:
- An unconnected slot now contributes nothing -- imageN_frame is only a
placement target for a wired image, never a source_batch pick. The old
unwired-slot fallback (which surfaced seemingly-random frames) is removed.
- source_batch + an empty frame list (no insert) now passes the source cut
window straight through instead of a placeholder batch, matching the
insert-mode empty-list passthrough.
Tests: new plan_slot_overwrites planner cases + fake-tensor behaviour tests
covering slot-beats-pick/insert, higher-slot-wins, passthrough-not-placed, and
the removed phantom fallback. Docstring, tooltips, user guide, design spec
(promoted DRAFT -> canonical), and CHANGELOG updated.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* test(nodes): assert selected_image_batch = picks/inserts + slots; drop matrix HTML demo
selected_image_batch already packs every placed position -- both the
source_frames picks / inserts and the manual-slot overwrites, with slots
winning on overlap. Add explicit select- and insert-mode tests asserting the
composition and ascending order, locking the behaviour in.
Also delete docs/designs/easy-image-batch-matrix.html (stale interactive demo
built against an earlier draft) and drop its companion reference from the
design spec.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(nodes): Easy Image Batch passthrough inpaint mask + frame-range syntax
Two refinements to the Easy Image Batch passthrough/list behaviour:
- Short-source passthrough is now an extend/inpaint mask. When source_batch is
connected and the frame list is empty, the covered source frames are kept
content (alpha 0.0) and the uncovered tail becomes the selection
(selected_image_batch / selected_frames) with alpha 1.0 -- "keep the first N,
generate the rest". Full coverage -> no gap, empty selection. The selection
is the gap here (inverse of select mode); insert mode is unchanged.
- The source_frames field accepts inclusive ranges: "1-5, 7, 9, 14-17" expands
to 1,2,3,4,5,7,9,14,15,16,17, in both select and insert, via a shared
torch-free parse_frame_tokens (descending/non-integer tokens warn).
Tests cover the gap selection (short/full/cut-start-offset/slot-in-gap), the
parser (ranges, bad tokens), and range syntax end-to-end. Docstring, tooltip,
user guide, design spec, and CHANGELOG updated.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* docs(designs): remove draft-era Easy Image Batch demo workflow + builder
Delete easy-image-batch-demo-setup.json and build_easy_image_batch_demo.py
(the leftover draft-era demo, sibling to the already-removed matrix HTML) and
drop the companion reference from the behavior spec. A purpose-built demo will
replace them later; the spec matrix + the node remain the canonical reference.
Also drop the now-stale "(proposed)" from the spec title (it is canonical).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* docs(user-guide): remove stale v0.1.5 Easy Image Batch screenshot
The screenshot predates the node's keyframes_insert / super-overwrite /
passthrough rework and is unreferenced. Removing it to be re-created fresh.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* docs: point Easy Image Batch docs at the bundled Select-and-Rebuild demo
Note the runnable demo workflow ("Easy Image Batch - Select and Rebuild",
bundled into the Kforge Labs Workflows sidebar folder via #248) in both the
user guide and the design spec, replacing the generated demo removed earlier.
Referenced by path (not a clickable link) since the workflow lands via #248.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(nodes): address PR review — keyframe_batch alias + input guards
- Restore keyframe_batch as a deprecated alias of keyframes_insert so
pre-rename workflows (origin/main exposes the input) keep loading; an explicit
keyframes_insert wins. Follows docs/maintainers/node-versioning.md
(alias-then-deprecate); removal deferred to a release boundary.
- Warn instead of silently returning a clean batch when source_frames is
non-empty but no image source is connected.
- Cap frame-list range expansion at 8192 frames/token to guard against typos
like 1-99999999.
- Docs: reframe the bundled demo-workflow note as forthcoming (the JSON lands
via #248, not on this branch); document the alias, cap, and no-source guard in
the user guide / design spec / CHANGELOG.
Tests: alias routing + precedence, no-source warning, range cap + boundary
(46 node tests). Fresh-eyes review: no correctness/compat issues (the IMAGE
alias input adds no widget-position shift).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* docs: point Easy Image Batch docs at the now-merged Select-and-Rebuild demo
#248 merged to main and is now in this branch (via the main merge), so the
demo workflow exists at docs/workflows/kforge-labs-workflows/. Repoint the user
guide and design spec at it directly (present tense, real folder link) instead
of the earlier "coming soon / pending" framing.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: AI Machine <ai.machine@x.baconcph.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>