Added 'Path Replacements' section in the Projects tab. Each entry is a
from→to string substitution applied to project_path output, fixing
casing mismatches between Docker containers (e.g. Davinci → davinci).
Stored in .editor_config.json under 'path_replacements'.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Uses resolve_path_case_insensitive so stored paths like '/Davinci/...'
are returned as '/davinci/...' if that's the real casing on disk.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Thumbnail opacity is 1.0 when the frame switch is on, 0.25 when off.
Initial state reflects the current logic index bit, and updates live
on toggle without requiring a page refresh.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each frame path now has two strength fields instead of one:
'start frame high strength', 'start frame low strength' (and same
for middle/end). Migration splits old single 'X frame strength' into
both new keys using the same value.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
These fields are no longer needed. Removed from DEFAULTS, UI widgets,
standard_keys set, and timeline preview. Added _migrate_remove_keys()
migration so existing JSON files are cleaned up transparently on load.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
start/middle/end frame strength are set via setdefault in the UI but
only persist after save. API now injects them with default 1.0 so
ProjectKey can use them immediately without requiring a save first.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ProjectKey: dot color matches ComfyUI's type color map (INT/FLOAT),
or green/grey for BOOLEAN based on actual value.
BinaryIndexDecoder: same green/grey per-output based on true/false.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Returns ui value alongside result for numeric/boolean types so JS
onExecuted can show e.g. '42 seed' on the output slot, matching
the BinaryIndexDecoder inline display style.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Returns ui values alongside result so JS onExecuted can update the
output slot labels with the actual true/false values after execution,
matching the KJNodes style inline display.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Hidden widgets aren't serialized by ComfyUI on queue, so project_name
arrives empty. Fall back to /api/active-project directly from Python.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>