- Fix Replace Cover: routes now read preview_path from form POST instead of session (session writes from background threads were lost)
- Fix batch generation: submit all jobs immediately, poll all in parallel via Promise.all
- Fix label NameError in character generate route
- Fix style detail missing characters context
- Selected Preview pane: click any image to select it; data-preview-path on all images across all 8 detail templates
- Gallery → Library rename across all index page headings and navbar
- Settings: add configurable LoRA/checkpoint directories; default checkpoint selector moved from navbar to settings page
- Consolidate 6 get_available_*_loras() into single get_available_loras(category) reading from Settings
- ComfyUI tooltip shows currently loaded checkpoint name
- Remove navbar checkpoint bar
- Phase 4 cleanup: remove dead _queue_generation(), add session.modified, standardize log prefixes, rename action_type → action
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Increase card density with more columns per breakpoint (2→6 across sm/xl).
Refactor style.css for consistent card sizing, spacing, and responsive layout.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Implements sequential job queue with background worker thread (_enqueue_job, _queue_worker)
- All generate routes now return job_id instead of prompt_id; frontend polls /api/queue/<id>/status
- Queue management UI in navbar with live badge, job list, pause/resume/remove controls
- Fix: replaced url_for() calls inside finalize callbacks with direct string paths (url_for raises RuntimeError without request context in background threads)
- Batch cover generation now uses two-phase pattern: queue all jobs upfront, then poll concurrently via Promise.all so page navigation doesn't interrupt the process
- Strengths gallery sweep migrated to same two-phase pattern; sgStop() cancels queued jobs server-side
- LoRA weight randomisation via lora_weight_min/lora_weight_max already present in _resolve_lora_weight
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- app.py: add subprocess import; add _ensure_mcp_repo() to clone/pull
danbooru-mcp from https://git.liveaodh.com/aodhan/danbooru-mcp into
tools/danbooru-mcp/ at startup; add ensure_mcp_server_running() which
calls _ensure_mcp_repo() then starts the Docker container if not running;
add GET /api/status/comfyui and GET /api/status/mcp health endpoints;
fix call_llm() to retry up to 3 times on unexpected response format
(KeyError/IndexError), logging the raw response and prompting the LLM
to respond with valid JSON before each retry
- templates/layout.html: add ComfyUI and MCP status dot indicators to
navbar; add polling JS that checks both endpoints on load and every 30s
- static/style.css: add .service-status, .status-dot, .status-ok,
.status-error, .status-checking styles and status-pulse keyframe animation
- .gitignore: add tools/ to exclude the cloned danbooru-mcp repo