Commit Graph
356 Commits
Author SHA1 Message Date
Jason HokuandClaude Opus 4.7 b95d2d0cfc feat: dashboard - Reset All Filters button + R key resets filter UI
Adds a 'Reset All' button to the filter modal header that re-selects all
filter buttons and clears search/logic filters. Updates the R key shortcut
to also reset the filter UI before reloading cards so visual state stays
consistent with the data.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:10:25 -07:00
Jason HokuandClaude Opus 4.7 7821c60d98 feat: dashboard - Delete All Rejected button
Adds a 'Delete All Rejected Items' button in the cog menu next to the
existing 'Delete All Non Favorited Items' button. Adds the matching
/config_tester/delete_rejected backend endpoint that removes rejected
item files and updates the manifest.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:09:47 -07:00
Jason HokuandClaude Opus 4.7 490c5196ef feat: configurable image save format (webp/png/jpg)
Adds a dropdown to the Builder UI's Run Settings section letting users
pick the saved image file format. Default remains webp (current
behavior). State plumbed through state_to_configs_json ->
_session_settings -> orchestrator -> save_image_to_disk.

PNG users will see lossless saves; JPG users smaller files at quality 95.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:05:10 -07:00
Jason HokuandClaude Opus 4.7 a491a88f48 docs: add CONTRIBUTING.md
Welcomes PRs, documents dev setup, test commands, key architecture
notes (single-source-of-truth transformer, manifest field names,
V1/V3 node dispatch), and a PR checklist.

Closes user request from GitHub feedback thread.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:02:37 -07:00
Jason HokuandClaude Opus 4.7 c45058adf3 feat: pre-flight scan counts already-existing configs in ETA
Scans the planned configs list once before the generation loop and
counts how many already have output files on disk (the same skip path
used by check_if_job_completed). Displays the count in the running
ETA line: "job X/Y (P%) | ETA: ... | N existing".

Helps users gauge how much actual work remains when re-running a
session that's been partially completed in a prior run.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:02:19 -07:00
Jason HokuandClaude Opus 4.7 8c8759d487 fix: strengthen dashboard filter highlight visibility for steps/cfg/upscale/type
The CSS rules and variables (--accent-steps/cfg/upscale/media) were already
added in 2c3851e; user reporting the bug was viewing a stale inlined dashboard
HTML generated before that commit. Since html_generator.py inlines report.css
at generation time, regeneration is required for CSS edits to take effect.

Added belt-and-suspenders box-shadow: inset to the four filter types so that
even if a theme override or cached page interferes with background, the inset
ring remains visible. Added a code comment documenting the regeneration
requirement.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:02:05 -07:00
Jason HokuandClaude Opus 4.7 4fb4fea5ed fix: lock Compare Strengths to single-bracket form (no Cartesian)
When the user types '0.5, 1.0' they want 2 outputs (lora at 0.5, lora
at 1.0 — both model and clip mirroring), not 4 outputs (Cartesian
m×c). The bug was that we wrote both _model AND _clip side-channel
arrays, so Python emitted 'name:[m]:[c]' which the orchestrator
correctly interpreted as Cartesian.

JS: collapse the two-input compare section to a single 'Strengths:'
input. Never write _clip to lora_weight_arrays.

Python: process_lora_array now emits 'name:[m_arr]' (no clip part)
when only _model array is present. The generator's existing
parse_lora_definition defaults clip=model when the third segment
is missing, giving N configs with locked semantics.

Drops the Cartesian path entirely. Backward compat retained: if a
saved workflow has both arrays (legacy), the dual-bracket form is
still emitted so the orchestrator can Cartesian-expand as before.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 11:27:39 -07:00
Jason HokuandClaude Opus 4.7 2913fc606a feat: unified Compare Strengths section with labeled Model+Clip inputs
Replaces the two separate '+ Compare Strengths' / '+ Compare CLIP'
buttons with a single button that toggles a section showing two
labeled inputs ('Model Strengths:' and 'Clip Strengths:'). When
Strength Lock is ON, only the Model input shows (CLIP mirrors
automatically — same as today).

Also fixes button-text-not-updating bug: previously the button
required a full re-render to swap between '+ Compare Strengths' and
'✕ Array' text, so toggling the input visible left the button stuck
at '+ Compare Strengths' until page reload. Activation now persists
arrays as [1] (Python passes through unchanged) and uses array
existence rather than length>1 as the active indicator, so reloads
correctly restore the active state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 10:27:49 -07:00
Jason HokuandClaude Opus 4.7 991631aec4 docs: update conf-builder-readme to reflect /configbuilder/preview endpoint
convertStateToConfigs() was deleted in the previous commit; the JS
preview now POSTs to the new endpoint and Python is the sole transformer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 09:59:48 -07:00
Jason HokuandClaude Opus 4.7 b6e2344f9b feat: preview panel uses /configbuilder/preview endpoint
Replaces synchronous JS convertStateToConfigs (~280 lines) with a
debounced (800ms) fetch to the new endpoint. Preview now renders
literally what generate_config produces — drift impossible by
construction.

Stale-state badge surfaces network failures without blocking editing.
Loading placeholder appears during the first-paint debounce window.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 09:59:10 -07:00
Jason HokuandClaude Opus 4.7 9ff76dd8ab feat: add POST /configbuilder/preview endpoint
Both runtime (generate_config) and preview now invoke
state_to_configs_json — single source of truth, drift-proof.
The Builder UI will fetch this endpoint instead of running a
parallel JS transformer (next commit removes that JS code).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 09:55:49 -07:00
Jason HokuandClaude Opus 4.7 3e9f9316c9 test: add 6 golden regression tests for state_to_configs_json
Covers single-lora pass-through, multi-lora combine with ' + ',
folder ref un-expansion, folder+brackets excluded from combine,
bypassed lora exclusion, and ltx_video model_type propagation.
Also tightens the existing bracket-array test from substring match
to exact string equality and removes the unused pytest import.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 09:54:12 -07:00
Jason HokuandClaude Opus 4.7 d07657c85b refactor: extract state_to_configs_json as single transformer
Eliminates the JS<->Python drift bug class by making one Python function
the source of truth for state -> configs_json. Both the runtime
(generate_config) and the new preview endpoint (next commit) call it.
Adds golden test for the lora-strength-arrays bracket case that just
broke (regression guard).

Also loads the real config_builder_node module in conftest.py (instead
of a bare stub) so that tests against UltimateConfigBuilder methods work
correctly. Stubs network_utils before loading to satisfy the relative
import.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 09:44:12 -07:00
Jason Hoku ef0062fce8 fix: ltx pickers route through modelLists object so refresh-models button updates them 2026-04-27 12:14:39 -07:00
Jason Hoku 15bd7ae2dd fix: localStorage cache version bump + persist latent_upscale_models, clearAllCaches resets all upscale fields 2026-04-27 12:07:41 -07:00
Jason Hoku fe73850d81 fix: ltx uses sampler resolutions widget for width/height (was hardcoded 446x576) 2026-04-25 21:31:06 -07:00
Jason Hoku 2a125cff4b fix: drag-drop and clipboard paste append to existing image input value instead of overwriting 2026-04-25 21:10:03 -07:00
Jason Hoku cdd230ef52 fix: disable ltx skip-on-exists, use timestamp suffix for filename uniqueness 2026-04-25 21:04:25 -07:00
Jason Hoku 1cd7a5528c feat: drag-drop + clipboard paste for ltx image input, resolve via comfy input dir 2026-04-25 21:01:00 -07:00
Jason Hoku f6bb5a0ef5 fix: ltx manifest entries get timestamp-based id matching image-gen pattern 2026-04-25 20:53:38 -07:00
Jason Hoku 20acff8a1e fix: ltx manifest entry includes 'file' key (/view? URL) for dashboard video loading 2026-04-25 20:46:27 -07:00
Jason Hoku 3d9d27617d fix: ltx output filename includes config hash so meaningful changes break skip-on-exists 2026-04-25 20:34:53 -07:00
Jason Hoku c8a937b137 feat: ltx i2v pipeline (preprocess + LTXVImgToVideoInplace both stages) + preview thumbnail 2026-04-25 20:23:39 -07:00
Jason Hoku 0f8c25a588 feat: input_image folder expansion for ltx i2v sweeps 2026-04-25 20:23:11 -07:00
Jason Hoku 3adad657b6 feat: ltx image-to-video builder ui (image picker, strength sliders, compression) 2026-04-25 20:16:07 -07:00
Jason Hoku 16b792601e test: update manifest entry test for image_path mirror 2026-04-25 20:13:39 -07:00
Jason Hoku fd9f191d22 fix: ltx mp4 saves to images/ subfolder, manifest image_path for dashboard load 2026-04-25 20:12:53 -07:00
Jason Hoku 7eed6a56e6 fix: skip SaveVideo node, call video.save_to() directly to avoid hidden-input deps 2026-04-25 20:04:35 -07:00
Jason Hoku 396dcb15c2 fix: unwrap V3 NodeOutput.args correctly (was returning whole NodeOutput object) 2026-04-25 20:01:01 -07:00
Jason Hoku 5dc011db1f fix: ltx node calls dispatch correctly for V1 (KJ/core) vs V3 (LTXV*) api 2026-04-25 19:57:37 -07:00
Jason Hoku a3478c01cb fix: ltx latent_upscaler reads from latent_upscale_models/ folder, not upscale_models/ 2026-04-25 19:43:10 -07:00
Jason Hoku 655816c9c9 fix: move ltx dispatch above image-gen log/build_prompt that assume sampler/steps keys 2026-04-25 19:29:23 -07:00
Jason Hoku f533c4755a fix: skip pre-encoding stage for ltx_video runs (uses dual-clip internally) 2026-04-25 19:26:53 -07:00
Jason Hoku 0d5d0aa723 fix: exempt ltx_video configs from non-checkpoint VAE validation 2026-04-25 19:25:04 -07:00
Jason Hoku 0b0781f838 fix: ltx config flattening in py generate_config + trust model type before file picked 2026-04-25 19:19:48 -07:00
Jason Hoku f76c9902a0 fix: ltx state lives per-configArray, derive model_type from models[] 2026-04-25 18:37:35 -07:00
Jason Hoku fee9d41090 fix: ltx_video model picker uses diffusion_models folder, LTX badge, LTX file label 2026-04-25 18:19:08 -07:00
Jason Hoku a60f7ed7e8 feat: hide scheduler/steps/denoise/flux fields when ltx_video selected 2026-04-25 18:09:44 -07:00
Jason Hoku 35cd8b8260 feat: ltx image input + audio subsection stubs (full impl in B/C) 2026-04-25 18:05:30 -07:00
Jason Hoku aa94e6c2c2 feat: ltx stage 1 + stage 2 sampler/sigmas subsections 2026-04-25 18:04:02 -07:00
Jason Hoku 5508be8539 feat: ltx video shape subsection (duration + frame rate sliders) 2026-04-25 18:01:01 -07:00
Jason Hoku 8064c31a55 feat: ltx model files subsection (dual clip, vae, upscaler pickers) 2026-04-25 17:59:08 -07:00
Jason Hoku 7ff5059dee feat: ltx_video dispatch in main generation loop 2026-04-25 17:58:42 -07:00
Jason Hoku cc52ad679b feat: ltx settings section skeleton with conditional render on model_type 2026-04-25 17:56:17 -07:00
Jason Hoku d58f00a4d0 feat: ltx manifest entry builder, video media_type (manifest_utils.py untouched) 2026-04-25 17:53:30 -07:00
Jason Hoku 166ca832b2 feat: ltx-aware sort order for cache locality 2026-04-25 17:51:42 -07:00
Jason Hoku 99f8cd0202 feat: ltx_video option in model_type dropdown 2026-04-25 17:51:18 -07:00
Jason Hoku 2ccef19837 feat: ltx two-stage video generation pipeline (t2v, audio always-on) 2026-04-25 16:59:39 -07:00
Jason Hoku b90aa1b893 feat: ltx dual-clip prompt encoding with LTXVConditioning wrapping 2026-04-25 16:57:27 -07:00
Jason Hoku 94694ec07a feat: ltx model loading with per-file caching 2026-04-25 16:56:15 -07:00