ProjectSource now outputs a third value: the project's folder path,
fetched from the new /api/projects/{name} endpoint. Useful for
building paths to files relative to the project directory.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Instead of a separate node, _get_data now appends three derived keys
to every sequence response: Path(start frame path).stem → start_name,
etc. Any ProjectKey node can use these directly as key_name.
Reverts ProjectFrameNames node (unnecessary).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
New node in JSON Manager/project that fetches start/middle/end frame
path from the sequence and outputs Path(value).stem for each, so
e.g. '/path/to/keyframe8.png' → 'keyframe8'. Avoids manual string
filtering in large workflows.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Added /api/active-project endpoint that reads current_project from
config. ProjectSource now hides the project_name widget and fetches
the active project automatically on create, load, and click.
Title shows "Source: <label> [<project>]" for at-a-glance status.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Clicking any ProjectKey node temporarily highlights all other nodes
in the workflow that share the same key_name with an amber color.
Deselecting restores their original colors.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
NiceGUI's ui.image (Quasar q-img) fails to display inside ui.dialog
regardless of URL type — shows alt text instead of image. Switched
both thumbnail and dialog content to plain HTML <img> tags which
the browser renders directly without component interference.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
NiceGUI's ui.image with a local file path fails to register static
files when inside a ui.dialog, showing alt text instead of the image.
Added /api/image-preview?path=... endpoint that streams the file via
FileResponse, and updated frame path thumbnails to use this URL.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removed end_frame mirror. Logic index is now entirely computed
from the 3 frame switches (bit 0=start, bit 1=middle, bit 2=end).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Quasar tooltip size constraints prevent large images from rendering.
Thumbnail is now clickable (cursor:pointer) and opens a full-size dialog.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each frame path row (start/middle/end) now has:
- path input with preview
- strength float (default 1.0)
- switch linked to the corresponding logic index bit
Switches and logic index are bidirectionally synced.
end_frame → logic index → switches mirror chain preserved.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bit 0 = start frame, bit 1 = middle frame, bit 2 = end frame.
Tooltip shows the full 0-7 truth table on hover.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Was scanning state.current_dir which could differ from the project's
actual folder, causing no JSON files to be found.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
projects.db now lives next to main.py instead of ~/.comfyui_json_manager/
so it survives Docker container updates when the project dir is mounted.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
direction:rtl caused path characters to render in wrong order.
text-align:right right-aligns the text (shows end of path) without
breaking the character display order.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Temporary field to ease node migration. Initializes to end_frame's
value and stays in sync whenever end_frame changes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Updates DEFAULTS, standard_keys, UI label, and timeline known_keys.
Adds _migrate_key_renames() called on load_json to auto-migrate
existing JSON files with the old key name.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
commit() is async but was called without await from sync handlers
(clone_next, clone_end, clone_sub, delete, copy_source, del_custom,
add_param, _sync_entry, _randomize) — causing saves and UI refreshes
to silently never run. Made all handlers async and added await.
Also fixed for i,entry loop shadowing the card's i parameter,
which was causing _render_vace_settings to receive the wrong index.
Removed unawaited render-time commit() in resolutions init block.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_render_preview_fields was only rendering hardcoded known keys.
Now adds a Resolutions section (W/H/Seed per slot) and a Custom Fields
catch-all for any other keys not in the standard set.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_get_data and _get_keys were querying the SQLite DB which only gets
populated when db_enabled is on. JSON file is always the source of
truth, so read from it directly — fixes missing keys (e.g. resolutions)
when DB hasn't been synced.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements ProjectResolution with TDD: fetches a [width, height] pair
from a resolution series by loop index, clamping out-of-bounds indices
to the last entry and returning (512, 512) defaults on error or missing key.
Also registers the node in mappings and updates TestNodeMappings count to 4.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace HistoryTree (DAG with branches, Graphviz rendering) with a flat
chronological SnapshotTimeline. New UI features: split-view layout,
snapshot compare/diff, cherry-pick restore of individual sequences or
fields, auto-snapshots with debounce, and pin/filter support.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Hidden widget sync passes sequence_number as string, causing format
code errors downstream. Cast to int before use.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
API returns {"files": [{"name": "...", "data_type": "..."}]}, not a
plain array. Extract file names from the nested structure.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- file_name is now a combo dropdown populated from the API when
manager_url and project_name are set
- ProjectSource outputs sequence_number (INT) for downstream use
- Refreshes file list when project_name or manager_url changes
- Updated tests for new output and error-default behavior
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When ProjectKey configures before ProjectSource, _getSourceLabels
returns empty. replaceWithCombo now always keeps the saved value in
the options list so it survives the race condition.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>