- Deep-copy node data on restore to prevent edits from mutating
stored history snapshots
- Guard glob calls against non-existent current_dir
- Read current selection at delete time instead of using stale
render-time capture
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Sync dict_input/dict_textarea/LoRA inputs on update:model-value
(not just blur) to prevent silent data loss on quick saves
- Split LoRA into name + strength fields, default strength to 1.0
- Stack LoRAs one per line instead of 3-card row
- Collapse "Add New Sequence from Source File" into expansion
- Add file selector to Pane A in dual-pane mode
- Clear secondary pane state on directory change
- Fix file radio resetting to first file on refresh
- Handle bare-list JSON files and inf/nan edge cases
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
dict_number() only wrote to seq[key] on blur, so changing a value
(e.g. via spinner arrows) and immediately clicking Save could race
the save ahead of the blur on the server. Now also syncs on
update:model-value so the dict is always current.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace red accent with amber, add Inter font, introduce 4-level depth
palette via CSS variables, expand padding/gaps, wrap sidebar and content
sections in cards, add section/subsection header typography classes, and
style scrollbars for dark theme. Pure visual changes — no functional or
data-flow modifications.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
dict_number() defaulted to 0 while mode_label used default of 1,
causing visual inconsistency when 'vace schedule' key is missing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
NiceGUI's ui.number returns float values, so seeds, steps, dimensions
etc. were being stored as floats (e.g. 42.0) instead of integers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update badge, installation instructions, port references, and file
structure to reflect the migration from Streamlit to NiceGUI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use set_options() instead of direct .options assignment (3 locations)
so dropdown changes actually reach the browser
- Wrap res.json() in try/except for non-JSON server responses
- Deep copy in create_batch and promote to match rest of codebase
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- save_config calls now pass full config to preserve comfy settings
- Mass update section moved inside refreshable to stay in sync
- Deep copy source data to prevent shared mutable references
- Clipboard copy uses json.dumps instead of repr() for safe JS
- Comfy monitor uses async IO (run_in_executor) to avoid blocking
- Auto-timeout now updates checkbox and refreshes live view UI
- Image URLs properly URL-encoded with urllib.parse.urlencode
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaces row/col grid with a resizable splitter at 66/34 ratio,
matching the original Streamlit st.columns([2, 1]) layout. Removes
extra card wrapper from sequences to maximize content width.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add page/sidebar background contrast, wrap action button rows,
ensure dark text in inputs, and improve timeline card highlight colors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
- 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>
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>
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>
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>
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>
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>
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>
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>
- 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>
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>
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>
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>
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>
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>
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>
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>