Skip to content

fix: Prevent corruption of workflow data due to checkState during graph loading#9531

Merged
pythongosssss merged 1 commit intomainfrom
pysssss/fix-workflow-corruption
Mar 7, 2026
Merged

fix: Prevent corruption of workflow data due to checkState during graph loading#9531
pythongosssss merged 1 commit intomainfrom
pysssss/fix-workflow-corruption

Conversation

@pythongosssss
Copy link
Member

@pythongosssss pythongosssss commented Mar 7, 2026

Summary

During workflow loading, the workflow data & active workflow object can be out of sync, meaning any checkState calls will overwrite data into the wrong workflow.

Recreation steps:

  • Open 2-3 workflows
  • Enter builder mode > select step
  • Select some different inputs on each
  • Quickly tap the shift key (this triggers checkState) while switching tabs
  • After a while, you'll see the wrong inputs on the workflows

Alternatively, register an extension that guarantees to call checkState during the bad phase, run this in browser devtools and switch tabs:

window.app.registerExtension({
  name: 'bad',
  async afterConfigureGraph() {
    window.app.extensionManager.workflow.activeWorkflow.changeTracker.checkState()
  }
})

Changes

  • What:
  • Add loading graph flag
  • Prevent checkState calls while loading
  • Prevent app mode data sync while loading

┆Issue is synchronized with this Notion page by Unito

@github-actions
Copy link

github-actions bot commented Mar 7, 2026

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

📊 Browser Reports
  • chromium: View Report (✅ 545 / ❌ 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 Mar 7, 2026

📝 Walkthrough

Walkthrough

The changes introduce a loading state guard mechanism by adding a new isLoadingGraph flag to the ChangeTracker class. This flag is set during graph initialization and prevents state serialization and data persistence updates from occurring while the graph is actively loading, ensuring data consistency throughout the loading sequence.

Changes

Cohort / File(s) Summary
Loading State Infrastructure
src/scripts/changeTracker.ts
Added static isLoadingGraph property and modified checkState() to short-circuit state serialization when flag is true.
Loading State Integration
src/scripts/app.ts
Imported ChangeTracker and wrapped graph loading flow with isLoadingGraph flag set to true before loading and reset to false in finally block.
Data Persistence Guard
src/stores/appModeStore.ts
Imported ChangeTracker and added guard condition to prevent data saves when isLoadingGraph is true or data is falsy.

Sequence Diagram

sequenceDiagram
    participant App as src/scripts/app.ts
    participant CT as ChangeTracker
    participant Store as appModeStore
    
    App->>CT: Set isLoadingGraph = true
    App->>App: Begin graph loading sequence
    App->>App: Configure layout & load graph data
    activate App
    Store->>Store: Data persistence triggered
    Store->>CT: Check isLoadingGraph?
    alt Loading in progress
        Store->>Store: Skip data save (early exit)
    end
    deactivate App
    App->>App: Scale view, process nodes/widgets
    App->>App: Invoke extensions, emit telemetry
    App->>CT: Set isLoadingGraph = false (finally)
    CT->>CT: checkState() now allowed to serialize
    Store->>Store: Data persistence resumes normally
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 A tale of loading states so bright,
ChangeTracker guards with all its might,
While graphs spin up without a care,
State corruption? Not on our hare! 🌟

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive PR description explains the issue clearly with reproduction steps, but the Changes section is incomplete with bullet points lacking detailed explanations. Complete the 'What' section under Changes with full descriptions of each bullet point (e.g., explain how the loading graph flag prevents corruption, how checkState prevention works, and the data sync logic).
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main fix: preventing workflow data corruption during graph loading by blocking checkState calls.
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 (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/fix-workflow-corruption

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

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/07/2026, 08:10:15 PM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 7, 2026

📦 Bundle: 4.57 MB gzip 🟢 -540 B

Details

Summary

  • Raw size: 21.4 MB baseline 21.4 MB — 🟢 -287 B
  • Gzip: 4.57 MB baseline 4.57 MB — 🟢 -540 B
  • Brotli: 3.53 MB baseline 3.53 MB — 🟢 -772 B
  • Bundles: 232 current • 233 baseline • 212 added / 213 removed

Category Glance
Other 🟢 -9.48 kB (8.04 MB) · Data & Services 🔴 +9.27 kB (2.77 MB) · Graph Workspace 🟢 -45 B (950 kB) · App Entry Points 🟢 -33 B (28.9 kB) · Vendor & Third-Party ⚪ 0 B (8.87 MB) · Panels & Settings ⚪ 0 B (436 kB) · + 5 more

App Entry Points — 28.9 kB (baseline 28.9 kB) • 🟢 -33 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BQuBXiso.js (removed) 28.9 kB 🟢 -28.9 kB 🟢 -11.4 kB 🟢 -9.32 kB
assets/index-Dt3Z6DJZ.js (new) 28.9 kB 🔴 +28.9 kB 🔴 +11.4 kB 🔴 +9.31 kB

Status: 1 added / 1 removed

Graph Workspace — 950 kB (baseline 950 kB) • 🟢 -45 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CmQh3SmP.js (removed) 950 kB 🟢 -950 kB 🟢 -200 kB 🟢 -152 kB
assets/GraphView-MBvH6knC.js (new) 950 kB 🔴 +950 kB 🔴 +200 kB 🔴 +152 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BZBBEd9Q.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.81 kB
assets/CloudSurveyView-DNYJh03J.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.83 kB
assets/CloudLoginView-Bee1PKNh.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.21 kB 🟢 -2.83 kB
assets/CloudLoginView-ByvjVqHO.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.21 kB 🔴 +2.83 kB
assets/CloudSignupView-DAjWeoT_.js (new) 9.41 kB 🔴 +9.41 kB 🔴 +2.71 kB 🔴 +2.37 kB
assets/CloudSignupView-HbwX0bih.js (removed) 9.41 kB 🟢 -9.41 kB 🟢 -2.71 kB 🟢 -2.38 kB
assets/UserCheckView-CSQTyIn_.js (removed) 8.42 kB 🟢 -8.42 kB 🟢 -2.23 kB 🟢 -1.93 kB
assets/UserCheckView-DVOCfcuB.js (new) 8.42 kB 🔴 +8.42 kB 🔴 +2.22 kB 🔴 +1.94 kB
assets/CloudLayoutView-78I64xAJ.js (new) 6.47 kB 🔴 +6.47 kB 🔴 +2.12 kB 🔴 +1.86 kB
assets/CloudLayoutView-Dt8Nk08a.js (removed) 6.47 kB 🟢 -6.47 kB 🟢 -2.12 kB 🟢 -1.86 kB
assets/CloudForgotPasswordView-1Z2XKvVq.js (new) 5.59 kB 🔴 +5.59 kB 🔴 +1.95 kB 🔴 +1.72 kB
assets/CloudForgotPasswordView-P6DgMSdK.js (removed) 5.59 kB 🟢 -5.59 kB 🟢 -1.95 kB 🟢 -1.76 kB
assets/CloudAuthTimeoutView-Ch1BWOmh.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/CloudAuthTimeoutView-DVTb-weq.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.79 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-BjBpZ701.js (new) 4.78 kB 🔴 +4.78 kB 🔴 +1.8 kB 🔴 +1.59 kB
assets/CloudSubscriptionRedirectView-yGdNlP8o.js (removed) 4.78 kB 🟢 -4.78 kB 🟢 -1.8 kB 🟢 -1.59 kB
assets/UserSelectView--CwKEHvd.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/UserSelectView-DypWO5cQ.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.47 kB
assets/CloudSorryContactSupportView-Deer4x8G.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +538 B 🔴 +475 B
assets/CloudSorryContactSupportView-kf2atGXo.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -537 B 🟢 -470 B
assets/layout-BEfSPHAy.js (new) 296 B 🔴 +296 B 🔴 +225 B 🔴 +189 B
assets/layout-C7XcDoLd.js (removed) 296 B 🟢 -296 B 🟢 -222 B 🟢 -187 B

Status: 11 added / 11 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settings-0_PXdVjq.js (new) 38.5 kB 🔴 +38.5 kB 🔴 +9.34 kB 🔴 +7.7 kB
assets/settings-CiXfim_M.js (removed) 38.5 kB 🟢 -38.5 kB 🟢 -9.34 kB 🟢 -7.7 kB
assets/settings-aWa4u4qN.js (new) 34.2 kB 🔴 +34.2 kB 🔴 +8.33 kB 🔴 +7.05 kB
assets/settings-Bwt_U2hc.js (removed) 34.2 kB 🟢 -34.2 kB 🟢 -8.33 kB 🟢 -7.01 kB
assets/settings-71sPPmDw.js (removed) 32.4 kB 🟢 -32.4 kB 🟢 -8.15 kB 🟢 -6.63 kB
assets/settings-rsISbbV-.js (new) 32.4 kB 🔴 +32.4 kB 🔴 +8.15 kB 🔴 +6.63 kB
assets/settings-CFCCJ6bh.js (removed) 30.5 kB 🟢 -30.5 kB 🟢 -8.45 kB 🟢 -7.09 kB
assets/settings-JMKwrBEp.js (new) 30.5 kB 🔴 +30.5 kB 🔴 +8.45 kB 🔴 +7.09 kB
assets/settings-BntF-aiB.js (removed) 29.9 kB 🟢 -29.9 kB 🟢 -8.1 kB 🟢 -7.07 kB
assets/settings-CrLux3Yh.js (new) 29.9 kB 🔴 +29.9 kB 🔴 +8.1 kB 🔴 +7.07 kB
assets/settings-B4se7HWo.js (removed) 28.8 kB 🟢 -28.8 kB 🟢 -7.79 kB 🟢 -6.66 kB
assets/settings-DxEQtHFK.js (new) 28.8 kB 🔴 +28.8 kB 🔴 +7.79 kB 🔴 +6.64 kB
assets/settings-CKnKW5J4.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +8 kB 🔴 +7.02 kB
assets/settings-LhJVbur1.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -8 kB 🟢 -7.01 kB
assets/settings-B6_1ih6C.js (new) 27.9 kB 🔴 +27.9 kB 🔴 +7.71 kB 🔴 +6.69 kB
assets/settings-DKOsOORk.js (removed) 27.9 kB 🟢 -27.9 kB 🟢 -7.71 kB 🟢 -6.69 kB
assets/settings-7ytexSd_.js (new) 27.8 kB 🔴 +27.8 kB 🔴 +8.12 kB 🔴 +6.77 kB
assets/settings-BsTYoQcE.js (removed) 27.8 kB 🟢 -27.8 kB 🟢 -8.12 kB 🟢 -6.77 kB
assets/settings-BnWq3fMI.js (removed) 24.5 kB 🟢 -24.5 kB 🟢 -7.91 kB 🟢 -6.35 kB
assets/settings-C8aNjNPu.js (new) 24.5 kB 🔴 +24.5 kB 🔴 +7.91 kB 🔴 +6.36 kB
assets/settings-91ZQQ8VC.js (new) 23.9 kB 🔴 +23.9 kB 🔴 +7.67 kB 🔴 +5.96 kB
assets/settings-B7IP4XTb.js (removed) 23.9 kB 🟢 -23.9 kB 🟢 -7.67 kB 🟢 -5.97 kB
assets/SecretsPanel-BO4ayz2N.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.66 kB
assets/SecretsPanel-CNJ061hq.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.3 kB 🔴 +4.65 kB
assets/LegacyCreditsPanel-BlmfRozJ.js (removed) 20.7 kB 🟢 -20.7 kB 🟢 -5.58 kB 🟢 -4.92 kB
assets/LegacyCreditsPanel-DIICfsb0.js (new) 20.7 kB 🔴 +20.7 kB 🔴 +5.58 kB 🔴 +4.91 kB
assets/SubscriptionPanel-CTQf5Ywd.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.76 kB 🟢 -4.18 kB
assets/SubscriptionPanel-D07BzfeQ.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.75 kB 🔴 +4.2 kB
assets/KeybindingPanel-BTCBiufr.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.54 kB 🔴 +3.13 kB
assets/KeybindingPanel-CeEwz4nC.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.54 kB 🟢 -3.14 kB
assets/AboutPanel-Bgfu3KLQ.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.46 kB
assets/AboutPanel-C2TxfkBa.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.73 kB 🔴 +2.47 kB
assets/ExtensionPanel-B1HpSYxb.js (removed) 9.42 kB 🟢 -9.42 kB 🟢 -2.67 kB 🟢 -2.38 kB
assets/ExtensionPanel-Cx_Lauhl.js (new) 9.42 kB 🔴 +9.42 kB 🔴 +2.67 kB 🔴 +2.38 kB
assets/ServerConfigPanel-Da8j4Oy5.js (removed) 6.49 kB 🟢 -6.49 kB 🟢 -2.13 kB 🟢 -1.91 kB
assets/ServerConfigPanel-dh-vWfPU.js (new) 6.49 kB 🔴 +6.49 kB 🔴 +2.13 kB 🔴 +1.92 kB
assets/UserPanel-9D6Hcct5.js (removed) 6.2 kB 🟢 -6.2 kB 🟢 -2.01 kB 🟢 -1.76 kB
assets/UserPanel-DDdNtfQc.js (new) 6.2 kB 🔴 +6.2 kB 🔴 +2.01 kB 🔴 +1.76 kB
assets/cloudRemoteConfig-BC3933VW.js (removed) 1.48 kB 🟢 -1.48 kB 🟢 -726 B 🟢 -631 B
assets/cloudRemoteConfig-D1jq6cES.js (new) 1.48 kB 🔴 +1.48 kB 🔴 +724 B 🔴 +630 B
assets/config-DrIhAAj_.js (new) 1.22 kB 🔴 +1.22 kB 🔴 +611 B 🔴 +506 B
assets/config-lV83_WNc.js (removed) 1.22 kB 🟢 -1.22 kB 🟢 -612 B 🟢 -502 B
assets/refreshRemoteConfig-BSgwETi5.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +520 B 🔴 +457 B
assets/refreshRemoteConfig-DFuQ0WdX.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -521 B 🟢 -482 B

Status: 22 added / 22 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/PasswordFields-CoyTAWuZ.js (removed) 4.51 kB 🟢 -4.51 kB 🟢 -1.35 kB 🟢 -1.19 kB
assets/PasswordFields-D5kX5MXM.js (new) 4.51 kB 🔴 +4.51 kB 🔴 +1.35 kB 🔴 +1.19 kB
assets/auth-CE-PaBLk.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +985 B
assets/auth-CpBbWNCE.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -987 B
assets/SignUpForm-CQvVxkRU.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.1 kB
assets/SignUpForm-CTuxJlQf.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/UpdatePasswordContent-Bju4POXx.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1.09 kB 🔴 +966 B
assets/UpdatePasswordContent-DSwZDxqr.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1.09 kB 🟢 -961 B
assets/WorkspaceProfilePic-BnOlFsWy.js (removed) 1.59 kB 🟢 -1.59 kB 🟢 -831 B 🟢 -718 B
assets/WorkspaceProfilePic-BorJpYlL.js (new) 1.59 kB 🔴 +1.59 kB 🔴 +832 B 🔴 +755 B
assets/firebaseAuthStore-DJRYCzLN.js (new) 831 B 🔴 +831 B 🔴 +408 B 🔴 +367 B
assets/firebaseAuthStore-Hir_O9LF.js (removed) 831 B 🟢 -831 B 🟢 -404 B 🟢 -366 B
assets/auth-BCYB0kw4.js (removed) 357 B 🟢 -357 B 🟢 -225 B 🟢 -207 B
assets/auth-ChU4hC9G.js (new) 357 B 🔴 +357 B 🔴 +225 B 🔴 +194 B

Status: 7 added / 7 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-BReC9lsm.js (new) 76.8 kB 🔴 +76.8 kB 🔴 +16.4 kB 🔴 +14.1 kB
assets/useShareDialog-CveyQAHm.js (removed) 76.8 kB 🟢 -76.8 kB 🟢 -16.4 kB 🟢 -14 kB
assets/useSubscriptionDialog-DO8pKij_.js (new) 779 B 🔴 +779 B 🔴 +397 B 🔴 +346 B
assets/useSubscriptionDialog-mUi7wvGp.js (removed) 779 B 🟢 -779 B 🟢 -396 B 🟢 -339 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-BCcfNbIl.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.9 kB 🔴 +3.49 kB
assets/ComfyQueueButton-zaGZ3_lj.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.9 kB 🟢 -3.49 kB
assets/useTerminalTabs-B4bj18Zx.js (removed) 9.87 kB 🟢 -9.87 kB 🟢 -3.41 kB 🟢 -3 kB
assets/useTerminalTabs-vxNR3Njz.js (new) 9.87 kB 🔴 +9.87 kB 🔴 +3.42 kB 🔴 +3.01 kB
assets/TopbarBadge-B23gUTFw.js (removed) 7.39 kB 🟢 -7.39 kB 🟢 -1.79 kB 🟢 -1.59 kB
assets/TopbarBadge-B95EAjGD.js (new) 7.39 kB 🔴 +7.39 kB 🔴 +1.79 kB 🔴 +1.59 kB
assets/ScrubableNumberInput-C0yl0FxS.js (new) 5.95 kB 🔴 +5.95 kB 🔴 +2.06 kB 🔴 +1.83 kB
assets/ScrubableNumberInput-DBAG5gMA.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -2.06 kB 🟢 -1.84 kB
assets/toggle-group-B2QRWqGW.js (new) 3.83 kB 🔴 +3.83 kB 🔴 +1.37 kB 🔴 +1.24 kB
assets/toggle-group-C6BH2eSy.js (removed) 3.83 kB 🟢 -3.83 kB 🟢 -1.37 kB 🟢 -1.22 kB
assets/FormSearchInput-CCyXrnmF.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/FormSearchInput-D3QLfJ-O.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.55 kB 🔴 +1.36 kB
assets/Button-BmzX8Tz2.js (removed) 3.2 kB 🟢 -3.2 kB 🟢 -1.28 kB 🟢 -1.12 kB
assets/Button-D3asrPDZ.js (new) 3.2 kB 🔴 +3.2 kB 🔴 +1.28 kB 🔴 +1.11 kB
assets/SubscribeButton-B20DbadC.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.01 kB 🔴 +887 B
assets/SubscribeButton-CYBZ3B4d.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1.01 kB 🟢 -888 B
assets/WidgetButton-CQC9ZngY.js (removed) 1.84 kB 🟢 -1.84 kB 🟢 -877 B 🟢 -769 B
assets/WidgetButton-YsqWV653.js (new) 1.84 kB 🔴 +1.84 kB 🔴 +876 B 🔴 +771 B
assets/cloudFeedbackTopbarButton-3u-9Tpcf.js (new) 1.42 kB 🔴 +1.42 kB 🔴 +746 B 🔴 +666 B
assets/cloudFeedbackTopbarButton-DYOsuAMy.js (removed) 1.42 kB 🟢 -1.42 kB 🟢 -746 B 🟢 -653 B
assets/UserAvatar-B-Cs_Zn1.js (removed) 1.19 kB 🟢 -1.19 kB 🟢 -628 B 🟢 -532 B
assets/UserAvatar-xfn08Ppk.js (new) 1.19 kB 🔴 +1.19 kB 🔴 +625 B 🔴 +533 B
assets/CloudBadge-BJr1VDd1.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +570 B 🔴 +489 B
assets/CloudBadge-CUYRUcxu.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -569 B 🟢 -492 B
assets/ComfyQueueButton-Bb_blak9.js (new) 836 B 🔴 +836 B 🔴 +412 B 🔴 +367 B
assets/ComfyQueueButton-BFCd9SNZ.js (removed) 836 B 🟢 -836 B 🟢 -411 B 🟢 -366 B

Status: 13 added / 13 removed

Data & Services — 2.77 MB (baseline 2.76 MB) • 🔴 +9.27 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-BHrWL35r.js (new) 1.93 MB 🔴 +1.93 MB 🔴 +433 kB 🔴 +325 kB
assets/dialogService-ClsLxEjm.js (removed) 1.92 MB 🟢 -1.92 MB 🟢 -430 kB 🟢 -323 kB
assets/api--yi5G70v.js (removed) 693 kB 🟢 -693 kB 🟢 -156 kB 🟢 -124 kB
assets/api-DHi-RmOi.js (new) 693 kB 🔴 +693 kB 🔴 +156 kB 🔴 +124 kB
assets/load3dService-BTrG8bfD.js (removed) 91.1 kB 🟢 -91.1 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/load3dService-DhLogh10.js (new) 91.1 kB 🔴 +91.1 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/extensionStore-CgWXBXYH.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -4.63 kB 🟢 -4.1 kB
assets/extensionStore-mbuhXld8.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +4.63 kB 🔴 +4.1 kB
assets/workflowShareService-CMedN0jT.js (removed) 13.1 kB 🟢 -13.1 kB 🟢 -4 kB 🟢 -3.55 kB
assets/workflowShareService-DcqpKTtZ.js (new) 13.1 kB 🔴 +13.1 kB 🔴 +4 kB 🔴 +3.55 kB
assets/releaseStore-BUriF6zu.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/releaseStore-CTXrhYKP.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/keybindingService-B_BwwKbp.js (new) 7.16 kB 🔴 +7.16 kB 🔴 +1.72 kB 🔴 +1.48 kB
assets/keybindingService-CR9oT1gd.js (removed) 7.16 kB 🟢 -7.16 kB 🟢 -1.72 kB 🟢 -1.48 kB
assets/serverConfigStore-gMFb9Bxl.js (removed) 2.32 kB 🟢 -2.32 kB 🟢 -790 B 🟢 -691 B
assets/serverConfigStore-Ze5zvB9a.js (new) 2.32 kB 🔴 +2.32 kB 🔴 +791 B 🔴 +691 B
assets/bootstrapStore--y0fO2Xd.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -873 B 🟢 -796 B
assets/bootstrapStore-BcQLMSki.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +870 B 🔴 +795 B
assets/userStore-CCtQsep6.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +717 B 🔴 +676 B
assets/userStore-N4S4rxty.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -719 B 🟢 -676 B
assets/audioService-D2yGzvq7.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +849 B 🔴 +725 B
assets/audioService-DqwmS3o9.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -848 B 🟢 -726 B
assets/releaseStore-CpMpCH4I.js (removed) 803 B 🟢 -803 B 🟢 -401 B 🟢 -357 B
assets/releaseStore-Je1w1M9o.js (new) 803 B 🔴 +803 B 🔴 +403 B 🔴 +362 B
assets/settingStore-BhtXZgf-.js (removed) 787 B 🟢 -787 B 🟢 -403 B 🟢 -353 B
assets/settingStore-Dsmf6c4H.js (new) 787 B 🔴 +787 B 🔴 +406 B 🔴 +360 B
assets/workflowDraftStore-Bvzts1-O.js (new) 779 B 🔴 +779 B 🔴 +398 B 🔴 +351 B
assets/workflowDraftStore-C2bkiGQG.js (removed) 779 B 🟢 -779 B 🟢 -394 B 🟢 -344 B
assets/dialogService-CVLdldCv.js (new) 768 B 🔴 +768 B 🔴 +389 B 🔴 +347 B
assets/dialogService-KTPT3pCu.js (removed) 768 B 🟢 -768 B 🟢 -387 B 🟢 -341 B

Status: 15 added / 15 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-CyEUIfA1.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3d-DAWo-Z5c.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3dViewer-D1JujFZo.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useLoad3dViewer-DzM6DkGD.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.8 kB
assets/colorUtil-Bz3E3A2O.js (new) 7 kB 🔴 +7 kB 🔴 +2.14 kB 🔴 +1.89 kB
assets/colorUtil-DskRKiYG.js (removed) 7 kB 🟢 -7 kB 🟢 -2.14 kB 🟢 -1.9 kB
assets/useFeatureFlags-C5wN7YMi.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.37 kB 🔴 +1.17 kB
assets/useFeatureFlags-DD-4M5JL.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.37 kB 🟢 -1.17 kB
assets/useWorkspaceUI-D1dOQonz.js (new) 3 kB 🔴 +3 kB 🔴 +822 B 🔴 +703 B
assets/useWorkspaceUI-Dv58IvZP.js (removed) 3 kB 🟢 -3 kB 🟢 -822 B 🟢 -705 B
assets/subscriptionCheckoutUtil--E2SAYB5.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -958 B
assets/subscriptionCheckoutUtil-RNI2gaNC.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +933 B
assets/useExternalLink-BgzeSX8e.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +771 B 🔴 +678 B
assets/useExternalLink-D8Ap5H2H.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -771 B 🟢 -680 B
assets/useErrorHandling-BpXt1vnH.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -630 B 🟢 -534 B
assets/useErrorHandling-D4rLMHRB.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +630 B 🔴 +534 B
assets/useWorkspaceSwitch-0MPdRcpF.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +542 B 🔴 +484 B
assets/useWorkspaceSwitch-BYmB11qj.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -542 B 🟢 -482 B
assets/useCopyToClipboard-BZXptEs9.js (new) 944 B 🔴 +944 B 🔴 +427 B 🔴 +366 B
assets/useCopyToClipboard-DJmFZePN.js (removed) 944 B 🟢 -944 B 🟢 -427 B 🟢 -366 B
assets/useLoad3d-6VfmpMOu.js (new) 902 B 🔴 +902 B 🔴 +440 B 🔴 +398 B
assets/useLoad3d-DM-_5nvq.js (removed) 902 B 🟢 -902 B 🟢 -443 B 🟢 -397 B
assets/useLoad3dViewer-AoynLm1V.js (new) 881 B 🔴 +881 B 🔴 +427 B 🔴 +382 B
assets/useLoad3dViewer-ChOqPkCN.js (removed) 881 B 🟢 -881 B 🟢 -427 B 🟢 -381 B
assets/audioUtils-C-zot94S.js (removed) 858 B 🟢 -858 B 🟢 -499 B 🟢 -414 B
assets/audioUtils-DUwt4GiF.js (new) 858 B 🔴 +858 B 🔴 +501 B 🔴 +405 B
assets/useCurrentUser-Cb47eBwN.js (removed) 765 B 🟢 -765 B 🟢 -390 B 🟢 -341 B
assets/useCurrentUser-Cy2ljfiK.js (new) 765 B 🔴 +765 B 🔴 +392 B 🔴 +348 B
assets/SkeletonUtils-Cybe2l6l.js (new) 133 B 🔴 +133 B 🔴 +114 B 🔴 +111 B
assets/SkeletonUtils-udjgEG1T.js (removed) 133 B 🟢 -133 B 🟢 -114 B 🟢 -110 B
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-CC-l-L9z.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DOdPeMQc.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 15 added / 15 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-three-C69yBO64.js (new) 1.8 MB 🔴 +1.8 MB 🔴 +385 kB 🔴 +280 kB
assets/vendor-three-fZJTFMbU.js (removed) 1.8 MB 🟢 -1.8 MB 🟢 -385 kB 🟢 -280 kB
assets/vendor-primevue-DTp467eP.js (removed) 1.72 MB 🟢 -1.72 MB 🟢 -311 kB 🟢 -189 kB
assets/vendor-primevue-prq_Rlnc.js (new) 1.72 MB 🔴 +1.72 MB 🔴 +311 kB 🔴 +189 kB
assets/vendor-other-CHuqBC10.js (removed) 1.54 MB 🟢 -1.54 MB 🟢 -324 kB 🟢 -257 kB
assets/vendor-other-u14f4tgD.js (new) 1.54 MB 🔴 +1.54 MB 🔴 +324 kB 🔴 +257 kB
assets/vendor-chart-D1OJsayB.js (removed) 399 kB 🟢 -399 kB 🟢 -95.7 kB 🟢 -79.5 kB
assets/vendor-chart-D82zUMvC.js (new) 399 kB 🔴 +399 kB 🔴 +95.7 kB 🔴 +79.5 kB
assets/vendor-xterm-Co8jWZ4q.js (new) 374 kB 🔴 +374 kB 🔴 +75.5 kB 🔴 +61 kB
assets/vendor-xterm-CWHPCody.js (removed) 374 kB 🟢 -374 kB 🟢 -75.5 kB 🟢 -61 kB
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 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-DccD0mxo.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-reka-ui-C-tDe-KL.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-DTO2QA4Q.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-CmHHRvL9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-CH_Hqnyl.js 124 kB 124 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

Status: 5 added / 5 removed

Other — 8.04 MB (baseline 8.05 MB) • 🟢 -9.48 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-CNOnC3E4.js (removed) 544 kB 🟢 -544 kB 🟢 -106 kB 🟢 -82.6 kB
assets/i18n-Cu5HZUQ7.js (new) 544 kB 🔴 +544 kB 🔴 +106 kB 🔴 +82.6 kB
assets/nodeDefs-BnwYZsRe.js (new) 494 kB 🔴 +494 kB 🔴 +75.3 kB 🔴 +51.8 kB
assets/nodeDefs-CgR71Tr3.js (removed) 494 kB 🟢 -494 kB 🟢 -75.3 kB 🟢 -51.8 kB
assets/nodeDefs-C8Mhble5.js (removed) 453 kB 🟢 -453 kB 🟢 -70.3 kB 🟢 -49.7 kB
assets/nodeDefs-CVMvffJd.js (new) 453 kB 🔴 +453 kB 🔴 +70.3 kB 🔴 +49.7 kB
assets/nodeDefs-Bhwr0_qt.js (new) 452 kB 🔴 +452 kB 🔴 +67.9 kB 🔴 +47.8 kB
assets/nodeDefs-CRYz2mnd.js (removed) 452 kB 🟢 -452 kB 🟢 -67.9 kB 🟢 -47.8 kB
assets/nodeDefs-AwPJIFaT.js (removed) 418 kB 🟢 -418 kB 🟢 -68.4 kB 🟢 -47.7 kB
assets/nodeDefs-D3rH0GXo.js (new) 418 kB 🔴 +418 kB 🔴 +68.4 kB 🔴 +47.7 kB
assets/nodeDefs-B8HFl03z.js (new) 406 kB 🔴 +406 kB 🔴 +66.8 kB 🔴 +47.4 kB
assets/nodeDefs-PqkLFoMZ.js (removed) 406 kB 🟢 -406 kB 🟢 -66.8 kB 🟢 -47.4 kB
assets/nodeDefs-Bn0fkHHL.js (removed) 402 kB 🟢 -402 kB 🟢 -65.4 kB 🟢 -47.9 kB
assets/nodeDefs-ZRmGudls.js (new) 402 kB 🔴 +402 kB 🔴 +65.4 kB 🔴 +47.8 kB
assets/nodeDefs-Cxe4eF5X.js (new) 402 kB 🔴 +402 kB 🔴 +66.9 kB 🔴 +48.5 kB
assets/nodeDefs-gchw_Udt.js (removed) 402 kB 🟢 -402 kB 🟢 -66.9 kB 🟢 -48.5 kB
assets/nodeDefs-BAZaj98M.js (removed) 399 kB 🟢 -399 kB 🟢 -64 kB 🟢 -46.7 kB
assets/nodeDefs-Ci3336-6.js (new) 399 kB 🔴 +399 kB 🔴 +64 kB 🔴 +46.7 kB
assets/nodeDefs-BQQ7epXP.js (new) 394 kB 🔴 +394 kB 🔴 +63 kB 🔴 +46.1 kB
assets/nodeDefs-DXkvS_31.js (removed) 394 kB 🟢 -394 kB 🟢 -63 kB 🟢 -46.1 kB
assets/nodeDefs-LI1J_566.js (new) 369 kB 🔴 +369 kB 🔴 +65.6 kB 🔴 +45.9 kB
assets/nodeDefs-xp8A6uOW.js (removed) 369 kB 🟢 -369 kB 🟢 -65.6 kB 🟢 -45.9 kB
assets/nodeDefs-C4H2Yzrv.js (new) 366 kB 🔴 +366 kB 🔴 +64.6 kB 🔴 +44.8 kB
assets/nodeDefs-DkmJQ9hP.js (removed) 366 kB 🟢 -366 kB 🟢 -64.6 kB 🟢 -44.8 kB
assets/main-BgBU6AKk.js (removed) 222 kB 🟢 -222 kB 🟢 -57.4 kB 🟢 -45.3 kB
assets/main-CE-IDeaX.js (new) 222 kB 🔴 +222 kB 🔴 +57.4 kB 🔴 +45.3 kB
assets/main-C63IkCng.js (removed) 199 kB 🟢 -199 kB 🟢 -51.8 kB 🟢 -41.9 kB
assets/main-mz70_xm5.js (new) 199 kB 🔴 +199 kB 🔴 +51.8 kB 🔴 +41.9 kB
assets/main-CiiJbmB-.js (removed) 190 kB 🟢 -190 kB 🟢 -51.7 kB 🟢 -41.3 kB
assets/main-Cr96NWaP.js (new) 190 kB 🔴 +190 kB 🔴 +51.7 kB 🔴 +41.3 kB
assets/main-Dz98XfJ3.js (removed) 182 kB 🟢 -182 kB 🟢 -51.3 kB 🟢 -41 kB
assets/main-yNGNLvSQ.js (new) 182 kB 🔴 +182 kB 🔴 +51.3 kB 🔴 +41 kB
assets/main-Dy9NTS2B.js (new) 167 kB 🔴 +167 kB 🔴 +49.8 kB 🔴 +41.8 kB
assets/main-xIqtEGBZ.js (removed) 167 kB 🟢 -167 kB 🟢 -49.8 kB 🟢 -41.8 kB
assets/main-DDi0Sn27.js (removed) 164 kB 🟢 -164 kB 🟢 -49.3 kB 🟢 -39.9 kB
assets/main-DszTeubJ.js (new) 164 kB 🔴 +164 kB 🔴 +49.3 kB 🔴 +39.9 kB
assets/main-CaVeIRES.js (new) 161 kB 🔴 +161 kB 🔴 +48.8 kB 🔴 +40.6 kB
assets/main-DvA-ztFr.js (removed) 161 kB 🟢 -161 kB 🟢 -48.8 kB 🟢 -40.6 kB
assets/main-CAD3xyA3.js (new) 159 kB 🔴 +159 kB 🔴 +49 kB 🔴 +41.2 kB
assets/main-CcYGk9uj.js (removed) 159 kB 🟢 -159 kB 🟢 -49 kB 🟢 -41.2 kB
assets/main-BR4_AzJM.js (removed) 158 kB 🟢 -158 kB 🟢 -48.3 kB 🟢 -40.7 kB
assets/main-MGZ85j1q.js (new) 158 kB 🔴 +158 kB 🔴 +48.3 kB 🔴 +40.7 kB
assets/main-DEofbW9c.js (removed) 140 kB 🟢 -140 kB 🟢 -47.6 kB 🟢 -38 kB
assets/main-SHq8Tn-Y.js (new) 140 kB 🔴 +140 kB 🔴 +47.6 kB 🔴 +37.9 kB
assets/main-CHFrc-nz.js (removed) 139 kB 🟢 -139 kB 🟢 -47.5 kB 🟢 -37.7 kB
assets/main-CXNMXZ66.js (new) 139 kB 🔴 +139 kB 🔴 +47.5 kB 🔴 +37.7 kB
assets/core-BCJqaZXW.js (new) 73.8 kB 🔴 +73.8 kB 🔴 +19.1 kB 🔴 +16.3 kB
assets/core-DCLmKAD-.js (removed) 73.8 kB 🟢 -73.8 kB 🟢 -19 kB 🟢 -16.3 kB
assets/groupNode-BLeJ_p-V.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.5 kB
assets/groupNode-CUgMbW98.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.6 kB
assets/WidgetSelect-CEGwgzaH.js (new) 58.3 kB 🔴 +58.3 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/WidgetSelect-CIMUDavp.js (removed) 58.3 kB 🟢 -58.3 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-BmfF1IAO.js (removed) 46.3 kB 🟢 -46.3 kB 🟢 -8.65 kB 🟢 -7.51 kB
assets/SubscriptionRequiredDialogContentWorkspace-D4u2FrBh.js (new) 46.3 kB 🔴 +46.3 kB 🔴 +8.65 kB 🔴 +7.51 kB
assets/WidgetPainter-Cb-x-B1s.js (new) 32.9 kB 🔴 +32.9 kB 🔴 +7.97 kB 🔴 +7.07 kB
assets/WidgetPainter-DL36vMIs.js (removed) 32.9 kB 🟢 -32.9 kB 🟢 -7.98 kB 🟢 -7.06 kB
assets/Load3DControls-9ftJIE2S.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.64 kB
assets/Load3DControls-Dy0O7sIc.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.33 kB 🟢 -4.65 kB
assets/WorkspacePanelContent-BTtamO-C.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.16 kB 🔴 +5.42 kB
assets/WorkspacePanelContent-cU3cbVZV.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.16 kB 🟢 -5.41 kB
assets/SubscriptionRequiredDialogContent-BixpRwaE.js (removed) 25.6 kB 🟢 -25.6 kB 🟢 -6.57 kB 🟢 -5.78 kB
assets/SubscriptionRequiredDialogContent-BstqrvVD.js (new) 25.6 kB 🔴 +25.6 kB 🔴 +6.56 kB 🔴 +5.79 kB
assets/Load3dViewerContent-B-6EMO-k.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.51 kB
assets/Load3dViewerContent-DwTFEv2I.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.5 kB
assets/WidgetImageCrop-C3hX_kk3.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.52 kB 🟢 -4.86 kB
assets/WidgetImageCrop-D0KX2_48.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.52 kB 🔴 +4.86 kB
assets/SubscriptionPanelContentWorkspace-BJ7bgjBu.js (removed) 22 kB 🟢 -22 kB 🟢 -5.11 kB 🟢 -4.5 kB
assets/SubscriptionPanelContentWorkspace-D4n8oI01.js (new) 22 kB 🔴 +22 kB 🔴 +5.11 kB 🔴 +4.5 kB
assets/CurrentUserPopoverWorkspace-CIGSjyio.js (new) 20.5 kB 🔴 +20.5 kB 🔴 +4.95 kB 🔴 +4.42 kB
assets/CurrentUserPopoverWorkspace-gAU_jZin.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -4.95 kB 🟢 -4.41 kB
assets/commands-4Ex6JXL0.js (new) 19.2 kB 🔴 +19.2 kB 🔴 +4.09 kB 🔴 +3.16 kB
assets/commands-Cnhgm1VY.js (removed) 19.2 kB 🟢 -19.2 kB 🟢 -4.08 kB 🟢 -3.16 kB
assets/SignInContent-BkF7XQn4.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.77 kB 🟢 -4.18 kB
assets/SignInContent-IJGCvJT4.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.77 kB 🔴 +4.18 kB
assets/WidgetInputNumber-Cd0k60v3.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -4.79 kB 🟢 -4.26 kB
assets/WidgetInputNumber-DSlnRWWU.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +4.79 kB 🔴 +4.26 kB
assets/commands-4eY_jIIw.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +3.76 kB 🔴 +2.96 kB
assets/commands-C9uuX9A8.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -3.76 kB 🟢 -2.95 kB
assets/commands-BVYIPKhK.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -3.83 kB 🟢 -3.03 kB
assets/commands-DTom9f1s.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +3.83 kB 🔴 +3.02 kB
assets/WidgetRecordAudio-BTG9kwf6.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -5.02 kB 🟢 -4.48 kB
assets/WidgetRecordAudio-k9WU0nor.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +5.01 kB 🔴 +4.49 kB
assets/commands-7jEGemPR.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -3.86 kB 🟢 -3.04 kB
assets/commands-ZTJwiV8a.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +3.86 kB 🔴 +3.04 kB
assets/commands-Db23kZm5.js (new) 17 kB 🔴 +17 kB 🔴 +3.59 kB 🔴 +2.97 kB
assets/commands-WvD-lin1.js (removed) 17 kB 🟢 -17 kB 🟢 -3.59 kB 🟢 -2.96 kB
assets/commands-B2u5OAt2.js (new) 16.5 kB 🔴 +16.5 kB 🔴 +3.58 kB 🔴 +2.96 kB
assets/commands-C-4fDhBH.js (removed) 16.5 kB 🟢 -16.5 kB 🟢 -3.58 kB 🟢 -2.96 kB
assets/commands-BwgnbfCS.js (new) 16.5 kB 🔴 +16.5 kB 🔴 +3.48 kB 🔴 +2.84 kB
assets/commands-DBj3pKAg.js (removed) 16.5 kB 🟢 -16.5 kB 🟢 -3.48 kB 🟢 -2.84 kB
assets/commands-BAAf-WrY.js (new) 16.4 kB 🔴 +16.4 kB 🔴 +3.45 kB 🔴 +2.89 kB
assets/commands-CbOIUWy7.js (removed) 16.4 kB 🟢 -16.4 kB 🟢 -3.45 kB 🟢 -2.89 kB
assets/commands-CMf3AlGU.js (new) 16.3 kB 🔴 +16.3 kB 🔴 +3.72 kB 🔴 +2.91 kB
assets/commands-M9tKv7Oq.js (removed) 16.3 kB 🟢 -16.3 kB 🟢 -3.72 kB 🟢 -2.91 kB
assets/Load3D-Bmebu-Ej.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.02 kB 🟢 -3.52 kB
assets/Load3D-C6bHVK-L.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.02 kB 🔴 +3.5 kB
assets/commands-DMVyXtbc.js (removed) 15.6 kB 🟢 -15.6 kB 🟢 -3.64 kB 🟢 -2.75 kB
assets/commands-y391QX3e.js (new) 15.6 kB 🔴 +15.6 kB 🔴 +3.64 kB 🔴 +2.75 kB
assets/commands-uXFULtu8.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +3.6 kB 🔴 +2.67 kB
assets/commands-ZXojZ-Qf.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -3.6 kB 🟢 -2.68 kB
assets/load3d-Bfuulm-u.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.21 kB 🟢 -3.64 kB
assets/load3d-hqUXGwP-.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.21 kB 🔴 +3.65 kB
assets/AudioPreviewPlayer-DjzwFUVh.js (removed) 11 kB 🟢 -11 kB 🟢 -3.26 kB 🟢 -2.92 kB
assets/AudioPreviewPlayer-Dze3GTK0.js (new) 11 kB 🔴 +11 kB 🔴 +3.26 kB 🔴 +2.91 kB
assets/changeTracker-Bqk5-Tw4.js (removed) 9.44 kB 🟢 -9.44 kB 🟢 -2.91 kB 🟢 -2.56 kB
assets/WidgetCurve-BZyvlEbQ.js (new) 9.36 kB 🔴 +9.36 kB 🔴 +3 kB 🔴 +2.71 kB
assets/WidgetCurve-CcAQLD_P.js (removed) 9.36 kB 🟢 -9.36 kB 🟢 -3 kB 🟢 -2.71 kB
assets/nodeTemplates-sUa6_b1i.js (new) 9.34 kB 🔴 +9.34 kB 🔴 +3.27 kB 🔴 +2.88 kB
assets/nodeTemplates-zV2KnT9l.js (removed) 9.34 kB 🟢 -9.34 kB 🟢 -3.27 kB 🟢 -2.88 kB
assets/SelectValue-DTlZN9Iz.js (removed) 8.94 kB 🟢 -8.94 kB 🟢 -2.26 kB 🟢 -1.99 kB
assets/SelectValue-rvNSYIKQ.js (new) 8.94 kB 🔴 +8.94 kB 🔴 +2.26 kB 🔴 +1.99 kB
assets/InviteMemberDialogContent-BFNqdrkm.js (removed) 7.41 kB 🟢 -7.41 kB 🟢 -2.31 kB 🟢 -2.01 kB
assets/InviteMemberDialogContent-CxLj_USr.js (new) 7.41 kB 🔴 +7.41 kB 🔴 +2.31 kB 🔴 +2.03 kB
assets/WidgetImageCompare-C_XVp8_Q.js (removed) 7 kB 🟢 -7 kB 🟢 -2.07 kB 🟢 -1.81 kB
assets/WidgetImageCompare-Ey4H47pH.js (new) 7 kB 🔴 +7 kB 🔴 +2.07 kB 🔴 +1.81 kB
assets/Load3DConfiguration-B_6fbUKJ.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/Load3DConfiguration-CXf7sRTL.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/CreateWorkspaceDialogContent-B7SU8l7l.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -2.01 kB 🟢 -1.75 kB
assets/CreateWorkspaceDialogContent-CJvyuFnP.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +2.01 kB 🔴 +1.75 kB
assets/onboardingCloudRoutes-C_d3foXO.js (removed) 5.51 kB 🟢 -5.51 kB 🟢 -1.88 kB 🟢 -1.63 kB
assets/onboardingCloudRoutes-j7kCF99D.js (new) 5.51 kB 🔴 +5.51 kB 🔴 +1.88 kB 🔴 +1.63 kB
assets/FreeTierDialogContent-8ias3MX8.js (new) 5.42 kB 🔴 +5.42 kB 🔴 +1.91 kB 🔴 +1.69 kB
assets/FreeTierDialogContent-WYNotvJQ.js (removed) 5.42 kB 🟢 -5.42 kB 🟢 -1.91 kB 🟢 -1.69 kB
assets/EditWorkspaceDialogContent-C94loZk_.js (new) 5.36 kB 🔴 +5.36 kB 🔴 +1.96 kB 🔴 +1.72 kB
assets/EditWorkspaceDialogContent-CaCjGsLa.js (removed) 5.36 kB 🟢 -5.36 kB 🟢 -1.96 kB 🟢 -1.72 kB
assets/ValueControlPopover-DYN2_OL6.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.77 kB 🔴 +1.58 kB
assets/ValueControlPopover-oy_I3Jyb.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.77 kB 🟢 -1.6 kB
assets/Preview3d-BtF502uo.js (removed) 4.89 kB 🟢 -4.89 kB 🟢 -1.61 kB 🟢 -1.4 kB
assets/Preview3d-DCjqZjB3.js (new) 4.89 kB 🔴 +4.89 kB 🔴 +1.61 kB 🔴 +1.41 kB
assets/CancelSubscriptionDialogContent-CESj8zy1.js (removed) 4.83 kB 🟢 -4.83 kB 🟢 -1.8 kB 🟢 -1.58 kB
assets/CancelSubscriptionDialogContent-DDDR3vkz.js (new) 4.83 kB 🔴 +4.83 kB 🔴 +1.8 kB 🔴 +1.58 kB
assets/AnimationControls-_96oFB9i.js (removed) 4.61 kB 🟢 -4.61 kB 🟢 -1.6 kB 🟢 -1.41 kB
assets/AnimationControls-Duc4GLUA.js (new) 4.61 kB 🔴 +4.61 kB 🔴 +1.6 kB 🔴 +1.41 kB
assets/DeleteWorkspaceDialogContent-4RJSqqXX.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.65 kB 🟢 -1.44 kB
assets/DeleteWorkspaceDialogContent-Bg1wi5o_.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.65 kB 🔴 +1.45 kB
assets/WidgetTextarea-3WiBgx-N.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.64 kB 🔴 +1.44 kB
assets/WidgetTextarea-DoOT2NKz.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.64 kB 🟢 -1.45 kB
assets/WidgetWithControl-BojfrLQo.js (new) 4.17 kB 🔴 +4.17 kB 🔴 +1.82 kB 🔴 +1.62 kB
assets/WidgetWithControl-DscA8Zs1.js (removed) 4.17 kB 🟢 -4.17 kB 🟢 -1.81 kB 🟢 -1.65 kB
assets/LeaveWorkspaceDialogContent-B0U7o7Pd.js (removed) 4.09 kB 🟢 -4.09 kB 🟢 -1.6 kB 🟢 -1.39 kB
assets/LeaveWorkspaceDialogContent-ClhpmooB.js (new) 4.09 kB 🔴 +4.09 kB 🔴 +1.59 kB 🔴 +1.4 kB
assets/RemoveMemberDialogContent-2CmbXY39.js (removed) 4.08 kB 🟢 -4.08 kB 🟢 -1.54 kB 🟢 -1.35 kB
assets/RemoveMemberDialogContent-uPpGS3YJ.js (new) 4.08 kB 🔴 +4.08 kB 🔴 +1.55 kB 🔴 +1.35 kB
assets/RevokeInviteDialogContent-B-LlcTJa.js (removed) 3.99 kB 🟢 -3.99 kB 🟢 -1.56 kB 🟢 -1.37 kB
assets/RevokeInviteDialogContent-B2ILaNzF.js (new) 3.99 kB 🔴 +3.99 kB 🔴 +1.56 kB 🔴 +1.38 kB
assets/InviteMemberUpsellDialogContent-B4FzCPJx.js (new) 3.86 kB 🔴 +3.86 kB 🔴 +1.42 kB 🔴 +1.25 kB
assets/InviteMemberUpsellDialogContent-Dar88SBQ.js (removed) 3.86 kB 🟢 -3.86 kB 🟢 -1.42 kB 🟢 -1.25 kB
assets/tierBenefits-BkjUB6qq.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.3 kB 🟢 -1.17 kB
assets/tierBenefits-Zly31_Rv.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.3 kB 🔴 +1.16 kB
assets/Popover-B5wSHUh4.js (new) 3.65 kB 🔴 +3.65 kB 🔴 +1.44 kB 🔴 +1.27 kB
assets/Popover-BOQk4Kmy.js (removed) 3.65 kB 🟢 -3.65 kB 🟢 -1.44 kB 🟢 -1.27 kB
assets/WidgetGalleria-Bc7gSRDd.js (removed) 3.6 kB 🟢 -3.6 kB 🟢 -1.4 kB 🟢 -1.25 kB
assets/WidgetGalleria-CyRqphmc.js (new) 3.6 kB 🔴 +3.6 kB 🔴 +1.39 kB 🔴 +1.25 kB
assets/WidgetToggleSwitch-CoDLRkkN.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.33 kB 🔴 +1.19 kB
assets/WidgetToggleSwitch-Cz9zimNv.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.33 kB 🟢 -1.2 kB
assets/Slider-B3Tsj8GO.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.36 kB 🔴 +1.21 kB
assets/Slider-Da9q2um5.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.36 kB 🟢 -1.19 kB
assets/saveMesh-CF4b2i0h.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -1.48 kB 🟢 -1.31 kB
assets/saveMesh-Dy8fqtxC.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +1.47 kB 🔴 +1.31 kB
assets/WidgetBoundingBox-C34_Csm-.js (removed) 3.19 kB 🟢 -3.19 kB 🟢 -895 B 🟢 -776 B
assets/WidgetBoundingBox-CagJRS6y.js (new) 3.19 kB 🔴 +3.19 kB 🔴 +895 B 🔴 +778 B
assets/cloudSessionCookie-C3mfNTHR.js (new) 3.14 kB 🔴 +3.14 kB 🔴 +1.1 kB 🔴 +967 B
assets/cloudSessionCookie-CFFZ5jMw.js (removed) 3.14 kB 🟢 -3.14 kB 🟢 -1.11 kB 🟢 -998 B
assets/WidgetMarkdown-BUuB6s0W.js (new) 2.93 kB 🔴 +2.93 kB 🔴 +1.23 kB 🔴 +1.08 kB
assets/WidgetMarkdown-DPn3Avbo.js (removed) 2.93 kB 🟢 -2.93 kB 🟢 -1.23 kB 🟢 -1.07 kB
assets/GlobalToast-BtG-8WKR.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.07 kB
assets/GlobalToast-H6YVN6lY.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.03 kB
assets/WidgetColorPicker-DkVSx5vx.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -1.23 kB 🟢 -1.11 kB
assets/WidgetColorPicker-L4hCPhOA.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +1.23 kB 🔴 +1.11 kB
assets/WidgetInputText-D0ea31DA.js (new) 2.89 kB 🔴 +2.89 kB 🔴 +1.24 kB 🔴 +1.11 kB
assets/WidgetInputText-Xip5ckf4.js (removed) 2.89 kB 🟢 -2.89 kB 🟢 -1.25 kB 🟢 -1.11 kB
assets/MediaVideoTop-GUUbKzSN.js (removed) 2.78 kB 🟢 -2.78 kB 🟢 -1.14 kB 🟢 -998 B
assets/MediaVideoTop-L08_iM14.js (new) 2.78 kB 🔴 +2.78 kB 🔴 +1.13 kB 🔴 +1.02 kB
assets/ApiNodesSignInContent-e8I2Uhgw.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +925 B
assets/ApiNodesSignInContent-UJpMqhFl.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -925 B
assets/WidgetChart-DLkq0NID.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +951 B 🔴 +825 B
assets/WidgetChart-Duh0oqfm.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -952 B 🟢 -824 B
assets/SubscribeToRun-CVc4JJoW.js (new) 2.06 kB 🔴 +2.06 kB 🔴 +949 B 🔴 +841 B
assets/SubscribeToRun-fzqs_kew.js (removed) 2.06 kB 🟢 -2.06 kB 🟢 -945 B 🟢 -830 B
assets/SubscriptionBenefits-D1DueXTw.js (removed) 2.01 kB 🟢 -2.01 kB 🟢 -701 B 🟢 -599 B
assets/SubscriptionBenefits-J8f-bQt0.js (new) 2.01 kB 🔴 +2.01 kB 🔴 +701 B 🔴 +598 B
assets/WidgetLayoutField-BZhqi3N7.js (removed) 1.98 kB 🟢 -1.98 kB 🟢 -892 B 🟢 -776 B
assets/WidgetLayoutField-Dq9_JfRn.js (new) 1.98 kB 🔴 +1.98 kB 🔴 +891 B 🔴 +777 B
assets/Media3DTop-0x8HaYIi.js (removed) 1.83 kB 🟢 -1.83 kB 🟢 -902 B 🟢 -768 B
assets/Media3DTop-CIss1NZp.js (new) 1.83 kB 🔴 +1.83 kB 🔴 +903 B 🔴 +768 B
assets/BaseViewTemplate-6VJcY26s.js (removed) 1.78 kB 🟢 -1.78 kB 🟢 -925 B 🟢 -805 B
assets/BaseViewTemplate-D2Wl6A4b.js (new) 1.78 kB 🔴 +1.78 kB 🔴 +924 B 🔴 +804 B
assets/MediaImageTop-CsGpbloy.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -879 B 🟢 -752 B
assets/MediaImageTop-D-7rS-iO.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +880 B 🔴 +752 B
assets/CloudRunButtonWrapper-2YhuUCQJ.js (new) 1.72 kB 🔴 +1.72 kB 🔴 +806 B 🔴 +741 B
assets/CloudRunButtonWrapper-DDtNbDsg.js (removed) 1.72 kB 🟢 -1.72 kB 🟢 -804 B 🟢 -729 B
assets/auto-DaAGiCO7.js (new) 1.7 kB 🔴 +1.7 kB 🔴 +622 B 🔴 +566 B
assets/auto-Mr7ZnDOO.js (removed) 1.7 kB 🟢 -1.7 kB 🟢 -619 B 🟢 -562 B
assets/cloudBadges-Cen7I_gY.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -793 B 🟢 -693 B
assets/cloudBadges-Dbbuftz6.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +792 B 🔴 +692 B
assets/signInSchema-CmxL2t5V.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +563 B 🔴 +514 B
assets/signInSchema-DyZeaALE.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -563 B 🟢 -527 B
assets/MediaAudioTop-CcX--__P.js (new) 1.43 kB 🔴 +1.43 kB 🔴 +765 B 🔴 +635 B
assets/MediaAudioTop-Cg7hEqmq.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -767 B 🟢 -641 B
assets/previousFullPath-Dgltiy4K.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +651 B 🔴 +573 B
assets/previousFullPath-TJ0E_S39.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -650 B 🟢 -578 B
assets/cloudSubscription-8RHlUKFM.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +675 B 🔴 +590 B
assets/cloudSubscription-Ao1WPxwD.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -675 B 🟢 -585 B
assets/Textarea-h5LgL2vk.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -715 B 🟢 -627 B
assets/Textarea-tnAz8KeU.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +716 B 🔴 +626 B
assets/VideoPlayOverlay-BciYDrIq.js (removed) 1.35 kB 🟢 -1.35 kB 🟢 -701 B 🟢 -622 B
assets/VideoPlayOverlay-BUItZo5F.js (new) 1.35 kB 🔴 +1.35 kB 🔴 +702 B 🔴 +621 B
assets/Loader-cdpDz0uu.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +628 B 🔴 +555 B
assets/Loader-CW1-OX64.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -630 B 🟢 -558 B
assets/widgetPropFilter-DWqMK-RY.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -515 B 🟢 -436 B
assets/widgetPropFilter-tYaGazrB.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +513 B 🔴 +453 B
assets/Load3D-CUBoHaei.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +520 B 🔴 +458 B
assets/Load3D-Di4iKYy8.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -518 B 🟢 -459 B
assets/nightlyBadges-BeAGnbNX.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +549 B 🔴 +492 B
assets/nightlyBadges-PB1Acxak.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -547 B 🟢 -492 B
assets/Load3dViewerContent-DhokoBaY.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -488 B 🟢 -430 B
assets/Load3dViewerContent-DonWqgeI.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +488 B 🔴 +428 B
assets/MediaOtherTop-BnLYn-y9.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -569 B 🟢 -477 B
assets/MediaOtherTop-FC1oe-E1.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +569 B 🔴 +477 B
assets/MediaTextTop-lRCQfO0C.js (removed) 1.01 kB 🟢 -1.01 kB 🟢 -565 B 🟢 -480 B
assets/MediaTextTop-quKrqFV_.js (new) 1.01 kB 🔴 +1.01 kB 🔴 +565 B 🔴 +478 B
assets/SubscriptionPanelContentWorkspace-BqivyexV.js (new) 963 B 🔴 +963 B 🔴 +456 B 🔴 +396 B
assets/SubscriptionPanelContentWorkspace-CBRYt4iU.js (removed) 963 B 🟢 -963 B 🟢 -457 B 🟢 -396 B
assets/ComfyOrgHeader-BiqY9Lcy.js (removed) 910 B 🟢 -910 B 🟢 -496 B 🟢 -426 B
assets/ComfyOrgHeader-CVUg6Znj.js (new) 910 B 🔴 +910 B 🔴 +496 B 🔴 +425 B
assets/changeTracker-LbuvdP1P.js (removed) 800 B 🟢 -800 B 🟢 -397 B 🟢 -349 B
assets/WidgetLegacy-3iDjiEIZ.js (new) 787 B 🔴 +787 B 🔴 +403 B 🔴 +353 B
assets/WidgetLegacy-BD4FtVMB.js (removed) 787 B 🟢 -787 B 🟢 -402 B 🟢 -349 B
assets/changeTracker-B98ib2no.js (new) 763 B 🔴 +763 B 🔴 +393 B 🔴 +345 B
assets/graphHasMissingNodes-BwcMGVBW.js (new) 761 B 🔴 +761 B 🔴 +373 B 🔴 +327 B
assets/graphHasMissingNodes-DLNejgYt.js (removed) 761 B 🟢 -761 B 🟢 -373 B 🟢 -322 B
assets/constants-Cl4K4L4H.js (removed) 579 B 🟢 -579 B 🟢 -257 B 🟢 -232 B
assets/constants-ogISyp4e.js (new) 579 B 🔴 +579 B 🔴 +256 B 🔴 +228 B
assets/WidgetBoundingBox-B3NJoLzd.js (new) 283 B 🔴 +283 B 🔴 +184 B 🔴 +162 B
assets/WidgetBoundingBox-s40kDLQo.js (removed) 283 B 🟢 -283 B 🟢 -184 B 🟢 -165 B
assets/src-BwR6vNpJ.js (new) 251 B 🔴 +251 B 🔴 +207 B 🔴 +180 B
assets/src-LCL7cak3.js (removed) 251 B 🟢 -251 B 🟢 -211 B 🟢 -180 B
assets/i18n-B2P414iJ.js (removed) 199 B 🟢 -199 B 🟢 -161 B 🟢 -138 B
assets/i18n-D_d4Oz5-.js (new) 199 B 🔴 +199 B 🔴 +162 B 🔴 +142 B
assets/comfy-logo-single-BcOH_oP5.js (new) 198 B 🔴 +198 B 🔴 +162 B 🔴 +128 B
assets/comfy-logo-single-C9H6LVPO.js (removed) 198 B 🟢 -198 B 🟢 -163 B 🟢 -127 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 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/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/widget-DIRwAHBY.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DYLaC2lj.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 120 added / 121 removed

@github-actions
Copy link

github-actions bot commented Mar 7, 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 122 123 +1%
canvas-idle: layouts 0 0 +0%
canvas-idle: task duration 461ms 393ms -15%
canvas-mouse-sweep: style recalcs 181 172 -5%
canvas-mouse-sweep: layouts 12 12 -3%
canvas-mouse-sweep: task duration 965ms 887ms -8%
dom-widget-clipping: style recalcs 43 43 +2%
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 377ms 369ms -2%
subgraph-dom-widget-clipping: style recalcs 74 75 +1%
subgraph-dom-widget-clipping: layouts 0 0
subgraph-dom-widget-clipping: task duration 425ms 429ms +1%
subgraph-idle: style recalcs 121 121 +1%
subgraph-idle: layouts 0 0
subgraph-idle: task duration 440ms 381ms -13%
subgraph-mouse-sweep: style recalcs 156 160 +2%
subgraph-mouse-sweep: layouts 16 16 +0%
subgraph-mouse-sweep: task duration 769ms 807ms +5%
Raw data
{
  "timestamp": "2026-03-07T20:13:24.701Z",
  "gitSha": "3fba0aa036ad0025dfac8bc33f5663fca4621487",
  "branch": "pysssss/fix-workflow-corruption",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2025.9340000000066,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 20.651000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 396.93999999999994,
      "heapDeltaBytes": -3151432
    },
    {
      "name": "canvas-idle",
      "durationMs": 2026.2910000000147,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 20.141,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 396.89000000000004,
      "heapDeltaBytes": -3558688
    },
    {
      "name": "canvas-idle",
      "durationMs": 2039.4699999999943,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 19.151,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 384.91700000000003,
      "heapDeltaBytes": -2879192
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2064.9590000000444,
      "styleRecalcs": 186,
      "styleRecalcDurationMs": 52.45300000000001,
      "layouts": 12,
      "layoutDurationMs": 3.4150000000000005,
      "taskDurationMs": 1079.267,
      "heapDeltaBytes": -3112336
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1829.3600000000083,
      "styleRecalcs": 166,
      "styleRecalcDurationMs": 43.889,
      "layouts": 12,
      "layoutDurationMs": 3.0709999999999997,
      "taskDurationMs": 810.211,
      "heapDeltaBytes": -3445028
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1808.4779999999796,
      "styleRecalcs": 164,
      "styleRecalcDurationMs": 41.802,
      "layouts": 12,
      "layoutDurationMs": 2.9859999999999998,
      "taskDurationMs": 770.4499999999999,
      "heapDeltaBytes": -3032328
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 611.8000000000166,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 14.440000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 405.10900000000004,
      "heapDeltaBytes": 7422096
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 603.8730000000214,
      "styleRecalcs": 44,
      "styleRecalcDurationMs": 12.411999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 355.716,
      "heapDeltaBytes": 7700456
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 557.7329999999847,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 11.817999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 345.613,
      "heapDeltaBytes": 7527712
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 623.2530000000338,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 18.654999999999998,
      "layouts": 1,
      "layoutDurationMs": 0.335,
      "taskDurationMs": 442.524,
      "heapDeltaBytes": -8218128
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 627.5339999999687,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 16.075,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 430.449,
      "heapDeltaBytes": 15086984
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 574.8179999999934,
      "styleRecalcs": 72,
      "styleRecalcDurationMs": 14.828000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 415.3310000000001,
      "heapDeltaBytes": -8934448
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2012.5250000000392,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 23.011,
      "layouts": 1,
      "layoutDurationMs": 0.21199999999999994,
      "taskDurationMs": 387.322,
      "heapDeltaBytes": -3998788
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2007.772999999986,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 18.948,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 379.024,
      "heapDeltaBytes": -3402048
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1993.7810000000127,
      "styleRecalcs": 120,
      "styleRecalcDurationMs": 18.643,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 376.84,
      "heapDeltaBytes": -3625916
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1997.191999999984,
      "styleRecalcs": 172,
      "styleRecalcDurationMs": 52.574000000000005,
      "layouts": 16,
      "layoutDurationMs": 4.523,
      "taskDurationMs": 980.4750000000001,
      "heapDeltaBytes": -5096852
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1696.883000000014,
      "styleRecalcs": 155,
      "styleRecalcDurationMs": 43.376,
      "layouts": 16,
      "layoutDurationMs": 4.2589999999999995,
      "taskDurationMs": 723.5409999999999,
      "heapDeltaBytes": -5794872
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1681.3339999999926,
      "styleRecalcs": 153,
      "styleRecalcDurationMs": 43.152,
      "layouts": 16,
      "layoutDurationMs": 4.472,
      "taskDurationMs": 716.929,
      "heapDeltaBytes": -5660824
    }
  ]
}

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/scripts/app.ts (1)

1310-1310: Consider counter-based approach for robustness against nested loads.

The codebase already uses configuringGraphLevel (a counter) for similar purposes. A counter-based approach would be more robust if loadGraphData were ever called recursively (e.g., from an extension hook). Currently this seems unlikely given the code structure, so the boolean is acceptable for this fix.

♻️ Optional: Counter-based approach for future-proofing
 export class ChangeTracker {
   static MAX_HISTORY = 50
-  static isLoadingGraph = false
+  private static loadingGraphLevel = 0
+  static get isLoadingGraph(): boolean {
+    return this.loadingGraphLevel > 0
+  }
+  static enterLoadingGraph(): void {
+    this.loadingGraphLevel++
+  }
+  static exitLoadingGraph(): void {
+    this.loadingGraphLevel--
+  }

Then in app.ts:

-    ChangeTracker.isLoadingGraph = true
+    ChangeTracker.enterLoadingGraph()
     try {
       // ...
     } finally {
-      ChangeTracker.isLoadingGraph = false
+      ChangeTracker.exitLoadingGraph()
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/scripts/app.ts` at line 1310, Replace the boolean flag usage with a
counter to guard nested loads: instead of setting ChangeTracker.isLoadingGraph =
true/false in loadGraphData, increment ChangeTracker.configuringGraphLevel (or
add that numeric property if missing) at the start of the load and decrement it
in a finally block at the end; update any checks that read
ChangeTracker.isLoadingGraph to instead test ChangeTracker.configuringGraphLevel
> 0 so recursive/nested calls are correctly handled. Ensure
increments/decrements are paired even on errors by performing the decrement in
the finally path.
🤖 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/scripts/app.ts`:
- Line 1310: Replace the boolean flag usage with a counter to guard nested
loads: instead of setting ChangeTracker.isLoadingGraph = true/false in
loadGraphData, increment ChangeTracker.configuringGraphLevel (or add that
numeric property if missing) at the start of the load and decrement it in a
finally block at the end; update any checks that read
ChangeTracker.isLoadingGraph to instead test ChangeTracker.configuringGraphLevel
> 0 so recursive/nested calls are correctly handled. Ensure
increments/decrements are paired even on errors by performing the decrement in
the finally path.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e5afc2f6-d820-42e2-b71e-fd02b5b84a73

📥 Commits

Reviewing files that changed from the base of the PR and between 1687ca9 and 81fbd8a.

📒 Files selected for processing (3)
  • src/scripts/app.ts
  • src/scripts/changeTracker.ts
  • src/stores/appModeStore.ts

@pythongosssss
Copy link
Member Author

@coderabbitai Log an issue to write a unit test to prevent a regression for this issue.
We should be able to recreate it for ensuring the test is valid by disabling the ChangeTracker.isLoadingGraph fix, then in the test register a custom extension that calls changeTracker.checkState() in the onAfterGraphConfigured hook, switch tabs, observe that the workflow is overwritten with the other tab data, then re-enable the fix and ensure test passes

@pythongosssss pythongosssss marked this pull request as ready for review March 7, 2026 20:19
@pythongosssss pythongosssss requested a review from a team as a code owner March 7, 2026 20:19
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Mar 7, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 7, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

@pythongosssss: I'll create the GitHub issue now with the details you provided.


🏁 Script executed:

#!/bin/bash
gh issue create \
  --repo Comfy-Org/ComfyUI_frontend \
  --title "test: Add unit test to prevent regression of workflow corruption during graph loading" \
  --body "## Summary

A regression test is needed to guard against workflow data corruption during graph loading, as fixed in `#9531`.

## Background

During workflow loading, the workflow data and the active workflow object can become out of sync, allowing \`checkState\` calls to write data into the wrong workflow. PR `#9531` introduced \`ChangeTracker.isLoadingGraph\` to block \`checkState\` and app-mode data sync while loading.

## Test Approach

The test should validate the fix by:

1. **Disable the fix** — temporarily set \`ChangeTracker.isLoadingGraph\` to never block \`checkState\` (to confirm the test can reproduce the corruption).
2. **Register a custom extension** that calls \`changeTracker.checkState()\` inside the \`onAfterGraphConfigured\` hook.
3. **Open multiple workflow tabs** (2–3), switch between them, and observe that the active workflow's state is overwritten with data from the other tab (reproducing the bug).
4. **Re-enable the fix** and confirm the test passes (no corruption occurs).

## Acceptance Criteria

- Test fails when \`ChangeTracker.isLoadingGraph\` guard is removed/bypassed.
- Test passes with the guard in place.
- Covers the \`checkState\` short-circuit path in \`src/scripts/changeTracker.ts\` and the early-exit guard in \`src/stores/appModeStore.ts\`.

## References

- Fix PR: `#9531`
- Requested by: `@pythongosssss` in https://github.com/Comfy-Org/ComfyUI_frontend/pull/9531
" \
  --assignee pythongosssss

Length of output: 57


@pythongosssss: The issue has been logged at #9532, assigned to you. It includes the full test approach you described:

  1. Disable the ChangeTracker.isLoadingGraph guard to confirm the corruption is reproducible.
  2. Register a custom extension that calls changeTracker.checkState() in onAfterGraphConfigured.
  3. Switch tabs and observe the workflow being overwritten with the wrong data.
  4. Re-enable the fix and verify the test passes.

🧠 Learnings used
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 8951
File: src/platform/workflow/management/stores/workflowStore.ts:301-301
Timestamp: 2026-03-05T23:21:47.113Z
Learning: In src/platform/workflow/management/stores/workflowStore.ts, `createTemporary()` and `createNewTemporary()` intentionally inject a UUID `id` into workflow data via `ensureWorkflowId()` to give workflows stable identity for sharing. This is a known behavioral change introduced in PR `#8951`. Extensions relying on serialized content matching their input may be silently affected.

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/AGENTS.md:0-0
Timestamp: 2026-02-03T20:33:39.759Z
Learning: Applies to browser_tests/**/*.spec.ts : Use premade JSON workflows in the `assets/` directory to load desired graph state in E2E tests

Learnt from: Myestery
Repo: Comfy-Org/ComfyUI_frontend PR: 7422
File: .github/workflows/pr-update-playwright-expectations.yaml:131-135
Timestamp: 2025-12-12T23:02:37.473Z
Learning: In the `.github/workflows/pr-update-playwright-expectations.yaml` workflow in the Comfy-Org/ComfyUI_frontend repository, the snapshot update process is intentionally scoped to only add and update snapshot images. Deletions of snapshot files are handled explicitly outside this workflow and should not be suggested as part of this automation.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7415
File: browser_tests/tests/mobileBaseline.spec.ts:17-22
Timestamp: 2025-12-13T05:54:35.779Z
Learning: In browser_tests tests for the Comfy-Org/ComfyUI_frontend repository, the `comfyPage.loadWorkflow()` method already handles all necessary synchronization and waiting. No additional `await comfyPage.nextFrame()` call is needed before taking screenshots after loading a workflow.

Learnt from: pythongosssss
Repo: Comfy-Org/ComfyUI_frontend PR: 9393
File: src/stores/appModeStore.ts:22-27
Timestamp: 2026-03-04T23:21:14.479Z
Learning: In `src/stores/appModeStore.ts`, the `hasNodes` computed reads `app.rootGraph?.nodes?.length` (non-reactive) but tracks `workflowStore.activeWorkflow` and `mode.value` as reactive dependencies. This is intentional and correct: node edits are only possible in graph mode, so `hasNodes` will always re-evaluate when switching into app/builder mode via the `mode.value` dependency change.

@pythongosssss
Copy link
Member Author

@coderabbitai Log an issue to see if we can rearchitect this to avoid getting into the desynced workflow/graph data state completley

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 7, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
gh issue create \
  --repo Comfy-Org/ComfyUI_frontend \
  --title "refactor: Rearchitect workflow/graph data sync to prevent desynced state during loading" \
  --body "## Summary

Explore rearchitecting the relationship between workflow data and the active workflow object so that the desynced state during graph loading cannot occur in the first place, rather than relying on guard flags to patch around it.

## Background

PR `#9531` fixed a bug where workflow data and the active workflow object could become out of sync during loading, allowing \`checkState\` calls to write data into the wrong workflow. The fix introduces \`ChangeTracker.isLoadingGraph\` as a guard flag in \`src/scripts/changeTracker.ts\` and \`src/stores/appModeStore.ts\`.

While this guard is effective, it is a defensive patch around a deeper architectural issue: the workflow loading sequence allows a window of time where the active workflow reference and the graph being configured are decoupled.

## Goal

Investigate and implement an architectural solution so that:

- The workflow data and the graph/active workflow object are always in sync — there is no window during loading where they can diverge.
- Guard flags like \`isLoadingGraph\` are no longer needed to prevent state corruption.
- \`checkState\`, app-mode data sync, and other state-writing paths are naturally safe to call at any point, because the data they read always belongs to the correct workflow.

## Possible approaches to explore

- Ensure the active workflow reference is updated atomically with the graph configuration step, so there is never a moment where the two are mismatched.
- Make \`checkState\` and related paths read workflow identity directly from the graph being serialized, rather than from a separately-tracked active workflow reference.
- Introduce a transactional loading primitive that gates all state-writing side effects until the load is fully committed.

## References

- Fix PR: `#9531`
- Regression test issue: `#9532`
- Requested by: `@pythongosssss` in https://github.com/Comfy-Org/ComfyUI_frontend/pull/9531
" \
  --assignee pythongosssss

Length of output: 57


@pythongosssss: The issue has been logged at #9533, assigned to you. It captures the architectural goal with the following key points:

  • Root cause: The loading sequence allows a window where the active workflow reference and the graph being configured are decoupled, requiring guard flags as a patch rather than a structural fix.
  • Goal: Ensure workflow data and graph/active workflow object are always in sync, so checkState, app-mode data sync, and other state-writing paths are naturally safe at any point.
  • Approaches to explore:
    • Atomically update the active workflow reference alongside the graph configuration step.
    • Have checkState read workflow identity directly from the graph being serialized, rather than a separately-tracked reference.
    • Introduce a transactional loading primitive that gates all state-writing side effects until the load is fully committed.

🧠 Learnings used
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 8951
File: src/platform/workflow/management/stores/workflowStore.ts:301-301
Timestamp: 2026-03-05T23:21:47.113Z
Learning: In src/platform/workflow/management/stores/workflowStore.ts, `createTemporary()` and `createNewTemporary()` intentionally inject a UUID `id` into workflow data via `ensureWorkflowId()` to give workflows stable identity for sharing. This is a known behavioral change introduced in PR `#8951`. Extensions relying on serialized content matching their input may be silently affected.

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/AGENTS.md:0-0
Timestamp: 2026-02-03T20:33:39.759Z
Learning: Applies to browser_tests/**/*.spec.ts : Use premade JSON workflows in the `assets/` directory to load desired graph state in E2E tests

Learnt from: pythongosssss
Repo: Comfy-Org/ComfyUI_frontend PR: 9393
File: src/stores/appModeStore.ts:22-27
Timestamp: 2026-03-04T23:21:14.479Z
Learning: In `src/stores/appModeStore.ts`, the `hasNodes` computed reads `app.rootGraph?.nodes?.length` (non-reactive) but tracks `workflowStore.activeWorkflow` and `mode.value` as reactive dependencies. This is intentional and correct: node edits are only possible in graph mode, so `hasNodes` will always re-evaluate when switching into app/builder mode via the `mode.value` dependency change.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 9345
File: src/platform/workflow/management/stores/workflowStore.ts:488-491
Timestamp: 2026-03-03T01:32:58.349Z
Learning: In `src/platform/workflow/management/stores/workflowStore.ts`, `openWorkflowPaths` maintains unique workflow paths by design. Operations like `openWorkflowsInBackground` use `_.union` to enforce uniqueness. When updating paths (e.g., during rename), replacing the first occurrence with `indexOf`/`splice` is sufficient because duplicates should not exist.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7415
File: browser_tests/tests/mobileBaseline.spec.ts:17-22
Timestamp: 2025-12-13T05:54:35.779Z
Learning: In browser_tests tests for the Comfy-Org/ComfyUI_frontend repository, the `comfyPage.loadWorkflow()` method already handles all necessary synchronization and waiting. No additional `await comfyPage.nextFrame()` call is needed before taking screenshots after loading a workflow.

Learnt from: Myestery
Repo: Comfy-Org/ComfyUI_frontend PR: 7422
File: .github/workflows/pr-update-playwright-expectations.yaml:131-135
Timestamp: 2025-12-12T23:02:37.473Z
Learning: In the `.github/workflows/pr-update-playwright-expectations.yaml` workflow in the Comfy-Org/ComfyUI_frontend repository, the snapshot update process is intentionally scoped to only add and update snapshot images. Deletions of snapshot files are handled explicitly outside this workflow and should not be suggested as part of this automation.

Copy link
Collaborator

@AustinMroz AustinMroz left a comment

Choose a reason for hiding this comment

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

PRs like this make me very happy for git diff -w/(hide whitespace)

@pythongosssss pythongosssss merged commit ec129de into main Mar 7, 2026
37 checks passed
@pythongosssss pythongosssss deleted the pysssss/fix-workflow-corruption branch March 7, 2026 20:44
@DrJKL DrJKL added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch cloud/1.41 Backport PRs for cloud 1.41 labels Mar 7, 2026
github-actions bot pushed a commit that referenced this pull request Mar 7, 2026
…ph loading (#9531)

## Summary

During workflow loading, the workflow data & active workflow object can
be out of sync, meaning any checkState calls will overwrite data into
the wrong workflow.

Recreation steps:
* Open 2-3 workflows
* Enter builder mode > select step
* Select some different inputs on each
* Quickly tap the shift key (this triggers checkState) while switching
tabs
* After a while, you'll see the wrong inputs on the workflows

Alternatively, register an extension that guarantees to call checkState
during the bad phase, run this in browser devtools and switch tabs:
```
window.app.registerExtension({
  name: 'bad',
  async afterConfigureGraph() {
    window.app.extensionManager.workflow.activeWorkflow.changeTracker.checkState()
  }
})
```

## Changes

- **What**: 
- Add loading graph flag
- Prevent checkState calls while loading
- Prevent app mode data sync while loading

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9531-fix-Prevent-corruption-of-workflow-data-due-to-checkState-during-graph-loading-31c6d73d365081e2ab91d9145bf1d025)
by [Unito](https://www.unito.io)
@comfy-pr-bot
Copy link
Member

@pythongosssss Successfully backported to #9537

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Mar 7, 2026
pythongosssss added a commit that referenced this pull request Mar 7, 2026
… checkState during graph loading (#9537)

Backport of #9531 to `cloud/1.41`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9537-backport-cloud-1-41-fix-Prevent-corruption-of-workflow-data-due-to-checkState-during-g-31c6d73d3650810a9963e85b18084e31)
by [Unito](https://www.unito.io)

Co-authored-by: pythongosssss <125205205+pythongosssss@users.noreply.github.com>
@christian-byrne christian-byrne added core/1.41 Backport PRs for core 1.41 needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch labels Mar 8, 2026
github-actions bot pushed a commit that referenced this pull request Mar 8, 2026
…ph loading (#9531)

## Summary

During workflow loading, the workflow data & active workflow object can
be out of sync, meaning any checkState calls will overwrite data into
the wrong workflow.

Recreation steps:
* Open 2-3 workflows
* Enter builder mode > select step
* Select some different inputs on each
* Quickly tap the shift key (this triggers checkState) while switching
tabs
* After a while, you'll see the wrong inputs on the workflows

Alternatively, register an extension that guarantees to call checkState
during the bad phase, run this in browser devtools and switch tabs:
```
window.app.registerExtension({
  name: 'bad',
  async afterConfigureGraph() {
    window.app.extensionManager.workflow.activeWorkflow.changeTracker.checkState()
  }
})
```

## Changes

- **What**: 
- Add loading graph flag
- Prevent checkState calls while loading
- Prevent app mode data sync while loading

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9531-fix-Prevent-corruption-of-workflow-data-due-to-checkState-during-graph-loading-31c6d73d365081e2ab91d9145bf1d025)
by [Unito](https://www.unito.io)
@github-actions
Copy link

github-actions bot commented Mar 8, 2026

⚠️ Backport to cloud/1.41 failed

Reason: Merge conflicts detected during cherry-pick of ec129de

📄 Conflicting files

🤖 Prompt for AI Agents
Backport PR #9531 (https://github.com/Comfy-Org/ComfyUI_frontend/pull/9531) to cloud/1.41.
Cherry-pick merge commit ec129de63dc75e884a77ca2e2ecf53f6f05ef8f9 onto new branch
backport-9531-to-cloud-1.41 from origin/cloud/1.41.
Resolve conflicts in: .
For test snapshots (browser_tests/**/*-snapshots/), accept PR version if
changed in original PR, else keep target. For package.json versions, keep
target branch. For pnpm-lock.yaml, regenerate with pnpm install.
Ask user for non-obvious conflicts.
Create PR titled "[backport cloud/1.41] <original title>" with label "backport".
See .github/workflows/pr-backport.yaml for workflow details.

cc @pythongosssss

github-actions bot pushed a commit that referenced this pull request Mar 8, 2026
…ph loading (#9531)

## Summary

During workflow loading, the workflow data & active workflow object can
be out of sync, meaning any checkState calls will overwrite data into
the wrong workflow.

Recreation steps:
* Open 2-3 workflows
* Enter builder mode > select step
* Select some different inputs on each
* Quickly tap the shift key (this triggers checkState) while switching
tabs
* After a while, you'll see the wrong inputs on the workflows

Alternatively, register an extension that guarantees to call checkState
during the bad phase, run this in browser devtools and switch tabs:
```
window.app.registerExtension({
  name: 'bad',
  async afterConfigureGraph() {
    window.app.extensionManager.workflow.activeWorkflow.changeTracker.checkState()
  }
})
```

## Changes

- **What**: 
- Add loading graph flag
- Prevent checkState calls while loading
- Prevent app mode data sync while loading

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9531-fix-Prevent-corruption-of-workflow-data-due-to-checkState-during-graph-loading-31c6d73d365081e2ab91d9145bf1d025)
by [Unito](https://www.unito.io)
@github-actions
Copy link

github-actions bot commented Mar 8, 2026

⚠️ Backport to cloud/1.41 failed

Reason: Merge conflicts detected during cherry-pick of ec129de

📄 Conflicting files

🤖 Prompt for AI Agents
Backport PR #9531 (https://github.com/Comfy-Org/ComfyUI_frontend/pull/9531) to cloud/1.41.
Cherry-pick merge commit ec129de63dc75e884a77ca2e2ecf53f6f05ef8f9 onto new branch
backport-9531-to-cloud-1.41 from origin/cloud/1.41.
Resolve conflicts in: .
For test snapshots (browser_tests/**/*-snapshots/), accept PR version if
changed in original PR, else keep target. For package.json versions, keep
target branch. For pnpm-lock.yaml, regenerate with pnpm install.
Ask user for non-obvious conflicts.
Create PR titled "[backport cloud/1.41] <original title>" with label "backport".
See .github/workflows/pr-backport.yaml for workflow details.

cc @pythongosssss

christian-byrne pushed a commit that referenced this pull request Mar 8, 2026
…ph loading (#9531)

## Summary

During workflow loading, the workflow data & active workflow object can
be out of sync, meaning any checkState calls will overwrite data into
the wrong workflow.

Recreation steps:
* Open 2-3 workflows
* Enter builder mode > select step
* Select some different inputs on each
* Quickly tap the shift key (this triggers checkState) while switching
tabs
* After a while, you'll see the wrong inputs on the workflows

Alternatively, register an extension that guarantees to call checkState
during the bad phase, run this in browser devtools and switch tabs:
```
window.app.registerExtension({
  name: 'bad',
  async afterConfigureGraph() {
    window.app.extensionManager.workflow.activeWorkflow.changeTracker.checkState()
  }
})
```

## Changes

- **What**: 
- Add loading graph flag
- Prevent checkState calls while loading
- Prevent app mode data sync while loading

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9531-fix-Prevent-corruption-of-workflow-data-due-to-checkState-during-graph-loading-31c6d73d365081e2ab91d9145bf1d025)
by [Unito](https://www.unito.io)
christian-byrne added a commit that referenced this pull request Mar 8, 2026
…checkState during graph loading (#9531) (#9561)

Backport of #9531 to core/1.41.

Cherry-pick of merge commit ec129de applied cleanly.

**Original PR:** #9531
**Pipeline ticket:** 15e1f241-efaa-4fe5-88ca-4ccc7bfb3345

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9561-backport-core-1-41-fix-Prevent-corruption-of-workflow-data-due-to-checkState-during-gr-31d6d73d365081aabc05c0409ee49615)
by [Unito](https://www.unito.io)

Co-authored-by: pythongosssss <125205205+pythongosssss@users.noreply.github.com>
@christian-byrne christian-byrne added the core/1.40 Backport PRs for core 1.40 label Mar 8, 2026
@github-actions
Copy link

github-actions bot commented Mar 8, 2026

⚠️ Backport to core/1.40 failed

Reason: Merge conflicts detected during cherry-pick of ec129de

📄 Conflicting files
src/scripts/app.ts
src/stores/appModeStore.ts
🤖 Prompt for AI Agents
Backport PR #9531 (https://github.com/Comfy-Org/ComfyUI_frontend/pull/9531) to core/1.40.
Cherry-pick merge commit ec129de63dc75e884a77ca2e2ecf53f6f05ef8f9 onto new branch
backport-9531-to-core-1.40 from origin/core/1.40.
Resolve conflicts in: src/scripts/app.ts src/stores/appModeStore.ts .
For test snapshots (browser_tests/**/*-snapshots/), accept PR version if
changed in original PR, else keep target. For package.json versions, keep
target branch. For pnpm-lock.yaml, regenerate with pnpm install.
Ask user for non-obvious conflicts.
Create PR titled "[backport core/1.40] <original title>" with label "backport".
See .github/workflows/pr-backport.yaml for workflow details.

cc @pythongosssss

@github-actions
Copy link

github-actions bot commented Mar 8, 2026

⚠️ Backport to core/1.41 failed

Reason: Merge conflicts detected during cherry-pick of ec129de

📄 Conflicting files

🤖 Prompt for AI Agents
Backport PR #9531 (https://github.com/Comfy-Org/ComfyUI_frontend/pull/9531) to core/1.41.
Cherry-pick merge commit ec129de63dc75e884a77ca2e2ecf53f6f05ef8f9 onto new branch
backport-9531-to-core-1.41 from origin/core/1.41.
Resolve conflicts in: .
For test snapshots (browser_tests/**/*-snapshots/), accept PR version if
changed in original PR, else keep target. For package.json versions, keep
target branch. For pnpm-lock.yaml, regenerate with pnpm install.
Ask user for non-obvious conflicts.
Create PR titled "[backport core/1.41] <original title>" with label "backport".
See .github/workflows/pr-backport.yaml for workflow details.

cc @pythongosssss

@github-actions
Copy link

github-actions bot commented Mar 8, 2026

⚠️ Backport to cloud/1.41 failed

Reason: Merge conflicts detected during cherry-pick of ec129de

📄 Conflicting files

🤖 Prompt for AI Agents
Backport PR #9531 (https://github.com/Comfy-Org/ComfyUI_frontend/pull/9531) to cloud/1.41.
Cherry-pick merge commit ec129de63dc75e884a77ca2e2ecf53f6f05ef8f9 onto new branch
backport-9531-to-cloud-1.41 from origin/cloud/1.41.
Resolve conflicts in: .
For test snapshots (browser_tests/**/*-snapshots/), accept PR version if
changed in original PR, else keep target. For package.json versions, keep
target branch. For pnpm-lock.yaml, regenerate with pnpm install.
Ask user for non-obvious conflicts.
Create PR titled "[backport cloud/1.41] <original title>" with label "backport".
See .github/workflows/pr-backport.yaml for workflow details.

cc @pythongosssss

christian-byrne pushed a commit that referenced this pull request Mar 8, 2026
…ph loading (#9531)

During workflow loading, the workflow data & active workflow object can
be out of sync, meaning any checkState calls will overwrite data into
the wrong workflow.

Recreation steps:
* Open 2-3 workflows
* Enter builder mode > select step
* Select some different inputs on each
* Quickly tap the shift key (this triggers checkState) while switching
tabs
* After a while, you'll see the wrong inputs on the workflows

Alternatively, register an extension that guarantees to call checkState
during the bad phase, run this in browser devtools and switch tabs:
```
window.app.registerExtension({
  name: 'bad',
  async afterConfigureGraph() {
    window.app.extensionManager.workflow.activeWorkflow.changeTracker.checkState()
  }
})
```

- **What**:
- Add loading graph flag
- Prevent checkState calls while loading
- Prevent app mode data sync while loading

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9531-fix-Prevent-corruption-of-workflow-data-due-to-checkState-during-graph-loading-31c6d73d365081e2ab91d9145bf1d025)
by [Unito](https://www.unito.io)
christian-byrne added a commit that referenced this pull request Mar 8, 2026
…checkState during graph loading (#9531) (#9579)

Backport of #9531 to core/1.40. Critical data corruption fix.

Conflicts resolved: restructured try/catch in app.ts to wrap with
ChangeTracker.isLoadingGraph. Removed appModeStore.ts (app mode not on
1.40).

**Original PR:** #9531
**Pipeline ticket:** 15e1f241-efaa-4fe5-88ca-4ccc7bfb3345

Co-authored-by: pythongosssss <125205205+pythongosssss@users.noreply.github.com>
christian-byrne added a commit that referenced this pull request Mar 26, 2026
Coverage for 10 bug gaps identified during deep persistence audit:

CRITICAL:
- PR #9531: Workflow data corruption from checkState during graph loading
  (pythongosssss fix — had ZERO tests, now covered with 2 tests)
- PR #9533: Desynced workflow/graph state during rapid tab switching

MEDIUM:
- PR #9380: Node output previews lost on tab switch
- 44bb6f1: Canvas not cleared before loading new workflow
- PR #7648: Widget values lost on graph change
- PR #9694: API format workflows fail with missing nodes
- PR #8259: Middle-click paste duplicates workflow
- PR #8715: Transient blob: URLs in serialization

LOW:
- PR #8963: Locale change breaks workflows
- Splitter panel size drift

All tests use Vue nodes with new menu enabled. Each test documents
which PR/commit it regresses and reproduces the exact user scenario.

Part of: Test Coverage Q2 Overhaul (REG-01)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud/1.41 Backport PRs for cloud 1.41 core/1.40 Backport PRs for core 1.40 core/1.41 Backport PRs for core 1.41 needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants