Commit Graph

235 Commits

Author SHA1 Message Date
bdcc05f388 Fix mode-unaware base_length recovery in VACE calculation
The recovery formula now matches the storage formula per mode:
End Extend subtracts only A, Pre Extend subtracts only B.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 19:24:06 +01:00
31da900502 Add mode-aware VACE frame calculation with 4n+1 snap
- Formula changes per VACE schedule: End Extend uses base+A,
  Pre Extend uses base+B, others use base+A+B
- Snap total to 4n+1 to match VACE sampler
- Show mode name label next to schedule number
- Add mode reference popover with all formulas

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 19:16:52 +01:00
f8f71b002d Change CFG default to 1.5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:12:48 +01:00
bc75e7f341 Add CFG input to batch processor UI
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:10:37 +01:00
6a3b72c035 Remove dead code: unused imports, session state keys, blank lines
- Remove unused `random` import and `KEY_PROMPT_HISTORY` from app.py
- Remove dead session state keys: edit_history_idx, append_prompt, rand_seed
- Clean up extra blank lines in json_loader.py

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 17:40:41 +01:00
387d4d874c Remove Single Editor tab (dead code)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 17:14:09 +01:00
7261f2c689 Change input_a_frames and input_b_frames default to 16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 17:12:24 +01:00
2263c3f598 Store vace_length as total (base + input_a + input_b) in JSON
UI shows the base value (vace_length - input_a - input_b) for editing,
saves the computed total back to the JSON.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 17:11:11 +01:00
7252fa3855 Fix load_dynamic missing output_types parameter
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 17:03:03 +01:00
a747f86daa Persist output types across save/load via hidden output_types widget
Types were lost on workflow reload because only key names were stored.
Now both keys and types are saved in hidden widgets and restored by
onConfigure, so colored connector dots persist without needing Refresh.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:16:50 +01:00
f5e242950d Auto-detect output types (INT, FLOAT, STRING) on dynamic node refresh
API route now returns types alongside keys. JS sets output slot type
accordingly, giving correct colored dots and type-safe connections.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:11:30 +01:00
dfab5e12ab Rewrite README with SVG diagrams and Dynamic node documentation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:08:33 +01:00
a08f2676f5 Fix tall node on creation by resizing after removing default outputs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:01:01 +01:00
3255fe76dc Preserve connections on Refresh when keys are added or reordered
Diff new keys against existing outputs instead of remove-all/add-all.
Reuses slot objects for matching key names so links stay connected.
Only disconnects links on keys that were actually removed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:00:16 +01:00
0d44944192 Fix dynamic node outputs using LiteGraph removeOutput/addOutput API
Direct array manipulation bypassed LiteGraph's internal slot tracking,
causing output names to show as defaults instead of JSON key names.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:57:06 +01:00
8cc244e8be Add case-insensitive path resolution for Current Path input
Walks each path component and matches against actual directory entries
when an exact match fails on Linux. Widget resyncs to the corrected
canonical path.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:52:48 +01:00
e841e9b76b Add JSONLoaderDynamic node with JS frontend for auto-discovered outputs
Dynamic node reads JSON keys and exposes them as outputs automatically
via 32 AnyType slots managed by a JS extension (show/hide/rename).
Includes /json_manager/get_keys API route, bool-safe type handling,
and workflow save/reload support.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:47:22 +01:00
a4717dfab6 Add vace_length field, move end_frame out of VACE settings, revert type coercion
- Moved end_frame to main settings area (i2v field, not VACE)
- Added vace_length (default 49) with computed output display
  showing vace_length + input_a + input_b
- Reverted custom param type coercion (ComfyUI handles conversion)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:26:13 +01:00
3718975d99 Add image preview popover for reference and FLF path fields
Shows a clickable eye button next to each image path input that
opens a popover with the image preview when the path is valid.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:49:17 +01:00
40ffdcf671 Clean up DEFAULTS: remove unused settings, add end_frame and transition
Removed steps, cfg, sampler_name, scheduler, denoise, model_name, and
vae_name that were showing as custom parameters. Added end_frame (0)
and transition (1-2) with VACE Settings widgets. Set default
general_negative prompt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:34:21 +01:00
81ecb91835 Fix Clone Next inserting between parent and its sub-segments
When cloning a parent sequence, the new sequence now inserts after the
parent's last sub-segment instead of directly after the parent.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 18:34:59 +01:00
e196ad27f5 Update templates to batch-only and remove single file option
Templates now generate batch_prompt_i2v.json and
batch_prompt_vace_extend.json as batch files. Create New JSON
always creates batch files since single mode is deprecated.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 17:04:39 +01:00
bd628b062e Clear stale file selector when navigating to empty folder
Removes leftover file_selector and loaded_file state when the current
directory has no JSON files, preventing stale data from persisting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 17:01:50 +01:00
1abae0de22 Fix path navigator using on_change with deferred sync
The inline check caused mismatches between typed and resolved paths.
Now uses on_change callback that always sets _sync_nav_path flag,
so the widget is synced to the canonical current_dir path on the
next rerun before the widget renders.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 17:00:37 +01:00
64472c7850 Fix nav_path_input write-after-widget error on invalid path
Use _sync_nav_path flag to defer the revert to the next rerun, before
the widget is instantiated.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 16:54:52 +01:00
907e7efd68 Fix path navigator by replacing on_change with inline check
The on_change callback had timing issues with Streamlit's session state,
causing user input to be discarded. Now checks the widget value inline
after render and triggers rerun on valid directory change.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 16:53:06 +01:00
0cfe9c9d4b Fix Current Path input reverting on directory change
The nav_path_input was force-overwritten on every rerun, causing
Streamlit to discard user edits before the on_change callback could
process them. Now only syncs on first load or external changes
(favorites). Also resets loaded_file on dir change and reverts
widget on invalid paths.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 16:37:53 +01:00
563dba5a0c Fix frame_to_skip shift by caching saved value in session state
The old_fts value was read from the data dict which gets mutated
in-place by widget renders, so on button click rerun delta was always 0.
Now the saved value is captured once per ui_reset_token cycle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 01:39:21 +01:00
b7164ae167 Replace legacy import with source sequence selector
Source file picker now shows all sequences in the selected file with a
dropdown, replacing the outdated history entry selector. Both "From
Source" and per-sequence "Copy Source" buttons use the selected sequence.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 01:07:29 +01:00
adff3d0124 Add sub-segment support for VACE batch sequences
Sub-segments use parent*1000+index numbering (e.g. 2001 = Sub #2.1) so
ComfyUI nodes can reference them via integer sequence_number without
code changes. Adds clone-as-sub button, visual distinction in expander
labels, sort-by-number button, and fixes auto-numbering/frame_to_skip
shift to work correctly with sub-segments.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 01:04:03 +01:00
f0ffeef731 Show delta on shift button and disable when zero
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 22:50:08 +01:00
2473a3d20c Add frame_to_skip shift button to propagate delta to following sequences
Adds a "Shift ↓" button next to Frame to Skip in VACE Settings that
applies the change delta to all sequences with a higher sequence_number.
Uses sequence_number field ordering, not array position.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 22:43:54 +01:00
9aad04bb02 Fix batch item lookup to match by sequence_number field
get_batch_item now searches for the item whose sequence_number field
matches the requested number, instead of using array position. Falls
back to index-based lookup for data without sequence_number fields.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 08:01:33 +01:00
45da9ee431 Add multiselect dropdown and Select All/Deselect All for bulk node deletion
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 20:12:18 +01:00
8c2b0f7809 Add multi-select node deletion to timeline
Adds a "Select to Delete" toggle that enables batch deletion mode.
When active, clicking graph nodes or checking linear log checkboxes
selects them (highlighted in red), and a "Delete N Nodes" button
performs batch deletion with backup, branch tip cleanup, and HEAD
reassignment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 17:22:10 +01:00
58345dc7c0 Fix delete corruption, promote desync, and shallow copies
- Delete sequence: add ui_reset_token increment to prevent shifted
  sequences from inheriting deleted sequence's widget state
- Promote: update data_cache with single_data so UI reflects the
  file format change without requiring a manual refresh
- Mass update & clone: use copy.deepcopy to avoid shared mutable
  references between sequences

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:54:06 +01:00
941eb836b0 Force data_cache reassignment after mass update
Explicitly reassign st.session_state.data_cache after mass update
to ensure Streamlit picks up in-place mutations to the batch data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 11:23:23 +01:00
c757038535 Fix mass update not refreshing UI
Increment ui_reset_token after mass update save so Streamlit
widgets re-read their values, matching all other save operations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 12:48:07 +01:00
8a86915347 Increase Specific Prompt text area height
- tab_single.py: 150 → 250px
- tab_batch.py: 100 → 300px to better match second column

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:59:28 +01:00
bde8bc5805 Fix interactive graph colors for dark theme
Use brighter node colors (yellow, green, light blue) and white font
for better visibility on dark backgrounds.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:12:52 +01:00
e4360f9124 Add interactive click-to-restore timeline graph
Uses streamlit-agraph for interactive node selection. Clicking a node
restores that version. Falls back to static graphviz if not installed.

Requires: pip install streamlit-agraph

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:10:51 +01:00
a88226778e Center vertical timeline graph
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:06:57 +01:00
94dbbc694f Fix vertical timeline scaling by disabling container width stretch
Vertical graphs now render at natural size instead of stretching to
fill container width, which was making nodes appear giant.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:05:01 +01:00
2653b5a0ee Make vertical timeline more compact with smaller nodes
Reduces font sizes, padding, spacing, and note truncation length
specifically for vertical (TB) mode to improve usability.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:02:28 +01:00
56db4080de Add mass update feature to batch processor
Allows propagating field values from one sequence to multiple/all other
sequences. Includes source selector, field multi-select, target checkboxes
with Select All toggle, preview, and history snapshot on apply.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 13:57:34 +01:00
87ed2f1dfb Merge timeline tabs into single polished tab with adaptive scaling
Combine stable and WIP timeline tabs into one with all features:
view switcher, restore/rename/delete, and data preview panel.
Add adaptive graph spacing based on node count, show full dates
and branch names on node labels, increase label truncation to 25
chars, and drop streamlit-agraph dependency.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 13:10:23 +01:00
e6ef69b126 Fix crash when navigating to a folder with no JSON files
st.radio was called with an empty list when no JSON files existed,
causing Streamlit to error and only render the sidebar.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 12:59:15 +01:00
676160be8c Always show reference path, flf image path, and VACE fields in batch editor
These fields were previously gated behind filename checks ("vace"/"i2v"
in filename), hiding them when the filename didn't match. Since DEFAULTS
includes all these keys, always render them.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 12:57:15 +01:00
8d0e16ac63 Fix missing keys in newly created batch files
Batch creation now seeds one item from DEFAULTS (which includes all
VACE/I2V keys) instead of creating an empty batch_data list.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 12:54:30 +01:00
a1bda9a979 Fix StreamlitAPIException when jumping to a favorite folder
Set nav_path_input before the widget renders and use on_change callbacks
instead of modifying widget state after instantiation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 12:52:05 +01:00