Replaces old list-format tags (which duplicated prompt content) with structured
dict tags per category (origin_series, outfit_type, participants, style_type,
scene_type, etc.). Tags are now purely organizational metadata — removed from
the prompt pipeline entirely.
Adds is_favourite and is_nsfw columns to all 8 resource models. Favourite is
DB-only (user preference); NSFW is mirrored in JSON tags for rescan persistence.
All library pages get filter controls and favourites-first sorting.
Introduces a parallel LLM job queue (_enqueue_task + _llm_queue_worker) for
background tag regeneration, with the same status polling UI as ComfyUI jobs.
Fixes call_llm() to use has_request_context() fallback for background threads.
Adds global search (/search) across resources and gallery images, with navbar
search bar. Adds gallery image sidecar JSON for per-image favourite/NSFW metadata.
Co-Authored-By: Claude Opus 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