Skip to content

feat: centralize node image rendering state in NodeImageStore#9435

Open
christian-byrne wants to merge 5 commits intomainfrom
refactor/node-output-store-centralization
Open

feat: centralize node image rendering state in NodeImageStore#9435
christian-byrne wants to merge 5 commits intomainfrom
refactor/node-output-store-centralization

Conversation

@christian-byrne
Copy link
Contributor

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

Summary

Centralize per-node image rendering state (imgs, imageIndex, imageRects, pointerDown, overIndex) in a Pinia store keyed by NodeLocatorId, following the established ECS pattern from useWidgetValueStore (#8594) and usePromotionStore (#8856).

Changes

  • What: New useNodeImageStore with property projection via Object.defineProperty — LGraphNode properties delegate to store getters/setters, so all ~18 consumer files work unchanged.
  • Key decisions:
    • Plain Map (not reactive) avoids Vue proxy overhead in the canvas render hot path
    • peekState() + frozen DEFAULT_STATE prevents unbounded Map growth from read-only access
    • Module-scoped setNodeLocatorResolver() breaks circular dependency (LGraph → store → workflowStore → app → litegraph)
    • imgs getter returns undefined when empty to preserve node.imgs?.length optional chaining semantics
  • Cleanup: Wired into removeNodeOutputs (per-node) and resetAllOutputsAndPreviews (bulk clear)

Review Focus

  • The dependency injection pattern (setNodeLocatorResolver) is called in GraphCanvas.vue before comfyApp.setup(), and LGraph.add() is guarded by getActivePinia() for unit test safety.
  • Zero consumer changes — all existing code reading/writing node.imgs, node.imageIndex, etc. continues to work via the property projection.
  • 24 dedicated unit tests covering state isolation, subgraph keying, idempotency, and edge cases.

Fixes #9242

┆Issue is synchronized with this Notion page by Unito

@christian-byrne christian-byrne requested a review from a team as a code owner March 5, 2026 10:28
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Mar 5, 2026
@github-actions
Copy link

github-actions bot commented Mar 5, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/12/2026, 04:02:59 PM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

🎭 Playwright: ✅ 549 passed, 0 failed · 6 flaky

📊 Browser Reports
  • chromium: View Report (✅ 536 / ❌ 0 / ⚠️ 6 / ⏭️ 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 5, 2026

Caution

Review failed

The head commit changed during the review from c57d4f5 to 26cef70.

📝 Walkthrough

Walkthrough

This PR introduces a centralized Pinia store (nodeImageStore) for managing node-scoped image rendering state (imgs, imageIndex, imageRects, pointerDown, overIndex) keyed by NodeLocatorId. It includes store implementation with backwards-compatible property projection on nodes, integration into graph initialization and node creation workflows, comprehensive test coverage, and minor styling adjustments.

Changes

Cohort / File(s) Summary
Centralized Node Image Store
src/stores/nodeImageStore.ts
New Pinia store module providing per-node image state management with property projection for backwards compatibility. Includes resolver pattern to avoid circular dependencies, state getters/setters, and dynamic property installation on nodes via Object.defineProperty.
Store Bootstrap & Integration
src/components/graph/GraphCanvas.vue, src/lib/litegraph/src/LGraph.ts
Integration of store initialization: GraphCanvas sets the node locator resolver during mount; LGraph installs property projection on nodes when they are added to the graph (guarded by active Pinia check).
Comprehensive Test Suite
src/stores/nodeImageStore.test.ts
Extensive test coverage for state isolation per locator ID, property projection bi-directional syncing, imgs array handling, subgraph isolation, edge cases, and idempotent installations.
Minor UI Styling
src/components/rightSidePanel/errors/MissingNodeCard.vue
Class order reordering and spacing adjustments (leading-relaxed, padding, mt-2 positioning) in template without functional or behavioral changes.

Sequence Diagram

sequenceDiagram
    participant App as GraphCanvas
    participant Store as nodeImageStore
    participant Graph as LGraph
    participant Node as LGraphNode

    App->>Store: setNodeLocatorResolver(workflowStore.nodeToNodeLocatorId)
    App->>Graph: comfyApp.setup()
    Graph->>Graph: add(node)
    
    alt Pinia is Active
        Graph->>Store: useNodeImageStore()
        Graph->>Store: installPropertyProjection(node)
        Store->>Node: Object.defineProperty(node, 'imgs', ...)
        Store->>Node: Object.defineProperty(node, 'imageIndex', ...)
        Store->>Node: Object.defineProperty(node, 'imageRects', ...)
        Store->>Node: Object.defineProperty(node, 'pointerDown', ...)
        Store->>Node: Object.defineProperty(node, 'overIndex', ...)
    end
    
    Node->>Store: node.imgs (getter → store lookup)
    Node->>Store: node.imgs = value (setter → store write)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 A store so fine for images bright,
Property projections gleaming with light,
Nodes synced clean with Pinia's art,
Per-locator state—a well-crafted heart!
No circular jests, just clarity pure,
The rabbit hops fast—this code will endure! 🌟

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 8.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: centralizing node image rendering state in a new NodeImageStore, which aligns with the core refactoring objective.
Description check ✅ Passed The PR description covers all required sections: Summary explains the centralization; Changes detail what/key decisions; Review Focus highlights critical design patterns; Fixes clause references issue #9242.
Linked Issues check ✅ Passed The PR fully addresses issue #9242 objectives: new NodeImageStore centralizes node rendering state (imgs, imageIndex, imageRects, pointerDown, overIndex) with property projection, uses ECS pattern, includes lifecycle integration, provides backward compatibility, and includes 24 unit tests.
Out of Scope Changes check ✅ Passed Changes to MissingNodeCard.vue (class reordering and spacing adjustments) are minor formatting-only and appear incidental; all core changes (store creation, property projection, lifecycle integration) align directly with issue #9242 objectives.

✏️ 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 refactor/node-output-store-centralization
📝 Coding Plan for PR comments
  • Generate coding plan

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

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

📦 Bundle: 4.59 MB gzip 🔴 +766 B

Details

Summary

  • Raw size: 21.5 MB baseline 21.5 MB — 🔴 +2.78 kB
  • Gzip: 4.59 MB baseline 4.59 MB — 🔴 +766 B
  • Brotli: 3.54 MB baseline 3.54 MB — 🔴 +834 B
  • Bundles: 233 current • 233 baseline • 165 added / 165 removed

Category Glance
Data & Services 🔴 +2.58 kB (2.8 MB) · Vendor & Third-Party 🔴 +112 B (8.9 MB) · Graph Workspace 🔴 +94 B (1.01 MB) · Other ⚪ 0 B (8.04 MB) · Panels & Settings ⚪ 0 B (440 kB) · Editors & Dialogs ⚪ 0 B (78.3 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-Bjp7vDMh.js (new) 17.7 kB 🔴 +17.7 kB 🔴 +6.25 kB 🔴 +5.44 kB
assets/index-DetjreSy.js (removed) 17.7 kB 🟢 -17.7 kB 🟢 -6.26 kB 🟢 -5.4 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

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

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-C_fbeLvW.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.85 kB
assets/CloudSurveyView-C1jK9nRd.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.82 kB
assets/CloudLoginView-Blb1W878.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.21 kB 🔴 +2.84 kB
assets/CloudLoginView-sdm8Jds8.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.21 kB 🟢 -2.84 kB
assets/CloudSignupView-B5Y1pO7R.js (new) 9.41 kB 🔴 +9.41 kB 🔴 +2.71 kB 🔴 +2.39 kB
assets/CloudSignupView-DcsxT_9G.js (removed) 9.41 kB 🟢 -9.41 kB 🟢 -2.71 kB 🟢 -2.39 kB
assets/UserCheckView-BoJLAVRu.js (removed) 8.42 kB 🟢 -8.42 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/UserCheckView-DLwqIiQd.js (new) 8.42 kB 🔴 +8.42 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/CloudLayoutView-BtiC1GIM.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +2.18 kB 🔴 +1.89 kB
assets/CloudLayoutView-DkwJxUZ6.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -2.18 kB 🟢 -1.89 kB
assets/CloudForgotPasswordView-BvTHLtUa.js (removed) 5.59 kB 🟢 -5.59 kB 🟢 -1.95 kB 🟢 -1.73 kB
assets/CloudForgotPasswordView-CSJhxmNi.js (new) 5.59 kB 🔴 +5.59 kB 🔴 +1.96 kB 🔴 +1.73 kB
assets/CloudAuthTimeoutView-BP6N3gGW.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.79 kB 🟢 -1.59 kB
assets/CloudAuthTimeoutView-CcqOQQnw.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.8 kB 🔴 +1.59 kB
assets/CloudSubscriptionRedirectView-Bs18APy9.js (removed) 4.78 kB 🟢 -4.78 kB 🟢 -1.8 kB 🟢 -1.6 kB
assets/CloudSubscriptionRedirectView-BtMsjHlW.js (new) 4.78 kB 🔴 +4.78 kB 🔴 +1.8 kB 🔴 +1.6 kB
assets/UserSelectView-Bq4BAhN7.js (removed) 4.55 kB 🟢 -4.55 kB 🟢 -1.67 kB 🟢 -1.49 kB
assets/UserSelectView-DBjuHpZO.js (new) 4.55 kB 🔴 +4.55 kB 🔴 +1.68 kB 🔴 +1.48 kB
assets/CloudSorryContactSupportView-BFw0sFGo.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -540 B 🟢 -463 B
assets/CloudSorryContactSupportView-BQdy2BdS.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +538 B 🔴 +462 B
assets/layout-CeT6PU95.js (new) 296 B 🔴 +296 B 🔴 +225 B 🔴 +210 B
assets/layout-Wd88ZKDq.js (removed) 296 B 🟢 -296 B 🟢 -223 B 🟢 -190 B

Status: 11 added / 11 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-DKLoCHW_.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.29 kB 🔴 +4.65 kB
assets/SecretsPanel-DVEl9UGB.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.65 kB
assets/LegacyCreditsPanel-B4Cbcp1I.js (new) 20.7 kB 🔴 +20.7 kB 🔴 +5.59 kB 🔴 +4.93 kB
assets/LegacyCreditsPanel-t0aW6ltv.js (removed) 20.7 kB 🟢 -20.7 kB 🟢 -5.59 kB 🟢 -4.92 kB
assets/SubscriptionPanel-BwJEqAsx.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.75 kB 🟢 -4.18 kB
assets/SubscriptionPanel-izWdBCG6.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.76 kB 🔴 +4.19 kB
assets/KeybindingPanel-ddCz4BAi.js (new) 15.2 kB 🔴 +15.2 kB 🔴 +4.11 kB 🔴 +3.65 kB
assets/KeybindingPanel-FCJvSKN6.js (removed) 15.2 kB 🟢 -15.2 kB 🟢 -4.11 kB 🟢 -3.66 kB
assets/AboutPanel-CEO7wwHS.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.12 kB 🟢 -2.81 kB
assets/AboutPanel-CmQ0RoQI.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.12 kB 🔴 +2.8 kB
assets/ExtensionPanel-BRAp4mkn.js (new) 9.42 kB 🔴 +9.42 kB 🔴 +2.67 kB 🔴 +2.38 kB
assets/ExtensionPanel-CTtlnN8Y.js (removed) 9.42 kB 🟢 -9.42 kB 🟢 -2.67 kB 🟢 -2.37 kB
assets/ServerConfigPanel-DhpGpo3w.js (removed) 6.49 kB 🟢 -6.49 kB 🟢 -2.14 kB 🟢 -1.91 kB
assets/ServerConfigPanel-DHq18ZZk.js (new) 6.49 kB 🔴 +6.49 kB 🔴 +2.14 kB 🔴 +1.94 kB
assets/UserPanel-B-Qch-qL.js (removed) 6.2 kB 🟢 -6.2 kB 🟢 -2.01 kB 🟢 -1.77 kB
assets/UserPanel-DhOkvDJf.js (new) 6.2 kB 🔴 +6.2 kB 🔴 +2.01 kB 🔴 +1.75 kB
assets/cloudRemoteConfig-BxhzSyLN.js (removed) 1.48 kB 🟢 -1.48 kB 🟢 -731 B 🟢 -632 B
assets/cloudRemoteConfig-Dt6c0sFF.js (new) 1.48 kB 🔴 +1.48 kB 🔴 +726 B 🔴 +626 B
assets/refreshRemoteConfig-BesnKQ9u.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -521 B 🟢 -457 B
assets/refreshRemoteConfig-DaGe7Mtq.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +517 B 🔴 +457 B
assets/config-p2eCRj7g.js 1.22 kB 1.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B3Lo1XmI.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BhljmVLI.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BMZqZMWV.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-bRtLtC70.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-bThwkOsC.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C1uM8WjX.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DvY3JpnZ.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-OPXE36wg.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Qe3udZkm.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-x4lDOTHy.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-yz0uqs_Z.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/PasswordFields-9n5QQhGG.js (new) 4.51 kB 🔴 +4.51 kB 🔴 +1.36 kB 🔴 +1.2 kB
assets/PasswordFields-qoMlUe6p.js (removed) 4.51 kB 🟢 -4.51 kB 🟢 -1.36 kB 🟢 -1.2 kB
assets/auth-C7ITppWs.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -989 B
assets/auth-D_MCmFJ7.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +991 B
assets/SignUpForm-BEdJdRyO.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/SignUpForm-BXDLTadJ.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/UpdatePasswordContent-CbeVXKpP.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1.09 kB 🟢 -963 B
assets/UpdatePasswordContent-wQwS45lA.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1.09 kB 🔴 +964 B
assets/WorkspaceProfilePic-DFryWnuX.js (new) 1.59 kB 🔴 +1.59 kB 🔴 +830 B 🔴 +757 B
assets/WorkspaceProfilePic-F0LwTAsD.js (removed) 1.59 kB 🟢 -1.59 kB 🟢 -831 B 🟢 -744 B
assets/firebaseAuthStore-DWpWBqhA.js (removed) 831 B 🟢 -831 B 🟢 -405 B 🟢 -355 B
assets/firebaseAuthStore-KT-BTcyb.js (new) 831 B 🔴 +831 B 🔴 +408 B 🔴 +360 B
assets/auth-BntCfgih.js (new) 357 B 🔴 +357 B 🔴 +226 B 🔴 +220 B
assets/auth-DQbj8i0C.js (removed) 357 B 🟢 -357 B 🟢 -225 B 🟢 -208 B

Status: 7 added / 7 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-Bz1FXpzm.js (removed) 77.5 kB 🟢 -77.5 kB 🟢 -16.6 kB 🟢 -14.2 kB
assets/useShareDialog-CJb1o78s.js (new) 77.5 kB 🔴 +77.5 kB 🔴 +16.6 kB 🔴 +14.2 kB
assets/useSubscriptionDialog-c31QAhAU.js (removed) 779 B 🟢 -779 B 🟢 -397 B 🟢 -343 B
assets/useSubscriptionDialog-RTCyblgu.js (new) 779 B 🔴 +779 B 🔴 +399 B 🔴 +343 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-Bv0Lwr6p.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.91 kB 🔴 +3.49 kB
assets/ComfyQueueButton-DqxX18Uj.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.91 kB 🟢 -3.49 kB
assets/useTerminalTabs-BnvT6dB6.js (new) 9.87 kB 🔴 +9.87 kB 🔴 +3.41 kB 🔴 +3.02 kB
assets/useTerminalTabs-Dcnpb6_I.js (removed) 9.87 kB 🟢 -9.87 kB 🟢 -3.41 kB 🟢 -3.01 kB
assets/TopbarBadge-CDV8z5F5.js (removed) 7.39 kB 🟢 -7.39 kB 🟢 -1.79 kB 🟢 -1.59 kB
assets/TopbarBadge-DMGagBd1.js (new) 7.39 kB 🔴 +7.39 kB 🔴 +1.79 kB 🔴 +1.58 kB
assets/ScrubableNumberInput-CVGQ2PHm.js (removed) 6.11 kB 🟢 -6.11 kB 🟢 -2.08 kB 🟢 -1.85 kB
assets/ScrubableNumberInput-DllzNTsX.js (new) 6.11 kB 🔴 +6.11 kB 🔴 +2.08 kB 🔴 +1.84 kB
assets/toggle-group-B0YZKPsn.js (new) 3.83 kB 🔴 +3.83 kB 🔴 +1.38 kB 🔴 +1.22 kB
assets/toggle-group-BmeEkX7i.js (removed) 3.83 kB 🟢 -3.83 kB 🟢 -1.37 kB 🟢 -1.21 kB
assets/FormSearchInput-CEMZoefM.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/FormSearchInput-CJENQRNk.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.55 kB 🔴 +1.36 kB
assets/Button-BaH4RoVV.js (removed) 3.22 kB 🟢 -3.22 kB 🟢 -1.28 kB 🟢 -1.13 kB
assets/Button-DWGG7B12.js (new) 3.22 kB 🔴 +3.22 kB 🔴 +1.29 kB 🔴 +1.13 kB
assets/SubscribeButton-CjfzPcU5.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.01 kB 🔴 +879 B
assets/SubscribeButton-CKLSWbQN.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1.01 kB 🟢 -881 B
assets/WidgetButton-4trmxPNl.js (removed) 1.84 kB 🟢 -1.84 kB 🟢 -876 B 🟢 -779 B
assets/WidgetButton-D-gE8JKi.js (new) 1.84 kB 🔴 +1.84 kB 🔴 +879 B 🔴 +777 B
assets/cloudFeedbackTopbarButton-ByMdOn2c.js (new) 1.42 kB 🔴 +1.42 kB 🔴 +748 B 🔴 +656 B
assets/cloudFeedbackTopbarButton-WPhmh5NS.js (removed) 1.42 kB 🟢 -1.42 kB 🟢 -746 B 🟢 -656 B
assets/UserAvatar-BB75XmhV.js (new) 1.19 kB 🔴 +1.19 kB 🔴 +630 B 🔴 +534 B
assets/UserAvatar-rA7elnKS.js (removed) 1.19 kB 🟢 -1.19 kB 🟢 -627 B 🟢 -529 B
assets/CloudBadge-BvYZZhcY.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +568 B 🔴 +490 B
assets/CloudBadge-KKDIsNYK.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -571 B 🟢 -494 B
assets/ComfyQueueButton-D5THnRxi.js (new) 836 B 🔴 +836 B 🔴 +413 B 🔴 +367 B
assets/ComfyQueueButton-D9BA-IDl.js (removed) 836 B 🟢 -836 B 🟢 -412 B 🟢 -367 B

Status: 13 added / 13 removed

Data & Services — 2.8 MB (baseline 2.79 MB) • 🔴 +2.58 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-C6M8UHVW.js (new) 1.95 MB 🔴 +1.95 MB 🔴 +438 kB 🔴 +328 kB
assets/dialogService-B4kpQ-Yl.js (removed) 1.95 MB 🟢 -1.95 MB 🟢 -438 kB 🟢 -328 kB
assets/api-C-_ixAgu.js (new) 697 kB 🔴 +697 kB 🔴 +157 kB 🔴 +125 kB
assets/api-CmYZ7Qzw.js (removed) 695 kB 🟢 -695 kB 🟢 -157 kB 🟢 -125 kB
assets/load3dService-DNBCU4My.js (new) 91.1 kB 🔴 +91.1 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-g8CepMxC.js (removed) 91.1 kB 🟢 -91.1 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/extensionStore-BH-E-woO.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +4.63 kB 🔴 +4.09 kB
assets/extensionStore-RY-4E-7g.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -4.63 kB 🟢 -4.09 kB
assets/workflowShareService-CnaXUn0Q.js (new) 13.3 kB 🔴 +13.3 kB 🔴 +4.11 kB 🔴 +3.64 kB
assets/workflowShareService-s1caaDmr.js (removed) 13.3 kB 🟢 -13.3 kB 🟢 -4.11 kB 🟢 -3.63 kB
assets/releaseStore-DQbklm__.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/releaseStore-ixpRqgUT.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/keybindingService-Cy3C6vn7.js (new) 7.16 kB 🔴 +7.16 kB 🔴 +1.72 kB 🔴 +1.48 kB
assets/keybindingService-w7BbDEXP.js (removed) 7.16 kB 🟢 -7.16 kB 🟢 -1.72 kB 🟢 -1.48 kB
assets/serverConfigStore-C2pg0BmL.js (new) 2.32 kB 🔴 +2.32 kB 🔴 +791 B 🔴 +694 B
assets/serverConfigStore-Va3_Wl8r.js (removed) 2.32 kB 🟢 -2.32 kB 🟢 -790 B 🟢 -692 B
assets/bootstrapStore-BJ5Jz5az.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -870 B 🟢 -797 B
assets/bootstrapStore-N4oF7xVI.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +871 B 🔴 +799 B
assets/userStore-CRyKhMD0.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +719 B 🔴 +630 B
assets/userStore-DiVSqL-c.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -722 B 🟢 -673 B
assets/audioService-AqlwkQ17.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -850 B 🟢 -725 B
assets/audioService-Bcq_Xt7c.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +850 B 🔴 +725 B
assets/releaseStore-DkGOOYsV.js (new) 803 B 🔴 +803 B 🔴 +406 B 🔴 +360 B
assets/releaseStore-qITRs0nG.js (removed) 803 B 🟢 -803 B 🟢 -405 B 🟢 -359 B
assets/settingStore-CeZosSnI.js (new) 787 B 🔴 +787 B 🔴 +406 B 🔴 +359 B
assets/settingStore-ChO9Mgps.js (removed) 787 B 🟢 -787 B 🟢 -405 B 🟢 -358 B
assets/workflowDraftStore-BWGL0VZP.js (new) 779 B 🔴 +779 B 🔴 +399 B 🔴 +350 B
assets/workflowDraftStore-DKrTBijD.js (removed) 779 B 🟢 -779 B 🟢 -397 B 🟢 -347 B
assets/dialogService-BeNEp-iA.js (removed) 768 B 🟢 -768 B 🟢 -389 B 🟢 -343 B
assets/dialogService-ChVobX0m.js (new) 768 B 🔴 +768 B 🔴 +390 B 🔴 +342 B
assets/assetsStore-C9rWoVqx.js (removed) 765 B 🟢 -765 B 🟢 -391 B 🟢 -342 B
assets/assetsStore-DYU-VTA3.js (new) 765 B 🔴 +765 B 🔴 +394 B 🔴 +342 B

Status: 16 added / 16 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-Cb8Dup80.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-kxmwWl4r.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3dViewer-Dj1_3-Gt.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.19 kB 🟢 -2.83 kB
assets/useLoad3dViewer-uenclFH_.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.19 kB 🔴 +2.83 kB
assets/colorUtil-9rODjIi9.js (new) 7 kB 🔴 +7 kB 🔴 +2.14 kB 🔴 +1.9 kB
assets/colorUtil-BFYqWnMD.js (removed) 7 kB 🟢 -7 kB 🟢 -2.14 kB 🟢 -1.9 kB
assets/useFeatureFlags-Cm6ab5R9.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.37 kB 🔴 +1.17 kB
assets/useFeatureFlags-PfwVZVLB.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.37 kB 🟢 -1.17 kB
assets/useWorkspaceUI-BerI3EVS.js (removed) 3 kB 🟢 -3 kB 🟢 -822 B 🟢 -702 B
assets/useWorkspaceUI-DFnq2gsj.js (new) 3 kB 🔴 +3 kB 🔴 +822 B 🔴 +703 B
assets/subscriptionCheckoutUtil-DB95W69V.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -953 B
assets/subscriptionCheckoutUtil-DSS5Ar_U.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +955 B
assets/useExternalLink-B6o93AHH.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -770 B 🟢 -678 B
assets/useExternalLink-CutfTCZy.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +769 B 🔴 +678 B
assets/useErrorHandling-Bx6krA3P.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -631 B 🟢 -534 B
assets/useErrorHandling-ChKIB3tX.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +627 B 🔴 +533 B
assets/useCopyToClipboard-BvQ0mEOJ.js (removed) 944 B 🟢 -944 B 🟢 -431 B 🟢 -367 B
assets/useCopyToClipboard-DFi8tyDj.js (new) 944 B 🔴 +944 B 🔴 +424 B 🔴 +365 B
assets/useLoad3d-CnZ-iScf.js (new) 902 B 🔴 +902 B 🔴 +444 B 🔴 +398 B
assets/useLoad3d-x9nGm52f.js (removed) 902 B 🟢 -902 B 🟢 -445 B 🟢 -397 B
assets/useLoad3dViewer-B-kL4PaC.js (removed) 881 B 🟢 -881 B 🟢 -430 B 🟢 -381 B
assets/useLoad3dViewer-DivOSKdc.js (new) 881 B 🔴 +881 B 🔴 +429 B 🔴 +387 B
assets/audioUtils-BCRH1AtQ.js (removed) 858 B 🟢 -858 B 🟢 -502 B 🟢 -402 B
assets/audioUtils-Dk4VmfHT.js (new) 858 B 🔴 +858 B 🔴 +502 B 🔴 +402 B
assets/useCurrentUser-Doy2tsRr.js (removed) 765 B 🟢 -765 B 🟢 -392 B 🟢 -341 B
assets/useCurrentUser-DWsMwaeo.js (new) 765 B 🔴 +765 B 🔴 +394 B 🔴 +342 B
assets/useWorkspaceSwitch-C2jIdjjC.js (new) 688 B 🔴 +688 B 🔴 +352 B 🔴 +302 B
assets/useWorkspaceSwitch-G8qjyNyz.js (removed) 688 B 🟢 -688 B 🟢 -353 B 🟢 -296 B
assets/_plugin-vue_export-helper-C4xK3rHS.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Clzmwvt4.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-BllOn75O.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-CXsVEgWz.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 14 added / 14 removed

Vendor & Third-Party — 8.9 MB (baseline 8.9 MB) • 🔴 +112 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-primevue-AQXge2Da.js (new) 1.72 MB 🔴 +1.72 MB 🔴 +311 kB 🔴 +189 kB
assets/vendor-primevue-gPZICJA3.js (removed) 1.72 MB 🟢 -1.72 MB 🟢 -311 kB 🟢 -189 kB
assets/vendor-other-7gKZ9P6N.js (new) 1.54 MB 🔴 +1.54 MB 🔴 +324 kB 🔴 +257 kB
assets/vendor-other-Dj9lOsnu.js (removed) 1.54 MB 🟢 -1.54 MB 🟢 -324 kB 🟢 -258 kB
assets/vendor-reka-ui-CkXQ0PEp.js (new) 428 kB 🔴 +428 kB 🔴 +78.7 kB 🔴 +61.5 kB
assets/vendor-reka-ui-DlFrLeZ5.js (removed) 428 kB 🟢 -428 kB 🟢 -78.7 kB 🟢 -61.5 kB
assets/vendor-vue-core-ti6zWT3D.js (new) 311 kB 🔴 +311 kB 🔴 +77 kB 🔴 +65 kB
assets/vendor-vue-core-DtiQ1dr9.js (removed) 311 kB 🟢 -311 kB 🟢 -77 kB 🟢 -65 kB
assets/vendor-i18n-DJXUrX2c.js (new) 133 kB 🔴 +133 kB 🔴 +27.8 kB 🔴 +23.9 kB
assets/vendor-i18n-DNX73mqE.js (removed) 133 kB 🟢 -133 kB 🟢 -27.8 kB 🟢 -23.9 kB
assets/vendor-vueuse-Dki_sbfD.js (new) 125 kB 🔴 +125 kB 🔴 +30.2 kB 🔴 +26.3 kB
assets/vendor-vueuse-7Q5M-X2w.js (removed) 125 kB 🟢 -125 kB 🟢 -30.2 kB 🟢 -26.3 kB
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-05GtjRkv.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-C_3GtM2H.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-CXbu7Mch.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-DPkCdaAS.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

Other — 8.04 MB (baseline 8.04 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n--ob9So4x.js (removed) 547 kB 🟢 -547 kB 🟢 -107 kB 🟢 -83.3 kB
assets/i18n-BwpcNsto.js (new) 547 kB 🔴 +547 kB 🔴 +107 kB 🔴 +83.3 kB
assets/core-C321lUHl.js (removed) 73.7 kB 🟢 -73.7 kB 🟢 -19 kB 🟢 -16.3 kB
assets/core-Cr2u8SUI.js (new) 73.7 kB 🔴 +73.7 kB 🔴 +19 kB 🔴 +16.3 kB
assets/groupNode-BVvQU2XE.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.6 kB
assets/groupNode-CkgOflbe.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.6 kB
assets/WidgetSelect-BD8NUco_.js (new) 58.1 kB 🔴 +58.1 kB 🔴 +12.5 kB 🔴 +10.8 kB
assets/WidgetSelect-DjO0vdKB.js (removed) 58.1 kB 🟢 -58.1 kB 🟢 -12.5 kB 🟢 -10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-B6b1Dc53.js (new) 46.2 kB 🔴 +46.2 kB 🔴 +8.65 kB 🔴 +7.54 kB
assets/SubscriptionRequiredDialogContentWorkspace-DHOeva2C.js (removed) 46.2 kB 🟢 -46.2 kB 🟢 -8.65 kB 🟢 -7.52 kB
assets/WidgetPainter-CRxaSHGp.js (removed) 32.9 kB 🟢 -32.9 kB 🟢 -7.98 kB 🟢 -7.06 kB
assets/WidgetPainter-DwWg6h7s.js (new) 32.9 kB 🔴 +32.9 kB 🔴 +7.98 kB 🔴 +7.08 kB
assets/Load3DControls-C3ss9BIU.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.64 kB
assets/Load3DControls-d0e-9fdj.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/WorkspacePanelContent-BjGXlSPb.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.16 kB 🟢 -5.43 kB
assets/WorkspacePanelContent-DulfchHG.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.16 kB 🔴 +5.43 kB
assets/SubscriptionRequiredDialogContent-0EOWk4Vr.js (new) 25.6 kB 🔴 +25.6 kB 🔴 +6.56 kB 🔴 +5.8 kB
assets/SubscriptionRequiredDialogContent-4Qoe4QAe.js (removed) 25.6 kB 🟢 -25.6 kB 🟢 -6.56 kB 🟢 -5.78 kB
assets/Load3dViewerContent-BSMXySrF.js (new) 23 kB 🔴 +23 kB 🔴 +5.19 kB 🔴 +4.5 kB
assets/Load3dViewerContent-C3l-wmou.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.5 kB
assets/WidgetImageCrop-D9YHpvEx.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.52 kB 🟢 -4.87 kB
assets/WidgetImageCrop-DcTH8F5a.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.52 kB 🔴 +4.85 kB
assets/SubscriptionPanelContentWorkspace-CUt--3Z7.js (removed) 22 kB 🟢 -22 kB 🟢 -5.11 kB 🟢 -4.49 kB
assets/SubscriptionPanelContentWorkspace-lPYF07cr.js (new) 22 kB 🔴 +22 kB 🔴 +5.12 kB 🔴 +4.51 kB
assets/CurrentUserPopoverWorkspace-CkNVX0Ug.js (new) 20.5 kB 🔴 +20.5 kB 🔴 +4.95 kB 🔴 +4.42 kB
assets/CurrentUserPopoverWorkspace-CtyDIKNR.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -4.94 kB 🟢 -4.41 kB
assets/SignInContent-DU-1Vund.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.77 kB 🟢 -4.17 kB
assets/SignInContent-H6r8_EGW.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.78 kB 🔴 +4.18 kB
assets/WidgetInputNumber-B8djoMhT.js (new) 18.1 kB 🔴 +18.1 kB 🔴 +4.64 kB 🔴 +4.13 kB
assets/WidgetInputNumber-Cx_h6jcN.js (removed) 18.1 kB 🟢 -18.1 kB 🟢 -4.64 kB 🟢 -4.12 kB
assets/WidgetRecordAudio-CurB4hxo.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +5.02 kB 🔴 +4.49 kB
assets/WidgetRecordAudio-SRpYSp3l.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -5.02 kB 🟢 -4.49 kB
assets/Load3D-DUFXZe0f.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.02 kB 🟢 -3.5 kB
assets/Load3D-tSlN25-4.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.52 kB
assets/load3d-CW0k821G.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.21 kB 🟢 -3.64 kB
assets/load3d-DaEajMRG.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.21 kB 🔴 +3.65 kB
assets/AudioPreviewPlayer-C1Exn9aj.js (new) 11 kB 🔴 +11 kB 🔴 +3.25 kB 🔴 +2.92 kB
assets/AudioPreviewPlayer-DKc48ohd.js (removed) 11 kB 🟢 -11 kB 🟢 -3.25 kB 🟢 -2.92 kB
assets/WidgetCurve-BGeh3ttj.js (new) 9.36 kB 🔴 +9.36 kB 🔴 +3 kB 🔴 +2.71 kB
assets/WidgetCurve-Dh_Oiqjm.js (removed) 9.36 kB 🟢 -9.36 kB 🟢 -3 kB 🟢 -2.71 kB
assets/SelectValue-Botr-VBb.js (new) 9.34 kB 🔴 +9.34 kB 🔴 +2.39 kB 🔴 +2.11 kB
assets/SelectValue-knMV-ROg.js (removed) 9.34 kB 🟢 -9.34 kB 🟢 -2.38 kB 🟢 -2.11 kB
assets/nodeTemplates-BbAGpJ7j.js (removed) 9.34 kB 🟢 -9.34 kB 🟢 -3.28 kB 🟢 -2.88 kB
assets/nodeTemplates-C_Wd_pWz.js (new) 9.34 kB 🔴 +9.34 kB 🔴 +3.27 kB 🔴 +2.88 kB
assets/InviteMemberDialogContent-Co1ihUCr.js (new) 7.37 kB 🔴 +7.37 kB 🔴 +2.31 kB 🔴 +2.04 kB
assets/InviteMemberDialogContent-DKFSxpHL.js (removed) 7.37 kB 🟢 -7.37 kB 🟢 -2.31 kB 🟢 -2.02 kB
assets/WidgetImageCompare-CCUyYQrz.js (new) 7.35 kB 🔴 +7.35 kB 🔴 +2.18 kB 🔴 +1.91 kB
assets/WidgetImageCompare-CJ9FBr4m.js (removed) 7.35 kB 🟢 -7.35 kB 🟢 -2.18 kB 🟢 -1.9 kB
assets/Load3DConfiguration-Bs22WY7d.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.92 kB 🟢 -1.68 kB
assets/Load3DConfiguration-Cbpx8H3j.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/onboardingCloudRoutes-CzRfI7Cx.js (new) 6.07 kB 🔴 +6.07 kB 🔴 +1.89 kB 🔴 +1.65 kB
assets/onboardingCloudRoutes-D2u_Y7ED.js (removed) 6.07 kB 🟢 -6.07 kB 🟢 -1.89 kB 🟢 -1.63 kB
assets/CreateWorkspaceDialogContent-CDmH6Uwe.js (new) 5.54 kB 🔴 +5.54 kB 🔴 +2 kB 🔴 +1.76 kB
assets/CreateWorkspaceDialogContent-LSer3qoF.js (removed) 5.54 kB 🟢 -5.54 kB 🟢 -2.01 kB 🟢 -1.75 kB
assets/FreeTierDialogContent-B7T72_ZG.js (new) 5.42 kB 🔴 +5.42 kB 🔴 +1.91 kB 🔴 +1.69 kB
assets/FreeTierDialogContent-C2hP4UYU.js (removed) 5.42 kB 🟢 -5.42 kB 🟢 -1.91 kB 🟢 -1.7 kB
assets/EditWorkspaceDialogContent-BtPrEc5p.js (removed) 5.35 kB 🟢 -5.35 kB 🟢 -1.97 kB 🟢 -1.73 kB
assets/EditWorkspaceDialogContent-DXYDY-4B.js (new) 5.35 kB 🔴 +5.35 kB 🔴 +1.97 kB 🔴 +1.73 kB
assets/Preview3d-B7M8uJ30.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/Preview3d-CL8PVjZZ.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.63 kB 🔴 +1.43 kB
assets/ValueControlPopover-CCm1_Vgn.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.77 kB 🔴 +1.6 kB
assets/ValueControlPopover-DdOQTz-o.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.77 kB 🟢 -1.6 kB
assets/CancelSubscriptionDialogContent-C_Z4-1IQ.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.8 kB 🟢 -1.58 kB
assets/CancelSubscriptionDialogContent-CKc40uec.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.8 kB 🔴 +1.59 kB
assets/AnimationControls-CM71oWic.js (new) 4.61 kB 🔴 +4.61 kB 🔴 +1.6 kB 🔴 +1.41 kB
assets/AnimationControls-DUOF31Ot.js (removed) 4.61 kB 🟢 -4.61 kB 🟢 -1.6 kB 🟢 -1.41 kB
assets/WidgetTextarea-CTe-gjY7.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.64 kB 🟢 -1.45 kB
assets/WidgetTextarea-DuRO6a6O.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.64 kB 🔴 +1.44 kB
assets/DeleteWorkspaceDialogContent-B-dgNwBA.js (new) 4.25 kB 🔴 +4.25 kB 🔴 +1.64 kB 🔴 +1.44 kB
assets/DeleteWorkspaceDialogContent-g_B6D5OX.js (removed) 4.25 kB 🟢 -4.25 kB 🟢 -1.64 kB 🟢 -1.44 kB
assets/WidgetWithControl-Bh7s4vDX.js (removed) 4.17 kB 🟢 -4.17 kB 🟢 -1.82 kB 🟢 -1.63 kB
assets/WidgetWithControl-BxPFrSDC.js (new) 4.17 kB 🔴 +4.17 kB 🔴 +1.81 kB 🔴 +1.65 kB
assets/LeaveWorkspaceDialogContent-CCgmLciv.js (new) 4.08 kB 🔴 +4.08 kB 🔴 +1.59 kB 🔴 +1.39 kB
assets/LeaveWorkspaceDialogContent-CJT3UCNM.js (removed) 4.08 kB 🟢 -4.08 kB 🟢 -1.59 kB 🟢 -1.39 kB
assets/RemoveMemberDialogContent-C3To0foS.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.54 kB 🟢 -1.35 kB
assets/RemoveMemberDialogContent-DqG_fUqM.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.54 kB 🔴 +1.35 kB
assets/RevokeInviteDialogContent-BynvDvpQ.js (removed) 3.97 kB 🟢 -3.97 kB 🟢 -1.55 kB 🟢 -1.37 kB
assets/RevokeInviteDialogContent-DEpEAkFg.js (new) 3.97 kB 🔴 +3.97 kB 🔴 +1.55 kB 🔴 +1.37 kB
assets/InviteMemberUpsellDialogContent-4gnysz4s.js (removed) 3.86 kB 🟢 -3.86 kB 🟢 -1.42 kB 🟢 -1.26 kB
assets/InviteMemberUpsellDialogContent-B2RLXFAS.js (new) 3.86 kB 🔴 +3.86 kB 🔴 +1.42 kB 🔴 +1.25 kB
assets/tierBenefits-PPQ2qtNv.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.31 kB 🟢 -1.17 kB
assets/tierBenefits-Zamh96Hr.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.31 kB 🔴 +1.17 kB
assets/Popover-CRNAN1Zu.js (removed) 3.65 kB 🟢 -3.65 kB 🟢 -1.43 kB 🟢 -1.27 kB
assets/Popover-Cvi3LYH8.js (new) 3.65 kB 🔴 +3.65 kB 🔴 +1.44 kB 🔴 +1.28 kB
assets/WidgetGalleria-B7fMX4i2.js (new) 3.6 kB 🔴 +3.6 kB 🔴 +1.4 kB 🔴 +1.26 kB
assets/WidgetGalleria-CWPm_CXr.js (removed) 3.6 kB 🟢 -3.6 kB 🟢 -1.4 kB 🟢 -1.25 kB
assets/WidgetToggleSwitch-AkZmu4-r.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.34 kB 🟢 -1.18 kB
assets/WidgetToggleSwitch-sJ5PrDVz.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.34 kB 🔴 +1.19 kB
assets/Slider-BK9p1k0F.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.36 kB 🔴 +1.19 kB
assets/Slider-DK6apKNA.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.35 kB 🟢 -1.17 kB
assets/saveMesh-1xjp9-fX.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -1.47 kB 🟢 -1.32 kB
assets/saveMesh-KBm64RsY.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +1.47 kB 🔴 +1.31 kB
assets/WidgetBoundingBox-BfW4RBS9.js (removed) 3.19 kB 🟢 -3.19 kB 🟢 -893 B 🟢 -780 B
assets/WidgetBoundingBox-gT78Sb0I.js (new) 3.19 kB 🔴 +3.19 kB 🔴 +894 B 🔴 +779 B
assets/cloudSessionCookie-BhjVYG7J.js (removed) 3.14 kB 🟢 -3.14 kB 🟢 -1.11 kB 🟢 -995 B
assets/cloudSessionCookie-BR0FaiCq.js (new) 3.14 kB 🔴 +3.14 kB 🔴 +1.11 kB 🔴 +1 kB
assets/WidgetMarkdown-87PSZUoW.js (removed) 2.93 kB 🟢 -2.93 kB 🟢 -1.24 kB 🟢 -1.07 kB
assets/WidgetMarkdown-B4VPxfF5.js (new) 2.93 kB 🔴 +2.93 kB 🔴 +1.24 kB 🔴 +1.08 kB
assets/GlobalToast-BE4RnAzh.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.07 kB
assets/GlobalToast-fKCA_A8C.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.04 kB
assets/WidgetColorPicker-B8UnLKKG.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +1.24 kB 🔴 +1.11 kB
assets/WidgetColorPicker-D4b3GyKM.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -1.23 kB 🟢 -1.11 kB
assets/WidgetInputText-C-AcvF4f.js (removed) 2.89 kB 🟢 -2.89 kB 🟢 -1.25 kB 🟢 -1.12 kB
assets/WidgetInputText-CivN4Pm9.js (new) 2.89 kB 🔴 +2.89 kB 🔴 +1.25 kB 🔴 +1.12 kB
assets/MediaVideoTop-BpARjupw.js (removed) 2.78 kB 🟢 -2.78 kB 🟢 -1.13 kB 🟢 -1 kB
assets/MediaVideoTop-DSyYYbl2.js (new) 2.78 kB 🔴 +2.78 kB 🔴 +1.14 kB 🔴 +1.01 kB
assets/ApiNodesSignInContent-C6_p9_S9.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +958 B
assets/ApiNodesSignInContent-wlsySawE.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -920 B
assets/WidgetChart-BYr9LIig.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -952 B 🟢 -820 B
assets/WidgetChart-VLhIt2tW.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +952 B 🔴 +821 B
assets/SubscribeToRun-DvO2EIf-.js (new) 2.06 kB 🔴 +2.06 kB 🔴 +947 B 🔴 +827 B
assets/SubscribeToRun-Nf98yo1y.js (removed) 2.06 kB 🟢 -2.06 kB 🟢 -950 B 🟢 -835 B
assets/SubscriptionBenefits-CDcJidce.js (new) 2.01 kB 🔴 +2.01 kB 🔴 +700 B 🔴 +601 B
assets/SubscriptionBenefits-CXHqTaYn.js (removed) 2.01 kB 🟢 -2.01 kB 🟢 -701 B 🟢 -599 B
assets/WidgetLayoutField-D6BxABad.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +895 B 🔴 +794 B
assets/WidgetLayoutField-VUV8QDjx.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -896 B 🟢 -792 B
assets/Media3DTop-BiQkqzKM.js (removed) 1.83 kB 🟢 -1.83 kB 🟢 -899 B 🟢 -767 B
assets/Media3DTop-CWb98KkP.js (new) 1.83 kB 🔴 +1.83 kB 🔴 +903 B 🔴 +767 B
assets/MediaImageTop-CSSG1p3Y.js (new) 1.81 kB 🔴 +1.81 kB 🔴 +890 B 🔴 +758 B
assets/MediaImageTop-DoRnE-bZ.js (removed) 1.81 kB 🟢 -1.81 kB 🟢 -893 B 🟢 -766 B
assets/BaseViewTemplate-CjY84GoU.js (removed) 1.78 kB 🟢 -1.78 kB 🟢 -925 B 🟢 -835 B
assets/BaseViewTemplate-DvhWawak.js (new) 1.78 kB 🔴 +1.78 kB 🔴 +924 B 🔴 +835 B
assets/CloudRunButtonWrapper-CTWyxSq7.js (new) 1.72 kB 🔴 +1.72 kB 🔴 +807 B 🔴 +722 B
assets/CloudRunButtonWrapper-RWzcPZOl.js (removed) 1.72 kB 🟢 -1.72 kB 🟢 -806 B 🟢 -732 B
assets/cloudBadges-CbymKst8.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -795 B 🟢 -697 B
assets/cloudBadges-DBLyS1n8.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +795 B 🔴 +694 B
assets/signInSchema-BL7AiPdj.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +562 B 🔴 +521 B
assets/signInSchema-DdKQRBTh.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -563 B 🟢 -520 B
assets/MediaAudioTop-cCCLSyg1.js (new) 1.43 kB 🔴 +1.43 kB 🔴 +764 B 🔴 +641 B
assets/MediaAudioTop-CRtIRcAY.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -765 B 🟢 -639 B
assets/previousFullPath-C-48_f9u.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -651 B 🟢 -579 B
assets/previousFullPath-DetnldkR.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +651 B 🔴 +582 B
assets/cloudSubscription-Br5nHuMb.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -675 B 🟢 -589 B
assets/cloudSubscription-DPq-alr8.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +673 B 🔴 +587 B
assets/Textarea-D1oECDda.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +714 B 🔴 +624 B
assets/Textarea-hSoGqB0Z.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -714 B 🟢 -625 B
assets/VideoPlayOverlay-b9xCyIM9.js (removed) 1.35 kB 🟢 -1.35 kB 🟢 -699 B 🟢 -618 B
assets/VideoPlayOverlay-CG5ZB2G9.js (new) 1.35 kB 🔴 +1.35 kB 🔴 +704 B 🔴 +623 B
assets/Loader-CpeOSwI8.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +631 B 🔴 +551 B
assets/Loader-Dxz91Dh1.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -629 B 🟢 -545 B
assets/Load3D-CfaI-Edo.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +519 B 🔴 +460 B
assets/Load3D-VdjGUOKT.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -518 B 🟢 -456 B
assets/nightlyBadges-a9kqwMcl.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +550 B 🔴 +491 B
assets/nightlyBadges-Lp4HhS6-.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -548 B 🟢 -490 B
assets/Load3dViewerContent-BuDy02C2.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +489 B 🔴 +433 B
assets/Load3dViewerContent-CKnW7XlH.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -487 B 🟢 -430 B
assets/MediaOtherTop-Bv9_XpJf.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -571 B 🟢 -478 B
assets/MediaOtherTop-DzW267FQ.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +575 B 🔴 +479 B
assets/MediaTextTop-B0SGShwE.js (new) 1.01 kB 🔴 +1.01 kB 🔴 +569 B 🔴 +478 B
assets/MediaTextTop-DOEMDxgs.js (removed) 1.01 kB 🟢 -1.01 kB 🟢 -566 B 🟢 -480 B
assets/SubscriptionPanelContentWorkspace-8EMkSoll.js (new) 963 B 🔴 +963 B 🔴 +457 B 🔴 +399 B
assets/SubscriptionPanelContentWorkspace-DC8r58_3.js (removed) 963 B 🟢 -963 B 🟢 -457 B 🟢 -396 B
assets/ComfyOrgHeader-BLiG8D2R.js (new) 910 B 🔴 +910 B 🔴 +499 B 🔴 +428 B
assets/ComfyOrgHeader-Cp3wIlKI.js (removed) 910 B 🟢 -910 B 🟢 -496 B 🟢 -458 B
assets/WidgetLegacy-B4pDGsOf.js (removed) 787 B 🟢 -787 B 🟢 -404 B 🟢 -353 B
assets/WidgetLegacy-FRzFr00a.js (new) 787 B 🔴 +787 B 🔴 +406 B 🔴 +352 B
assets/changeTracker-BQZMrWZ8.js (removed) 763 B 🟢 -763 B 🟢 -392 B 🟢 -341 B
assets/changeTracker-FgVs6KJ1.js (new) 763 B 🔴 +763 B 🔴 +394 B 🔴 +345 B
assets/graphHasMissingNodes-CN8CzmhB.js (removed) 761 B 🟢 -761 B 🟢 -375 B 🟢 -330 B
assets/graphHasMissingNodes-DnPiiver.js (new) 761 B 🔴 +761 B 🔴 +372 B 🔴 +318 B
assets/widgetTypes-Bne_gF_b.js (new) 393 B 🔴 +393 B 🔴 +258 B 🔴 +249 B
assets/widgetTypes-DzBxiY8I.js (removed) 393 B 🟢 -393 B 🟢 -260 B 🟢 -245 B
assets/WidgetBoundingBox-BBciwTNX.js (new) 283 B 🔴 +283 B 🔴 +187 B 🔴 +167 B
assets/WidgetBoundingBox-BiPCu9PR.js (removed) 283 B 🟢 -283 B 🟢 -185 B 🟢 -169 B
assets/src-BSEsXra9.js (removed) 251 B 🟢 -251 B 🟢 -210 B 🟢 -177 B
assets/src-DbyKJ2M5.js (new) 251 B 🔴 +251 B 🔴 +214 B 🔴 +179 B
assets/i18n-CzPZ2oyt.js (removed) 199 B 🟢 -199 B 🟢 -161 B 🟢 -139 B
assets/i18n-gIp4q3RQ.js (new) 199 B 🔴 +199 B 🔴 +160 B 🔴 +138 B
assets/auto-CtFmjb6K.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-B810ZRS_.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-0V4s4r1K.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BL762dz-.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BnVLe_Bi.js 19.2 kB 19.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BXsNoiTn.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BZxSrlEH.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C23MOD89.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CdENTy7Q.js 17.3 kB 17.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cq73R4Wp.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CriyFW2y.js 15.6 kB 15.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CyFcxndj.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DReOpKnh.js 16.4 kB 16.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-KYihJEkp.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-6sQ9dyIE.js 140 kB 140 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B0aq4SOP.js 159 kB 159 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BMvp_ngw.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bs4m2I_7.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BVnshHMY.js 199 kB 199 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C2EBpmzg.js 164 kB 164 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CumaBqGT.js 158 kB 158 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DchxU7Pt.js 167 kB 167 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dn_22rOe.js 139 kB 139 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-hknb2a26.js 190 kB 190 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-sF5tizy-.js 222 kB 222 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BBzKxTIy.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BsK7YlZv.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BXi-pYlO.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CDP9UeA-.js 402 kB 402 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Comy_sMi.js 406 kB 406 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CuDYP-Ax.js 418 kB 418 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CzCfhTal.js 452 kB 452 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DRlsrA3Y.js 453 kB 453 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DuxLvF2P.js 402 kB 402 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DwSpKc2S.js 394 kB 394 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-T8ki-3ab.js 494 kB 494 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/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/widgetPropFilter-D5drFiH0.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 84 added / 84 removed

@github-actions
Copy link

github-actions bot commented Mar 5, 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 10 11 +3%
canvas-idle: layouts 0 0 +0%
canvas-idle: task duration 336ms 373ms +11%
canvas-mouse-sweep: style recalcs 76 79 +3%
canvas-mouse-sweep: layouts 12 12 +0%
canvas-mouse-sweep: task duration 822ms 860ms +5%
dom-widget-clipping: style recalcs 14 13 -2%
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 332ms 339ms +2%
subgraph-dom-widget-clipping: style recalcs 48 50 +3%
subgraph-dom-widget-clipping: layouts 0 0
subgraph-dom-widget-clipping: task duration 378ms 400ms +6%
subgraph-idle: style recalcs 12 13 +6%
subgraph-idle: layouts 0 0
subgraph-idle: task duration 334ms 352ms +5%
subgraph-mouse-sweep: style recalcs 78 77 -1%
subgraph-mouse-sweep: layouts 16 16 +2%
subgraph-mouse-sweep: task duration 656ms 657ms +0%
Raw data
{
  "timestamp": "2026-03-12T16:06:04.330Z",
  "gitSha": "aba7e9fa5bb049113aa106c5f7fbb10d0949ab9a",
  "branch": "refactor/node-output-store-centralization",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2048.778000000084,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.905,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 410.607,
      "heapDeltaBytes": -5495720
    },
    {
      "name": "canvas-idle",
      "durationMs": 2028.5930000000008,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.787999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 357.379,
      "heapDeltaBytes": 338700
    },
    {
      "name": "canvas-idle",
      "durationMs": 2034.7590000000082,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.751999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 349.754,
      "heapDeltaBytes": 1069568
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1928.162000000043,
      "styleRecalcs": 81,
      "styleRecalcDurationMs": 39.937,
      "layouts": 12,
      "layoutDurationMs": 3.509,
      "taskDurationMs": 894.931,
      "heapDeltaBytes": 1248588
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1763.9580000000024,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 34.53399999999999,
      "layouts": 12,
      "layoutDurationMs": 3.3400000000000003,
      "taskDurationMs": 729.9780000000001,
      "heapDeltaBytes": -1047360
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2013.2160000000567,
      "styleRecalcs": 81,
      "styleRecalcDurationMs": 39.737,
      "layouts": 12,
      "layoutDurationMs": 3.08,
      "taskDurationMs": 954.5199999999999,
      "heapDeltaBytes": 1294904
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 574.3039999999837,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 7.592999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 343.812,
      "heapDeltaBytes": 12003336
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 586.0989999999902,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 8.341999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 338.77599999999995,
      "heapDeltaBytes": 12882616
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 581.0229999999592,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 10.819,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 334.08000000000004,
      "heapDeltaBytes": 12322204
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 592.7369999999428,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 12.126999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 387.564,
      "heapDeltaBytes": -3284960
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 619.2350000000033,
      "styleRecalcs": 52,
      "styleRecalcDurationMs": 16.381,
      "layouts": 1,
      "layoutDurationMs": 0.289,
      "taskDurationMs": 421.09200000000004,
      "heapDeltaBytes": -2226556
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 627.3579999999583,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 11.497999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 390.161,
      "heapDeltaBytes": -2199172
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2025.3760000000511,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 13.746,
      "layouts": 1,
      "layoutDurationMs": 0.23899999999999996,
      "taskDurationMs": 359.056,
      "heapDeltaBytes": 832656
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1990.7210000000077,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 9.848,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 344.202,
      "heapDeltaBytes": 763108
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2016.1930000000439,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 13.022999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 352.33799999999997,
      "heapDeltaBytes": 172264
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1721.3339999999562,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 41.47,
      "layouts": 17,
      "layoutDurationMs": 4.489,
      "taskDurationMs": 666.034,
      "heapDeltaBytes": 278944
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1698.1549999999288,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 34.704,
      "layouts": 16,
      "layoutDurationMs": 4.529,
      "taskDurationMs": 645.178,
      "heapDeltaBytes": -316948
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1690.1819999999361,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 36.038000000000004,
      "layouts": 16,
      "layoutDurationMs": 4.465999999999999,
      "taskDurationMs": 658.418,
      "heapDeltaBytes": -548840
    }
  ]
}

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

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/stores/nodeImageStore.ts`:
- Around line 20-30: The bug is that DEFAULT_STATE is a shallow freeze so nested
arrays (imgs, imageRects) are shared and mutable; update the code so getters and
any default returns use a fresh instance from createDefaultState() (or
deep-freeze the nested arrays) instead of returning the single DEFAULT_STATE,
and change DEFAULT_STATE usage to either be removed or replaced with a const
DEFAULT_STATE_FACTORY = createDefaultState and call it where defaults are
returned (affecting DEFAULT_STATE, createDefaultState, and any getter that
currently returns DEFAULT_STATE to avoid node.imageRects.push(...) mutating
shared state).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0a7bb672-7418-417f-9725-031be62a1c1b

📥 Commits

Reviewing files that changed from the base of the PR and between 5376b7e and 30e370c.

📒 Files selected for processing (5)
  • src/components/graph/GraphCanvas.vue
  • src/lib/litegraph/src/LGraph.ts
  • src/stores/imagePreviewStore.ts
  • src/stores/nodeImageStore.test.ts
  • src/stores/nodeImageStore.ts

@dosubot dosubot bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Mar 5, 2026
@christian-byrne
Copy link
Contributor Author

Addressed CodeRabbit review: DEFAULT_STATE now deep-freezes nested arrays (imgs, imageRects) to prevent shared mutation. Added immutability test.

@christian-byrne christian-byrne force-pushed the refactor/node-output-store-centralization branch from 4260c22 to 2552946 Compare March 5, 2026 10:43
AustinMroz
AustinMroz previously approved these changes Mar 5, 2026
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.

Changes look safe, have my approval, and are a step in the right direction.

  • None of the store state is reactive.
  • node.images is tightly coupled, but not included with the store.
    • Off the top of my head, this data is already duplicated across a ~3 different places (node, nodeoutputstore, app.ts?) so it probably requires a lot more work with compatibility layers
  • My primary hope with these changes is that the logic for transforming the 'path to an image' to an image element would be handled by the store.
    • This is the super ugly part where node state is dependent upon receiving draw calls instead of being generated on state access.
    • Definitely work for a followup PR
  • I think the other store PRs are keying off the now-globally-unique nodeIds. There's some moderate concern for future store access if stores are keyed by different properties.
    • Given there's not a performant way to do node lookup without locatorIds, I think this PR is in the right. Any reconciling will occur with the release of the proposed "Node Store"

christian-byrne and others added 4 commits March 12, 2026 08:48
Introduce useNodeImageStore — a Pinia store keyed by NodeLocatorId that
owns imgs, imageIndex, imageRects, pointerDown, and overIndex state.

LGraphNode properties delegate to the store via Object.defineProperty
getters/setters installed in LGraph.add(), so all existing consumer code
(~18 files) continues to read/write node.imgs, node.imageIndex, etc.
unchanged.

Key design decisions:
- Plain Map (not reactive) avoids Vue proxy overhead in the canvas
  render hot path.
- peekState() + frozen DEFAULT_STATE for read-only access prevents
  unbounded Map growth from getter-only calls.
- Module-scoped setNodeLocatorResolver() breaks circular dependency
  (LGraph → store → workflowStore → app → litegraph).
- imgs getter returns undefined when empty to preserve node.imgs?.length
  optional chaining semantics.

Cleanup is wired into removeNodeOutputs (per-node) and
resetAllOutputsAndPreviews (bulk clear).

Fixes #9242

Amp-Thread-ID: https://ampcode.com/threads/T-019cbd88-ca30-76ec-abfa-38949748ba3d
The call to setNodeLocatorResolver was lost when resolving merge
conflicts during rebase onto main. Re-adds it in the bootstrap
sequence before comfyApp.setup().
@christian-byrne
Copy link
Contributor Author

@coderabbitai full review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 12, 2026

✅ Actions performed

Full review triggered.

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

Labels

refactor size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Migrate node.imgs and rendering state to centralized ECS store

3 participants