Commit Graph
1386 Commits
Author SHA1 Message Date
digital-garbage 9fb64a41ca feat(editor): pin up to three Settings shortcuts to the toolbar
Slot number is the address: holes close up, surviving buttons keep their
numbers, so a shortcut never moves. Pinning with a node open pins the node.
2026-08-22 22:24:55 +03:00
digital-garbage 857215bca7 fix(editor): None clears the whole global prompt, not just scene texts
The prompt is anchor + transitions + scene texts, so clearing only the
bodies left it non-empty. Postfix and variables are separate settings and
are untouched.
2026-08-22 22:11:50 +03:00
digital-garbage 98f706c815 fix(editor): prompt templates are editable, deletable and dismissable
The bar never recorded which template was applied, so there was nothing to
rename, delete or leave; deletePromptTemplate had no caller at all. Clearing
is now explicit because applyGlobalPromptQuiet refuses empty text.
2026-08-22 22:09:35 +03:00
digital-garbage 95fb87db0d fix(editor): dismissing pipeline setup could be undone by an in-flight reopen
chooseFamily reopens the modal after three round-trips, so a close during
that window was reverted. User closes now supersede pending continuations.
2026-08-22 20:06:27 +03:00
digital-garbage 641263c4a4 feat(models): name FunPack's own nodes, wire many outputs on add
Built-in loaders show an icon and a plain name instead of their class;
third-party nodes keep theirs. The add-node panel reuses the node page's
multi-destination editor, gate included.
2026-08-22 19:57:54 +03:00
digital-garbage b1ce5bc605 feat(editor): reverse a clip, picture and audio
No CSS equivalent, so a reversed clip always takes the preview-segment
path instead of the raw source. Guarded on frame count: ffmpeg's reverse
buffers the whole clip, and a wrong-direction render is worse than an error.
2026-08-22 19:42:40 +03:00
digital-garbage ad55692847 feat(editor): flip, crop and fill-frame on timeline clips
Preview and render share one geometry_filters() definition so they cannot
drift. Effects are now visible on the clip and clearable; back-fill new
presets into libraries that predate them.
2026-08-22 19:39:48 +03:00
digital-garbage f31401760d feat(editor): double-click media to set a clip's anchor
The inner <img> hijacked the card's drag with a native image drag, so the
drop payload was a URL, not a media id — and it got worse the bigger the
image. Opt the image out and give the drag a cheap ghost.
2026-08-22 19:35:44 +03:00
digital-garbage 897efde50d fix(player): a media reset left the preview stuck on "loading" forever
Recovery keyed on v.error, which a reset never sets, so nothing restarted
the load and _isSeeking() froze the transport at readyState 0. Play took
the same wait-for-metadata branch, so it was a no-op.
2026-08-22 19:30:38 +03:00
digital-garbageandClaude Opus 5 7e2818b3b7 feat: detect the model family from the checkpoint, not a button
Reads the safetensors header's key names (same signatures core uses), so the
pipeline wires for whatever is actually loaded. An unidentifiable file proposes
no family rather than defaulting to LTX. Frame geometry migrates on change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 19:08:39 +03:00
digital-garbageandClaude Opus 5 e985f62115 docs: changelog for family-aware settings
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 18:57:02 +03:00
digital-garbageandClaude Opus 5 9f04f1de01 feat(editor): hide settings the loaded model cannot use
Family is known at loader-save, so Engine Settings drops H3-dead knobs (and
LTX-dead h3_audio_clock) instead of explaining them per run. Values survive a
family switch; the now-redundant main-window chips are removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 18:56:25 +03:00
digital-garbageandClaude Opus 5 d77b3e2eed docs: record why clone_latent's nested-tensor aliasing is safe
_refine_latent rejects nested latents at the door and every other caller
returns the clone unmodified, so the alias is unreachable. Noted so the next
audit does not re-open it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 18:53:06 +03:00
digital-garbageandClaude Opus 5 c96186aaee revert: roadmap belongs in local memory, not the public repo
Plans are not published unless asked; docs/ is node reference material.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 18:50:18 +03:00
digital-garbageandClaude Opus 5 d7d05879fd maint: drop chain_layout's dead latent-frame helpers
expected_latent_frames had one caller (latent_overlap_frames), which the test
only imported and never called. The live layout path reads the sampler's own
scene_playback numbers. Tests: 968 passed, same as baseline.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 18:37:51 +03:00
digital-garbageandClaude Opus 5 e6ea5a6ba7 maint: remove the negative prompt advisor, start a roadmap
Unreferenced, and negatives do not exist at CFG=1 where most generation happens.
Drops _v2_negative_prompt_advisor and its two private helpers (131 lines);
_v2_negative_text_conflicts_with_request keeps 2 live callers and stays.
Tests: 968 passed, same as baseline.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 18:35:56 +03:00
digital-garbageandClaude Opus 5 d7267ba7a8 feat: finish the reporting sweep on the feature paths
14 more silent no-ops made audible: conditioning memory blend/repel/rollback,
Bounded Attention, ALG blur, guide image load, identity install, wired pins,
shortcut expansion. Both hook-removal leaks now name the restart.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 18:03:57 +03:00
digital-garbageandClaude Opus 5 49ad84db45 feat: report failures, stop repeating standing conditions
One mechanism for both: failed() names the attempt, the error and the effect on
the output, once per run; note_on_change states a standing condition once and
again only when it changes. 13 silent no-ops made audible, 4 repeats silenced.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 17:59:01 +03:00
digital-garbageandClaude Opus 5 7854cb2e95 revert: the player retry fix was based on a wrong root cause
_ensureVideo already registers the url on both the create and reuse paths, so
window-materialized elements always could retry; the added registration was a
no-op and its comment described a bug that does not exist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 17:37:46 +03:00
digital-garbageandClaude Opus 5 f601dffce0 docs: changelog for the player retry fix
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 17:25:26 +03:00
digital-garbageandClaude Opus 5 2adb8c462c fix(player): clips materialized during playback could never retry
_classifyVideoError requires _urlClips registration and only _syncPool
registered, so anything the sliding window added mid-playback was stuck on
"Loading" after one transient error.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 17:25:06 +03:00
digital-garbageandClaude Opus 5 52c8c6aed7 fix(editor): the linked-prompt hint promised a match it did not deliver
Project - Prompt (global) omits the postfix Studio appends to every scene, so
a linked node encoded less than Studio with no clue; the postfix is where
audio directions usually live.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 02:10:49 +03:00
digital-garbageandClaude Opus 5 a571e0ec7c fix(studio): say when a wired conditioning is being ignored
CLIP wins whenever it is connected and the wired CONDITIONING is never read;
the ownership label that knew this was computed and thrown away.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:58:11 +03:00
digital-garbageandClaude Opus 5 733266388b fix(sampler): gate steering on schedule position, not absolute sigma
H3's shifted schedules keep sigma high to the end, so max(0, 1-2*sigma) gave
the rating wrappers 0 of 4 steps on turbo and 4 of 20 at shift 3 while they
reported active. Read the base grid off the schedule; report the window.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:55:27 +03:00
digital-garbageandClaude Opus 5 e409ac8f82 fix(sampler): the value function path steered without saying so
Only the fixed-direction fallback announced its lift, so a working value
function was indistinguishable from nothing happening.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:50:25 +03:00
digital-garbageandClaude Opus 5 3e6cb7fbb3 fix(sampler): ask the value function for a gradient in its own space
Fitted on raw conditioning, it was handed H3's refined tensor and threw every
step; the run fell back to the fixed direction while reporting VF steering.
Take the gradient at the raw cond, lift it, cache it per scene.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:40:32 +03:00
digital-garbageandClaude Opus 5 68515b3825 fix(sampler): carry taste directions into the space the model consumes
H3 refines conditioning in extra_conds, so c_crossattn is 5376-dim hidden
state while the taste store holds 5120-dim raw text: embed_guidance raised,
score_slider swallowed it and steered nothing. Lift via the model's own
preprocessor; same bridge fixes DynaShift's prompt weighting.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:35:40 +03:00
digital-garbageandClaude Opus 5 1c4d449a83 fix(sampler): resample H3 keyframe pins when a second pass resizes the latent
A pin is packed as condition rows, so its token count belongs to the grid it was
encoded on and upscale_2x crashed the model placing it. LTX guides are dropped
here; on H3 the pin is the anchor, so it is brought along instead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:26:07 +03:00
digital-garbageandClaude Opus 5 fce300cf48 feat(second pass): a resample factor, honoured only where it is real
H3's resizer interpolates to a requested size and takes 1.0-4.0; Lightricks' is a
fixed 2x network and now says it ignored the value instead of rounding quietly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:16:07 +03:00
digital-garbageandClaude Opus 5 e1cd94104a fix(editor): the upsampler hint promised an LTX download that H3 refuses
'auto' will not fetch a 128-channel file for a 24-channel model, so the old text
sent H3 users to wait at the console for a download that never starts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:13:24 +03:00
digital-garbageandClaude Opus 5 6bcd869d4e fix(sampler): carry_i2v_guides and mid_scene_guide had no H3 path
Both did LTX latent surgery unguarded: prepending frames off H3's 5k+2 grid and
attaching conditioning it never reads. Carry now pins the original reference at
frame 0; a mid-clip guide declines by the same rule as every other H3 pin.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:09:36 +03:00
digital-garbageandClaude Opus 5 a9d2c0d9f0 feat(detailing): load MiniMax H3's latent upscaler natively
ComfyUI has no branch for this architecture, so the only published 24-channel
upsampler needed its own node pack — and second_pass_op on H3 needs a 24-channel
one to run. Shape and statistics come off the checkpoint; it owns its normalisation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:03:43 +03:00
digital-garbageandClaude Opus 5 d4a69eb873 fix(sampler): H3 scenes continue from the previous one, not just next to it
H3 has no latent conditioning, so a carried tail was noise it could overwrite:
the seam matched and the rest of the shot knew nothing about the scene before it.
The previous scene's last latent frame becomes this scene's frame-0 pin.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 23:59:27 +03:00
digital-garbageandClaude Opus 5 71777a9f29 fix(second pass): name the upsampler ComfyUI cannot load, instead of its traceback
Core's latent-upscale loader is an if/elif with no else, so an unrecognised file
falls off the end as "cannot access local variable 'model'". The architectures it
knows are probed here first, and an unknown one is reported by name and key shape.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 23:56:10 +03:00
digital-garbageandClaude Opus 5 a4839c36f2 refactor(loaders): SLA composes with the attention backend instead of replacing it
It is a toggle now, not a value in the list: SLA takes H3's packed self-attention
and the chosen backend takes the text refiner, masked calls and dense-last steps.
When SLA does not take, the chosen backend is still installed on its own.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 23:36:01 +03:00
digital-garbageandClaude Opus 5 caf13f4ed9 feat(loaders): SLA block-sparse attention for MiniMax H3
Picked in the diffusion model loader's attention list, not wired as a node.
Six settings folded under Advanced; offered only where CUDA and Triton run it
and ignored on any model that is not H3. Kernel vendored from LightX2V.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 23:06:15 +03:00
digital-garbageandClaude Opus 5 7ae308f261 fix(models): a project's graph is no longer the template for new projects
Saving a pipeline mirrored it into the global default, so every later project
adopted an imported workflow. Only FunPack's own seeded loaders travel now; the
family is recorded on its own. Also: creating a linked input no longer self-aborts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 22:56:28 +03:00
digital-garbageandClaude Opus 5 33aaa1b883 fix(models): expose Studio's positive_conditioning; ignore dead pass-throughs
A CONDITIONING output had no port to reach in guided mode. It wires explicitly
only — it replaces the typed prompt. An unwired pass-through no longer counts as
a source, which had made every CLIP consumer read as ambiguous.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 19:46:31 +03:00
digital-garbageandClaude Opus 5 65814fa590 fix(models): H3's image-to-video latent had nowhere to wire
Studio's latent port does not exist in this family, so the node could be added,
filled in and never connected. Its LATENT and keyframe CONDITIONING now reach the
sampler, with a test that every open core input stays reachable in both families.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 19:30:40 +03:00
digital-garbageandClaude Opus 5 614ce0a196 feat(models): the LoRA loader gets a real picker; advanced inputs fold away
Rows are picked from a searchable list of installed files instead of typed into a
table of dropdowns, and an input the node calls advanced (the trained stack) is
folded away unless something feeds it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 19:29:35 +03:00
digital-garbageandClaude Opus 5 e93ad88ec8 fix(models): a new project starts as FunPack's loaders, not as the last import
An imported workflow was copied into every new project, so a fresh wizard setup
handed the user third-party loaders to wire. It now seeds FunPack's own and
carries the picked files across; an audio VAE feeds the audio latent too.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 19:25:45 +03:00
digital-garbageandClaude Opus 5 eb78f35a1e fix(sampler): sweep leaked hooks below the blocks; log a hook census per run
v2a scale and bounded attention install on attn2 / video_to_audio_attn, which the
block-only sweep never reached and never tagged. The census prints what is still
installed before sampling, so a count that grows is proof rather than a hunch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 19:14:24 +03:00
digital-garbageandClaude Opus 5 aa08b909f3 feat(models): seed the LoRA loader; empty list passes the model through
Empty is a working state now, logged as "No active LoRAs", so the hop every
LoRA needs is already wired into a fresh pipeline.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 19:09:33 +03:00
digital-garbage 41bba44b54 feat(models): a new project starts as FunPack's loaders, already wired
Seeded server-side on first read, once, per family — plus the family's own plumbing, so
nothing required is left to wire by hand. A seed never reaches the global default, which
would replace configured loaders with empty ones. Wizard and node picker follow.
2026-08-20 19:01:59 +03:00
digital-garbage 8d4a199e1f feat(sampler): second pass and segmented detailing on any model family
Both were switched off on H3 because Lightricks' upsampler is 128-channel — a fact about
the file, not the family. They now load any upsampler ComfyUI can (core's loader handles
the rest), refuse a mismatched one by name, and never download the LTX file for H3.
2026-08-20 18:38:36 +03:00
digital-garbage 1efa4ce5b2 feat(models): list inputs, loaders pinned to the top, auto-rewire on remove
A funpack_list widget renders as rows with Add/reorder/remove instead of raw JSON.
Loaders sit in a pinned section above everything else; imported workflows fall back to
what a node outputs. Removing a node joins its neighbours, the way ComfyUI's delete does.
2026-08-20 18:32:35 +03:00
digital-garbage 3837f8fc95 feat(loaders): FunPack diffusion/CLIP/VAE loaders; LoRA loader works alone
Quantization + a per-model attention backend read from ComfyUI's own registry, so only
installed ones are offered. The LoRA loader now takes its own list and scores wrapper
prefixes against the model's key map, instead of applying a diffusers LoRA as a silent no-op.
2026-08-20 18:20:16 +03:00
digital-garbage 9d15a2726f feat(models): bypass a whole group; fix bypassing connected nodes
The group button just sets the per-node bypass every card already has. The builder was
judging each node against a graph still holding its doomed siblings, so it refused any
bypass of connected nodes and left chains pointing at deleted ones — an output read only
by other leaving nodes needs no pass-through, and a leaving consumer needs no repair.
2026-08-14 23:54:22 +03:00
digital-garbage f3c8e33f47 feat(models): node groups and search
Groups come from the workflow's own group boxes and from each subgraph's name, so what
the author organised survives import. A group is a VIEW — nodes stay flat, every wire
keeps its real endpoints, there is no inside to navigate into. Search covers class, label,
widget names and values (model files) and socket types; it overrides folds.
2026-08-14 23:45:15 +03:00
digital-garbage b6163e9070 fix(import): resolve KJNodes Set/Get instead of importing them as nodes
They exist only in web/js/setgetnodes.js — no Python class — so the frontend resolves
them away and emitting one queues a type the backend has never heard of. Links are
re-pointed past each pair; a Get with no Set leaves the input unwired rather than dangling.
2026-08-14 23:24:08 +03:00