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>
- 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>
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>
- 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>
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>
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>
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>
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>
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>
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>
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>
- 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>
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>
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>
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>
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>
- save_json() now writes to a temp file then uses os.replace() for atomic writes
- Replace hardcoded "batch_data", "history_tree", "prompt_history", "sequence_number"
strings with constants (KEY_BATCH_DATA, etc.) across all modules
- Add 29 unit tests for history_tree, utils, and json_loader
- Add type hints to public functions in utils.py, json_loader.py, history_tree.py
- Remove ALLOWED_BASE_DIR restriction that blocked navigating outside app CWD
- Fix path text input not updating on navigation by using session state key
- Add unpin button (❌) for removing pinned folders
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace bare except clauses with specific exceptions (JSONDecodeError, IOError, ValueError, TypeError)
- Add path traversal protection restricting navigation to ALLOWED_BASE_DIR
- Sanitize iframe URLs with scheme validation and html.escape to prevent XSS
- Extract duplicate to_float/to_int to module-level helpers in json_loader.py
- Replace silent modulo wrapping with clamped bounds checking via get_batch_item()
- Remove hardcoded IP 192.168.1.51:5800, default to empty string
- Add try/except around fragile batch history string parsing
- Add JSON schema validation (dict type check) in read_json_data()
- Add Python logging framework, replace print() calls
- Consolidate session state initialization into loop with defaults dict
- Guard streamlit_agraph import with try/except ImportError
- Add backup snapshot before history node deletion
- Add cycle detection in HistoryTree.commit()
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>