14 Commits
Author SHA1 Message Date
Moser9815andClaude Opus 5 121670e72e Fix PREVIEW_DIR so preview cleanup targets the served folder
PREVIEW_DIR pointed at Playground\Viewer\public\previews, but the app lives at
Playground\Apps\Viewer. The clear-on-workflow-start in styles_pipe has therefore been
sweeping an empty folder since the app moved, while real previews accumulated untouched
in the served one - 9 files / 4.26 MB found and removed.

Resolves against a candidate list now (RM_PREVIEW_DIR, current location, legacy), first
existing wins, so moving the app again cannot silently resurrect this.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
2026-08-24 21:50:44 -04:00
Moser9815andClaude Opus 5 8273fc52eb Add stage capture: ship every decoded image to the Viewer as it is produced
Gives the monitor a clickable history of where a generation has been, at real decoded
quality rather than the 1/8-scale latent previews live_preview streams.

A node collecting image_1..image_N cannot do this. ComfyUI executes a node only once ALL
its inputs resolve, so a hub node emits nothing until the final stage finishes - exactly
when the information stops being useful. Same barrier documented in save_lineage.py, and
the reason RMSaveLineage cannot serve this purpose either.

So this patches the funnel instead: comfy.sd.VAE.decode and .decode_tiled. Every decoded
image passes through one of the two, including images from custom nodes calling
vae.decode directly, so existing workflows gain stage history with nothing wired. Accepted
cost: it captures every decode, including ones inside detailers and upscalers, and stages
cannot be hand-named.

Unlike live previews this queues rather than single-slots - a preview frame is disposable
because a newer one is moments away, but every stage is a distinct event and losing one
leaves a hole in the history. Bounded at 12 pending, dropping oldest.

Capture is guarded at the wrapper as well as inside _capture. A test that threw from
_capture proved the safety property was only incidental: the wrapper had no guard of its
own, so one future edit moving a line outside _capture would have broken every generation
in every workflow.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
2026-08-24 18:04:56 -04:00
Moser9815andClaude Opus 5 e413e41ac6 BUGS: styles pipe positive prompt - measured, position is correct
Pipe slot 0 is populated and RMStylesPipeOut unpacks it correctly; all eight return paths
emit an 8-tuple with positive at index 0. The content policy is rewriting the text in
place instead: across 293 styles, 26% clean / 70% sanitized / 4% blocked.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
2026-08-24 17:06:28 -04:00
Moser9815andClaude Opus 5 b7177c23d2 RMSaveLineage: image inputs grow as you connect them
Connecting the last image slot appends a fresh empty one, so a chain can be extended
without pressing a button. Its sibling RMMakeImageBatch uses an explicit "Add Image
Input" button; here slot order IS chain order, so the next slot should already be waiting.

Only the tail is managed - there is always exactly one trailing empty slot. Middle gaps
are deliberately left alone: the Python side sorts by slot number and skips unwired slots,
so 1,3,4 is still the chain 1->3->4, and compacting would silently re-point every parent
link in the lineage record.

Slot bookkeeping is deferred a frame and made idempotent, because LiteGraph fires
onConnectionsChange once per restored link during a workflow load - it must converge
rather than accumulate slots.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
2026-08-24 17:05:59 -04:00
Moser9815andClaude Opus 5 60447700e7 Port live_preview and auto_retry from ComfyUI-Moser
The Viewer depended on ComfyUI-Moser for two things the clean build no longer had:
live sampler previews (POSTed to /api/comfy-live/frame) and the auto-retry toggle. Both
now live here, so the Viewer needs exactly one pack installed.

Viewer endpoints are unchanged. Auto-retry registers /api/rm-autoretry/* as canonical
and keeps /api/moser-autoretry/* as an alias so no Viewer change is needed yet; both
prefixes share state. Route registration is per-path so a co-installed ComfyUI-Moser
owning the moser-* paths cannot prevent the rm-* ones from registering, and the live
preview hook checks both _rm_patched and _moser_patched so the two never double-send.

Dropped auto_retry runtime pip install of websocket-client: this venv is uv-managed and
has no pip, so the fallback could never succeed and hid the real cause. Declared in
requirements.txt instead.

MOSER_* environment variables still work as a fallback for the live preview settings.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
2026-08-24 14:34:55 -04:00
Moser9815andClaude Opus 5 6e37a66d4a Add RMAddLabel and RMImageComparer to drop KJNodes/rgthree dependencies
Both replace a single node we were pulling an entire pack in for.

RMAddLabel matches KJNodes AddLabel widget-for-widget, with two fixes: left/right now
work at any aspect ratio (the original rotated on the width/channel axes and returned a
[B,C,H,W] tensor that could only concatenate when the image was square), and fonts are
read from the system font directory as well as the pack, so a clean install has 361
usable fonts instead of none.

RMImageComparer is a self-contained reimplementation of rgthree Image Comparer. The
Python half subclasses PreviewImage; the slider is drawn on the node canvas in
js/rm_image_comparer.js rather than through rgthree base-node and widget framework.
The batch index widget is added in JS, not Python, so stepping through a batch does not
invalidate the cache and re-run the graph.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
2026-08-24 14:22:41 -04:00
Moser9815andClaude Opus 5 82730d93f5 Declare third-party deps (opencv-python, ultralytics, imageio-ffmpeg)
The pack had no requirements.txt, so a fresh ComfyUI install failed to import it entirely (ModuleNotFoundError: cv2). Declaring these lets Manager/uv install them automatically on any rebuild.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
2026-08-24 13:56:04 -04:00
Moser9815andClaude Opus 5 2fa4d5e9a3 WIP: snapshot before clean ComfyUI rebuild
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
2026-08-24 13:49:00 -04:00
Moser9815andClaude Opus 4.6 975bd4958c Add RM Mask Denoise Remap node
Remaps mask black/white to custom denoise levels for per-region
inpaint strength control. Output = black_denoise + mask * (white_denoise - black_denoise).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 23:46:10 -04:00
Moser9815andClaude Opus 4.6 f0ac574e2b Update Make Image Batch with dynamic inputs and silent failures
Supports unlimited image inputs via "Add Image Input" button.
Fails silently on bad inputs instead of crashing the workflow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 17:08:47 -04:00
Moser9815andClaude Opus 4.6 f3e100b9b4 Add RM Make Image Batch node
Combines up to 5 images into a single batch, auto-resizing mismatched
dimensions to match the first image.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 17:07:01 -04:00
Moser9815andClaude Opus 4.6 794fcb9077 Add RM Math Expression node
Standalone replacement for pysssss MathExpression — supports expressions
with variables (a, b, c), arithmetic, comparisons, and built-in functions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 11:43:44 -04:00
Moser9815andClaude Opus 4.6 cfb28ffcef Add new nodes and update existing nodes
New nodes: Face Detailer, Mask Combine, Multi Detect Crop, Progress Reporter
Updated: Styles Full, Styles Pipe, Video Combine, styles data

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 11:38:22 -04:00
Moser9815andClaude Opus 4.5 ace5516265 Initial commit: ComfyUI-RMAutomation node pack
Features:
- RM Styles Full/Pipe: Load prompts from JSON with random/increment/decrement modes
- RM Power Lora Loader: Advanced LoRA loading with random weight support
- RM Lora Apply: Apply multiple LoRAs with weight ranges
- Image fallback, mask gate, latent nodes, and more

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 19:37:35 -05:00