Skip to content

App mode - discard slow preview messages to prevent overwriting output image#9261

Merged
pythongosssss merged 2 commits intomainfrom
pysssss/discard-delayed-previews
Feb 27, 2026
Merged

App mode - discard slow preview messages to prevent overwriting output image#9261
pythongosssss merged 2 commits intomainfrom
pysssss/discard-delayed-previews

Conversation

@pythongosssss
Copy link
Member

@pythongosssss pythongosssss commented Feb 26, 2026

Summary

Prevent latent previews received after the job/node has already finished processing overwriting the actual output display

Changes

  • What:
  • updates job preview store to also track which node the preview was for
  • updates linear progress tracking to store executed nodes enabling skipping previews of these

Review Focus

Screenshots (if applicable)

┆Issue is synchronized with this Notion page by Unito

…hed processing, stopping it to overwriting the actual output display
@github-actions
Copy link

github-actions bot commented Feb 26, 2026

🎭 Playwright: ✅ 555 passed, 0 failed · 1 flaky

📊 Browser Reports
  • chromium: View Report (✅ 542 / ❌ 0 / ⚠️ 1 / ⏭️ 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)

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 26, 2026

📝 Walkthrough

Walkthrough

Previews now carry optional nodeId metadata; jobPreviewStore stores NodePromptPreview objects and exposes URL-only computed mapping. linearOutputStore tracks executed node IDs, skips latent previews for executed nodes, cancels RAF appropriately, and onLatentPreview/onNodeExecuted signatures accept/record nodeId. Event handler forwards displayNodeId when setting previews.

Changes

Cohort / File(s) Summary
Job Preview Store
src/stores/jobPreviewStore.ts, src/stores/jobPreviewStore.test.ts
Introduce NodePromptPreview { url, nodeId? }; nodePreviewsByPromptId now stores objects; add previewsByPromptId computed map; setPreviewUrl(promptId, url, nodeId?) accepts nodeId; tests added/updated for storage, clearing, duplicates, and disabled previews.
Linear Output Store
src/renderer/extensions/linearMode/linearOutputStore.ts, src/renderer/extensions/linearMode/linearOutputStore.test.ts
Track executedNodeIds; extend onLatentPreview(jobId, url, nodeId?); skip latent previews for executed nodes; record nodeId in onNodeExecuted and cancel RAF; watch now observes nodePreviewsByPromptId; tests updated for multiple timing scenarios.
App Event Handler
src/scripts/app.ts
b_preview_with_metadata handler now passes displayNodeId to setPreviewUrl(promptId, url, displayNodeId).
Tests / Mocks
src/renderer/extensions/linearMode/linearOutputStore.test.ts (expanded), src/stores/jobPreviewStore.test.ts
Mocks updated to reflect nodePreviewsByPromptId shape and new getter name; test helpers updated to accept nodeId; multiple latent-preview timing scenarios added.

Sequence Diagram(s)

sequenceDiagram
    participant App as App Event Handler
    participant Store as Job Preview Store
    participant Linear as Linear Output Store
    participant Cache as Preview Cache

    App->>Store: setPreviewUrl(promptId, blobUrl, displayNodeId)
    Store->>Cache: store preview {url, nodeId?}
    Store-->>Linear: notify via nodePreviewsByPromptId

    Linear->>Linear: if nodeId present, check executedNodeIds
    alt already executed
        Linear->>Linear: discard latent preview
    else new node
        Linear->>Linear: schedule RAF to show latent preview
        Linear-->>Cache: display latent preview
    end

    App->>Linear: onNodeExecuted(nodeId)
    Linear->>Linear: add nodeId to executedNodeIds
    Linear->>Linear: cancel pending RAF / update rendering

    App->>Linear: onJobComplete(jobId)
    Linear->>Linear: cancel pending RAF and clear trackedJobId
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

A rabbit hops with careful stride,
Storing previews, nodeId beside,
Latent frames that linger near,
Are skipped when that node first appears,
Hop—no duplicates this time! 🐇✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% 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 objective: preventing latent/slow preview messages from overwriting output after job completion.
Description check ✅ Passed The description covers the summary and key changes but omits optional sections like Review Focus and Screenshots. The provided information is sufficient and relevant.

✏️ 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 pysssss/discard-delayed-previews

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions
Copy link

github-actions bot commented Feb 26, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 02/27/2026, 02:35:29 PM UTC

Links

@github-actions
Copy link

github-actions bot commented Feb 26, 2026

📦 Bundle: 4.46 MB gzip 🟢 -42 B

Details

Summary

  • Raw size: 20.9 MB baseline 20.9 MB — 🔴 +678 B
  • Gzip: 4.46 MB baseline 4.46 MB — 🟢 -42 B
  • Brotli: 3.44 MB baseline 3.44 MB — 🟢 -89 B
  • Bundles: 228 current • 228 baseline • 108 added / 108 removed

Category Glance
Graph Workspace 🔴 +446 B (1.02 MB) · Data & Services 🔴 +232 B (2.55 MB) · Vendor & Third-Party ⚪ 0 B (8.84 MB) · Other ⚪ 0 B (7.86 MB) · Panels & Settings ⚪ 0 B (435 kB) · Views & Navigation ⚪ 0 B (72.1 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CQBseKJW.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -6.34 kB 🟢 -5.52 kB
assets/index-DoSRPAhn.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +6.35 kB 🔴 +5.53 kB

Status: 1 added / 1 removed

Graph Workspace — 1.02 MB (baseline 1.02 MB) • 🔴 +446 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-DzM_KIpD.js (new) 1.02 MB 🔴 +1.02 MB 🔴 +218 kB 🔴 +165 kB
assets/GraphView-Ce_J417X.js (removed) 1.02 MB 🟢 -1.02 MB 🟢 -218 kB 🟢 -165 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BssbqL7H.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.81 kB
assets/CloudSurveyView-DMrf1pLk.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.82 kB
assets/CloudLoginView-Dle0n_KP.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.19 kB 🔴 +2.82 kB
assets/CloudLoginView-sqL4H6Ii.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.19 kB 🟢 -2.82 kB
assets/CloudSignupView-CnSRucTb.js (new) 9.37 kB 🔴 +9.37 kB 🔴 +2.69 kB 🔴 +2.35 kB
assets/CloudSignupView-DFPCF4M1.js (removed) 9.37 kB 🟢 -9.37 kB 🟢 -2.7 kB 🟢 -2.37 kB
assets/UserCheckView-B9DQzsJB.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/UserCheckView-FqreuXoG.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/CloudLayoutView-Bcfm59lh.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.1 kB 🔴 +1.82 kB
assets/CloudLayoutView-C5Ce6G3g.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.1 kB 🟢 -1.82 kB
assets/CloudForgotPasswordView-DD8BB5t4.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.93 kB 🟢 -1.7 kB
assets/CloudForgotPasswordView-p518pK5o.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/CloudAuthTimeoutView-Bn8RMj9k.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.54 kB
assets/CloudAuthTimeoutView-zSk6BQUo.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.54 kB
assets/CloudSubscriptionRedirectView-Bs_MQmB6.js (removed) 4.75 kB 🟢 -4.75 kB 🟢 -1.79 kB 🟢 -1.58 kB
assets/CloudSubscriptionRedirectView-C1gC5oSC.js (new) 4.75 kB 🔴 +4.75 kB 🔴 +1.78 kB 🔴 +1.57 kB
assets/UserSelectView-CJSRfda5.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/UserSelectView-CuJUKD8w.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.47 kB
assets/CloudSorryContactSupportView-Bypca0av.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-CI4MZk1L.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-9UY6jfRK.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.31 kB 🟢 -4.66 kB
assets/SecretsPanel-xjdQd8KR.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.3 kB 🔴 +4.66 kB
assets/LegacyCreditsPanel-3Y2Dd4oN.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.56 kB 🟢 -4.89 kB
assets/LegacyCreditsPanel-DhAX2YK9.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.56 kB 🔴 +4.88 kB
assets/SubscriptionPanel-CTw9hdUc.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.66 kB 🟢 -4.09 kB
assets/SubscriptionPanel-dcqOGA7y.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.65 kB 🔴 +4.09 kB
assets/KeybindingPanel-Duk824MF.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.52 kB 🟢 -3.12 kB
assets/KeybindingPanel-eWgKeRSj.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.51 kB 🔴 +3.12 kB
assets/AboutPanel-DHNB0WQb.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.73 kB 🔴 +2.45 kB
assets/AboutPanel-FK1M11cz.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.45 kB
assets/ExtensionPanel-DV8u9Z7D.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.65 kB 🔴 +2.36 kB
assets/ExtensionPanel-DVxqxUcH.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.65 kB 🟢 -2.36 kB
assets/ServerConfigPanel-FAn_M2tY.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.12 kB 🔴 +1.91 kB
assets/ServerConfigPanel-RNSzMmS6.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.13 kB 🟢 -1.92 kB
assets/UserPanel-CeoZRvLa.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +1.99 kB 🔴 +1.75 kB
assets/UserPanel-DCWc5EZ_.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -2 kB 🟢 -1.75 kB
assets/cloudRemoteConfig-B9OQqXPY.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -708 B 🟢 -612 B
assets/cloudRemoteConfig-DHMORoIQ.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +703 B 🔴 +612 B
assets/refreshRemoteConfig-BUX6HpZu.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -522 B 🟢 -462 B
assets/refreshRemoteConfig-nf93uU3t.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +521 B 🔴 +457 B
assets/config-CGn5JFmU.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B5oF6TeI.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BVYOg4dh.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CBEvSL1z.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CGx1t8IZ.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CNcb_4nC.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cx1dZM6H.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dw-QS6Nb.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DXxgnCSn.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-GRFn4guL.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-mgwKIVQ2.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-s83B801I.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-CupqODgc.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -985 B
assets/auth-ibUnGMjH.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +990 B
assets/SignUpForm-C23WW4aG.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/SignUpForm-hIRFmRYN.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/UpdatePasswordContent-CkpsQY6R.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.06 kB 🔴 +941 B
assets/UpdatePasswordContent-DV6NUnem.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -943 B
assets/firebaseAuthStore-DcVdVSMo.js (new) 788 B 🔴 +788 B 🔴 +387 B 🔴 +346 B
assets/firebaseAuthStore-DgxjvyWF.js (removed) 788 B 🟢 -788 B 🟢 -390 B 🟢 -349 B
assets/auth-127tCzya.js (removed) 357 B 🟢 -357 B 🟢 -226 B 🟢 -210 B
assets/auth-UW8q8w1P.js (new) 357 B 🔴 +357 B 🔴 +226 B 🔴 +192 B
assets/PasswordFields-DLbVLg8O.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-D6ioir1T.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Editors & Dialogs — 736 B (baseline 736 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-CTimK0J3.js (new) 736 B 🔴 +736 B 🔴 +377 B 🔴 +325 B
assets/useSubscriptionDialog-DRkwA1-V.js (removed) 736 B 🟢 -736 B 🟢 -380 B 🟢 -329 B

Status: 1 added / 1 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-7ZTaAREe.js (removed) 9.84 kB 🟢 -9.84 kB 🟢 -3.4 kB 🟢 -3.01 kB
assets/useTerminalTabs-B8KntGtT.js (new) 9.84 kB 🔴 +9.84 kB 🔴 +3.4 kB 🔴 +3 kB
assets/ComfyQueueButton-Cxrxq-8u.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.48 kB 🟢 -2.23 kB
assets/ComfyQueueButton-DCEX2NQ_.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.49 kB 🔴 +2.23 kB
assets/SubscribeButton-Bo-_i-AA.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +1.06 kB 🔴 +940 B
assets/SubscribeButton-BzDRRKFz.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -1.07 kB 🟢 -946 B
assets/cloudFeedbackTopbarButton-1rREFURl.js (removed) 1.59 kB 🟢 -1.59 kB 🟢 -852 B 🟢 -758 B
assets/cloudFeedbackTopbarButton-CNeQ2N3D.js (new) 1.59 kB 🔴 +1.59 kB 🔴 +851 B 🔴 +761 B
assets/ComfyQueueButton-B6gR7q1_.js (removed) 793 B 🟢 -793 B 🟢 -393 B 🟢 -351 B
assets/ComfyQueueButton-CoZeWEeS.js (new) 793 B 🔴 +793 B 🔴 +391 B 🔴 +350 B
assets/Button-D1z3poyI.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-D1z3EKPy.js 1.16 kB 1.16 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-Bg4LklDe.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-DecBFGbM.js 5.94 kB 5.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-CJNpTEnW.js 7.44 kB 7.44 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-CnQQLXB-.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-sg8Jj4MY.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.55 MB (baseline 2.55 MB) • 🔴 +232 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-CU5PN8q1.js (new) 1.75 MB 🔴 +1.75 MB 🔴 +393 kB 🔴 +296 kB
assets/dialogService-CSlbqssv.js (removed) 1.75 MB 🟢 -1.75 MB 🟢 -393 kB 🟢 -296 kB
assets/api-BYKFbLKU.js (removed) 678 kB 🟢 -678 kB 🟢 -153 kB 🟢 -122 kB
assets/api-D5p6lSZY.js (new) 678 kB 🔴 +678 kB 🔴 +153 kB 🔴 +122 kB
assets/load3dService-Cf9x76lU.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/load3dService-KrI5Yj4J.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/extensionStore-BbUvsbBJ.js (removed) 12.1 kB 🟢 -12.1 kB 🟢 -4.21 kB 🟢 -3.7 kB
assets/extensionStore-C-4htqrm.js (new) 12.1 kB 🔴 +12.1 kB 🔴 +4.21 kB 🔴 +3.7 kB
assets/releaseStore-2e-QEaiH.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/releaseStore-BvpGk-d_.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/keybindingService-BO3FA4nj.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/keybindingService-fTLMJubO.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/bootstrapStore-BKfcEskX.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -874 B 🟢 -790 B
assets/bootstrapStore-BphRH-Mv.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +874 B 🔴 +787 B
assets/userStore-C1DtABWu.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +722 B 🔴 +671 B
assets/userStore-d0A0CZfH.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -722 B 🟢 -666 B
assets/audioService-CPJ3JiCr.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -849 B 🟢 -726 B
assets/audioService-HfIJHXb3.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +850 B 🔴 +724 B
assets/releaseStore-Bjh4yqUB.js (new) 760 B 🔴 +760 B 🔴 +380 B 🔴 +336 B
assets/releaseStore-DkAGp3Lx.js (removed) 760 B 🟢 -760 B 🟢 -384 B 🟢 -345 B
assets/settingStore-Cxc5UKaH.js (removed) 744 B 🟢 -744 B 🟢 -387 B 🟢 -344 B
assets/settingStore-tw3UTM66.js (new) 744 B 🔴 +744 B 🔴 +385 B 🔴 +337 B
assets/workflowDraftStore-CtLrdXzx.js (removed) 736 B 🟢 -736 B 🟢 -379 B 🟢 -337 B
assets/workflowDraftStore-CuOgeo-B.js (new) 736 B 🔴 +736 B 🔴 +376 B 🔴 +332 B
assets/dialogService-BXrFlBI4.js (new) 725 B 🔴 +725 B 🔴 +368 B 🔴 +323 B
assets/dialogService-IQrQZYDl.js (removed) 725 B 🟢 -725 B 🟢 -367 B 🟢 -328 B
assets/serverConfigStore-EPk4OtIK.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-BhBXw2xm.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3d-CMp8BfmB.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3dViewer-BitcgJbM.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.8 kB
assets/useLoad3dViewer-jsBZOhJS.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useFeatureFlags-CO0ARF0s.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.24 kB 🟢 -1.06 kB
assets/useFeatureFlags-DHU30wUO.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.24 kB 🔴 +1.06 kB
assets/useWorkspaceUI-DWjYbZ6E.js (removed) 3 kB 🟢 -3 kB 🟢 -821 B 🟢 -702 B
assets/useWorkspaceUI-L-iBvZk4.js (new) 3 kB 🔴 +3 kB 🔴 +823 B 🔴 +735 B
assets/subscriptionCheckoutUtil--Cqc954S.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -953 B
assets/subscriptionCheckoutUtil-BLoOBIPR.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +923 B
assets/useErrorHandling-bfkpo6ku.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +630 B 🔴 +535 B
assets/useErrorHandling-NH7yL2GH.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -632 B 🟢 -535 B
assets/useWorkspaceSwitch-C9_a59G9.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +545 B 🔴 +481 B
assets/useWorkspaceSwitch-D2amNbHs.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -543 B 🟢 -484 B
assets/useLoad3d-Cw98U-9d.js (new) 859 B 🔴 +859 B 🔴 +422 B 🔴 +375 B
assets/useLoad3d-Dq9tTTof.js (removed) 859 B 🟢 -859 B 🟢 -425 B 🟢 -383 B
assets/audioUtils-Bd2YBsMJ.js (removed) 858 B 🟢 -858 B 🟢 -500 B 🟢 -402 B
assets/audioUtils-BduZi086.js (new) 858 B 🔴 +858 B 🔴 +500 B 🔴 +402 B
assets/useLoad3dViewer-C1gdtTCX.js (removed) 838 B 🟢 -838 B 🟢 -410 B 🟢 -372 B
assets/useLoad3dViewer-DrgM47gK.js (new) 838 B 🔴 +838 B 🔴 +407 B 🔴 +365 B
assets/useCurrentUser-DaovJl0c.js (removed) 722 B 🟢 -722 B 🟢 -370 B 🟢 -329 B
assets/useCurrentUser-DVos7Ckv.js (new) 722 B 🔴 +722 B 🔴 +372 B 🔴 +323 B
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-CY7QMUhQ.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-Cddas8Zl.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BputJAFn.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-Cf_cbLlH.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

Vendor & Third-Party — 8.84 MB (baseline 8.84 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-BxkFiWzp.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-DrYd4O-6.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-BnCPTL0g.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-DVmi2O2Z.js 388 kB 388 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-LBLOE6BD.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BnYkbQDM.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-D2jVNnmE.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-MKpa1ZAW.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 — 7.86 MB (baseline 7.86 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-BBIEU6M1.js (removed) 73.4 kB 🟢 -73.4 kB 🟢 -18.9 kB 🟢 -16.2 kB
assets/core-BP8wB3VZ.js (new) 73.4 kB 🔴 +73.4 kB 🔴 +18.9 kB 🔴 +16.2 kB
assets/groupNode-BzjZoE9r.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.5 kB
assets/groupNode-D0qqOqfV.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.5 kB
assets/WidgetSelect-CUjQq36A.js (removed) 58.1 kB 🟢 -58.1 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/WidgetSelect-xxatP0p0.js (new) 58.1 kB 🔴 +58.1 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-CQv6SDaE.js (removed) 46.3 kB 🟢 -46.3 kB 🟢 -8.65 kB 🟢 -7.49 kB
assets/SubscriptionRequiredDialogContentWorkspace-D54csbDy.js (new) 46.3 kB 🔴 +46.3 kB 🔴 +8.65 kB 🔴 +7.51 kB
assets/WidgetPainter-dIYyvdKY.js (new) 32.5 kB 🔴 +32.5 kB 🔴 +7.96 kB 🔴 +7.06 kB
assets/WidgetPainter-P_gGjFMI.js (removed) 32.5 kB 🟢 -32.5 kB 🟢 -7.96 kB 🟢 -7.07 kB
assets/Load3DControls-CTxU4DDI.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.64 kB
assets/Load3DControls-DhGDT6-u.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/WorkspacePanelContent-BI7Spqix.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.14 kB 🟢 -5.4 kB
assets/WorkspacePanelContent-u1dqN3WC.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.14 kB 🔴 +5.39 kB
assets/SubscriptionRequiredDialogContent-BxxJN6jl.js (new) 25.7 kB 🔴 +25.7 kB 🔴 +6.57 kB 🔴 +5.78 kB
assets/SubscriptionRequiredDialogContent-Bz3Ni2Ey.js (removed) 25.7 kB 🟢 -25.7 kB 🟢 -6.57 kB 🟢 -5.78 kB
assets/Load3dViewerContent-BCfTGDxB.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.49 kB
assets/Load3dViewerContent-BMtopcRt.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.49 kB
assets/WidgetImageCrop-CfxCjJUJ.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.5 kB 🔴 +4.85 kB
assets/WidgetImageCrop-y8qIQGPV.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.51 kB 🟢 -4.85 kB
assets/SubscriptionPanelContentWorkspace-B3rJESEh.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -5.05 kB 🟢 -4.45 kB
assets/SubscriptionPanelContentWorkspace-wq2eRPLZ.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +5.05 kB 🔴 +4.46 kB
assets/CurrentUserPopoverWorkspace-NHiV0JSr.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -4.88 kB 🟢 -4.34 kB
assets/CurrentUserPopoverWorkspace-VICEU8bh.js (new) 19.9 kB 🔴 +19.9 kB 🔴 +4.88 kB 🔴 +4.36 kB
assets/SignInContent-BrN7bNNe.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.76 kB 🟢 -4.16 kB
assets/SignInContent-Cq2JhblS.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.76 kB 🔴 +4.16 kB
assets/WidgetInputNumber-B_nGT3ZM.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.75 kB 🔴 +4.22 kB
assets/WidgetInputNumber-CAjBrz7G.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.75 kB 🟢 -4.22 kB
assets/WidgetRecordAudio-B4TGdktF.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.94 kB 🔴 +4.43 kB
assets/WidgetRecordAudio-D1VmaV1F.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.94 kB 🟢 -4.42 kB
assets/Load3D-CiVgNjRS.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.52 kB
assets/Load3D-FvZL7ow0.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.51 kB
assets/load3d-Cr6MeDX3.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.19 kB 🔴 +3.63 kB
assets/load3d-DUyrharl.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.19 kB 🟢 -3.63 kB
assets/AudioPreviewPlayer-B1jFEnOK.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.19 kB 🟢 -2.85 kB
assets/AudioPreviewPlayer-DlsXJO0T.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.19 kB 🔴 +2.85 kB
assets/changeTracker-C1AcBIL7.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.9 kB 🔴 +2.55 kB
assets/changeTracker-CgyGIsbp.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.89 kB 🟢 -2.55 kB
assets/nodeTemplates-Dx51ET8u.js (new) 9.29 kB 🔴 +9.29 kB 🔴 +3.25 kB 🔴 +2.86 kB
assets/nodeTemplates-L80lUXf9.js (removed) 9.29 kB 🟢 -9.29 kB 🟢 -3.26 kB 🟢 -2.86 kB
assets/InviteMemberDialogContent-B7Cy5Peb.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.29 kB 🟢 -2 kB
assets/InviteMemberDialogContent-DOLQmDUS.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.29 kB 🔴 +2 kB
assets/Load3DConfiguration-dscfCbQH.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/Load3DConfiguration-R24FSrKa.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/CreateWorkspaceDialogContent-C0eI7_W-.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +1.99 kB 🔴 +1.73 kB
assets/CreateWorkspaceDialogContent-CvzD2sCR.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -1.99 kB 🟢 -1.74 kB
assets/onboardingCloudRoutes-BVXLMkYz.js (new) 5.41 kB 🔴 +5.41 kB 🔴 +1.84 kB 🔴 +1.59 kB
assets/onboardingCloudRoutes-CAKwyn9w.js (removed) 5.41 kB 🟢 -5.41 kB 🟢 -1.83 kB 🟢 -1.61 kB
assets/FreeTierDialogContent-2RADL9-2.js (removed) 5.39 kB 🟢 -5.39 kB 🟢 -1.9 kB 🟢 -1.67 kB
assets/FreeTierDialogContent-DsUEMhW-.js (new) 5.39 kB 🔴 +5.39 kB 🔴 +1.89 kB 🔴 +1.66 kB
assets/EditWorkspaceDialogContent-BqflGEx2.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.94 kB 🔴 +1.7 kB
assets/EditWorkspaceDialogContent-CotsVbKG.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.95 kB 🟢 -1.7 kB
assets/ValueControlPopover-BwX_ha6i.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/ValueControlPopover-ClPdAXvz.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/Preview3d-B0Q9WcAk.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.56 kB 🟢 -1.36 kB
assets/Preview3d-BMyIuYvy.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/CancelSubscriptionDialogContent-CtNsdN_Y.js (removed) 4.79 kB 🟢 -4.79 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/CancelSubscriptionDialogContent-s748CFBK.js (new) 4.79 kB 🔴 +4.79 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/DeleteWorkspaceDialogContent-BigS2tn4.js (removed) 4.23 kB 🟢 -4.23 kB 🟢 -1.63 kB 🟢 -1.42 kB
assets/DeleteWorkspaceDialogContent-RIx7e9GU.js (new) 4.23 kB 🔴 +4.23 kB 🔴 +1.63 kB 🔴 +1.42 kB
assets/WidgetWithControl-dBXsObLs.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.77 kB 🟢 -1.59 kB
assets/WidgetWithControl-DCY8VKla.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.77 kB 🔴 +1.6 kB
assets/LeaveWorkspaceDialogContent-CnF534wu.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.58 kB 🟢 -1.37 kB
assets/LeaveWorkspaceDialogContent-D8cZyyT0.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/RemoveMemberDialogContent-Bp68umeU.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.52 kB 🔴 +1.32 kB
assets/RemoveMemberDialogContent-z4iTh7Up.js (removed) 4.04 kB 🟢 -4.04 kB 🟢 -1.52 kB 🟢 -1.33 kB
assets/RevokeInviteDialogContent-Clt0Atea.js (removed) 3.95 kB 🟢 -3.95 kB 🟢 -1.54 kB 🟢 -1.35 kB
assets/RevokeInviteDialogContent-D2IVDop_.js (new) 3.95 kB 🔴 +3.95 kB 🔴 +1.54 kB 🔴 +1.35 kB
assets/InviteMemberUpsellDialogContent-Dp9KjB0l.js (removed) 3.82 kB 🟢 -3.82 kB 🟢 -1.4 kB 🟢 -1.23 kB
assets/InviteMemberUpsellDialogContent-Dvyubouw.js (new) 3.82 kB 🔴 +3.82 kB 🔴 +1.4 kB 🔴 +1.23 kB
assets/tierBenefits-C-EmfoUo.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.3 kB 🟢 -1.18 kB
assets/tierBenefits-DM4zcuLs.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.3 kB 🔴 +1.17 kB
assets/saveMesh--kmXQyDc.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.45 kB 🔴 +1.29 kB
assets/saveMesh-o9rLYt2g.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.29 kB
assets/cloudSessionCookie-DIoevIDH.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.08 kB 🔴 +977 B
assets/cloudSessionCookie-q3bBVDJR.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.09 kB 🟢 -954 B
assets/GlobalToast-CJ54WY_p.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/GlobalToast-CJEJCSaU.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.03 kB
assets/SubscribeToRun-C161bFy0.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -887 B
assets/SubscribeToRun-M0psABoy.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +866 B
assets/CloudRunButtonWrapper-mARrON5K.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -787 B 🟢 -712 B
assets/CloudRunButtonWrapper-VF8qCTJt.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +785 B 🔴 +703 B
assets/previousFullPath-BoELn_gy.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +651 B 🔴 +570 B
assets/previousFullPath-DVS9846V.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -650 B 🟢 -582 B
assets/cloudBadges-BuklwWKw.js (new) 1.36 kB 🔴 +1.36 kB 🔴 +703 B 🔴 +610 B
assets/cloudBadges-CMVw-6cE.js (removed) 1.36 kB 🟢 -1.36 kB 🟢 -705 B 🟢 -614 B
assets/cloudSubscription-9QBSN9vM.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -655 B 🟢 -566 B
assets/cloudSubscription-CEUfKJIa.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +654 B 🔴 +563 B
assets/Load3D-BO0NXPSy.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -496 B 🟢 -445 B
assets/Load3D-C1s_ZIjy.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +498 B 🔴 +439 B
assets/nightlyBadges-1JOrx6Kn.js (new) 1 kB 🔴 +1 kB 🔴 +528 B 🔴 +472 B
assets/nightlyBadges-y78mU53_.js (removed) 1 kB 🟢 -1 kB 🟢 -531 B 🟢 -471 B
assets/Load3dViewerContent-D0kKbaT1.js (removed) 993 B 🟢 -993 B 🟢 -467 B 🟢 -419 B
assets/Load3dViewerContent-DasnEsWT.js (new) 993 B 🔴 +993 B 🔴 +464 B 🔴 +412 B
assets/SubscriptionPanelContentWorkspace-D4tJv3Hp.js (new) 920 B 🔴 +920 B 🔴 +434 B 🔴 +375 B
assets/SubscriptionPanelContentWorkspace-D92qhv4R.js (removed) 920 B 🟢 -920 B 🟢 -438 B 🟢 -382 B
assets/graphHasMissingNodes-IV6I38fM.js (new) 761 B 🔴 +761 B 🔴 +375 B 🔴 +331 B
assets/graphHasMissingNodes-mMiy3In8.js (removed) 761 B 🟢 -761 B 🟢 -375 B 🟢 -333 B
assets/changeTracker-BeEwPTbo.js (removed) 757 B 🟢 -757 B 🟢 -384 B 🟢 -340 B
assets/changeTracker-Cc5ks2Yu.js (new) 757 B 🔴 +757 B 🔴 +382 B 🔴 +334 B
assets/WidgetLegacy-D8_I54dL.js (removed) 745 B 🟢 -745 B 🟢 -381 B 🟢 -338 B
assets/WidgetLegacy-D9wrVSov.js (new) 745 B 🔴 +745 B 🔴 +382 B 🔴 +351 B
assets/WidgetInputNumber-BM24hULO.js (removed) 469 B 🟢 -469 B 🟢 -265 B 🟢 -229 B
assets/WidgetInputNumber-CGL9CgeM.js (new) 469 B 🔴 +469 B 🔴 +264 B 🔴 +228 B
assets/AnimationControls-e1OB6oJR.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-BKNHRD6l.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-BTnZwrs2.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-DQKI7wOs.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-D9MrYETV.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-CuEodz4y.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B-AdR9IA.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CbkxT8K8.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CJGmjcIS.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CMaLgTTb.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cw07MMbJ.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D7EtdE6o.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DknEFpK3.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ds6WuXnw.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Dvq-F-mb.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-pUOay9Eo.js 15.1 kB 15.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-u2AZ8xU4.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-htt0vt7m.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-Bcia7X9c.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-DI0OPWoR.js 531 kB 531 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B_Wsy2zX.js 151 kB 151 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BgoL-5j1.js 171 kB 171 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BgP6H8V2.js 178 kB 178 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BHnRTSDV.js 153 kB 153 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BVdfMmEN.js 148 kB 148 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CplVY01V.js 185 kB 185 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D3J6T63F.js 207 kB 207 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D8ud0Hl5.js 130 kB 130 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DEL_HfgI.js 156 kB 156 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DQyIQ6JB.js 148 kB 148 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Y59dVx3K.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-Dqa2c7nZ.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-DLiWNcHw.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-BLQErkwF.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-NQGNpa4H.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-0crUoXWV.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-sJMrm9jB.js 2.77 kB 2.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-4cn4-gG9.js 448 kB 448 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B5k4lNE3.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BJNVnuoz.js 402 kB 402 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-bylbcqSc.js 448 kB 448 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CU0-WQTL.js 489 kB 489 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D1sHTs_-.js 362 kB 362 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DedOJsaf.js 414 kB 414 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-QD8mdHRS.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Rqekep7N.js 397 kB 397 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-rUOYRJo0.js 394 kB 394 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-wEnA0xcT.js 389 kB 389 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-BIYdg9E5.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-C_7cycpB.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-CtKEtoXB.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-DVkw5nPu.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-CbNGuSYA.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-DVSfLULk.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/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-D-ZhKuWc.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-NeEr3XWN.js 586 B 586 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BYbwNME9.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-GzA4D-L-.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-BtoXUSiF.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-DCbDfd19.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-CIcV8pqy.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-DZSYhGzO.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-oYMwrOjF.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-0CncUIzA.js 1.86 kB 1.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-TvCt3ARa.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-Cqdttdn1.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DN03zIgB.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-B7IIifV6.js 3.96 kB 3.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-CTquGMvp.js 6.8 kB 6.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-Br_tbhcL.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 52 added / 52 removed

@github-actions
Copy link

github-actions bot commented Feb 26, 2026

⚡ Performance Report

Metric Baseline PR Δ
canvas-idle: style recalcs 125 124 -1% ⚪
canvas-idle: layouts 0 0 +0% ⚪
canvas-idle: task duration 430ms 451ms +5% ⚪
canvas-mouse-sweep: style recalcs 169 184 +9% ⚪
canvas-mouse-sweep: layouts 12 12 +0% ⚪
canvas-mouse-sweep: task duration 804ms 1083ms +35% 🔴
dom-widget-clipping: style recalcs 46 45 -2% ⚪
dom-widget-clipping: layouts 1 0 -100% 🟢
dom-widget-clipping: task duration 366ms 412ms +13% 🟠
Raw data
{
  "timestamp": "2026-02-27T14:36:54.455Z",
  "gitSha": "94f181431fc108fd1d858dd54a8cc96598d166bb",
  "branch": "pysssss/discard-delayed-previews",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2044.5430000000329,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 28.559,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 450.69599999999997,
      "heapDeltaBytes": -2062412
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2062.0059999999967,
      "styleRecalcs": 184,
      "styleRecalcDurationMs": 59.265,
      "layouts": 12,
      "layoutDurationMs": 3.5900000000000003,
      "taskDurationMs": 1083.4,
      "heapDeltaBytes": -2363972
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 620.1519999999618,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 16.898000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 412.31300000000005,
      "heapDeltaBytes": 7831548
    }
  ]
}

@pythongosssss pythongosssss changed the title App mode - discard slow preview messages from overwriting output image App mode - discard slow preview messages to prevent overwriting output image Feb 26, 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.

🧹 Nitpick comments (1)
src/stores/jobPreviewStore.test.ts (1)

94-101: Consider adding a test for the watch that clears previews when disabled.

The production code has a watch(isPreviewEnabled, ...) that calls clearAllPreviews() when previews become disabled. This behavior isn't explicitly tested. Adding a test would improve coverage of this reactive side effect.

🧪 Suggested test case
+  it('clears all previews when preview method changes to none', async () => {
+    const { nextTick } = await import('vue')
+    const store = useJobPreviewStore()
+    store.setPreviewUrl('p1', 'blob:a', 'node-1')
+    store.setPreviewUrl('p2', 'blob:b', 'node-2')
+
+    expect(Object.keys(store.nodePreviewsByPromptId)).toHaveLength(2)
+
+    previewMethodRef.value = 'none'
+    await nextTick()
+
+    expect(store.nodePreviewsByPromptId).toEqual({})
+  })
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stores/jobPreviewStore.test.ts` around lines 94 - 101, Add a test that
verifies the reactive watcher clears previews when previews become disabled:
create a store via useJobPreviewStore(), enable previews by setting
previewMethodRef.value to a non-'none' value, call store.setPreviewUrl(...) to
populate nodePreviewsByPromptId, then change previewMethodRef.value to 'none'
and assert that store.nodePreviewsByPromptId is cleared (or that
clearAllPreviews was invoked); reference useJobPreviewStore(), previewMethodRef,
setPreviewUrl and clearAllPreviews/watch behavior in the test.
🤖 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/stores/jobPreviewStore.test.ts`:
- Around line 94-101: Add a test that verifies the reactive watcher clears
previews when previews become disabled: create a store via useJobPreviewStore(),
enable previews by setting previewMethodRef.value to a non-'none' value, call
store.setPreviewUrl(...) to populate nodePreviewsByPromptId, then change
previewMethodRef.value to 'none' and assert that store.nodePreviewsByPromptId is
cleared (or that clearAllPreviews was invoked); reference useJobPreviewStore(),
previewMethodRef, setPreviewUrl and clearAllPreviews/watch behavior in the test.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9fb93a5 and c797e1b.

📒 Files selected for processing (5)
  • src/renderer/extensions/linearMode/linearOutputStore.test.ts
  • src/renderer/extensions/linearMode/linearOutputStore.ts
  • src/scripts/app.ts
  • src/stores/jobPreviewStore.test.ts
  • src/stores/jobPreviewStore.ts

@pythongosssss pythongosssss marked this pull request as ready for review February 27, 2026 10:40
@pythongosssss pythongosssss requested a review from a team as a code owner February 27, 2026 10:40
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Feb 27, 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

🧹 Nitpick comments (1)
src/renderer/extensions/linearMode/linearOutputStore.ts (1)

250-259: Watch only the active job preview instead of deep-watching the full map

The deep watch triggers for unrelated job preview mutations. Watching the active job entry directly reduces unnecessary callback work.

Refactor sketch
-watch(
-  () => jobPreviewStore.nodePreviewsByPromptId,
-  (previews) => {
-    if (!appModeStore.isAppMode) return
-    const jobId = executionStore.activeJobId
-    if (!jobId) return
-    const preview = previews[jobId]
-    if (preview) onLatentPreview(jobId, preview.url, preview.nodeId)
-  },
-  { deep: true }
-)
+watch(
+  () => {
+    const jobId = executionStore.activeJobId
+    return jobId ? jobPreviewStore.nodePreviewsByPromptId[jobId] : undefined
+  },
+  (preview) => {
+    if (!appModeStore.isAppMode) return
+    const jobId = executionStore.activeJobId
+    if (!jobId || !preview) return
+    onLatentPreview(jobId, preview.url, preview.nodeId)
+  }
+)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderer/extensions/linearMode/linearOutputStore.ts` around lines 250 -
259, Replace the deep watch over jobPreviewStore.nodePreviewsByPromptId with a
focused watch that only observes the currently active job's preview: create the
watch source as a getter that reads executionStore.activeJobId and returns the
single preview entry for that id (or null/undefined when no active id), then in
the watch callback call onLatentPreview(jobId, preview.url, preview.nodeId) when
a preview exists; remove the { deep: true } option. Use the existing symbols:
watch, executionStore.activeJobId, jobPreviewStore.nodePreviewsByPromptId,
appModeStore.isAppMode, and onLatentPreview to locate and implement the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/renderer/extensions/linearMode/linearOutputStore.ts`:
- Around line 58-61: In onLatentPreview, check whether nodeId is in
executedNodeIds and return early before touching raf; move the executed-node
filtering (the nodeId && executedNodeIds.has(nodeId) check) to the top of the
function so you don't cancelAnimationFrame(raf) or schedule a new RAF for a node
that's already executed; update references to raf and any subsequent scheduling
so they only run when the node is not executed.

---

Nitpick comments:
In `@src/renderer/extensions/linearMode/linearOutputStore.ts`:
- Around line 250-259: Replace the deep watch over
jobPreviewStore.nodePreviewsByPromptId with a focused watch that only observes
the currently active job's preview: create the watch source as a getter that
reads executionStore.activeJobId and returns the single preview entry for that
id (or null/undefined when no active id), then in the watch callback call
onLatentPreview(jobId, preview.url, preview.nodeId) when a preview exists;
remove the { deep: true } option. Use the existing symbols: watch,
executionStore.activeJobId, jobPreviewStore.nodePreviewsByPromptId,
appModeStore.isAppMode, and onLatentPreview to locate and implement the change.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c797e1b and 8b38c41.

📒 Files selected for processing (1)
  • src/renderer/extensions/linearMode/linearOutputStore.ts

@pythongosssss pythongosssss force-pushed the pysssss/discard-delayed-previews branch from 8b38c41 to c797e1b Compare February 27, 2026 14:33
@pythongosssss pythongosssss merged commit f83daa6 into main Feb 27, 2026
66 checks passed
@pythongosssss pythongosssss deleted the pysssss/discard-delayed-previews branch February 27, 2026 18:58
DrJKL pushed a commit that referenced this pull request Feb 28, 2026
…t image (#9261)

## Summary

Prevent latent previews received after the job/node has already finished
processing overwriting the actual output display

## Changes

- **What**: 
- updates job preview store to also track which node the preview was for
- updates linear progress tracking to store executed nodes enabling
skipping previews of these

## Review Focus

<!-- Critical design decisions or edge cases that need attention -->

<!-- If this PR fixes an issue, uncomment and update the line below -->
<!-- Fixes #ISSUE_NUMBER -->

## Screenshots (if applicable)

<!-- Add screenshots or video recording to help explain your changes -->

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9261-App-mode-discard-slow-preview-messages-to-prevent-overwriting-output-image-3136d73d3650817884c2ce2ff5993b9e)
by [Unito](https://www.unito.io)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants