Skip to content

fix: track nodePreviewImages in usePromotedPreviews for GLSL live preview propagation#9461

Open
christian-byrne wants to merge 4 commits intomainfrom
fix/glsl-promoted-preview-propagation
Open

fix: track nodePreviewImages in usePromotedPreviews for GLSL live preview propagation#9461
christian-byrne wants to merge 4 commits intomainfrom
fix/glsl-promoted-preview-propagation

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Mar 6, 2026

Summary

Fix GLSL shader live preview propagation to SubgraphNode parents, broken after the promoted widget rewrite in #8856.

Changes

  • What: Add nodePreviewImages as a reactive dependency in usePromotedPreviews's computed property. The GLSL live preview renderer writes to nodePreviewImages (via setNodePreviewsByNodeId), not nodeOutputs, so the computed never re-evaluated. The gate now passes if either store has data. getNodeImageUrls already handles the fallback correctly (checks previews first, then outputs).

Review Focus

The fix is a one-line gate change (|| instead of only checking nodeOutputs). Both reactive refs are read to establish Vue dependency tracking, matching the existing pattern.

Screenshots (if applicable)

N/A — preview rendering is identical to pre-#8856 behavior; this restores broken reactivity.

┆Issue is synchronized with this Notion page by Unito

@christian-byrne christian-byrne requested a review from a team as a code owner March 6, 2026 03:50
@christian-byrne christian-byrne self-assigned this Mar 6, 2026
@dosubot dosubot bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Mar 6, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 6, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0ac3c76b-e3f2-4516-8cf6-5bbe11e076d8

📥 Commits

Reviewing files that changed from the base of the PR and between c8f09b9 and 549dd5d.

📒 Files selected for processing (3)
  • browser_tests/tests/subgraphPromotion.spec.ts
  • src/composables/node/usePromotedPreviews.test.ts
  • src/composables/node/usePromotedPreviews.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • browser_tests/tests/subgraphPromotion.spec.ts

📝 Walkthrough

Walkthrough

Adds a reactive nodePreviewImages source for image previews, updates tests to seed and assert previews from that source, strengthens promotionStore reactivity with a version counter and touch logic, and adds a browser test verifying promoted preview rendering in subgraphs.

Changes

Cohort / File(s) Summary
Test infra — promoted previews
src/__tests__/src/composables/node/usePromotedPreviews.test.ts
Added nodePreviewImages to the mock store type and factory, introduced seedPreviewImages, switched mocks to target getNodeImageUrls directly, and added tests for preview-only (GLSL-style) images and re-evaluation after promotions.
Composable — preview dependency
src/composables/node/usePromotedPreviews.ts
Now reads both nodeOutputs and nodePreviewImages when computing promoted previews; skips entries unless images exist in either source; comments updated.
Store — promotion reactivity
src/stores/promotionStore.ts
Added reactive _version counter and _touch() helper; ensured getPromotionsRef and per-graph maps/refs read _version so nested Map mutations propagate; call _touch() after set/move/clear mutations.
Browser tests
browser_tests/tests/subgraphPromotion.spec.ts
Added a Vue-mode test that injects an interior node output (SaveImage) into a subgraph and asserts the promoted preview image renders inside the SubgraphNode.
Manifest / misc
package-manifest (manifest lines changed)
Manifest updated to reflect added/modified tests and files (manifest edits in this diff).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 I nibble new previews in a hop and a cheer,
Seeded URLs bloom where nodes once were clear,
The store ticks its beat, dependents wake anew,
Tests watch the image appear—one, two, woohoo!
A rabbit hops off—happy, with a carrot cue 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 7.69% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: tracking nodePreviewImages in usePromotedPreviews to fix GLSL live preview propagation.
Description check ✅ Passed The description covers all required template sections (Summary, Changes, Review Focus) with clear, specific details about the fix and its scope.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/glsl-promoted-preview-propagation

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Mar 6, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/12/2026, 10:46:35 AM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 6, 2026

🎭 Playwright: ✅ 553 passed, 0 failed · 4 flaky

📊 Browser Reports
  • chromium: View Report (✅ 540 / ❌ 0 / ⚠️ 4 / ⏭️ 10)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 10 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@github-actions
Copy link

github-actions bot commented Mar 6, 2026

📦 Bundle: 4.58 MB gzip 🟢 -94 B

Details

Summary

  • Raw size: 21.5 MB baseline 21.5 MB — 🔴 +279 B
  • Gzip: 4.58 MB baseline 4.58 MB — 🟢 -94 B
  • Brotli: 3.54 MB baseline 3.54 MB — 🔴 +277 B
  • Bundles: 233 current • 233 baseline • 109 added / 109 removed

Category Glance
Graph Workspace 🔴 +147 B (1.01 MB) · Data & Services 🔴 +132 B (2.79 MB) · Vendor & Third-Party ⚪ 0 B (8.9 MB) · Other ⚪ 0 B (8.04 MB) · Panels & Settings ⚪ 0 B (438 kB) · Editors & Dialogs ⚪ 0 B (78.3 kB) · + 5 more

App Entry Points — 17.7 kB (baseline 17.7 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-DV2uaYeb.js (removed) 17.7 kB 🟢 -17.7 kB 🟢 -6.26 kB 🟢 -5.41 kB
assets/index-HBW5liS8.js (new) 17.7 kB 🔴 +17.7 kB 🔴 +6.26 kB 🔴 +5.42 kB

Status: 1 added / 1 removed

Graph Workspace — 1.01 MB (baseline 1.01 MB) • 🔴 +147 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Csd5IdSR.js (new) 1.01 MB 🔴 +1.01 MB 🔴 +213 kB 🔴 +161 kB
assets/GraphView-DNE_kuFt.js (removed) 1.01 MB 🟢 -1.01 MB 🟢 -213 kB 🟢 -161 kB

Status: 1 added / 1 removed

Views & Navigation — 72.5 kB (baseline 72.5 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CNnUhORo.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.82 kB
assets/CloudSurveyView-KyvIBVbS.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.81 kB
assets/CloudLoginView-DKTe20Zr.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.21 kB 🟢 -2.85 kB
assets/CloudLoginView-Gm1wf83I.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.21 kB 🔴 +2.84 kB
assets/CloudSignupView-CKHp7npP.js (new) 9.41 kB 🔴 +9.41 kB 🔴 +2.71 kB 🔴 +2.37 kB
assets/CloudSignupView-D3Q3xBYN.js (removed) 9.41 kB 🟢 -9.41 kB 🟢 -2.71 kB 🟢 -2.38 kB
assets/UserCheckView-Dk8ZWuPE.js (new) 8.42 kB 🔴 +8.42 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/UserCheckView-Dr7MHwOy.js (removed) 8.42 kB 🟢 -8.42 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/CloudLayoutView-CZo2QOcL.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -2.18 kB 🟢 -1.88 kB
assets/CloudLayoutView-lFPwRtRM.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +2.17 kB 🔴 +1.88 kB
assets/CloudForgotPasswordView-B6MzL_uA.js (removed) 5.59 kB 🟢 -5.59 kB 🟢 -1.95 kB 🟢 -1.73 kB
assets/CloudForgotPasswordView-SXgXijjr.js (new) 5.59 kB 🔴 +5.59 kB 🔴 +1.95 kB 🔴 +1.75 kB
assets/CloudAuthTimeoutView-BxgyoYOj.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.79 kB 🟢 -1.57 kB
assets/CloudAuthTimeoutView-D-_e_OmN.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/CloudSubscriptionRedirectView-BQVgkaSX.js (removed) 4.78 kB 🟢 -4.78 kB 🟢 -1.8 kB 🟢 -1.59 kB
assets/CloudSubscriptionRedirectView-MjBTSZ5t.js (new) 4.78 kB 🔴 +4.78 kB 🔴 +1.8 kB 🔴 +1.59 kB
assets/UserSelectView-D3jiJ5RT.js (removed) 4.55 kB 🟢 -4.55 kB 🟢 -1.67 kB 🟢 -1.49 kB
assets/UserSelectView-DagiKez6.js (new) 4.55 kB 🔴 +4.55 kB 🔴 +1.67 kB 🔴 +1.49 kB
assets/CloudSorryContactSupportView-BFw0sFGo.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-Wd88ZKDq.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

Panels & Settings — 438 kB (baseline 438 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-CX_2k0le.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.29 kB 🟢 -4.65 kB
assets/SecretsPanel-G_8_Urm1.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.29 kB 🔴 +4.65 kB
assets/LegacyCreditsPanel-BpIgn4Mh.js (removed) 20.7 kB 🟢 -20.7 kB 🟢 -5.59 kB 🟢 -4.91 kB
assets/LegacyCreditsPanel-Clz32ADf.js (new) 20.7 kB 🔴 +20.7 kB 🔴 +5.59 kB 🔴 +4.93 kB
assets/SubscriptionPanel-CIlb9dhy.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.75 kB 🔴 +4.19 kB
assets/SubscriptionPanel-DW7UAoM7.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.75 kB 🟢 -4.18 kB
assets/KeybindingPanel-B9tK2OJt.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.54 kB 🟢 -3.15 kB
assets/KeybindingPanel-DjPfEQCD.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.53 kB 🔴 +3.13 kB
assets/AboutPanel-D2gnwHIY.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.12 kB 🔴 +2.81 kB
assets/AboutPanel-DLCwY2-p.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.12 kB 🟢 -2.8 kB
assets/ExtensionPanel-D8QiRc-Q.js (removed) 9.42 kB 🟢 -9.42 kB 🟢 -2.67 kB 🟢 -2.37 kB
assets/ExtensionPanel-DK8xOPbv.js (new) 9.42 kB 🔴 +9.42 kB 🔴 +2.67 kB 🔴 +2.38 kB
assets/ServerConfigPanel-Br0IqmaW.js (new) 6.49 kB 🔴 +6.49 kB 🔴 +2.13 kB 🔴 +1.93 kB
assets/ServerConfigPanel-CvoYXunX.js (removed) 6.49 kB 🟢 -6.49 kB 🟢 -2.13 kB 🟢 -1.93 kB
assets/UserPanel-bJk4eoHi.js (new) 6.2 kB 🔴 +6.2 kB 🔴 +2.01 kB 🔴 +1.78 kB
assets/UserPanel-C1D98LgV.js (removed) 6.2 kB 🟢 -6.2 kB 🟢 -2.01 kB 🟢 -1.77 kB
assets/cloudRemoteConfig-1uAjWtL7.js (new) 1.48 kB 🔴 +1.48 kB 🔴 +724 B 🔴 +633 B
assets/cloudRemoteConfig-BtG2go5x.js (removed) 1.48 kB 🟢 -1.48 kB 🟢 -727 B 🟢 -635 B
assets/refreshRemoteConfig-C5AtT7pv.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +520 B 🔴 +473 B
assets/refreshRemoteConfig-ZpMPXUEz.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -522 B 🟢 -457 B
assets/config-p2eCRj7g.js 1.22 kB 1.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B3Lo1XmI.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BhljmVLI.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BMZqZMWV.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-bRtLtC70.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-bThwkOsC.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C1uM8WjX.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DvY3JpnZ.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-OPXE36wg.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Qe3udZkm.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-x4lDOTHy.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-yz0uqs_Z.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

User & Accounts — 16.1 kB (baseline 16.1 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-CIV4_9Qw.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +994 B
assets/auth-QiS7Gd9n.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -986 B
assets/SignUpForm-DYnP9NXA.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/SignUpForm-rtm6ty0R.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/UpdatePasswordContent-0I0P1Gyh.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1.08 kB 🔴 +958 B
assets/UpdatePasswordContent-BTe1ADET.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1.09 kB 🟢 -959 B
assets/firebaseAuthStore-BqCzNnYC.js (new) 831 B 🔴 +831 B 🔴 +405 B 🔴 +355 B
assets/firebaseAuthStore-CfwppIrS.js (removed) 831 B 🟢 -831 B 🟢 -406 B 🟢 -354 B
assets/auth-Dyj2U8CF.js (removed) 357 B 🟢 -357 B 🟢 -226 B 🟢 -215 B
assets/auth-XqdRrgip.js (new) 357 B 🔴 +357 B 🔴 +227 B 🔴 +196 B
assets/PasswordFields-qoMlUe6p.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-F0LwTAsD.js 1.59 kB 1.59 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Editors & Dialogs — 78.3 kB (baseline 78.3 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-CRflYnBe.js (new) 77.5 kB 🔴 +77.5 kB 🔴 +16.6 kB 🔴 +14.2 kB
assets/useShareDialog-kEWi_qzp.js (removed) 77.5 kB 🟢 -77.5 kB 🟢 -16.6 kB 🟢 -14.2 kB
assets/useSubscriptionDialog-CBAFD1Cb.js (new) 779 B 🔴 +779 B 🔴 +396 B 🔴 +339 B
assets/useSubscriptionDialog-YAH4I4aC.js (removed) 779 B 🟢 -779 B 🟢 -397 B 🟢 -342 B

Status: 2 added / 2 removed

UI Components — 56.7 kB (baseline 56.7 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-Dm2rN16z.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.91 kB 🔴 +3.48 kB
assets/ComfyQueueButton-zh1a0TuQ.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.9 kB 🟢 -3.48 kB
assets/useTerminalTabs-CCe60HVX.js (new) 9.87 kB 🔴 +9.87 kB 🔴 +3.41 kB 🔴 +3.02 kB
assets/useTerminalTabs-g72-4-o7.js (removed) 9.87 kB 🟢 -9.87 kB 🟢 -3.41 kB 🟢 -3.01 kB
assets/SubscribeButton-CrBRqsfO.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1.01 kB 🟢 -879 B
assets/SubscribeButton-DIDFisIY.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.01 kB 🔴 +877 B
assets/cloudFeedbackTopbarButton-BG9n6RFq.js (removed) 1.42 kB 🟢 -1.42 kB 🟢 -746 B 🟢 -648 B
assets/cloudFeedbackTopbarButton-CohRiwUZ.js (new) 1.42 kB 🔴 +1.42 kB 🔴 +743 B 🔴 +651 B
assets/ComfyQueueButton-CxC1dNk2.js (new) 836 B 🔴 +836 B 🔴 +412 B 🔴 +364 B
assets/ComfyQueueButton-DwLxYDLO.js (removed) 836 B 🟢 -836 B 🟢 -414 B 🟢 -364 B
assets/Button-BaH4RoVV.js 3.22 kB 3.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-KKDIsNYK.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-CEMZoefM.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-CVGQ2PHm.js 6.11 kB 6.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/toggle-group-BmeEkX7i.js 3.83 kB 3.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-CDV8z5F5.js 7.39 kB 7.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-rA7elnKS.js 1.19 kB 1.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-4trmxPNl.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.79 MB (baseline 2.79 MB) • 🔴 +132 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-doEm8puF.js (removed) 1.95 MB 🟢 -1.95 MB 🟢 -438 kB 🟢 -328 kB
assets/dialogService-WrZaoWT-.js (new) 1.95 MB 🔴 +1.95 MB 🔴 +438 kB 🔴 +328 kB
assets/api-DUu7PD8l.js (new) 695 kB 🔴 +695 kB 🔴 +157 kB 🔴 +125 kB
assets/api-xfEepVw6.js (removed) 695 kB 🟢 -695 kB 🟢 -157 kB 🟢 -125 kB
assets/load3dService-CwhgljN_.js (new) 91.1 kB 🔴 +91.1 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-D0f8Z255.js (removed) 91.1 kB 🟢 -91.1 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/extensionStore-CtE3vSLX.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -4.63 kB 🟢 -4.1 kB
assets/extensionStore-D7BHOttj.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +4.63 kB 🔴 +4.09 kB
assets/workflowShareService-B8gyH9A5.js (removed) 13.3 kB 🟢 -13.3 kB 🟢 -4.11 kB 🟢 -3.63 kB
assets/workflowShareService-CeYR5naX.js (new) 13.3 kB 🔴 +13.3 kB 🔴 +4.11 kB 🔴 +3.63 kB
assets/releaseStore-aYTvwaV4.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/releaseStore-jdZg9CE1.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/keybindingService-BLH3DI1K.js (removed) 7.16 kB 🟢 -7.16 kB 🟢 -1.72 kB 🟢 -1.48 kB
assets/keybindingService-CFcsIEgn.js (new) 7.16 kB 🔴 +7.16 kB 🔴 +1.72 kB 🔴 +1.48 kB
assets/bootstrapStore-Cm39Vh7m.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +871 B 🔴 +790 B
assets/bootstrapStore-DlUvwcUV.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -870 B 🟢 -794 B
assets/userStore-Bzc3juxJ.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +719 B 🔴 +634 B
assets/userStore-DuFciVvP.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -718 B 🟢 -669 B
assets/audioService-BWyhKgg2.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -847 B 🟢 -723 B
assets/audioService-DH0l-yW5.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +848 B 🔴 +725 B
assets/releaseStore-B37oOhX-.js (removed) 803 B 🟢 -803 B 🟢 -404 B 🟢 -357 B
assets/releaseStore-CK-kk_cM.js (new) 803 B 🔴 +803 B 🔴 +403 B 🔴 +355 B
assets/settingStore-BLicEGFg.js (new) 787 B 🔴 +787 B 🔴 +404 B 🔴 +357 B
assets/settingStore-JYNAY4fV.js (removed) 787 B 🟢 -787 B 🟢 -406 B 🟢 -356 B
assets/workflowDraftStore-BqABOJEu.js (removed) 779 B 🟢 -779 B 🟢 -398 B 🟢 -347 B
assets/workflowDraftStore-CkPcsdAP.js (new) 779 B 🔴 +779 B 🔴 +396 B 🔴 +346 B
assets/dialogService-DJ0Z45Xc.js (new) 768 B 🔴 +768 B 🔴 +388 B 🔴 +340 B
assets/dialogService-gVXYrFtR.js (removed) 768 B 🟢 -768 B 🟢 -389 B 🟢 -341 B
assets/assetsStore-DQ6DNxy_.js (removed) 765 B 🟢 -765 B 🟢 -393 B 🟢 -341 B
assets/assetsStore-S832YsTA.js (new) 765 B 🔴 +765 B 🔴 +391 B 🔴 +339 B
assets/serverConfigStore-Va3_Wl8r.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 15 added / 15 removed

Utilities & Hooks — 57.2 kB (baseline 57.2 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-BQ8nI5QP.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-CJtKgCj7.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3dViewer-D2rp5gQZ.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.19 kB 🟢 -2.83 kB
assets/useLoad3dViewer-HJkvyMlL.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.19 kB 🔴 +2.83 kB
assets/useFeatureFlags-DDTqVHdn.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.37 kB 🔴 +1.17 kB
assets/useFeatureFlags-DXHHwAmj.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.37 kB 🟢 -1.17 kB
assets/useWorkspaceUI-Bk2kFYPB.js (new) 3 kB 🔴 +3 kB 🔴 +823 B 🔴 +742 B
assets/useWorkspaceUI-DngI-sBp.js (removed) 3 kB 🟢 -3 kB 🟢 -820 B 🟢 -702 B
assets/subscriptionCheckoutUtil-CPra8JLS.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.05 kB 🟢 -959 B
assets/subscriptionCheckoutUtil-xct5PVi4.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +959 B
assets/useErrorHandling-BoxVeBS2.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +628 B 🔴 +533 B
assets/useErrorHandling-ETY5czwa.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -627 B 🟢 -535 B
assets/useLoad3d-BeI3KMQA.js (new) 902 B 🔴 +902 B 🔴 +444 B 🔴 +400 B
assets/useLoad3d-CiAbazxW.js (removed) 902 B 🟢 -902 B 🟢 -447 B 🟢 -399 B
assets/useLoad3dViewer-BQs0WOmE.js (removed) 881 B 🟢 -881 B 🟢 -432 B 🟢 -386 B
assets/useLoad3dViewer-Cqr7wu1h.js (new) 881 B 🔴 +881 B 🔴 +429 B 🔴 +388 B
assets/audioUtils-DBMv1ght.js (new) 858 B 🔴 +858 B 🔴 +498 B 🔴 +402 B
assets/audioUtils-lbGHOo4p.js (removed) 858 B 🟢 -858 B 🟢 -499 B 🟢 -419 B
assets/useCurrentUser-BRJK5bqQ.js (new) 765 B 🔴 +765 B 🔴 +390 B 🔴 +339 B
assets/useCurrentUser-D-nsslpf.js (removed) 765 B 🟢 -765 B 🟢 -393 B 🟢 -339 B
assets/useWorkspaceSwitch-CQwZGlki.js (new) 688 B 🔴 +688 B 🔴 +350 B 🔴 +298 B
assets/useWorkspaceSwitch-Iqv0TIhV.js (removed) 688 B 🟢 -688 B 🟢 -351 B 🟢 -296 B
assets/_plugin-vue_export-helper-C4xK3rHS.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-BFYqWnMD.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Clzmwvt4.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-BllOn75O.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-CXsVEgWz.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCopyToClipboard-COTREHXG.js 944 B 944 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-Cre4POfP.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

Vendor & Third-Party — 8.9 MB (baseline 8.9 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-05GtjRkv.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DNX73mqE.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-Dj9lOsnu.js 1.54 MB 1.54 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-gPZICJA3.js 1.72 MB 1.72 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-DlFrLeZ5.js 428 kB 428 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-C_3GtM2H.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-CXbu7Mch.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-DtiQ1dr9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-7Q5M-X2w.js 125 kB 125 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-DPkCdaAS.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 8.04 MB (baseline 8.04 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-u0XPcB8V.js (removed) 73.7 kB 🟢 -73.7 kB 🟢 -19 kB 🟢 -16.3 kB
assets/core-Xkh5gG_S.js (new) 73.7 kB 🔴 +73.7 kB 🔴 +19 kB 🔴 +16.3 kB
assets/groupNode-ACIkdMlJ.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.6 kB
assets/groupNode-CWUqg89Z.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.6 kB
assets/WidgetSelect-DPCtDvzF.js (new) 58 kB 🔴 +58 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/WidgetSelect-O6AdJrxb.js (removed) 58 kB 🟢 -58 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-BHezRnkT.js (new) 46.2 kB 🔴 +46.2 kB 🔴 +8.65 kB 🔴 +7.55 kB
assets/SubscriptionRequiredDialogContentWorkspace-ilk-5322.js (removed) 46.2 kB 🟢 -46.2 kB 🟢 -8.65 kB 🟢 -7.49 kB
assets/WidgetPainter-DyeD7vWE.js (new) 32.9 kB 🔴 +32.9 kB 🔴 +7.97 kB 🔴 +7.07 kB
assets/WidgetPainter-RhcAqdIP.js (removed) 32.9 kB 🟢 -32.9 kB 🟢 -7.97 kB 🟢 -7.08 kB
assets/Load3DControls-BJQT__mW.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/Load3DControls-docx73np.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.66 kB
assets/WorkspacePanelContent-BoWGSpyO.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.16 kB 🔴 +5.42 kB
assets/WorkspacePanelContent-qw5jKEek.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.16 kB 🟢 -5.41 kB
assets/SubscriptionRequiredDialogContent-Dk5Z3BmL.js (removed) 25.6 kB 🟢 -25.6 kB 🟢 -6.56 kB 🟢 -5.77 kB
assets/SubscriptionRequiredDialogContent-DWXGd9IR.js (new) 25.6 kB 🔴 +25.6 kB 🔴 +6.56 kB 🔴 +5.78 kB
assets/Load3dViewerContent-BLVP8ZkQ.js (removed) 23 kB 🟢 -23 kB 🟢 -5.19 kB 🟢 -4.5 kB
assets/Load3dViewerContent-DTK_Knsz.js (new) 23 kB 🔴 +23 kB 🔴 +5.19 kB 🔴 +4.5 kB
assets/WidgetImageCrop-CQaeg_Or.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.52 kB 🔴 +4.87 kB
assets/WidgetImageCrop-U9PDeRSW.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.52 kB 🟢 -4.86 kB
assets/SubscriptionPanelContentWorkspace-BObwrDiI.js (new) 22 kB 🔴 +22 kB 🔴 +5.11 kB 🔴 +4.5 kB
assets/SubscriptionPanelContentWorkspace-CU9OKKGE.js (removed) 22 kB 🟢 -22 kB 🟢 -5.11 kB 🟢 -4.49 kB
assets/CurrentUserPopoverWorkspace-DFXcscI-.js (new) 20.5 kB 🔴 +20.5 kB 🔴 +4.94 kB 🔴 +4.41 kB
assets/CurrentUserPopoverWorkspace-Dvq8zFDk.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -4.94 kB 🟢 -4.41 kB
assets/SignInContent-CiqOoW2T.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.77 kB 🟢 -4.17 kB
assets/SignInContent-CWqWc-Ru.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.77 kB 🔴 +4.18 kB
assets/WidgetInputNumber-B31G90Yh.js (new) 18.1 kB 🔴 +18.1 kB 🔴 +4.64 kB 🔴 +4.13 kB
assets/WidgetInputNumber-B7YrkZYt.js (removed) 18.1 kB 🟢 -18.1 kB 🟢 -4.64 kB 🟢 -4.12 kB
assets/WidgetRecordAudio-B0AwpLCy.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +5.02 kB 🔴 +4.48 kB
assets/WidgetRecordAudio-BbirZmx2.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -5.01 kB 🟢 -4.48 kB
assets/Load3D-BfKnR5uE.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.02 kB 🔴 +3.51 kB
assets/Load3D-DErw72TW.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.5 kB
assets/load3d-5-DIzRsi.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.2 kB 🔴 +3.65 kB
assets/load3d-GLLYx_iL.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.21 kB 🟢 -3.65 kB
assets/AudioPreviewPlayer-BE1jQ-ey.js (new) 11 kB 🔴 +11 kB 🔴 +3.25 kB 🔴 +2.93 kB
assets/AudioPreviewPlayer-DhB0MPZJ.js (removed) 11 kB 🟢 -11 kB 🟢 -3.25 kB 🟢 -2.92 kB
assets/nodeTemplates-By1xowOb.js (removed) 9.34 kB 🟢 -9.34 kB 🟢 -3.27 kB 🟢 -2.88 kB
assets/nodeTemplates-ByERlalZ.js (new) 9.34 kB 🔴 +9.34 kB 🔴 +3.27 kB 🔴 +2.88 kB
assets/InviteMemberDialogContent-Bm14Se9-.js (new) 7.37 kB 🔴 +7.37 kB 🔴 +2.3 kB 🔴 +2.02 kB
assets/InviteMemberDialogContent-D9lDoEp5.js (removed) 7.37 kB 🟢 -7.37 kB 🟢 -2.3 kB 🟢 -2.01 kB
assets/Load3DConfiguration-CwiYE2Vg.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/Load3DConfiguration-DkNcX7-t.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/onboardingCloudRoutes-COWjmQLD.js (removed) 6.07 kB 🟢 -6.07 kB 🟢 -1.89 kB 🟢 -1.63 kB
assets/onboardingCloudRoutes-CT-OTcS7.js (new) 6.07 kB 🔴 +6.07 kB 🔴 +1.89 kB 🔴 +1.63 kB
assets/CreateWorkspaceDialogContent-BgX5U5nU.js (new) 5.54 kB 🔴 +5.54 kB 🔴 +2 kB 🔴 +1.75 kB
assets/CreateWorkspaceDialogContent-D5OpbOKc.js (removed) 5.54 kB 🟢 -5.54 kB 🟢 -2 kB 🟢 -1.75 kB
assets/FreeTierDialogContent-BswXgx_-.js (new) 5.42 kB 🔴 +5.42 kB 🔴 +1.91 kB 🔴 +1.69 kB
assets/FreeTierDialogContent-C_EbAwKB.js (removed) 5.42 kB 🟢 -5.42 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/EditWorkspaceDialogContent-aEqgwncb.js (new) 5.35 kB 🔴 +5.35 kB 🔴 +1.97 kB 🔴 +1.72 kB
assets/EditWorkspaceDialogContent-CCxwKCsd.js (removed) 5.35 kB 🟢 -5.35 kB 🟢 -1.97 kB 🟢 -1.72 kB
assets/Preview3d-00kFWVVi.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/Preview3d-DqsGQb9Z.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/ValueControlPopover-P7denRdc.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.77 kB 🔴 +1.59 kB
assets/ValueControlPopover-zqo7hQWd.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.77 kB 🟢 -1.6 kB
assets/CancelSubscriptionDialogContent-95I8bEi-.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.8 kB 🟢 -1.58 kB
assets/CancelSubscriptionDialogContent-BBPeF2oe.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.8 kB 🔴 +1.58 kB
assets/DeleteWorkspaceDialogContent-BEIM11cQ.js (removed) 4.25 kB 🟢 -4.25 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/DeleteWorkspaceDialogContent-BwXUcpfn.js (new) 4.25 kB 🔴 +4.25 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/WidgetWithControl-BwjXPHmJ.js (removed) 4.17 kB 🟢 -4.17 kB 🟢 -1.82 kB 🟢 -1.62 kB
assets/WidgetWithControl-DPVug1M3.js (new) 4.17 kB 🔴 +4.17 kB 🔴 +1.81 kB 🔴 +1.62 kB
assets/LeaveWorkspaceDialogContent-BW_yu4qE.js (removed) 4.08 kB 🟢 -4.08 kB 🟢 -1.59 kB 🟢 -1.38 kB
assets/LeaveWorkspaceDialogContent-CFrzkijJ.js (new) 4.08 kB 🔴 +4.08 kB 🔴 +1.59 kB 🔴 +1.38 kB
assets/RemoveMemberDialogContent-B-6YLe9q.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.54 kB 🟢 -1.35 kB
assets/RemoveMemberDialogContent-DgRKyXIB.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.54 kB 🔴 +1.35 kB
assets/RevokeInviteDialogContent-BUKDHvHK.js (removed) 3.97 kB 🟢 -3.97 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/RevokeInviteDialogContent-BXvNLub9.js (new) 3.97 kB 🔴 +3.97 kB 🔴 +1.55 kB 🔴 +1.36 kB
assets/InviteMemberUpsellDialogContent-Cm_b1-RB.js (new) 3.86 kB 🔴 +3.86 kB 🔴 +1.42 kB 🔴 +1.25 kB
assets/InviteMemberUpsellDialogContent-DnmfgyvV.js (removed) 3.86 kB 🟢 -3.86 kB 🟢 -1.42 kB 🟢 -1.25 kB
assets/tierBenefits-BF8SbEEl.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.31 kB 🟢 -1.16 kB
assets/tierBenefits-DAAYm3vc.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.31 kB 🔴 +1.16 kB
assets/saveMesh-c5bgj8FR.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -1.48 kB 🟢 -1.31 kB
assets/saveMesh-DdAI4-K_.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +1.47 kB 🔴 +1.31 kB
assets/cloudSessionCookie-Ch53CJjq.js (removed) 3.14 kB 🟢 -3.14 kB 🟢 -1.1 kB 🟢 -975 B
assets/cloudSessionCookie-Dnas7Oye.js (new) 3.14 kB 🔴 +3.14 kB 🔴 +1.1 kB 🔴 +973 B
assets/GlobalToast-CgDDQ78g.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.04 kB
assets/GlobalToast-CHhg7FKj.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/SubscribeToRun-C9RxFS4O.js (removed) 2.06 kB 🟢 -2.06 kB 🟢 -950 B 🟢 -836 B
assets/SubscribeToRun-UNVL-gbU.js (new) 2.06 kB 🔴 +2.06 kB 🔴 +950 B 🔴 +848 B
assets/CloudRunButtonWrapper-_PDqfHQ8.js (new) 1.72 kB 🔴 +1.72 kB 🔴 +804 B 🔴 +736 B
assets/CloudRunButtonWrapper-BjNXyCqQ.js (removed) 1.72 kB 🟢 -1.72 kB 🟢 -803 B 🟢 -738 B
assets/cloudBadges-B3p3TnIx.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +793 B 🔴 +695 B
assets/cloudBadges-B5hKvcYz.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -795 B 🟢 -702 B
assets/previousFullPath-B-SUocul.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -648 B 🟢 -554 B
assets/previousFullPath-Cl0ESUTE.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +648 B 🔴 +569 B
assets/cloudSubscription-8TW_59_n.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +674 B 🔴 +585 B
assets/cloudSubscription-D4yS0Q6-.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -675 B 🟢 -587 B
assets/Load3D-CH-UDb61.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +518 B 🔴 +460 B
assets/Load3D-Clpi4DxB.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -522 B 🟢 -465 B
assets/nightlyBadges-BZUX6rNZ.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -547 B 🟢 -492 B
assets/nightlyBadges-d7F1x7Yz.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +547 B 🔴 +488 B
assets/Load3dViewerContent-CRbO-HNQ.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +488 B 🔴 +431 B
assets/Load3dViewerContent-PgCSGVlc.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -493 B 🟢 -429 B
assets/SubscriptionPanelContentWorkspace-D3uyO871.js (removed) 963 B 🟢 -963 B 🟢 -458 B 🟢 -400 B
assets/SubscriptionPanelContentWorkspace-DBmUbqBD.js (new) 963 B 🔴 +963 B 🔴 +456 B 🔴 +395 B
assets/WidgetLegacy-Cd7gE62w.js (new) 787 B 🔴 +787 B 🔴 +404 B 🔴 +351 B
assets/WidgetLegacy-ClcW2dN1.js (removed) 787 B 🟢 -787 B 🟢 -405 B 🟢 -351 B
assets/changeTracker-BiH83YVT.js (removed) 763 B 🟢 -763 B 🟢 -393 B 🟢 -339 B
assets/changeTracker-YN1F_yXq.js (new) 763 B 🔴 +763 B 🔴 +391 B 🔴 +339 B
assets/graphHasMissingNodes-DEWgC_pq.js (removed) 761 B 🟢 -761 B 🟢 -374 B 🟢 -315 B
assets/graphHasMissingNodes-DKKLwNVM.js (new) 761 B 🔴 +761 B 🔴 +375 B 🔴 +329 B
assets/AnimationControls-DUOF31Ot.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-XyL61ttM.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-CtFmjb6K.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-CjY84GoU.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-B810ZRS_.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-Cp3wIlKI.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-0V4s4r1K.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BL762dz-.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BnVLe_Bi.js 19.2 kB 19.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BXsNoiTn.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BZxSrlEH.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C23MOD89.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CdENTy7Q.js 17.3 kB 17.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cq73R4Wp.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CriyFW2y.js 15.6 kB 15.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CyFcxndj.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DReOpKnh.js 16.4 kB 16.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-KYihJEkp.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-B-UHRanr.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-Bib-tbcr.js 547 kB 547 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Loader-Dxz91Dh1.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-6sQ9dyIE.js 140 kB 140 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B0aq4SOP.js 159 kB 159 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BMvp_ngw.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bs4m2I_7.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BVnshHMY.js 199 kB 199 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C2EBpmzg.js 164 kB 164 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CumaBqGT.js 158 kB 158 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DchxU7Pt.js 167 kB 167 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dn_22rOe.js 139 kB 139 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-hknb2a26.js 190 kB 190 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-sF5tizy-.js 222 kB 222 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-BiQkqzKM.js 1.83 kB 1.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-CRtIRcAY.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-DoRnE-bZ.js 1.81 kB 1.81 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-Bv9_XpJf.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-DOEMDxgs.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-BpARjupw.js 2.78 kB 2.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BBzKxTIy.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BsK7YlZv.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BXi-pYlO.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CDP9UeA-.js 402 kB 402 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Comy_sMi.js 406 kB 406 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CuDYP-Ax.js 418 kB 418 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CzCfhTal.js 452 kB 452 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DRlsrA3Y.js 453 kB 453 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DuxLvF2P.js 402 kB 402 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DwSpKc2S.js 394 kB 394 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-T8ki-3ab.js 494 kB 494 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-CRNAN1Zu.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-knMV-ROg.js 9.34 kB 9.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-D8R4t_jS.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-DK6apKNA.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-BSEsXra9.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-CXHqTaYn.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Textarea-hSoGqB0Z.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-b9xCyIM9.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DIRwAHBY.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BfW4RBS9.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BiPCu9PR.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-BYr9LIig.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-D4b3GyKM.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-Dh_Oiqjm.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-CWPm_CXr.js 3.6 kB 3.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-CJ9FBr4m.js 7.35 kB 7.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-C-AcvF4f.js 2.89 kB 2.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-VUV8QDjx.js 1.99 kB 1.99 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-87PSZUoW.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-D5drFiH0.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-Lh7Miy-i.js 4.26 kB 4.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-AkZmu4-r.js 3.54 kB 3.54 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DzBxiY8I.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 50 added / 50 removed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
src/composables/node/usePromotedPreviews.test.ts (1)

217-240: Add one reactive-update test to lock in the original regression path.

This new case is good for preview-only data, but it seeds data before first
evaluation. Consider also asserting recomputation when nodePreviewImages is
written after initial evaluation.

♻️ Suggested test addition
+  it('recomputes when preview images are populated after first evaluation', () => {
+    const setup = createSetup()
+    addInteriorNode(setup, { id: 10, previewMediaType: 'image' })
+    usePromotionStore().promote(
+      setup.subgraphNode.rootGraph.id,
+      setup.subgraphNode.id,
+      '10',
+      '$$canvas-image-preview'
+    )
+
+    const { promotedPreviews } = usePromotedPreviews(() => setup.subgraphNode)
+    expect(promotedPreviews.value).toEqual([])
+
+    const blobUrl = 'blob:http://localhost/glsl-preview'
+    seedPreviewImages(setup.subgraph.id, [{ nodeId: 10, urls: [blobUrl] }])
+    getNodeImageUrls.mockReturnValue([blobUrl])
+
+    expect(promotedPreviews.value).toEqual([
+      {
+        interiorNodeId: '10',
+        widgetName: '$$canvas-image-preview',
+        type: 'image',
+        urls: [blobUrl]
+      }
+    ])
+  })

As per coding guidelines, src/**/*.test.ts should prioritize behavioral
coverage for critical/new features.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/composables/node/usePromotedPreviews.test.ts` around lines 217 - 240, The
test covers the preview-only path but misses asserting reactive recomputation
when nodePreviewImages are added after first evaluation; add a new test that
uses createSetup(), addInteriorNode(... id:10 ...), promote via
usePromotionStore().promote(..., '10', '$$canvas-image-preview'), then call
usePromotedPreviews(() => setup.subgraphNode) and first assert
promotedPreviews.value is empty, then write the preview via
seedPreviewImages(setup.subgraph.id, [{ nodeId: 10, urls: [blobUrl] }]) (and
ensure getNodeImageUrls.mockReturnValue([blobUrl]) is set), await a tick (or
force reactivity), and finally assert promotedPreviews.value equals the expected
image entry; reference usePromotedPreviews, seedPreviewImages, getNodeImageUrls,
usePromotionStore().promote, createSetup, and addInteriorNode to locate code.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/composables/node/usePromotedPreviews.test.ts`:
- Around line 217-240: The test covers the preview-only path but misses
asserting reactive recomputation when nodePreviewImages are added after first
evaluation; add a new test that uses createSetup(), addInteriorNode(... id:10
...), promote via usePromotionStore().promote(..., '10',
'$$canvas-image-preview'), then call usePromotedPreviews(() =>
setup.subgraphNode) and first assert promotedPreviews.value is empty, then write
the preview via seedPreviewImages(setup.subgraph.id, [{ nodeId: 10, urls:
[blobUrl] }]) (and ensure getNodeImageUrls.mockReturnValue([blobUrl]) is set),
await a tick (or force reactivity), and finally assert promotedPreviews.value
equals the expected image entry; reference usePromotedPreviews,
seedPreviewImages, getNodeImageUrls, usePromotionStore().promote, createSetup,
and addInteriorNode to locate code.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 3584d2dd-8f2e-4c5e-af7a-93ab9babad4f

📥 Commits

Reviewing files that changed from the base of the PR and between e2cb356 and 275064a.

📒 Files selected for processing (2)
  • src/composables/node/usePromotedPreviews.test.ts
  • src/composables/node/usePromotedPreviews.ts

@github-actions
Copy link

github-actions bot commented Mar 6, 2026

⚡ Performance Report

ℹ️ Collecting baseline variance data (0/5 runs). Significance will appear after 2 main branch runs.

Metric Baseline PR Δ
canvas-idle: style recalcs 12 11 -11%
canvas-idle: layouts 0 0 -100%
canvas-idle: task duration 361ms 358ms -1%
canvas-mouse-sweep: style recalcs 78 77 -2%
canvas-mouse-sweep: layouts 12 12 +3%
canvas-mouse-sweep: task duration 827ms 801ms -3%
dom-widget-clipping: style recalcs 14 13 -5%
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 334ms 358ms +7%
subgraph-dom-widget-clipping: style recalcs 50 49 -2%
subgraph-dom-widget-clipping: layouts 0 0 -100%
subgraph-dom-widget-clipping: task duration 400ms 402ms +1%
subgraph-idle: style recalcs 12 12 +0%
subgraph-idle: layouts 0 0 +0%
subgraph-idle: task duration 346ms 365ms +6%
subgraph-mouse-sweep: style recalcs 77 78 +1%
subgraph-mouse-sweep: layouts 16 16 +0%
subgraph-mouse-sweep: task duration 668ms 700ms +5%
Raw data
{
  "timestamp": "2026-03-12T10:49:11.330Z",
  "gitSha": "c6fa2eec155fdd403d58ad050a9a0b600eee18fa",
  "branch": "fix/glsl-promoted-preview-propagation",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 1994.9770000000058,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.866999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 347.846,
      "heapDeltaBytes": 1164380
    },
    {
      "name": "canvas-idle",
      "durationMs": 2012.7949999999828,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.447000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 361.445,
      "heapDeltaBytes": 1110452
    },
    {
      "name": "canvas-idle",
      "durationMs": 2045.829000000026,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.969,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 365.864,
      "heapDeltaBytes": 428992
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1885.1600000000417,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 36.846,
      "layouts": 12,
      "layoutDurationMs": 3.8739999999999997,
      "taskDurationMs": 835.726,
      "heapDeltaBytes": 1257576
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1845.0209999999743,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 40.803,
      "layouts": 13,
      "layoutDurationMs": 3.398,
      "taskDurationMs": 778.605,
      "heapDeltaBytes": 1784200
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1848.7230000000068,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 42.948,
      "layouts": 12,
      "layoutDurationMs": 3.928,
      "taskDurationMs": 787.4250000000001,
      "heapDeltaBytes": 187980
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 615.429000000006,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 9.528,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 372.85999999999996,
      "heapDeltaBytes": 6787708
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 554.3180000000234,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 8.833,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 357.26099999999997,
      "heapDeltaBytes": 11810324
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 551.7189999999914,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 8.517999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 343.151,
      "heapDeltaBytes": 12594096
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 577.9919999999947,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 12.200000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 395.095,
      "heapDeltaBytes": -4541684
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 582.5760000000173,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 11.642999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 387.953,
      "heapDeltaBytes": -4269540
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 626.1739999999918,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 12.884999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 424.35100000000006,
      "heapDeltaBytes": -4529808
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2003.3440000000269,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 9.369,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 335.789,
      "heapDeltaBytes": 612896
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2011.0609999999838,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 14.270000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 353.074,
      "heapDeltaBytes": 259232
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2000.0519999999824,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.964999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 405.62299999999993,
      "heapDeltaBytes": 551996
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1718.629999999962,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 36.943,
      "layouts": 16,
      "layoutDurationMs": 5.032,
      "taskDurationMs": 691.5450000000001,
      "heapDeltaBytes": -553876
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1748.106000000007,
      "styleRecalcs": 80,
      "styleRecalcDurationMs": 43.120000000000005,
      "layouts": 17,
      "layoutDurationMs": 4.8950000000000005,
      "taskDurationMs": 710.8879999999999,
      "heapDeltaBytes": -158108
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1725.195000000042,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 38.981,
      "layouts": 16,
      "layoutDurationMs": 4.468,
      "taskDurationMs": 697.088,
      "heapDeltaBytes": -1216132
    }
  ]
}

AustinMroz
AustinMroz previously approved these changes Mar 6, 2026
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:M This PR changes 30-99 lines, ignoring generated files. labels Mar 7, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/composables/node/usePromotedPreviews.test.ts (1)

17-40: ⚠️ Potential issue | 🟡 Minor

Reset the hoisted getNodeImageUrls mock between tests to prevent test order dependency.

vi.clearAllMocks() clears call history but does not reset mockReturnValue/mockImplementation, causing per-test stubs to persist across tests and create hidden test order dependencies.

🧪 Suggested change
 beforeEach(() => {
   setActivePinia(createTestingPinia({ stubActions: false }))
   vi.clearAllMocks()
+  getNodeImageUrls.mockReset()

   nodeOutputStore = createMockNodeOutputStore()
   useNodeOutputStoreMock.mockReturnValue(nodeOutputStore)
 })
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/composables/node/usePromotedPreviews.test.ts` around lines 17 - 40, The
hoisted mocks created with vi.hoisted (getNodeImageUrls and
useNodeOutputStoreMock) keep their mock implementations between tests, causing
test-order dependency; add a per-test reset (e.g., in a beforeEach or afterEach)
that calls mockReset()/mockClear() on getNodeImageUrls and
useNodeOutputStoreMock to wipe any mockReturnValue/mockImplementation set by a
previous test so createMockNodeOutputStore returns clean stubs each test and
tests remain isolated.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@browser_tests/tests/subgraphPromotion.spec.ts`:
- Around line 557-597: The test "Promoted preview renders when outputs are
injected for interior node" currently simulates backend results by dispatching
an 'executed' event and seeding output.images, which bypasses the preview-image
propagation path; change the test to drive the preview path instead by writing
into the app's preview store used by GLSL/live previews (e.g.
window.app!.nodePreviewImages or the API used to set preview images) for the
interior node locator "5:10" (using the same NodeLocatorId conversion the app
uses), or dispatch the specific preview update event the app listens for, so the
reactive preview propagation code runs and the promoted preview in the
SubgraphNode (node locator '5') becomes visible; keep the final assertion on
subgraphVueNode.locator('.image-preview img') as-is.

---

Outside diff comments:
In `@src/composables/node/usePromotedPreviews.test.ts`:
- Around line 17-40: The hoisted mocks created with vi.hoisted (getNodeImageUrls
and useNodeOutputStoreMock) keep their mock implementations between tests,
causing test-order dependency; add a per-test reset (e.g., in a beforeEach or
afterEach) that calls mockReset()/mockClear() on getNodeImageUrls and
useNodeOutputStoreMock to wipe any mockReturnValue/mockImplementation set by a
previous test so createMockNodeOutputStore returns clean stubs each test and
tests remain isolated.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 067f0319-2465-47c6-af3a-776f18d26161

📥 Commits

Reviewing files that changed from the base of the PR and between 275064a and 4fd75f0.

📒 Files selected for processing (3)
  • browser_tests/tests/subgraphPromotion.spec.ts
  • src/composables/node/usePromotedPreviews.test.ts
  • src/stores/promotionStore.ts

Comment on lines +557 to +597
test('Promoted preview renders when outputs are injected for interior node', async ({
comfyPage
}) => {
await comfyPage.workflow.loadWorkflow(
'subgraphs/subgraph-with-preview-node'
)
await comfyPage.vueNodes.waitForNodes()

const subgraphVueNode = comfyPage.vueNodes.getNodeLocator('5')
await expect(subgraphVueNode).toBeVisible()

// Simulate backend sending execution results for interior SaveImage
// node (id 10) inside the SubgraphNode (id 5).
// The executed event handler converts execution ID "5:10" to a
// NodeLocatorId using the subgraph UUID, then sets both
// app.nodeOutputs and the reactive nodeOutputs ref.
await comfyPage.page.evaluate(() => {
const api = window.app!.api
api.dispatchEvent(
new CustomEvent('executed', {
detail: {
node: '5:10',
display_node: '5:10',
output: {
images: [
{
filename: 'example.png',
subfolder: '',
type: 'input'
}
]
}
}
})
)
})

// The promoted preview should render an image inside the SubgraphNode
const previewImage = subgraphVueNode.locator('.image-preview img')
await expect(previewImage).toBeVisible({ timeout: 5_000 })
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

This E2E misses the regression path.

The bug here is promoted previews updating from nodePreviewImages/GLSL live previews, but this test dispatches executed and seeds output.images. That means it can stay green even if preview-image propagation is still broken. Please drive the preview-image path here instead of the executed-output path.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@browser_tests/tests/subgraphPromotion.spec.ts` around lines 557 - 597, The
test "Promoted preview renders when outputs are injected for interior node"
currently simulates backend results by dispatching an 'executed' event and
seeding output.images, which bypasses the preview-image propagation path; change
the test to drive the preview path instead by writing into the app's preview
store used by GLSL/live previews (e.g. window.app!.nodePreviewImages or the API
used to set preview images) for the interior node locator "5:10" (using the same
NodeLocatorId conversion the app uses), or dispatch the specific preview update
event the app listens for, so the reactive preview propagation code runs and the
promoted preview in the SubgraphNode (node locator '5') becomes visible; keep
the final assertion on subgraphVueNode.locator('.image-preview img') as-is.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
browser_tests/tests/subgraphPromotion.spec.ts (1)

568-589: ⚠️ Potential issue | 🟠 Major

This still validates the fallback path, not the regression fixed by this PR.

Dispatching executed with output.images only proves promoted previews render from nodeOutputs. The bug here was broken reactivity from nodePreviewImages/GLSL live previews, so this test can stay green even if that path is still broken. Please seed the preview-image update path for the interior node instead and keep the final DOM assertion.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@browser_tests/tests/subgraphPromotion.spec.ts` around lines 568 - 589, The
test currently only dispatches an 'executed' event which updates app.nodeOutputs
(validating the fallback) but not the GLSL/live-preview reactivity; instead seed
the preview-image update path for the interior node (locator "5:10") by either
dispatching the same custom event your app listens for to update
nodePreviewImages/preview-image state or directly mutating the reactive ref
app.nodePreviewImages['5:10'] (and any associated preview metadata the
live-preview logic expects) before asserting the DOM; keep the final DOM
assertion as-is but ensure you target the nodePreviewImages/reactive preview
update path (reference symbols: nodePreviewImages, nodeOutputs, locator "5:10",
and the 'executed'/'preview-image' custom event your app handles).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@browser_tests/tests/subgraphPromotion.spec.ts`:
- Around line 568-589: The test currently only dispatches an 'executed' event
which updates app.nodeOutputs (validating the fallback) but not the
GLSL/live-preview reactivity; instead seed the preview-image update path for the
interior node (locator "5:10") by either dispatching the same custom event your
app listens for to update nodePreviewImages/preview-image state or directly
mutating the reactive ref app.nodePreviewImages['5:10'] (and any associated
preview metadata the live-preview logic expects) before asserting the DOM; keep
the final DOM assertion as-is but ensure you target the
nodePreviewImages/reactive preview update path (reference symbols:
nodePreviewImages, nodeOutputs, locator "5:10", and the
'executed'/'preview-image' custom event your app handles).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 94ab191f-4c79-4eb6-bef8-0b437924e907

📥 Commits

Reviewing files that changed from the base of the PR and between 4fd75f0 and c8f09b9.

📒 Files selected for processing (1)
  • browser_tests/tests/subgraphPromotion.spec.ts

@christian-byrne christian-byrne added the preview-gpu Creates a preview ephemeral environment for this PR (GPU available) label Mar 8, 2026
Add version counter to promotionStore that guarantees computed properties
re-evaluate when promotions change. The nested Map<UUID, Map<NodeId, ...>>
structure can miss reactive notifications when inner Maps are lazily
initialized and returned as raw references.

- Add _version ref incremented on setPromotions/movePromotion/clearGraph
- Read _version in getPromotionsRef to establish reactive dependency
- Re-read inner Maps through reactive proxy after lazy init
- Add unit test for late-promotion reactivity scenario
- Add E2E test for promoted preview rendering via synthetic execution
@christian-byrne christian-byrne force-pushed the fix/glsl-promoted-preview-propagation branch from c8f09b9 to 549dd5d Compare March 12, 2026 10:45
@christian-byrne christian-byrne removed their assignment Mar 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview-gpu Creates a preview ephemeral environment for this PR (GPU available) size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants