Commit Graph
61 Commits
Author SHA1 Message Date
ChrisandClaude Opus 5 f1a2e77e46 feat: front-end support for the Multi Video Loader pair
Extends the shared web/js/multi_loader.js to a third kind ("video") for
AI2GoMultiVideoLoader / AI2GoMultiVideoLoaderAdvanced: NODES map entries,
video/* MIME acceptance, drop-zone wording, a video-row preview (mm:ss +
WxH probed via a hidden <video>), and a serializeValue guard on force_rate
mirroring the existing max_size guard so a '' value can't fail validation.
README and the design spec's amendments section are extended to match.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 19:03:58 +02:00
Chris 19602fef52 feat: per-row on/off toggles with Toggle All; disabled rows hold their socket and output nothing 2026-08-14 15:31:12 +02:00
ChrisandClaude Fable 5 105574def5 fix: singular grammar in slot note ("has"/"it", not "haves"/"them")
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 14:35:57 +02:00
ChrisandClaude Fable 5 a2cdb1ddf2 polish: natural single-item wording in slot note; document under-pinned slots in README
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 14:34:37 +02:00
ChrisandClaude Fable 5 87cd054f93 feat: pinnable output_slots + drop zone doubles as file picker
Multi Loader nodes previously sized their output sockets to the loaded
file count, so deleting one file shrank the sockets and destroyed any
wire on a later socket. Add an output_slots combo (auto/1-8, front-end
only — Python already returns a fully padded output list) so a fixed
socket count can be pinned and wires survive file-list edits; the
status line now flags file/socket-count mismatches.

Also drop the separate + Add button: the drop zone itself is now
clickable and opens the same file picker, so there is one field for
both drag-and-drop and click-to-browse.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 14:29:34 +02:00
ChrisandClaude Fable 5 a5b21c8294 refactor: rename Batch loaders to Multi loaders, plain-word downscale modes
Batch already means one-item-per-queued-run in this pack (AI2GoPromptBatch);
these loaders emit everything in a single run, so Batch was misleading.
Renamed the four loader nodes/files/classes to Multi (AI2GoMultiImageLoader,
AI2GoMultiImageLoaderAdvanced, AI2GoMultiAudioLoader, AI2GoMultiAudioLoaderAdvanced),
and reworded DOWNSCALE_MODES from fit/crop/stretch to the plain-word
"keep aspect ratio"/"crop to square"/"stretch to square" (behavior unchanged).
Nothing published yet, so no back-compat aliases were added.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 10:42:25 +02:00
Chris 29ed6e531f fix: node auto-sizing - measure inner content element, not pinned widget root 2026-08-14 10:36:30 +02:00
ChrisandClaude Fable 5 46ed6294b0 fix: final-review findings - upload race past cap, delete/restore warnings, MIME filter, error positions
Six findings from the whole-branch review, fixed together:
1. addFiles() re-checks the row count before each push inside the upload loop, closing a
   race where two overlapping drops could push a node past MAX_FILES.
2. removeAt() now warns whenever a wired socket is disturbed, including when the removed
   row was the last one (previously required a promoted row too).
3. onConfigure no longer overwrites a files_json that failed to parse with "[]"; it shows
   the parse error in the status line and leaves the original widget value in place.
4. parseFiles' mirror comment documents both of its intentional deviations from Python's
   parse_files (empty input OK, entries beyond MAX_FILES ignored rather than rejected).
5. The image/audio MIME filter (and file-picker accept attr) now allows empty-MIME files
   and, for audio, video/* containers like .ogg that the backend decodes fine.
6. Missing-file and decode errors in the image/audio loaders now include the file's
   1-based position alongside its name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 09:25:06 +02:00
Chris 1907c230d6 feat: batch loader rows UI - previews, delete warning, reorder, sort 2026-08-14 00:29:43 +02:00
Chris 18fcbba141 feat: batch loader drop zone 2026-08-14 00:25:56 +02:00
Chris 3cb8adc074 fix: upload-failure status no longer clobbered by false-success message 2026-08-12 21:53:42 +02:00
Chris c2726481e9 feat: batch loader front-end skeleton - socket trim/grow + minimal upload 2026-08-12 21:47:24 +02:00
Chris 23769a02fa bugfix - clear button 2026-07-16 22:21:39 +02:00
Chris a5c0e9aa22 bugfix-ideogram-prompt-profile 2026-07-15 23:41:04 +02:00
Chris 65f146bd45 fix: append new inputs for old-workflow compat; add MP/portrait tests; harden JS parseAR; README range 2026-07-15 21:09:31 +02:00
Chris 7525542759 feat: flip button, snap-multiple visibility, orientation readout in resolution selector JS 2026-07-15 20:49:25 +02:00
ChrisandClaude Opus 4.8 e23137d1f9 feat: detect rgthree Power Lora Loader + Lora Loader Stack
The Save Metadata (Civitai) graph trace only recognized ComfyUI's stock
LoraLoader/LoraLoaderModelOnly, so LoRAs loaded via rgthree's multi-LoRA
nodes were silently missing from the written metadata and the preview.

- tracer.py: harvest LoRAs from "Power Lora Loader (rgthree)" (lora_N dicts)
  and "Lora Loader Stack (rgthree)" (flat lora_0N/strength_0N pairs), several
  per node, in load order. Skip disabled, empty ("None") and zero-strength
  slots to match what actually loads. Stock loaders still work.
- save_civitai_metadata.js: mirror the same detection in the live-graph
  Test-detection preview (kept in sync with the Python tracer).
- Preview warning now distinguishes positive/negative (may be resolved at run
  time by the AI2Go Prompt Batch node) from genuinely-unresolved fields.
- Tests for both rgthree loaders (multiple loras, ordering, skipped slots).
- README: document the supported LoRA loaders.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 20:07:08 +02:00
ChrisandClaude Opus 4.8 5380fb336d fix: model detection for diffusion models, %date% filenames, preview resize
Real-world testing feedback (PR #9):
- Detect models loaded via UNETLoader ("Load Diffusion Model", unet_name in
  the diffusion_models folder) + GGUF unet loaders, not just checkpoints;
  carry the folder so AutoV2 hashing looks in the right place. Fixes
  "model (?)" on Flux/SD3/Krea workflows. Mirrored in the JS Test button.
- Expand %date:FORMAT% filename tokens (frontend feature that doesn't reach a
  custom node's widget) before get_save_image_path, so e.g.
  "%date:yyyy-MM-dd%/Krea-Turbo" works. New comfy-free filenames module.
- Test-detection preview panel now reserves its natural height and grows the
  node to fit (measured, like the Prompt Batch editor) instead of overflowing.

Advanced node sockets kept as-is per user preference. +10 unit tests (39 passed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 17:51:50 +02:00
Chris e8c77a6817 fix: harden Test preview batch-slot handling and numeric escaping 2026-07-12 12:11:10 +02:00
Chris 86d6279b71 fix: reflect Advanced override sockets in Test-detection preview 2026-07-12 12:04:29 +02:00
Chris 707effa8a8 feat: Test-detection button + JS tracer mirror for Save Metadata nodes 2026-07-12 11:56:08 +02:00
Chris 85959a9291 bugfix to main, great 2026-07-11 18:42:30 +02:00
Chris 9123c938f9 new feature 2026-07-11 15:26:07 +02:00
Chris b686fe40d3 upload-V2 2026-07-11 12:55:35 +02:00
Chris ea99cd873a prompt batch 2026-07-11 11:07:02 +02:00
ChrisandClaude Opus 4.8 9352b23986 fix(resolution selector): aspect-preserving clamp + read-only readout with max warning
- megapixel/auto now preserve the aspect ratio when clamped to the profile's per-side cap (16:9 at max -> 2048x1152, not 2048x2048); aspect is prioritized over hitting the exact target size.

- Replaced the Apply button with a read-only readout (resulting WxH + MP); edits and new connections auto-push the dims to a connected Prompt Builder canvas.

- Added a profile-aware warning shown when the request is clamped to the profile's maximum (e.g. Ideogram 4 max 2048x2048).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 21:43:29 +02:00
ChrisandClaude Opus 4.8 5eea33938f feat: standalone AI2Go Resolution Selector node; revert prompt builder to KJ-original resolution
Adds AI2GoResolutionSelector: a profile-aware (Ideogram 4 = x16, 256-2048) resolution node with raw/auto/megapixel modes, INT width/height outputs for any workflow, and an Apply button that pushes dims into a connected node's width/height widgets (refreshing the Ideogram 4 Prompt Builder canvas via the same write pattern the Style Wizard uses). Dims also flow on graph execution.

Reverts the prompt builder's width/height to KJ-original (removes the embedded resolution_mode/aspect_ratio/megapixels widgets) so its node/JSON stays copy-paste compatible with the upstream KJNodes Ideogram 4 node.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 21:19:20 +02:00
ChrisandClaude Opus 4.8 4881323373 fix: heal legacy resolution-widget values + name-keyed restore
Old workflows/images saved before the resolution selector (or by a build with a different widget order) could land non-numeric junk in resolution_mode/aspect_ratio/megapixels via ComfyUI's positional widgets_values restore (shown as NaN). onConfigure now restores them from a name-keyed blob when present and coerces any remaining junk to sane defaults.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 20:38:28 +02:00
Chris e8d9804ec0 res-selector 2026-06-29 19:06:36 +02:00
ChrisandClaude Opus 4.8 f6e570d934 templates: larger 72px thumbnails, 200x200 previews
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 14:55:03 +02:00
Chris 9fa6245549 templates 2026-06-29 14:26:03 +02:00
Chris 749fb487ee fix bounding box group 2026-06-28 01:04:36 +02:00
ChrisandClaude Opus 4.8 e0db3b8415 Wizard: rename 'Clear & apply' -> 'Clear & apply & close'; close after
The button now clears the wizard, applies the cleared state to the builder,
and closes the modal in one click.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 23:17:23 +02:00
ChrisandClaude Opus 4.8 92824b96de Wizard: clearing now clears the builder's photo/art_style; add Clear & apply
Bug: after "Clear all" + "Apply", the builder's photo (or art_style) field
stayed filled. applyToBuilder computed kind=null when both were empty and
skipped the style block entirely, leaving the builder's previous value.

Fix: mirror the wizard exactly — when both are empty, set the builder's
"style" combo to "none" (its DynamicCombo drops the photo/art_style
sub-widget, actually clearing it), matching how the builder's own
applyCaption handles a style-less import.

Also add a "Clear & apply" button (clears the wizard and pushes the cleared
state to the builder in one click).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 23:09:11 +02:00
ChrisandClaude Opus 4.8 9bf33e0d56 Wizard: enlarge status line, make 'not connected' state red
Bump the Pick-tab status text 11px -> 13px and color the not-connected
warning red (bold) instead of orange, so it reads clearly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 23:02:03 +02:00
ChrisandClaude Opus 4.8 2dfe428e4c Fix stray ')' that broke the Style Wizard module load
An extra ")" in the parsePresets() error-message concatenation closed the
string early and left a dangling token, so web/js/ideogram4_style_wizard.js
failed to parse as an ES module. The whole extension never registered:
the node showed its raw wizard_data widget with no "Open Style Wizard" button.

`node --check` on the .js false-passed; validated now as strict ESM (.mjs)
and via a mocked import()+onNodeCreated harness (button is added again).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 22:56:58 +02:00
Chris 5d1d22e8b3 updated-builder 2026-06-27 21:46:37 +02:00
Chris be17938d49 style wizzard update 2026-06-27 19:49:17 +02:00
Chris dd7870c365 added new wizard node 2026-06-27 18:58:06 +02:00
ChrisandClaude Opus 4.8 44909e9c19 Overview right-click: add "Move to root"
The context menu gains a "Move to root" item that unparents the right-clicked node (or the whole
selection if that row is part of it) — a discoverable alternative to dragging onto the header.
Disabled when nothing in the target is nested. The node's subtree comes with it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 23:37:36 +02:00
Chris e44286ce2c fix bug 2026-06-26 20:03:25 +02:00
ChrisandClaude Opus 4.8 8709ec6613 Fix: lock a child's enable toggle whenever its group is off
The lock condition was "(effectively off) && (not own-disabled)", so a child that was ALREADY
individually disabled stayed clickable after the group was disabled — and clicking it merely flipped
it into the locked state. Lock now keys purely on whether a parent group is off (ancestorOff), so
once a group is disabled ALL its children are consistently 🚫 + non-toggleable until the group is
re-enabled.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 10:35:18 +02:00
ChrisandClaude Opus 4.8 2cfb42e5e0 Disabled group now shows its children as hidden in the tree
The per-row eye reflected only the box's OWN state, so children under a disabled group still showed
👁 even though they were hidden everywhere. Now the eye shows EFFECTIVE visibility: a child of a
disabled group reads as 🚫, faded and non-toggleable (the group is the master switch — flip it to
show them again). The whole disabled row dims for a clear hidden look.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 09:18:33 +02:00
ChrisandClaude Opus 4.8 a4d56abd0b Make the row enable/disable toggle a visible 👁 button
The enable toggle was a tiny native checkbox at the left of each Overview row — easy to miss on the
dark dock. Replaced it with a clear button: 👁 when enabled, 🚫 when disabled (click to toggle),
styled like the other row buttons.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 08:50:37 +02:00
ChrisandClaude Opus 4.8 6158eab5ef Overview: per-row enable/disable toggle (cascades through groups)
Each region and group row in the Overview gets an enable checkbox. Disabling a box (or a group —
which cascades to all its members) hides it from the canvas AND excludes it from the exported prompt,
the bbox output, and the preview render. Still listed in the Overview (dimmed) so it can be re-enabled.

- JS: isDisabled(b) walks the parent chain (own or any ancestor disabled); applied in the canvas draw,
  hit-testing, and buildCaptionObject (so token estimate reflects it too). Row checkbox toggles
  b.disabled and commits; effectively-disabled rows render dimmed. State persists + round-trips via
  the _ai2go sidecar / workflow.
- Python: _eff_disabled(box, by_id) mirrors the cascade; skips disabled in execute (elements + bboxes)
  and in _render_preview.

JS + Python parse clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 22:18:44 +02:00
ChrisandClaude Opus 4.8 31acac11b2 Copy/paste carries an _ai2go layout sidecar (KJ ↔ AI2Go two-way compatible)
Copy and templates now emit the clean caption PLUS an "_ai2go" sidecar holding the full editor box
list (groups, parenting, ids, names, collapse/lock). Paste/import/template-load restores from it when
present, so AI2Go→AI2Go round-trips losslessly. KJNodes (and the model) ignore the unknown key, so:
- AI2Go → KJ: pastes as a normal flat scene.
- KJ → AI2Go: no sidecar → imports flat (as before).
- AI2Go → AI2Go: hierarchy + groups fully preserved.

The sidecar is added only when there's hierarchy/groups to keep (plain scenes stay clean). The Python
`prompt` output and the token estimate use the clean caption — the sidecar is clipboard/template-only.

JS parses clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 14:33:13 +02:00
ChrisandClaude Opus 4.8 70235dd35d Harden group duplicate + mirror (review fixes)
- Duplicate: derive the shift delta from the copy's actual bounding box (not the group frame, since a
  member can protrude after individual editing) and apply one uniform delta with no per-clone clamp, so
  the copy's internal layout is preserved exactly. Falls back to a negative shift when the group is
  pinned to an edge (no more copy-on-top-of-original).
- Mirror: skip whole LOCKED sub-branches as a unit (collect members without crossing a locked box) so a
  nested sub-group frame and its children always mirror together; clamp the whole reflected interval
  (keeps box size, stays on-canvas) instead of one edge; validate the axis.

JS parses clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 14:04:40 +02:00
ChrisandClaude Opus 4.8 58d7d5194d Group actions: duplicate + mirror H/V
Three buttons in a selected group's panel:
- Duplicate: clones the group and its whole subtree (fresh ids, parents remapped within the copy,
  shifted slightly so the copy is visible and stays on-canvas; copy is editable).
- Mirror ⇆ / Mirror ⇅: flip the group's members left↔right / top↕bottom about the group's frame
  (frame unchanged). Locked and unplaced members are left as-is.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 13:58:33 +02:00
ChrisandClaude Opus 4.8 aa9463e5da Resizing a group scales its members
Previously a group frame could be resized but it did nothing to the children. Now resizing a
group's frame (corner/edge handle) scales its placed children proportionally about the same anchor
edge — reusing the existing group-resize transform. Skips locked sub-branches and unplaced (nobbox)
children. Resizing a normal region is unchanged (children don't scale). Show frames with 👁️ first
to grab a group's handles.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 12:54:55 +02:00
ChrisandClaude Opus 4.8 24af8e41e0 Group toggle: 👁️ icon, hidden by default
- Toolbar button icon is now 👁️ (lit/active = group frames visible).
- Group frames are HIDDEN on the canvas by default (showGroups defaults off; only `true` shows them).
  Click 👁️ to reveal them. Groups remain in the Overview tree at all times and are never exported.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 10:13:34 +02:00