- New nodes: Image Resize plus the Utility group (Text, Integer, Float, Show Text, Math Expression, Select Every Nth, Split Batch, Merge Batches, Free Memory) - the dependency-free gaps that let shared workflows drop heavy packs. - Replace with AusBoss nodes (prototype): preview-then-confirm graph rewrite swapping known third-party nodes for pack equivalents, with a tested translation map, per-node opt-out, and refuse-with-reason for nodes the pack cannot stand in for. - Load Video: single-frame FRAME picker, an honest "what will load" label from the probed source rate, drop-a-video-to-restore. Save Video: format-aware widgets and a file_path output. Stitch Inpaint gained a blend_mask output, Select Frame negative from-the-end indexing, Image Size a batch count - all appended, saved workflows load unchanged. - LoRA Loader: drag-to-reorder rows, hover thumbnails on rows, file size and date in the info card. - Appearance: flagship scheme deepened to slate-teal; the retired bright-teal pair upgrades automatically via LEGACY_SCHEME_PAIRS. Optional queue-completion chime, off by default. - Image Resize invariant: pixels are only invented on an explicit width+height pad request - scale-derived modes resolve divisible_by snaps with a sub-half-step resize, never bars. - Docs refreshed for six stale pages, stale text and metadata fixed across the pack, the panel-height rule codified in AGENTS.md and the brand skill, and ausboss_node_tour.json added - a model-free example exercising 17 node types in one graph. Validated: scripts/validate_nodes.py (24 files), 300 JS tests, all Python suites under the ComfyUI embedded interpreter.
22 lines
1.1 KiB
JavaScript
22 lines
1.1 KiB
JavaScript
// Pure decision logic for the queue-completion chime. No DOM and no ComfyUI
|
|
// imports, so it stays testable under node:test; the audio and event wiring
|
|
// live in js/notify/index.js.
|
|
|
|
// ComfyUI's "status" event has carried the queue count in two shapes across
|
|
// frontend versions: detail.exec_info.queue_remaining and
|
|
// detail.status.exec_info.queue_remaining. Anything else (including the null
|
|
// detail sent on disconnect) resolves to null, which callers must ignore
|
|
// rather than treat as "queue empty".
|
|
export function queueRemaining(detail) {
|
|
const info = detail?.exec_info ?? detail?.status?.exec_info;
|
|
const remaining = Number(info?.queue_remaining);
|
|
return Number.isFinite(remaining) ? remaining : null;
|
|
}
|
|
|
|
// The chime marks the moment work finishes: a transition from a busy queue
|
|
// to an empty one, and only while the setting is on. Loading the page with
|
|
// an idle queue (0 → 0) and every in-between tick (3 → 2) stay silent.
|
|
export function shouldChime(enabled, previousRemaining, nextRemaining) {
|
|
return !!enabled && Number(previousRemaining) > 0 && nextRemaining === 0;
|
|
}
|