Commit Graph
135 Commits
Author SHA1 Message Date
Ewald 16366a3e8c Merge main into feat/bulk-rating and rebuild dist 2026-11-06 21:42:54 +01:00
Ewald 47ab18a739 Fix type errors in bulk rating UI and tests 2026-11-06 08:48:25 +01:00
Ewald 6d9596177b Fix type errors in the empty trash tests 2026-11-06 08:48:25 +01:00
Wiley Walarus 7357b7d4f7 Merge remote-tracking branch 'upstream/main' into feat/empty-trash
# Conflicts:
#	dist/chunks/FloatingViewer--x61GAzy.js
#	dist/chunks/FloatingViewer-C1eZh1RI.js
#	dist/chunks/FloatingViewer-DhwnucdW.js
#	dist/chunks/LiveStreamTracker-C_DbXPzd.js
#	dist/chunks/LiveStreamTracker-D7_0rdMr.js
#	dist/chunks/LiveStreamTracker-TJKzCtmY.js
#	dist/chunks/TagsEditor-CoihV7nA.js
#	dist/chunks/TagsEditor-MUk741GH.js
#	dist/chunks/TagsEditor-azyI3gio.js
#	dist/chunks/ViewerPortal-C-jJfeZ8.js
#	dist/chunks/ViewerPortal-Sv96pbcb.js
#	dist/chunks/ViewerPortal-uMD2UO3H.js
#	dist/chunks/client-BvjF14km.js
#	dist/chunks/config-C9a-wT5M.js
#	dist/chunks/config-DuYSTOIQ.js
#	dist/chunks/floatingViewerManager-B_I-SRbd.js
#	dist/chunks/floatingViewerManager-DKKiRaIT.js
#	dist/chunks/floatingViewerManager-fDjzEWML.js
#	dist/chunks/genInfo-CeqJwWZi.js
#	dist/chunks/genInfo-CqefQj0f.js
#	dist/chunks/genInfo-Dk8cerKp.js
#	dist/chunks/generationSectionState-C3QjLGhL.js
#	dist/chunks/generationSectionState-CvxAWtdW.js
#	dist/chunks/generationSectionState-DuXxSw-j.js
#	dist/chunks/tooltipShortcuts-B6df4adU.js
#	dist/chunks/tooltipShortcuts-BhVUSZWz.js
#	dist/chunks/tooltipShortcuts-Ury2eTek.js
#	dist/entry.js
2026-11-05 10:18:05 -08:00
Wiley Walarus b57aef737e Merge remote-tracking branch 'upstream/main' into feat/bulk-rating
# Conflicts:
#	dist/chunks/FloatingViewer--x61GAzy.js
#	dist/chunks/FloatingViewer-DhwnucdW.js
#	dist/chunks/FloatingViewer-XL2VdSI7.js
#	dist/chunks/LiveStreamTracker-8JqZRAHJ.js
#	dist/chunks/LiveStreamTracker-C_DbXPzd.js
#	dist/chunks/LiveStreamTracker-D7_0rdMr.js
#	dist/chunks/TagsEditor-CoihV7nA.js
#	dist/chunks/TagsEditor-De8cQTQE.js
#	dist/chunks/TagsEditor-MUk741GH.js
#	dist/chunks/ViewerPortal-BCfI-otY.js
#	dist/chunks/ViewerPortal-Sv96pbcb.js
#	dist/chunks/ViewerPortal-uMD2UO3H.js
#	dist/chunks/config-C9a-wT5M.js
#	dist/chunks/config-DuYSTOIQ.js
#	dist/chunks/config-dihyfQy1.js
#	dist/chunks/floatingViewerManager-B_I-SRbd.js
#	dist/chunks/floatingViewerManager-BzzaeMOl.js
#	dist/chunks/floatingViewerManager-DKKiRaIT.js
#	dist/chunks/genInfo-CqefQj0f.js
#	dist/chunks/genInfo-Dk8cerKp.js
#	dist/chunks/genInfo-xXAhWbtu.js
#	dist/chunks/generationSectionState-BX83mf43.js
#	dist/chunks/generationSectionState-CvxAWtdW.js
#	dist/chunks/generationSectionState-DuXxSw-j.js
#	dist/chunks/tooltipShortcuts-B6df4adU.js
#	dist/chunks/tooltipShortcuts-BCONAm3l.js
#	dist/chunks/tooltipShortcuts-Ury2eTek.js
#	dist/entry.js
2026-11-05 10:18:05 -08:00
Ewald 9c01b9cab7 Fix bulk delete test typing for the typecheck:tests gate 2026-11-05 11:41:59 +01:00
Ewald b9550bbc5f Merge pull request #280 from johnbuck/fix/bulk-delete-endpoint
Rebuild dist after merging
2026-11-05 11:36:23 +01:00
Ewald 9a8242ce4c Ignore temp previews in the sidebar asset badge
A generation with a compare node indexes two temp preview files next to
the output, so one generation showed a badge of 3. Skip assets whose
source is temp.
2026-11-05 10:22:55 +01:00
Wiley Walarus 9fa4f681ef style(ui): revert unrelated StatusDot formatting 2026-11-04 14:07:10 -08:00
Wiley Walarus 1af8ff149d fix(ui): keep the empty-trash panel wiring quiet when the client is mocked 2026-11-04 12:49:58 -08:00
Wiley Walarus f9d2d17100 Merge remote-tracking branch 'upstream/main' into feat/empty-trash
# Conflicts:
#	dist/chunks/FloatingViewer--x61GAzy.js
#	dist/chunks/FloatingViewer-Bz47Jc0X.js
#	dist/chunks/FloatingViewer-D8bHMZQk.js
#	dist/chunks/LiveStreamTracker-3cOrqzaO.js
#	dist/chunks/LiveStreamTracker-CIt2lOUV.js
#	dist/chunks/LiveStreamTracker-C_DbXPzd.js
#	dist/chunks/SidebarWorkflowSection-CNCP5dlO.js
#	dist/chunks/TagsEditor-aRJPpygc.js
#	dist/chunks/Viewer-kUNEcWpp.js
#	dist/chunks/ViewerPortal-CaLKlqFj.js
#	dist/chunks/config-C9a-wT5M.js
#	dist/chunks/events-7GBcKIuJ.js
#	dist/chunks/events-tsQFsZrH.js
#	dist/chunks/floatingViewerManager-DjQlwRgo.js
#	dist/chunks/genInfo-3GnsjPmc.js
#	dist/chunks/model3dRenderer-C6r7uHPh.js
#	dist/chunks/openMajoorSettings-IdB9HDLb.js
#	dist/chunks/openMajoorSettings-o-KvlZWK.js
#	dist/chunks/sideBySide-By4kool7.js
#	dist/chunks/tooltipShortcuts-Ury2eTek.js
#	dist/chunks/viewerOpenRequest--9P9UGeN.js
#	dist/chunks/viewerRuntimeHosts-C-jwQQuE.js
#	dist/entry.js
2026-11-04 12:37:13 -08:00
Wiley Walarus f89f35734e Merge remote-tracking branch 'upstream/main' into feat/bulk-rating
# Conflicts:
#	dist/chunks/FloatingViewer--x61GAzy.js
#	dist/chunks/FloatingViewer-CoLKFy-V.js
#	dist/chunks/FloatingViewer-D8bHMZQk.js
#	dist/chunks/LiveStreamTracker-CIt2lOUV.js
#	dist/chunks/LiveStreamTracker-CXMPWBuu.js
#	dist/chunks/LiveStreamTracker-C_DbXPzd.js
#	dist/chunks/SidebarWorkflowSection-D5MpDsey.js
#	dist/chunks/TagsEditor-BPt1aTVO.js
#	dist/chunks/Viewer-DjRdwzYB.js
#	dist/chunks/ViewerPortal-CENQ3UGt.js
#	dist/chunks/config-C9a-wT5M.js
#	dist/chunks/events-C9AjbLbS.js
#	dist/chunks/events-tsQFsZrH.js
#	dist/chunks/floatingViewerManager-B5hXkzSo.js
#	dist/chunks/genInfo-Cy9XpLCK.js
#	dist/chunks/model3dRenderer-DiKG1134.js
#	dist/chunks/openMajoorSettings-DVq-b2TJ.js
#	dist/chunks/openMajoorSettings-IdB9HDLb.js
#	dist/chunks/sideBySide-DKS5-27I.js
#	dist/chunks/tooltipShortcuts-Ury2eTek.js
#	dist/chunks/viewerOpenRequest-CHrdpRvN.js
#	dist/chunks/viewerRuntimeHosts-CzzbsByu.js
#	dist/entry.js
2026-11-04 12:37:12 -08:00
Wiley Walarus 77a96d110c Merge remote-tracking branch 'upstream/main' into fix/bulk-delete-endpoint
# Conflicts:
#	dist/chunks/FloatingViewer--x61GAzy.js
#	dist/chunks/FloatingViewer-ChLkunrC.js
#	dist/chunks/FloatingViewer-D8bHMZQk.js
#	dist/chunks/LiveStreamTracker-Bm3iSgMa.js
#	dist/chunks/LiveStreamTracker-CIt2lOUV.js
#	dist/chunks/LiveStreamTracker-C_DbXPzd.js
#	dist/chunks/SidebarWorkflowSection-Il8h_Lxt.js
#	dist/chunks/TagsEditor-DIWU3BJ3.js
#	dist/chunks/Viewer-CVh8T5Ff.js
#	dist/chunks/ViewerPortal-CYbu70-Q.js
#	dist/chunks/config-C9a-wT5M.js
#	dist/chunks/events-Dsaaq7CE.js
#	dist/chunks/events-tsQFsZrH.js
#	dist/chunks/floatingViewerManager-DQlULmZ-.js
#	dist/chunks/genInfo-_xs-pT8h.js
#	dist/chunks/model3dRenderer-DNsnm5Az.js
#	dist/chunks/openMajoorSettings-CJdCbICp.js
#	dist/chunks/openMajoorSettings-IdB9HDLb.js
#	dist/chunks/sideBySide-CioDf4i3.js
#	dist/chunks/tooltipShortcuts-Ury2eTek.js
#	dist/chunks/viewerOpenRequest-SXvGdj01.js
#	dist/chunks/viewerRuntimeHosts-BVuaPEIm.js
#	dist/entry.js
2026-11-04 12:37:10 -08:00
Wiley Walarus 72ac801372 feat(ui): Empty trash action in the status panel 2026-11-04 12:27:39 -08:00
Wiley Walarus 615b76f409 feat(ui): rate multi-card selections in one batch
The 0-5 hotkeys and the grid "Set rating (N selected)" submenu now send
chunked batch requests (<=500 ids, sequential) via updateAssetsRatingBulk
instead of one per-asset request per card, with per-asset
mjr:asset-rating-changed events, a progress toast on multi-chunk runs and
an "N rated, M failed" summary on partial failures. Single-card paths
are unchanged.
2026-11-04 11:55:48 -08:00
Wiley Walarus 0f23422dc2 fix(grid): delete multi-card selections through the bulk endpoint 2026-11-04 11:14:44 -08:00
Ewald ALOEBOETOE 39defc3471 Fix floating viewer compare modes with the Studio player
- Tag the Studio player's video with the media class the floating viewer
  uses, so zoom, pan, exposure/channel tone and overlay guides apply to it
  in A/B, side by side and grid like they do to the other slots.
- Stop the A/B divider above the player controls instead of drawing over
  them.
- Keep B's aspect ratio when comparing images of different sizes in the
  Studio viewer.
2026-11-04 13:39:16 +00:00
Ewald ALOEBOETOE e7b2d306ab Keep the floating viewer topbar button next to Run after a reload
The Run group is rendered asynchronously inside the actionbar, and the
observer only watched the actionbar's direct children, so the button stayed
at the end once Run appeared. Observe the subtree and re-anchor when the
button is not right after the Run group.
2026-11-04 13:22:06 +00:00
Ewald ALOEBOETOE 6b4f14beae Keep the Studio player controls visible in floating A/B compare
With the Studio player on A, put layer A on top and clip only its picture
at the divider (B shows underneath), instead of clipping B over A, which
hid the right half of the player controls.
2026-11-04 13:18:05 +00:00
Ewald ALOEBOETOE 9ed8759fb1 Use the Studio player in every floating viewer mode and restore light dismiss
- Floating viewer compare modes (A/B, side by side, grid) now build their
  primary video/audio with the Studio player, like the simple mode. The
  legacy video controls, their media bridge, styles and tests are removed;
  only the sidebar's preview controls remain.
- The Studio viewer closes again when the empty area around the picture is
  clicked (quick click only, so panning never dismisses it).
2026-11-04 13:12:33 +00:00
Ewald ALOEBOETOE ee5bc6ead5 Remove the classic viewer and its player; keep only the Studio viewer
The Studio viewer now covers everything the classic overlay did, so the
classic runtime (toolbar, panzoom, A/B and side-by-side engine, scopes,
loupe, probe, grading and WebGL video processors, filmstrip, context menu,
keyboard handling), its styles and its tests are deleted.

- Every open request goes to the Studio viewer; requestViewerOpen no longer
  falls back to a viewer singleton.
- Drop the classic-only settings (use classic viewer, pan without zoom,
  disable WebGL) and their internal options and constants.
- Studio tells the grid which asset it ended on when it closes, and the
  rating hotkeys yield to it while it is open.
- Remove dead helpers left behind (image processor, media player helpers,
  3D helpers, metadata block, viewerbar controls variant) and unused CSS.
- Update the viewer tutorial, hotkeys doc and changelog.
2026-11-04 13:04:25 +00:00
Ewald ALOEBOETOE 71c2ee9bfd Bring the classic viewer's review tools to the Studio viewer as a HUD
A tool rail on the left of the stage adds channels, exposure and gamma,
zebra, histogram and waveform scopes, composition guides, aspect masks,
pixel probe, loupe, copy to clipboard and A/B compare (wipe, side by side,
difference, add, subtract, multiply, screen) with B selection, pin and
swap. Colour tools are SVG filters so they also apply to playing video;
video compare keeps a second player in sync.

3D models and the A/B / side-by-side open modes now use the Studio viewer,
audio files show a live spectrum, and the inspector's tag editor no longer
steals focus after navigating.
2026-11-04 12:46:18 +00:00
Ewald ALOEBOETOE 03f128305b Use the Studio player in the floating viewer and refresh its look
- Simple mode renders video and audio with the Studio player through
  mountStudioPlayerHost, which honours the floating viewer's player-host
  contract (togglePlay / stepFrames / destroy handle, inner media element
  for mute/speed persistence) and releases media on teardown. Falls back
  to the legacy player for images, 3D, compare modes, mount failures
  and the "classic viewer" setting.
- StudioPlayer gains initial mute/speed, a compact width-aware variant
  and an autoplay that retries muted when sound is blocked.
- CSS-only refresh of the floating window aligned with the Studio
  viewer; popped-out / desktop-expanded windows stay square.
2026-11-04 11:47:21 +00:00
Ewald ALOEBOETOE 36cb53eff7 Add the Studio viewer as the new default main viewer
A simpler, review-first main viewer built in Vue, routed through the
existing OPEN_VIEWER event so every caller keeps working:

- Header with navigation, file summary and actions; zoom/pan image
  stage (cursor-anchored wheel zoom, fit/1:1, transparency checker).
- New video/audio player: frame stepping and counter, A-B loop, loop,
  speed, volume, fullscreen, save frame as PNG, auto-hiding controls;
  media is released on change/close.
- Inspector reusing the asset sidebar's rating, tags, generation,
  workflow and file components, hydrated with the viewer metadata
  cache; filmstrip windowed for large lists; keyboard shortcuts.
- The classic viewer stays for A/B and side-by-side compare, 3D models
  and its analysis tools, and as an opt-in setting.
2026-11-04 11:24:57 +00:00
Ewald ALOEBOETOE 4a19fc81a5 Fix remaining issues from the integration audits
- Watcher: a sidecar JSON created or edited next to an unchanged media
  file now invalidates that file's metadata cache and scan journal and
  forces a re-extraction; a non-incremental re-index no longer skips
  assets that already have a metadata row when the cache was cleared.
- Merge index rows that are one file under different Windows path
  spellings at startup, keeping the best rating, all tags, the stack
  cover, execution ids and the vector embedding.
- Remove deleted/removed assets from the generated feed too.
- Scope the floating viewer's single-letter shortcuts to the viewer
  (pointer, focus or pop-out) instead of the whole page.
- Take LGraph/LGraphCanvas types from comfyui-frontend-types and drop
  @comfyorg/litegraph; delete five dead frontend files.
- Fix an order-dependent test that leaked an input-directory override.
2026-11-04 08:48:26 +00:00
Ewald ALOEBOETOE 6cafe5cc42 Fix search syntax errors, sidecar JSON, workflow JSON recognition, MFV media leak
- Search: tokens were filtered down to nothing for inputs like "at-7",
  "(2)", "AND", a single letter or a lone quote, producing an empty FTS
  MATCH and "Invalid search query syntax". Fall back to the raw words,
  treat punctuation-only input as browse-all, keep non-Latin scripts and
  fold accents on Latin letters only (as FTS5 unicode61 does).
- Sidecar JSON (<file>.<ext>.json, then <stem>.json) now supplies the
  workflow/prompt/generation data of images, videos and audio when none
  is embedded; shared with the 3D extractor; BOM tolerated.
- Workflow tab: skip hidden folders (.history version snapshots were
  listed as workflows), only list UI exports, API prompts and wrappers,
  read with utf-8-sig, drop invalid JSON from the index (version 5),
  and load API-format workflows with app.loadApiJson.
- Floating viewer: release (not just pause) videos before re-rendering
  and on dispose, so Live mode no longer accumulates media players.
2026-11-04 08:26:47 +00:00
Ewald ALOEBOETOE 4407289e42 Fix duplicate-stack render loop and wrong duplicate grouping
- Clicking a duplicate-stack badge could freeze ComfyUI: displayAssets,
  the per-card ref callback (syncRenderedDuplicateCards) and the live
  upsert dedupe each rewrote _mjrDupStack/_mjrDupMembers on reactive
  assets read by the grid template, with a new array every pass and
  conflicting representatives. The ref callback ran on every render, so
  each write scheduled another render (no recursion limit in prod Vue).
- Compute duplicate stacks only in buildDisplayAssets with change-guarded
  writes and stable member arrays; keep one ref callback per card; stop
  the other passes from touching duplicate fields.
- A duplicate is now the same name in the same source/root/subfolder:
  files sharing a name in different folders are no longer stacked,
  hidden from the grid or given another file's generation time.
- The duplicates view lists every copy using cycle-free member copies.
- Add regression tests (render-loop idempotence, folder scoping).
2026-11-04 08:11:01 +00:00
Ewald ALOEBOETOE 49bf320631 Fix asset sync for new, moved and deleted files
- Fix assets_fts triggers: the external-content FTS5 table was updated
  with plain UPDATE/DELETE, so every rename or move failed with
  "database disk image is malformed" and the watcher fell back to
  delete + re-index, losing ratings, tags and collections. Use the FTS5
  'delete' command, limit the update trigger to filename/subfolder and
  repair existing databases (plus an FTS rebuild) at startup.
- Wait for the prompt history entry before post-execution ingestion:
  ComfyUI fires on_prompt_end before task_done() stores history, so
  outputs of prompts queued from the API or another client could be
  missed.
- Scan prune only removes assets whose absence is confirmed; a stat
  error or an unreadable scan root no longer deletes user data. Report
  pruned assets instead of SQLite change counts.
- Emit mjr-assets-removed for watcher deletes and scan prunes and
  mjr-asset-updated for moves so open grids update in place.
- Annotate mjr-scan-complete with origin and needs_refresh; reload the
  grid once when live events cannot cover a change and summarise a
  finished directory scan in one ComfyUI core toast.
- Document the comparison with ComfyUI core's asset system.
2026-11-04 08:01:26 +00:00
Ewald ALOEBOETOE b6f6082f4f Move Majoor notifications onto ComfyUI core toasts
- Use the typed ToastManager API (success/error/info/warning/loading)
  instead of the deprecated add(); add() stays as a fallback for older
  frontends.
- Accept a toast manager without add() so toasts keep working once
  ComfyUI drops the deprecated methods.
- Tracked operations (DB restore/reset, vector backfill) show one
  loading toast updated in place via its ToastId instead of stacking a
  toast per step; dismiss them on extension teardown.
- Persistent toasts use the largest safe timer delay instead of
  Infinity; history action links become native toast action buttons
  (http(s) or same-origin paths only).
- Route genInfoOverridePicker and comfyAlert through the core toast API;
  drop the app.ui.toast fallback, the no-op fallback dismisser and the
  unused .mjr-toast CSS.
- Keep the Majoor message center as a read-only history; it no longer
  pops open by itself on reset/backfill.
- Document the notification audit.
2026-11-04 07:38:14 +00:00
Ewald ALOEBOETOE d0ab7d594e Resolve remaining ComfyUI integration conflicts
- Move the read-only OpenAPI compat surface from /api/v2/assets to
  /mjr/am/compat/assets so it never squats ComfyUI core's /api namespace;
  the legacy alias is opt-in via MJR_AM_LEGACY_API_V2_ASSETS=1.
- Allow Python 3.14 (requires-python <3.15) and add 3.14 to CI and tox.
- Stop wrapping api.queuePrompt: progress tracking now resolves the
  running prompt from the core Jobs API (getJobDetail), then /queue and
  /history, driven by websocket events. Remove wrapHostQueuePrompt.
- Add opt-in Majoor.Integration.HideNativeAssetsTab setting that hides
  ComfyUI's native Assets sidebar tab through the official
  getSidebarTabs/unregisterSidebarTab API and restores it when disabled.
- Fix all 913 type errors in tsconfig.test.json and type-check tests in
  CI; drop a duplicated `stubs` key in asset_card_inner test; make
  addToastHistory's type argument optional for the object form.
- Update audit report, changelog, API reference and env var docs.
2026-11-03 21:16:34 +00:00
Ewald ALOEBOETOE fdb0c5b2f1 Align host integration with current ComfyUI frontend/backend
- hostAdapter: serialize the root graph instead of calling the now-async
  graphToPrompt() synchronously (avoids exporting only the open subgraph
  and an unhandled rejection); read dirty state from the workflow store.
- Bump @comfyorg/comfyui-frontend-types to ^1.60.0: 1.57.3 was published
  without index.d.ts, so the official ComfyApp type was silently lost.
- Backend: typed aiohttp request keys (web.RequestKey when available)
  to silence NotAppKeyWarning on aiohttp >= 3.13 and avoid key clashes.
- Fix ruff import-order failures; rebuild dist bundle.
- Add docs/COMFYUI_INTEGRATION_AUDIT.md with remaining conflict risks
  and an integration roadmap.
2026-11-03 21:00:06 +00:00
copilot-swe-agent[bot]andMajoorWaldi 10cfc0a464 Style Scan button to match panel and follow status colors
Co-authored-by: MajoorWaldi <129623145+MajoorWaldi@users.noreply.github.com>
2026-10-25 09:32:55 +00:00
copilot-swe-agent[bot]andMajoorWaldi 14d773f06d Fix custom Inputs indexing and expose an explicit scan button
Co-authored-by: MajoorWaldi <129623145+MajoorWaldi@users.noreply.github.com>
2026-10-24 16:46:36 +00:00
Ewald f093348cf5 fix: resolve collection exports and floating viewer input conflicts 2026-10-23 11:21:08 +02:00
Ewald e72a78f8c8 Fix duplicate grid reloads and the ignored maintenance guard
A global mjr:reload-grid event was handled by both the panel and the assets query controller, so each request reloaded the grid twice. Only the controller handles it now, and it skips the reload while DB maintenance is active.
2026-10-01 13:02:04 +02:00
Ewald 7913d14792 Classify opus, aac, m4a and EXR live outputs in the realtime listener
Also accept tif/tiff and m4v in drag and drop, and rebuild dist/.
2026-10-01 12:18:20 +02:00
Ewald 3cb623139b Fix geninfo sidebar tests for the new disabled-by-default state
These tests construct a bare FloatingViewer and call
_renderGenInfoSidebar() directly to check rendered content, so they
need to opt into the sidebar now that _genSidebarEnabled defaults to
false instead of asserting on it implicitly.
2026-10-01 08:43:50 +02:00
Ewald 9852b937e5 Disable viewer auto-pause and floating viewer gen info by default
VIEWER_PAUSE_DURING_EXECUTION now defaults to false, matching the
settings toggle's own (already-false) displayed default. The Floating
Viewer's gen info sidebar no longer opens automatically; it stays
available on demand via its existing toggle button.
2026-09-30 16:56:20 +02:00
Ewald 1e7c35647a Fix grid-loader listener leak and search autocomplete race
- useGridLoader's pagehide listener is now removed in dispose(), so
  remounting the grid host (scope switches, feed panel) no longer
  accumulates one bound listener per instance for the rest of the
  page session.
- SearchBar's autocomplete now drops stale responses via a sequence
  guard, so an earlier request resolving after a later one can no
  longer overwrite the suggestions for the current query.
2026-09-30 16:56:10 +02:00
Ewald 990071069f Remove automatic GitHub release/update check
The frontend called checkMajoorVersion() unconditionally on startup,
and the backend /mjr/am/releases endpoint made outbound requests to
api.github.com to power it. This violates the no-internet-requests
policy for core ComfyUI code, even for update checks framed as
diagnostic or opt-out. Removes the endpoint, the frontend check, the
now-dead version-update badge dot in HeaderSection.vue, and associated
tests/docs.
2026-09-30 16:55:50 +02:00
copilot-swe-agent[bot]andMajoorWaldi dc0ddec4ca Fix output preview URL parsing and workflow category guard
Co-authored-by: MajoorWaldi <129623145+MajoorWaldi@users.noreply.github.com>
2026-09-26 18:29:31 +00:00
copilot-swe-agent[bot]andMajoorWaldi 0c013c6852 Merge remote-tracking branch 'origin/main' into copilot/fix-majoor-save-image-placeholder
# Conflicts:
#	dist/entry.js

Co-authored-by: MajoorWaldi <129623145+MajoorWaldi@users.noreply.github.com>
2026-09-26 18:18:00 +00:00
copilot-swe-agent[bot]andMajoorWaldi 05ddad11bc Fix Majoor save filename placeholder serialization hook
Co-authored-by: MajoorWaldi <129623145+MajoorWaldi@users.noreply.github.com>
2026-09-26 18:03:06 +00:00
copilot-swe-agent[bot]andMajoorWaldi aa9d28bc53 Merge remote-tracking branch 'origin/main' into fix/registry-runtime-hardening
# Conflicts:
#	dist/chunks/FloatingViewer-AB1oLZ0d.js
#	dist/chunks/FloatingViewer-BVmALIs3.js
#	dist/chunks/FloatingViewer-Cg2hGEZM.js
#	dist/chunks/LiveStreamTracker-0EQGV-lK.js
#	dist/chunks/LiveStreamTracker-BUT5H4M5.js
#	dist/chunks/LiveStreamTracker-DdMfL0ro.js
#	dist/chunks/SidebarWorkflowSection-B4wvtrtQ.js
#	dist/chunks/SidebarWorkflowSection-B_P-QZwl.js
#	dist/chunks/SidebarWorkflowSection-DckvqBNY.js
#	dist/chunks/TagsEditor-B8xpRa5e.js
#	dist/chunks/TagsEditor-BHGoWuSC.js
#	dist/chunks/TagsEditor-cUM_tRt-.js
#	dist/chunks/Viewer-DDNDTRcP.js
#	dist/chunks/Viewer-Dzb5KE6D.js
#	dist/chunks/Viewer-GH30s1No.js
#	dist/chunks/ViewerPortal-BAh1499M.js
#	dist/chunks/ViewerPortal-C-GBMubk.js
#	dist/chunks/ViewerPortal-DvYVQ32S.js
#	dist/chunks/floatingViewerManager-5-IYujSt.js
#	dist/chunks/floatingViewerManager-BVG4XDLW.js
#	dist/chunks/floatingViewerManager-Bnd82Qrd.js
#	dist/chunks/genInfo-Bq-kF66o.js
#	dist/chunks/genInfo-CV-v139t.js
#	dist/chunks/genInfo-CwY4j1FN.js
#	dist/chunks/mjr-primevue-C955bvXT.js
#	dist/chunks/mjr-primevue-DtKnnCVn.js
#	dist/chunks/mjr-primevue-n1rsQYJg.js
#	dist/chunks/mjr-vue-vendor-BU1tBlvz.js
#	dist/chunks/mjr-vue-vendor-CF0zsqr1.js
#	dist/chunks/mjr-vue-vendor-D2GeV7Qd.js
#	dist/chunks/openMajoorSettings-CHrLP8DR.js
#	dist/chunks/openMajoorSettings-DU4OegtI.js
#	dist/chunks/openMajoorSettings-JYq392b-.js
#	dist/chunks/viewerOpenRequest-C4hEgmOj.js
#	dist/chunks/viewerOpenRequest-CzyrZA71.js
#	dist/chunks/viewerOpenRequest-DQQY02Vk.js
#	dist/chunks/viewerRuntimeHosts-CIiyEfr6.js
#	dist/chunks/viewerRuntimeHosts-CuR8T4j6.js
#	dist/chunks/viewerRuntimeHosts-DC1iA_jY.js
#	dist/entry.js
#	mjr_am_backend/features/index/vector_service.py
#	mjr_am_backend/routes/core/request_json.py
#	mjr_am_backend/routes/core/security_proxies.py
#	mjr_am_backend/routes/core/security_tokens.py
#	mjr_am_shared/version.py

Co-authored-by: MajoorWaldi <129623145+MajoorWaldi@users.noreply.github.com>
2026-09-26 17:40:42 +00:00
Ewald 9c5078d174 fix: harden registry packaging and runtime boundaries
Exclude development-only content from Registry packages while retaining runtime
docs and vendor assets. Centralize environment access and media process execution,
validate filesystem inputs, and restrict nested media protocols.

Route update checks through the backend GitHub boundary and read version metadata
without spawning Git. Preserve annotated-tag priority over lightweight nightly
tags, including packed refs, with regression coverage. Rebuild the frontend bundle.

Validation: Python tests with coverage, JS tests, targeted media/version regression
tests, and the canonical Python quality gate.
2026-09-26 19:21:04 +02:00
Ewald f2380168b7 refactor(ui): type AssetsGrid/VirtualAssetGridHost, close out any-reduction (batch 10/final)
Types every remaining any in AssetsGrid.vue (its own state + the
methods matching MjrAssetsGridExpose's signatures) and
VirtualAssetGridHost.vue's props (scrollElement as a real Ref/element
union, onCardRendered/onCardDblclick with their actual call-site
argument shapes using MjrAssetLike).

ui/vue any count: 78 -> 1. The one survivor is MjrGridContainer's
`Record<string, any>` index signature (VirtualAssetGridHost.vue) --
already documented in a comment as deliberate: ~30 heterogeneous
_mjr* properties (functions, Maps, strings, booleans) legacy
controller code reads/writes on the grid container DOM node, where an
`unknown` index signature would force a cast at every one of those
call sites for no real safety gain.

Build + full vitest suite (831 tests) pass. Live-verified against the
running ComfyUI instance.
2026-09-12 01:04:10 +02:00
Ewald 235c6eb522 refactor(ui): type remaining App/ViewerPortal/SummaryBar/SearchBar any usages (batch 9)
App.vue's panel-runtime dispose handle, ViewerPortal's viewer-instance
handle, SummaryBarSection's updateSummaryBar/setFolderBreadcrumb params
(now reusing its own BreadcrumbAction interface instead of any), and
SearchBar's similarPopoverRef (new MjrSimilarSearchPopoverExpose in
componentExposes.d.ts) + metadata-keys cache all get real shapes.

Build + full vitest suite (831 tests) pass.
2026-09-12 01:02:14 +02:00
Ewald a237304d71 refactor(ui): type CollectionsPopover's collection/cluster/idea objects (batch 8)
The specific ask from the last audit follow-up: CollectionsPopover.vue's
collections list, AI cluster results, and smart-suggestion "ideas" now
use MjrCollectionItem/MjrCluster/MjrSmartCollectionIdea from
ui/types/collections.d.ts instead of any. withBusyAction is now generic
over its wrapped function's argument tuple instead of any[], so the
per-callback argument types (no args, MjrCollectionItem, etc.) still
flow through instead of being erased.

Build + full vitest suite (831 tests) pass. Live-verified against the
running ComfyUI instance.
2026-09-12 01:00:07 +02:00
Ewald b78f6e2bd9 refactor(ui): type generation-viewer/workflow-picker/add-to-collection params (batch 7)
GenerationInputThumb's dynamic floatingViewerManager import, WorkflowPickerDialog's
workflow list items, AssetSidebarContent's onUpdate callback, and
AddToCollectionMenu's collections list + addAssetsToCollection() result
all get real shapes instead of any. Adds ui/types/collections.d.ts
(MjrCollectionItem, MjrAddCollectionResult, MjrSmartCollectionIdea,
MjrCluster) shared between AddToCollectionMenu.vue and the next
CollectionsPopover.vue batch.

Build + full vitest suite (831 tests) pass.
2026-09-12 00:59:08 +02:00
Ewald 3fdc738455 refactor(ui): type sidebar/viewer helper params instead of any (batch 6)
PinnedFoldersPopover.normalizeRoot, ViewerMetadataBlock's
looksLikePromptGraph/formatRawMetadata, ViewerPortal's viewer-open
event detail, SidebarSection's _currentAsset/_currentFullAsset (now
MjrAssetLike), SidebarPreviewSection's videoControlsHandle,
SidebarGenerationSection's AlignmentState + branch-accent params,
SidebarFileInfoSection's formatBitDepth, and SidebarWorkflowSection's
minimap render-info object (canvasToWorld/hitTestNode/bounds) all get
real shapes instead of any.

Build + full vitest suite (831 tests) pass.
2026-09-12 00:57:14 +02:00