Skip to content

Handle desktop close confirmation requests#8607

Draft
benceruleanlu wants to merge 1 commit intomainfrom
fix/close-confirmation-ipc-frontend
Draft

Handle desktop close confirmation requests#8607
benceruleanlu wants to merge 1 commit intomainfrom
fix/close-confirmation-ipc-frontend

Conversation

@benceruleanlu
Copy link
Member

@benceruleanlu benceruleanlu commented Feb 4, 2026

Summary

  • Handle desktop close-request IPC in the Electron adapter
  • Reuse the existing confirmation dialog and setting to decide whether to allow close
  • Centralize quit confirmation in the main-process close flow

Testing

  • pnpm lint
  • pnpm typecheck

Linked PRs

Refs Comfy-Org/desktop#1585

┆Issue is synchronized with this Notion page by Unito

Summary by CodeRabbit

Bug Fixes

  • Refined application close and quit behavior to include confirmation prompts when workflows contain unsaved modifications, controlled by user preferences.

@github-actions
Copy link

github-actions bot commented Feb 4, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/04/2026, 08:32:13 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Feb 4, 2026

🎭 Playwright Tests: ✅ Passed

Results: 508 passed, 0 failed, 0 flaky, 8 skipped (Total: 516)

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 4, 2026

📝 Walkthrough

Walkthrough

This change refactors the Electron close-handling flow by introducing a dedicated close request handler that checks settings and prompts users for confirmation when modified workflows exist, while simplifying the Quit menu command.

Changes

Cohort / File(s) Summary
Electron Close-Handling Refactor
src/extensions/core/electronAdapter.ts
Introduces typed ElectronCloseApi augmentation and implements close request handler that loads settings, checks "UnloadConfirmation" setting, and prompts user before closing if modified workflows exist. Removes inline confirmation logic from Quit menu command. Adds dependencies for useSettingStore and useDialogService.

Sequence Diagram

sequenceDiagram
    participant User
    participant ElectronAPI as Electron API
    participant Handler as Close Handler
    participant SettingStore
    participant DialogService
    participant App

    User->>ElectronAPI: Trigger close request
    ElectronAPI->>Handler: onCloseRequested event
    Handler->>SettingStore: Load settings
    SettingStore-->>Handler: Settings loaded
    Handler->>Handler: Check UnloadConfirmation setting
    alt UnloadConfirmation enabled
        Handler->>DialogService: Prompt user confirmation
        DialogService-->>User: Show confirmation dialog
        User->>DialogService: User responds
        DialogService-->>Handler: Confirmation result
        alt User confirms
            Handler->>ElectronAPI: Allow close
        else User cancels
            Handler->>ElectronAPI: Prevent close
        end
    else UnloadConfirmation disabled
        Handler->>ElectronAPI: Allow close
    end
    ElectronAPI->>App: Close application (if allowed)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 A handler hops in, watches the door,
Settings checked, no rush anymore.
Dialog asks: "Are you sure, friend?"
Close flows proper, from start to end!
~CodeRabbit

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Description check ❓ Inconclusive The description covers the key aspects but deviates from the template structure. It lacks the prescribed 'What' and 'Dependencies' sections, and does not follow the 'Changes' section format required by the template. Restructure the description to follow the template format: add a concise summary sentence, clearly list 'What' was changed and 'Dependencies' added, and optionally add a 'Review Focus' section for critical design decisions.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: handling desktop close confirmation requests, which matches the core functionality added in the Electron adapter.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/close-confirmation-ipc-frontend

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 4, 2026

Bundle Size Report

Summary

  • Raw size: 20.2 MB baseline 20.2 MB — 🔴 +630 B
  • Gzip: 4.32 MB baseline 4.32 MB — 🔴 +379 B
  • Brotli: 3.34 MB baseline 3.34 MB — 🔴 +158 B
  • Bundles: 233 current • 233 baseline • 107 added / 107 removed

Category Glance
Other 🔴 +630 B (7.08 MB) · Vendor & Third-Party ⚪ 0 B (9.37 MB) · Data & Services ⚪ 0 B (2.1 MB) · Graph Workspace ⚪ 0 B (838 kB) · Panels & Settings ⚪ 0 B (410 kB) · Utilities & Hooks ⚪ 0 B (234 kB) · + 5 more

Per-category breakdown
App Entry Points — 22.5 kB (baseline 22.5 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-B1eQcg7r.js (removed) 22.5 kB 🟢 -22.5 kB 🟢 -7.18 kB 🟢 -6.26 kB
assets/index-BSgmrfDp.js (new) 22.5 kB 🔴 +22.5 kB 🔴 +7.18 kB 🔴 +6.25 kB

Status: 1 added / 1 removed

Graph Workspace — 838 kB (baseline 838 kB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-B4PeWUCs.js (removed) 838 kB 🟢 -838 kB 🟢 -180 kB 🟢 -137 kB
assets/GraphView-BdjF66Ah.js (new) 838 kB 🔴 +838 kB 🔴 +180 kB 🔴 +137 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CT2hviZk.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -3.46 kB 🟢 -2.95 kB
assets/CloudSurveyView-Do-tQVrV.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +3.46 kB 🔴 +2.93 kB
assets/CloudLoginView-CLv1XSVN.js (new) 10 kB 🔴 +10 kB 🔴 +2.93 kB 🔴 +2.56 kB
assets/CloudLoginView-qkoSWM8M.js (removed) 10 kB 🟢 -10 kB 🟢 -2.93 kB 🟢 -2.57 kB
assets/UserCheckView-D0Ww2GW8.js (removed) 8.39 kB 🟢 -8.39 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/UserCheckView-D5UFQNG3.js (new) 8.39 kB 🔴 +8.39 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/CloudSignupView-B76mcHLH.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.31 kB 🔴 +2.02 kB
assets/CloudSignupView-BTj1zFuV.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.31 kB 🟢 -2.01 kB
assets/CloudLayoutView-BfZpfv7G.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.12 kB 🔴 +1.83 kB
assets/CloudLayoutView-DcWHVqRR.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.12 kB 🟢 -1.83 kB
assets/CloudForgotPasswordView-CMqPxTji.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.93 kB 🟢 -1.7 kB
assets/CloudForgotPasswordView-Csj6EmFt.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.94 kB 🔴 +1.71 kB
assets/CloudAuthTimeoutView-7U5eC7F_.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CloudAuthTimeoutView-CJLJFRkj.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/CloudSubscriptionRedirectView-CEY-1rqF.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.77 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-HY_wVI5A.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.77 kB 🔴 +1.57 kB
assets/UserSelectView-BXlTyN_Z.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.64 kB 🟢 -1.47 kB
assets/UserSelectView-tKINgjpB.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/CloudSorryContactSupportView-BPXBOTez.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-ncetNFDR.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WorkspacePanel-B00h0zGG.js (new) 26.9 kB 🔴 +26.9 kB 🔴 +5.66 kB 🔴 +4.99 kB
assets/WorkspacePanel-Dx8mEf01.js (removed) 26.9 kB 🟢 -26.9 kB 🟢 -5.65 kB 🟢 -4.97 kB
assets/SecretsPanel-4RmLxzre.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.27 kB 🔴 +4.63 kB
assets/SecretsPanel-n37moPEu.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.27 kB 🟢 -4.63 kB
assets/LegacyCreditsPanel-BqHiu-wK.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -5.62 kB 🟢 -4.93 kB
assets/LegacyCreditsPanel-DMTH-wR4.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +5.62 kB 🔴 +4.92 kB
assets/SubscriptionPanel-Bq16IX7y.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -4.76 kB 🟢 -4.2 kB
assets/SubscriptionPanel-DCTJeALa.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +4.76 kB 🔴 +4.21 kB
assets/KeybindingPanel-4by8QD5O.js (removed) 12.6 kB 🟢 -12.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/KeybindingPanel-x1wWZSUY.js (new) 12.6 kB 🔴 +12.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/ExtensionPanel-5P0MSaZb.js (new) 9.49 kB 🔴 +9.49 kB 🔴 +2.69 kB 🔴 +2.38 kB
assets/ExtensionPanel-BK0OFm0a.js (removed) 9.49 kB 🟢 -9.49 kB 🟢 -2.69 kB 🟢 -2.4 kB
assets/AboutPanel-BmML5Pqe.js (new) 8.62 kB 🔴 +8.62 kB 🔴 +2.46 kB 🔴 +2.21 kB
assets/AboutPanel-De1jGRtR.js (removed) 8.62 kB 🟢 -8.62 kB 🟢 -2.45 kB 🟢 -2.21 kB
assets/ServerConfigPanel-BlFCWREc.js (removed) 6.64 kB 🟢 -6.64 kB 🟢 -2.15 kB 🟢 -1.93 kB
assets/ServerConfigPanel-BQBxLMij.js (new) 6.64 kB 🔴 +6.64 kB 🔴 +2.15 kB 🔴 +1.93 kB
assets/UserPanel-CuXzW3UQ.js (new) 6.28 kB 🔴 +6.28 kB 🔴 +2.02 kB 🔴 +1.78 kB
assets/UserPanel-H9_rSh1A.js (removed) 6.28 kB 🟢 -6.28 kB 🟢 -2.02 kB 🟢 -1.77 kB
assets/cloudRemoteConfig-BUztlcco.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +699 B 🔴 +607 B
assets/cloudRemoteConfig-DujwtKMe.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -698 B 🟢 -601 B
assets/refreshRemoteConfig-C9pns1R0.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -511 B 🟢 -447 B
assets/refreshRemoteConfig-ta39fgr9.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +511 B 🔴 +447 B
assets/refreshRemoteConfig-450eDwen.js (new) 345 B 🔴 +345 B 🔴 +201 B 🔴 +184 B
assets/refreshRemoteConfig-BTsOrgXm.js (removed) 345 B 🟢 -345 B 🟢 -205 B 🟢 -180 B
assets/config-HAvaVehF.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/remoteConfig-CUBB_j_I.js 581 B 581 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BgcR6REE.js 25 kB 25 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BmEXiKRV.js 32 kB 32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BNs5rnMt.js 24.1 kB 24.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C5jqELHS.js 23.6 kB 23.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CKCscONF.js 28.1 kB 28.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CzcL_U24.js 20.8 kB 20.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D95NIw0v.js 26.8 kB 26.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DmYc-PH9.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DQe4OZm2.js 25.7 kB 25.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dxocpd_-.js 20.3 kB 20.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-f2yAwEpW.js 23.3 kB 23.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-CPVw3fnL.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +996 B
assets/auth-CrOcbCdP.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -996 B
assets/SignUpForm-ChgceXFD.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.11 kB
assets/SignUpForm-ZCrpZcSm.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.24 kB 🔴 +1.09 kB
assets/UpdatePasswordContent-CpDsTDC9.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -948 B
assets/UpdatePasswordContent-QHLkktB1.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +946 B
assets/firebaseAuthStore-CZedc9jy.js (removed) 790 B 🟢 -790 B 🟢 -387 B 🟢 -350 B
assets/firebaseAuthStore-DwCKKjtV.js (new) 790 B 🔴 +790 B 🔴 +391 B 🔴 +345 B
assets/auth-DNpvMw6Z.js (new) 347 B 🔴 +347 B 🔴 +221 B 🔴 +188 B
assets/auth-UQ26rpOb.js (removed) 347 B 🟢 -347 B 🟢 -220 B 🟢 -187 B
assets/PasswordFields-BAi3GPM-.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-B0BztYjc.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-BemyRTMP.js (new) 2.68 kB 🔴 +2.68 kB 🔴 +1.32 kB 🔴 +1.18 kB
assets/useSubscriptionDialog-uBpo_u0d.js (removed) 2.68 kB 🟢 -2.68 kB 🟢 -1.32 kB 🟢 -1.17 kB
assets/useSubscriptionDialog-BYePtGUc.js (new) 783 B 🔴 +783 B 🔴 +388 B 🔴 +343 B
assets/useSubscriptionDialog-C4lmhS8x.js (removed) 783 B 🟢 -783 B 🟢 -384 B 🟢 -346 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-BgXyJz6O.js (removed) 9.9 kB 🟢 -9.9 kB 🟢 -3.4 kB 🟢 -2.99 kB
assets/useTerminalTabs-BrN_qtkR.js (new) 9.9 kB 🔴 +9.9 kB 🔴 +3.4 kB 🔴 +3 kB
assets/ComfyQueueButton-JN1Fpe3t.js (removed) 7.13 kB 🟢 -7.13 kB 🟢 -2.31 kB 🟢 -2.06 kB
assets/ComfyQueueButton-VnTzy2rW.js (new) 7.13 kB 🔴 +7.13 kB 🔴 +2.31 kB 🔴 +2.06 kB
assets/SubscribeButton-DLP3-hTf.js (removed) 3.68 kB 🟢 -3.68 kB 🟢 -1.38 kB 🟢 -1.21 kB
assets/SubscribeButton-N9pjPkYX.js (new) 3.68 kB 🔴 +3.68 kB 🔴 +1.38 kB 🔴 +1.24 kB
assets/cloudFeedbackTopbarButton-CD5esHT8.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -856 B 🟢 -762 B
assets/cloudFeedbackTopbarButton-CMs6zCOL.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +856 B 🔴 +765 B
assets/ComfyQueueButton-CG6geLDt.js (new) 795 B 🔴 +795 B 🔴 +394 B 🔴 +349 B
assets/ComfyQueueButton-DNn95fYA.js (removed) 795 B 🟢 -795 B 🟢 -391 B 🟢 -354 B
assets/Button-ChqYCdrL.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-DtjkqbcY.js 1.2 kB 1.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-BsZTG314.js 7.52 kB 7.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-Dtdiv1Hu.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DVfWCi_V.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.1 MB (baseline 2.1 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-BRxjPq-X.js (new) 1.3 MB 🔴 +1.3 MB 🔴 +298 kB 🔴 +231 kB
assets/dialogService-BXfCe7Zs.js (removed) 1.3 MB 🟢 -1.3 MB 🟢 -298 kB 🟢 -231 kB
assets/api-CkLvPPeO.js (removed) 640 kB 🟢 -640 kB 🟢 -144 kB 🟢 -115 kB
assets/api-DguG1UCJ.js (new) 640 kB 🔴 +640 kB 🔴 +144 kB 🔴 +115 kB
assets/load3dService-CvRZFRGO.js (new) 91.1 kB 🔴 +91.1 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-D12j4dBR.js (removed) 91.1 kB 🟢 -91.1 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/teamWorkspaceStore-_b5LyHDw.js (new) 27.1 kB 🔴 +27.1 kB 🔴 +6.12 kB 🔴 +5.42 kB
assets/teamWorkspaceStore-C24bfLFK.js (removed) 27.1 kB 🟢 -27.1 kB 🟢 -6.12 kB 🟢 -5.41 kB
assets/systemStatsStore-D79Iptpt.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -4.29 kB 🟢 -3.77 kB
assets/systemStatsStore-L5eEf2wc.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +4.29 kB 🔴 +3.77 kB
assets/releaseStore-4AkqPKAx.js (new) 8.14 kB 🔴 +8.14 kB 🔴 +2.24 kB 🔴 +1.97 kB
assets/releaseStore-CWyZyVIL.js (removed) 8.14 kB 🟢 -8.14 kB 🟢 -2.24 kB 🟢 -1.97 kB
assets/keybindingService-C0MoNrWx.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/keybindingService-D6hi3LGe.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/bootstrapStore-B_ghDwb2.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +884 B 🔴 +809 B
assets/bootstrapStore-Ca-vNW0D.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -882 B 🟢 -813 B
assets/userStore-agIQfIqz.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -719 B 🟢 -671 B
assets/userStore-BaJm9tiK.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +719 B 🔴 +666 B
assets/audioService-Bs0zXIlX.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -845 B 🟢 -732 B
assets/audioService-CChAVJc_.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +845 B 🔴 +725 B
assets/releaseStore-CJjNW1aG.js (new) 762 B 🔴 +762 B 🔴 +388 B 🔴 +336 B
assets/releaseStore-NPf2r1SY.js (removed) 762 B 🟢 -762 B 🟢 -383 B 🟢 -339 B
assets/dialogStore-D2gUGUn6.js 4.1 kB 4.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-DB58Z5s2.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-BwdRHEYw.js (new) 177 kB 🔴 +177 kB 🔴 +38.9 kB 🔴 +32.3 kB
assets/useConflictDetection-Dv4fpdfb.js (removed) 177 kB 🟢 -177 kB 🟢 -38.9 kB 🟢 -32.4 kB
assets/useLoad3d-Ct25zwBy.js (new) 14.4 kB 🔴 +14.4 kB 🔴 +3.56 kB 🔴 +3.14 kB
assets/useLoad3d-HVnlTzAw.js (removed) 14.4 kB 🟢 -14.4 kB 🟢 -3.56 kB 🟢 -3.14 kB
assets/useLoad3dViewer-D1C_8wD2.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.16 kB 🟢 -2.8 kB
assets/useLoad3dViewer-DkWxiPTW.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.16 kB 🔴 +2.8 kB
assets/useErrorHandling-Bc5VkDeQ.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.34 kB 🟢 -1.18 kB
assets/useErrorHandling-DCyPyZ_N.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.34 kB 🔴 +1.18 kB
assets/useWorkspaceUI-BO5SlXMv.js (new) 3.16 kB 🔴 +3.16 kB 🔴 +883 B 🔴 +765 B
assets/useWorkspaceUI-BVThnTwa.js (removed) 3.16 kB 🟢 -3.16 kB 🟢 -883 B 🟢 -765 B
assets/useSubscriptionActions-2ac_YFU2.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -755 B 🟢 -652 B
assets/useSubscriptionActions-DFJaL_1P.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +755 B 🔴 +649 B
assets/subscriptionCheckoutUtil-B9twTb41.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +785 B 🔴 +683 B
assets/subscriptionCheckoutUtil-BT4lo_vU.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -784 B 🟢 -688 B
assets/useSubscriptionCredits-BC2u4oKu.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +501 B 🔴 +451 B
assets/useSubscriptionCredits-Bd96By84.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -502 B 🟢 -441 B
assets/useLoad3d-CDNeCuSq.js (removed) 861 B 🟢 -861 B 🟢 -427 B 🟢 -383 B
assets/useLoad3d-T55kgT08.js (new) 861 B 🔴 +861 B 🔴 +426 B 🔴 +383 B
assets/audioUtils-CQe78WVK.js (new) 858 B 🔴 +858 B 🔴 +501 B 🔴 +404 B
assets/audioUtils-DYhoekip.js (removed) 858 B 🟢 -858 B 🟢 -498 B 🟢 -418 B
assets/useLoad3dViewer-DGUQm5Ea.js (removed) 840 B 🟢 -840 B 🟢 -411 B 🟢 -371 B
assets/useLoad3dViewer-Qon2aVwx.js (new) 840 B 🔴 +840 B 🔴 +412 B 🔴 +368 B
assets/useCurrentUser-BjM1KBLT.js (removed) 724 B 🟢 -724 B 🟢 -372 B 🟢 -330 B
assets/useCurrentUser-c3A6jK9y.js (new) 724 B 🔴 +724 B 🔴 +376 B 🔴 +328 B
assets/_plugin-vue_export-helper-CAbbkOlw.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-FW_Ghng2.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Djb4sHrV.js 524 B 524 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-Cc2LFa5s.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/networkUtil-Du2a_n7V.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-DwBAnKr-.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCopyToClipboard-ihQ2636T.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-Br3OkPS9.js 1.63 kB 1.63 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-D0w6WYH0.js 71.6 kB 71.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-CIdI9Yl4.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-CLEC0CcJ.js 842 kB 842 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-C6_f776o.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-BkVHYrKV.js 102 kB 102 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-DPcKX1Hx.js 2.16 MB 2.16 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-Dw8RivU1.js 1.74 MB 1.74 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CPrt7lw0.js 240 kB 240 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-BVA5kbUC.js 183 kB 183 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-CJhOuqDg.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-CvX7mojg.js 632 kB 632 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-BBP9kkTE.js 312 kB 312 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-CS5mlw4Q.js 111 kB 111 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-DOEEpxXk.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-BtrvIr1x.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-gAWmQIF-.js 110 kB 110 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.08 MB (baseline 7.08 MB) • 🔴 +630 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-Cdiym8pJ.js (new) 72.1 kB 🔴 +72.1 kB 🔴 +18.6 kB 🔴 +15.9 kB
assets/core-BkHm7yo7.js (removed) 71.4 kB 🟢 -71.4 kB 🟢 -18.4 kB 🟢 -15.8 kB
assets/groupNode-tGu7R_Jm.js (new) 70.9 kB 🔴 +70.9 kB 🔴 +17.5 kB 🔴 +15.4 kB
assets/groupNode-wApeescD.js (removed) 70.9 kB 🟢 -70.9 kB 🟢 -17.5 kB 🟢 -15.4 kB
assets/WidgetSelect-BbTaPyEs.js (new) 56.6 kB 🔴 +56.6 kB 🔴 +12 kB 🔴 +10.4 kB
assets/WidgetSelect-C2mhL8wM.js (removed) 56.6 kB 🟢 -56.6 kB 🟢 -12 kB 🟢 -10.4 kB
assets/SettingDialogContent-2-j2O9HA.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -8 kB 🟢 -7.06 kB
assets/SettingDialogContent-DTNjXhVt.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +8.01 kB 🔴 +7.06 kB
assets/Load3DControls-ClczJxg_.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -5.33 kB 🟢 -4.64 kB
assets/Load3DControls-DOoJkjqN.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +5.33 kB 🔴 +4.63 kB
assets/SubscriptionRequiredDialogContent-CGHR74V3.js (removed) 25.4 kB 🟢 -25.4 kB 🟢 -6.36 kB 🟢 -5.58 kB
assets/SubscriptionRequiredDialogContent-D86F799R.js (new) 25.4 kB 🔴 +25.4 kB 🔴 +6.36 kB 🔴 +5.58 kB
assets/Load3dViewerContent-Byh4deNR.js (new) 23.2 kB 🔴 +23.2 kB 🔴 +5.24 kB 🔴 +4.55 kB
assets/Load3dViewerContent-C1v0y_iv.js (removed) 23.2 kB 🟢 -23.2 kB 🟢 -5.24 kB 🟢 -4.54 kB
assets/WidgetImageCrop-BG6vZ-RV.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.51 kB 🔴 +4.86 kB
assets/WidgetImageCrop-BXz9dYki.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.51 kB 🟢 -4.84 kB
assets/FormItem-BZ2LJKNc.js (removed) 20.2 kB 🟢 -20.2 kB 🟢 -4.87 kB 🟢 -4.25 kB
assets/FormItem-Cx_pXalQ.js (new) 20.2 kB 🔴 +20.2 kB 🔴 +4.87 kB 🔴 +4.25 kB
assets/CurrentUserPopoverWorkspace-aJYAtyKm.js (removed) 19.7 kB 🟢 -19.7 kB 🟢 -4.74 kB 🟢 -4.23 kB
assets/CurrentUserPopoverWorkspace-B7_SxgGH.js (new) 19.7 kB 🔴 +19.7 kB 🔴 +4.74 kB 🔴 +4.23 kB
assets/SignInContent-7uf5xfDV.js (removed) 19 kB 🟢 -19 kB 🟢 -4.8 kB 🟢 -4.2 kB
assets/SignInContent-FbiRZPtg.js (new) 19 kB 🔴 +19 kB 🔴 +4.8 kB 🔴 +4.2 kB
assets/WidgetRecordAudio-CXdKngFb.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -4.92 kB 🟢 -4.4 kB
assets/WidgetRecordAudio-DSnFvpRu.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +4.93 kB 🔴 +4.41 kB
assets/TopUpCreditsDialogContent-CSrKqc2q.js (new) 16.9 kB 🔴 +16.9 kB 🔴 +4.8 kB 🔴 +4.25 kB
assets/TopUpCreditsDialogContent-DrBuJ0vs.js (removed) 16.9 kB 🟢 -16.9 kB 🟢 -4.79 kB 🟢 -4.24 kB
assets/Load3D-DkvpQXbO.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.04 kB 🔴 +3.51 kB
assets/Load3D-DW8PJ7GG.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.5 kB
assets/MissingModelsWarning-CL8z_rKN.js (new) 16.1 kB 🔴 +16.1 kB 🔴 +4.4 kB 🔴 +3.91 kB
assets/MissingModelsWarning-Dl0V0KoO.js (removed) 16.1 kB 🟢 -16.1 kB 🟢 -4.4 kB 🟢 -3.9 kB
assets/SubscriptionPanelContentWorkspace-BzgrN6_c.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.03 kB 🔴 +3.56 kB
assets/SubscriptionPanelContentWorkspace-D3kDPzWL.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -4.03 kB 🟢 -3.54 kB
assets/WidgetInputNumber-BMcpRtzZ.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -4.2 kB 🟢 -3.74 kB
assets/WidgetInputNumber-DnPIJjzc.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +4.2 kB 🔴 +3.75 kB
assets/load3d-BPLgbh-n.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.18 kB 🔴 +3.65 kB
assets/load3d-BrM2Fv31.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.18 kB 🟢 -3.64 kB
assets/NodeConflictDialogContent-CEW-FfcE.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.36 kB 🔴 +2.07 kB
assets/NodeConflictDialogContent-nBS_sRgu.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.36 kB 🟢 -2.08 kB
assets/AudioPreviewPlayer-CnWAR0dI.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.98 kB 🟢 -2.67 kB
assets/AudioPreviewPlayer-D0oIVcGl.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.99 kB 🔴 +2.7 kB
assets/nodeTemplates-EbFqTcw_.js (new) 9.33 kB 🔴 +9.33 kB 🔴 +3.27 kB 🔴 +2.88 kB
assets/nodeTemplates-FWNpYtSL.js (removed) 9.33 kB 🟢 -9.33 kB 🟢 -3.27 kB 🟢 -2.87 kB
assets/InviteMemberDialogContent-C6Feqc-K.js (removed) 7.95 kB 🟢 -7.95 kB 🟢 -2.56 kB 🟢 -2.22 kB
assets/InviteMemberDialogContent-Do8jmwuQ.js (new) 7.95 kB 🔴 +7.95 kB 🔴 +2.57 kB 🔴 +2.22 kB
assets/WidgetWithControl-CS5FiXYr.js (removed) 6.97 kB 🟢 -6.97 kB 🟢 -2.59 kB 🟢 -2.31 kB
assets/WidgetWithControl-DBSLNf67.js (new) 6.97 kB 🔴 +6.97 kB 🔴 +2.59 kB 🔴 +2.32 kB
assets/Load3DConfiguration-0nE3Sm0m.js (removed) 6.36 kB 🟢 -6.36 kB 🟢 -1.92 kB 🟢 -1.69 kB
assets/Load3DConfiguration-QT3nBBhV.js (new) 6.36 kB 🔴 +6.36 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/MissingNodesContent-BJ8id4KY.js (new) 6.14 kB 🔴 +6.14 kB 🔴 +2.09 kB 🔴 +1.85 kB
assets/MissingNodesContent-CO54z5CT.js (removed) 6.14 kB 🟢 -6.14 kB 🟢 -2.08 kB 🟢 -1.85 kB
assets/CreateWorkspaceDialogContent-aE6fFW-d.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -2 kB 🟢 -1.75 kB
assets/CreateWorkspaceDialogContent-BIoJIHWW.js (new) 5.58 kB 🔴 +5.58 kB 🔴 +2 kB 🔴 +1.75 kB
assets/EditWorkspaceDialogContent-Bd0OugRB.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.96 kB 🔴 +1.7 kB
assets/EditWorkspaceDialogContent-DyQSw_lc.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.96 kB 🟢 -1.7 kB
assets/ValueControlPopover-BW5VgFx8.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.77 kB 🔴 +1.58 kB
assets/ValueControlPopover-CUleXdH0.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.77 kB 🟢 -1.58 kB
assets/Preview3d-Dcs8Huk6.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.57 kB 🟢 -1.36 kB
assets/Preview3d-DHXpXMwd.js (new) 4.82 kB 🔴 +4.82 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/MissingNodesFooter-D0WLRocr.js (new) 4.8 kB 🔴 +4.8 kB 🔴 +1.78 kB 🔴 +1.58 kB
assets/MissingNodesFooter-m13DAoNg.js (removed) 4.8 kB 🟢 -4.8 kB 🟢 -1.78 kB 🟢 -1.57 kB
assets/DeleteWorkspaceDialogContent-DhMQQ8x2.js (removed) 4.28 kB 🟢 -4.28 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/DeleteWorkspaceDialogContent-MvfF1N4t.js (new) 4.28 kB 🔴 +4.28 kB 🔴 +1.65 kB 🔴 +1.43 kB
assets/LeaveWorkspaceDialogContent-CBp0RAXd.js (removed) 4.11 kB 🟢 -4.11 kB 🟢 -1.59 kB 🟢 -1.38 kB
assets/LeaveWorkspaceDialogContent-CjVUn9mF.js (new) 4.11 kB 🔴 +4.11 kB 🔴 +1.59 kB 🔴 +1.37 kB
assets/RemoveMemberDialogContent-BO5lzO25.js (removed) 4.09 kB 🟢 -4.09 kB 🟢 -1.54 kB 🟢 -1.34 kB
assets/RemoveMemberDialogContent-DFukqd2s.js (new) 4.09 kB 🔴 +4.09 kB 🔴 +1.54 kB 🔴 +1.34 kB
assets/RevokeInviteDialogContent-Cj9Bd8YX.js (new) 4 kB 🔴 +4 kB 🔴 +1.55 kB 🔴 +1.36 kB
assets/RevokeInviteDialogContent-CyEW43oz.js (removed) 4 kB 🟢 -4 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/saveMesh-Bopvq5Vu.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.45 kB 🔴 +1.29 kB
assets/saveMesh-DcTrVfzE.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.29 kB
assets/cloudSessionCookie-7TGmwvlj.js (removed) 3.07 kB 🟢 -3.07 kB 🟢 -1.08 kB 🟢 -974 B
assets/cloudSessionCookie-CPjILDao.js (new) 3.07 kB 🔴 +3.07 kB 🔴 +1.08 kB 🔴 +940 B
assets/GlobalToast-1DfJ45Id.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -965 B 🟢 -806 B
assets/GlobalToast-BmIlu62a.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +964 B 🔴 +802 B
assets/SubscribeToRun-Aj_gqysj.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -990 B 🟢 -868 B
assets/SubscribeToRun-BxqUr9u6.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +989 B 🔴 +868 B
assets/CloudRunButtonWrapper-B3MOtGaA.js (removed) 1.67 kB 🟢 -1.67 kB 🟢 -780 B 🟢 -700 B
assets/CloudRunButtonWrapper-CcHvR09A.js (new) 1.67 kB 🔴 +1.67 kB 🔴 +782 B 🔴 +709 B
assets/cloudBadges-C-3XyGwm.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -699 B 🟢 -615 B
assets/cloudBadges-CemrJj0_.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +701 B 🔴 +613 B
assets/cloudSubscription-B77JoDAn.js (removed) 1.32 kB 🟢 -1.32 kB 🟢 -651 B 🟢 -567 B
assets/cloudSubscription-DWJ76WCq.js (new) 1.32 kB 🔴 +1.32 kB 🔴 +655 B 🔴 +569 B
assets/SubscriptionPanelContentWorkspace-C-ZcN8cG.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -480 B 🟢 -421 B
assets/SubscriptionPanelContentWorkspace-Dskjcdb_.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +481 B 🔴 +419 B
assets/Load3D-Damv7MwL.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -487 B 🟢 -433 B
assets/Load3D-E_nNKHK-.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +487 B 🔴 +434 B
assets/nightlyBadges-C7Wgf-Zp.js (new) 1 kB 🔴 +1 kB 🔴 +536 B 🔴 +475 B
assets/nightlyBadges-M5sg9x4P.js (removed) 1 kB 🟢 -1 kB 🟢 -535 B 🟢 -473 B
assets/Load3dViewerContent-DKIJuYjw.js (new) 961 B 🔴 +961 B 🔴 +457 B 🔴 +406 B
assets/Load3dViewerContent-DKtF7k9V.js (removed) 961 B 🟢 -961 B 🟢 -456 B 🟢 -407 B
assets/SettingDialogContent-Kv3eqSvV.js (removed) 917 B 🟢 -917 B 🟢 -443 B 🟢 -393 B
assets/SettingDialogContent-oQzmw5jz.js (new) 917 B 🔴 +917 B 🔴 +443 B 🔴 +389 B
assets/graphHasMissingNodes-D9HwVMq2.js (removed) 761 B 🟢 -761 B 🟢 -373 B 🟢 -326 B
assets/graphHasMissingNodes-xEpiJlJj.js (new) 761 B 🔴 +761 B 🔴 +373 B 🔴 +320 B
assets/WidgetLegacy-DHri6b_2.js (new) 747 B 🔴 +747 B 🔴 +388 B 🔴 +334 B
assets/WidgetLegacy-DWcILVxw.js (removed) 747 B 🟢 -747 B 🟢 -385 B 🟢 -337 B
assets/WidgetInputNumber-C9w9Ogpj.js (removed) 392 B 🟢 -392 B 🟢 -231 B 🟢 -197 B
assets/WidgetInputNumber-DMlzJc8e.js (new) 392 B 🔴 +392 B 🔴 +231 B 🔴 +193 B
assets/AnimationControls-bPyINTJI.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-BIJKq20L.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-DjoqfnTX.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-BnXUotno.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-DCVL1uOL.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-32ZIoIYN.js 909 B 909 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-7WXVxhf9.js 14.6 kB 14.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BNcWkRcH.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cchriln7.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-COsT3jlc.js 16 kB 16 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CpqJ59mV.js 16.8 kB 16.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-dco-b4jy.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Dj4qNjPR.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-gwZZf095.js 14.4 kB 14.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-jn33Krva.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-kIN_T4OP.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-mTEY_dzO.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-CU6mOd8i.js 478 kB 478 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-wGA3C3Hi.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeContent-VPjQzi79.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeFooter-B2l9_-Av.js 1.88 kB 1.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeHeader-DUns4_x2.js 1.08 kB 1.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-CVvKb-rW.js 12.3 kB 12.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-9VWyHo5z.js 136 kB 136 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B8iCY4y4.js 155 kB 155 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BFqZCm1H.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CgmTJMw2.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D2_fl4nn.js 148 kB 148 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DbGv8BCU.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DigTCF_h.js 129 kB 129 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DuAAxgfq.js 179 kB 179 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DYZBa_3M.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-wdnI-QZq.js 128 kB 128 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Zns-zxeS.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-DTYkrVtB.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-AFmsiWi3.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-ATOoJCQr.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-CQw3f2T6.js 2.23 kB 2.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingNodesHeader-BOlbqJ0O.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-Dq6XmUX_.js 92 B 92 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictFooter-C8QCTAMD.js 2.37 kB 2.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictHeader-DRxQs5TH.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-aApbAbNI.js 360 kB 360 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B2JRfCRl.js 332 kB 332 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BbVIS5BG.js 357 kB 357 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BddTsShn.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CEMSHoZg.js 360 kB 360 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Cfjv7JEn.js 364 kB 364 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-COMqCnF4.js 353 kB 353 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-oMRTTpzO.js 405 kB 405 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-PGdfR_x_.js 441 kB 441 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-SDKvs0-9.js 404 kB 404 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-wKqgWC3H.js 329 kB 329 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/PanelTemplate-C1h0RxBM.js 1.2 kB 1.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DsBk66MD.js 665 B 665 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-Ca2S-reV.js 1.87 kB 1.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-RIZ7-gt8.js 8.81 kB 8.81 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SettingDialogHeader-BHt-6Ao_.js 1.62 kB 1.62 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SettingDialogHeader-D5wathvf.js 244 B 244 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-5NW8sj_6.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-Bh_ZdHn9.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-DAMctjF_.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-VDank0gz.js 318 B 318 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-RLUqfB5N.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-2w5BjjHm.js 3.94 kB 3.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-Djm16aYN.js 131 B 131 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-Dsp6bf_j.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-jDbRm4n6.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-C8ikSQqn.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-B1RSu0_k.js 3.1 kB 3.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-MXN3EUoN.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-BcUSnWUK.js 1.95 kB 1.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-wePHc2fh.js 2.88 kB 2.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DyQHILEf.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-COgaptkR.js 3.09 kB 3.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-CoKD027B.js 2.5 kB 2.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-BCsKJASV.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 49 added / 49 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.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/extensions/core/electronAdapter.ts`:
- Around line 36-62: The catch block in handleCloseRequest currently calls
electronAPI.respondToCloseRequest(true) which may allow closing despite errors;
change it to deny close on error when unsaved workflows exist by checking
workflowStore.modifiedWorkflows.length and calling
electronAPI.respondToCloseRequest(false) if there are modified workflows (or
always deny close as the safest fallback), and log the error via log.error as
before; ensure you still await electronAPI.respondToCloseRequest(...) and
reference handleCloseRequest, settingStore, workflowStore, electronAPI,
dialogService, and log when making the change.
🧹 Nitpick comments (1)
src/extensions/core/electronAdapter.ts (1)

36-62: Prefer a function declaration for handleCloseRequest.

This is a pure helper and can be declared as a function instead of a const arrow for consistency with repo conventions.

♻️ Refactor suggestion
-  const handleCloseRequest = async () => {
+  async function handleCloseRequest() {
     try {
       await settingStore.load()
@@
-  }
+  }

Based on learnings: Prefer pure function declarations over function expressions (e.g., use function foo() { ... } instead of const foo = () => { ... }) for pure functions in the repository.

Comment on lines +36 to +62
const handleCloseRequest = async () => {
try {
await settingStore.load()

const confirmOnClose = settingStore.get('Comfy.Window.UnloadConfirmation')
if (!confirmOnClose) {
await electronAPI.respondToCloseRequest(true)
return
}

if (workflowStore.modifiedWorkflows.length === 0) {
await electronAPI.respondToCloseRequest(true)
return
}

const confirmed = await dialogService.confirm({
message: t('desktopMenu.confirmQuit'),
title: t('desktopMenu.quit'),
type: 'default'
})

await electronAPI.respondToCloseRequest(confirmed === true)
} catch (error) {
log.error('Failed to handle close request.', error)
await electronAPI.respondToCloseRequest(true)
}
}
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

Don’t default to allowing close on error.

In the catch block, respondToCloseRequest(true) can close the app even when unsaved workflows exist (e.g., if settings load or the confirm dialog fails). Safer fallback: deny close when there are modified workflows.

🔧 Suggested safer fallback
   } catch (error) {
     log.error('Failed to handle close request.', error)
-    await electronAPI.respondToCloseRequest(true)
+    const hasModified = workflowStore.modifiedWorkflows.length > 0
+    await electronAPI.respondToCloseRequest(!hasModified)
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const handleCloseRequest = async () => {
try {
await settingStore.load()
const confirmOnClose = settingStore.get('Comfy.Window.UnloadConfirmation')
if (!confirmOnClose) {
await electronAPI.respondToCloseRequest(true)
return
}
if (workflowStore.modifiedWorkflows.length === 0) {
await electronAPI.respondToCloseRequest(true)
return
}
const confirmed = await dialogService.confirm({
message: t('desktopMenu.confirmQuit'),
title: t('desktopMenu.quit'),
type: 'default'
})
await electronAPI.respondToCloseRequest(confirmed === true)
} catch (error) {
log.error('Failed to handle close request.', error)
await electronAPI.respondToCloseRequest(true)
}
}
const handleCloseRequest = async () => {
try {
await settingStore.load()
const confirmOnClose = settingStore.get('Comfy.Window.UnloadConfirmation')
if (!confirmOnClose) {
await electronAPI.respondToCloseRequest(true)
return
}
if (workflowStore.modifiedWorkflows.length === 0) {
await electronAPI.respondToCloseRequest(true)
return
}
const confirmed = await dialogService.confirm({
message: t('desktopMenu.confirmQuit'),
title: t('desktopMenu.quit'),
type: 'default'
})
await electronAPI.respondToCloseRequest(confirmed === true)
} catch (error) {
log.error('Failed to handle close request.', error)
const hasModified = workflowStore.modifiedWorkflows.length > 0
await electronAPI.respondToCloseRequest(!hasModified)
}
}
🤖 Prompt for AI Agents
In `@src/extensions/core/electronAdapter.ts` around lines 36 - 62, The catch block
in handleCloseRequest currently calls electronAPI.respondToCloseRequest(true)
which may allow closing despite errors; change it to deny close on error when
unsaved workflows exist by checking workflowStore.modifiedWorkflows.length and
calling electronAPI.respondToCloseRequest(false) if there are modified workflows
(or always deny close as the safest fallback), and log the error via log.error
as before; ensure you still await electronAPI.respondToCloseRequest(...) and
reference handleCloseRequest, settingStore, workflowStore, electronAPI,
dialogService, and log when making the change.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant