252 Commits

Author SHA1 Message Date
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
b02bf124fb Add atomic writes, magic string constants, unit tests, type hints, and fix navigation
- 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>
2026-02-02 12:44:31 +01:00
326ae25ab2 Fix critical bugs, security issues, and code quality across all modules
- 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>
2026-02-02 11:47:50 +01:00
268de89f6d Update tab_batch.py 2026-01-06 21:53:38 +01:00
80b77b0218 Update tab_comfy.py 2026-01-06 09:36:14 +01:00
b19e7b937c Update tab_comfy.py 2026-01-06 01:35:23 +01:00
316ef0e620 Update tab_comfy.py 2026-01-05 22:54:00 +01:00
18550005dd Update app.py 2026-01-05 15:21:14 +01:00
65e19fb7ff Update tab_comfy.py 2026-01-05 14:49:11 +01:00
b25814f756 Update app.py 2026-01-05 12:51:55 +01:00
2b4221e444 Update tab_batch.py 2026-01-05 12:51:20 +01:00
a5c5410b04 Add tab_raw.py 2026-01-05 12:50:34 +01:00
213aa254fb width of timeline 2026-01-04 19:10:07 +01:00
f51a0d6fe0 Update tab_timeline_wip.py 2026-01-04 19:06:57 +01:00
d054ff2725 Update tab_batch.py 2026-01-04 17:03:31 +01:00
7b4b0ff7ee Update tab_timeline_wip.py 2026-01-04 16:41:40 +01:00
d3deb58469 Update tab_timeline.py 2026-01-04 16:41:19 +01:00
a6b88467a8 Update tab_batch.py 2026-01-04 15:26:08 +01:00
f7d7e74cb9 Update tab_batch.py 2026-01-04 12:42:31 +01:00
9c83dd0017 Delete db_manager.py 2026-01-03 16:24:11 +01:00
bc2035eee5 Update app.py 2026-01-03 16:22:26 +01:00
2ed1c8a3cd Update app.py 2026-01-03 16:17:22 +01:00
5f3f8e2076 Update db_manager.py 2026-01-03 16:16:05 +01:00
29335bd4d5 Update app.py 2026-01-03 16:13:26 +01:00
5bd67476bc Update app.py 2026-01-03 16:10:05 +01:00
8fe0e39ecf Update db_manager.py 2026-01-03 16:06:34 +01:00
f74f583e98 Create db_manager.py 2026-01-03 16:01:27 +01:00
909f2b5f21 Update tab_batch.py 2026-01-03 10:51:52 +01:00
d7f06b7a93 Update tab_timeline_wip.py 2026-01-03 01:26:54 +01:00
7e4cede82b Update tab_timeline_wip.py 2026-01-03 01:25:46 +01:00
f25e264db9 Update tab_timeline_wip.py 2026-01-03 01:22:24 +01:00
6eff0f3ad5 Update tab_timeline_wip.py 2026-01-03 01:18:44 +01:00
4d398afea0 Update tab_timeline_wip.py 2026-01-03 01:14:54 +01:00
9582103d40 Update tab_timeline_wip.py 2026-01-03 01:11:51 +01:00