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>
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>