Skip to content

Comments

[refactor] Extract executionErrorStore from executionStore#9060

Open
jaeone94 wants to merge 1 commit intomainfrom
refactor/extract-execution-error-store
Open

[refactor] Extract executionErrorStore from executionStore#9060
jaeone94 wants to merge 1 commit intomainfrom
refactor/extract-execution-error-store

Conversation

@jaeone94
Copy link
Collaborator

@jaeone94 jaeone94 commented Feb 21, 2026

Summary

Extracts error-related state and logic from executionStore into a dedicated executionErrorStore for better separation of concerns.

Changes

  • New store: executionErrorStore with all error state (lastNodeErrors, lastExecutionError, lastPromptError), computed properties (hasAnyError, totalErrorCount, activeGraphErrorNodeIds), and UI state (isErrorOverlayOpen, showErrorOverlay, dismissErrorOverlay)
  • Moved util: executionIdToNodeLocatorId extracted to graphTraversalUtil, reusing traverseSubgraphPath and accepting rootGraph as parameter
  • Updated consumers: 12 files updated to import from executionErrorStore
  • Backward compat: Deprecated getters retained in ComfyApp for extension compatibility

Review Focus

  • Deprecated getters in app.ts — can be removed in a future breaking-change PR once extension authors migrate

┆Issue is synchronized with this Notion page by Unito

Separate error-related state and logic from executionStore into a
dedicated executionErrorStore for better modularity.
Changes:
- Create executionErrorStore with all error state (lastNodeErrors,
  lastExecutionError, lastPromptError), computed properties
  (hasAnyError, totalErrorCount, activeGraphErrorNodeIds), and
  UI state (isErrorOverlayOpen, showErrorOverlay, dismissErrorOverlay)
- Move executionIdToNodeLocatorId to graphTraversalUtil, reusing
  existing traverseSubgraphPath and accepting rootGraph as parameter
- Update 12 consumer files to import from executionErrorStore
- Retain deprecated getters in ComfyApp for backward compatibility
@jaeone94 jaeone94 requested a review from a team as a code owner February 21, 2026 13:01
@jaeone94 jaeone94 added the enhancement New feature or request label Feb 21, 2026
@dosubot dosubot bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Feb 21, 2026
@dosubot
Copy link

dosubot bot commented Feb 21, 2026

Related Documentation

Checked 0 published document(s) in 1 knowledge base(s). No updates required.

How did I do? Any feedback?  Join Discord

@github-actions
Copy link

github-actions bot commented Feb 21, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/21/2026, 01:02:25 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Feb 21, 2026

Playwright: ✅ 524 passed, 0 failed · 5 flaky

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 21, 2026

📝 Walkthrough

Walkthrough

This PR refactors error state management by introducing a new dedicated executionErrorStore Pinia store and migrating all error-related state (node errors, execution errors, prompt errors) from the main executionStore. Multiple components and utilities are updated to use the new error store, and the executionIdToNodeLocatorId function is extracted to a utility module with an updated signature.

Changes

Cohort / File(s) Summary
Error Store Centralization
src/stores/executionErrorStore.ts
New Pinia store for managing execution error state including lastNodeErrors, lastExecutionError, lastPromptError, error overlays, and derived computed properties like hasAnyError, activeGraphErrorNodeIds, and error lookup helpers.
Component Error Store Migration
src/components/TopMenuSection.vue, src/components/error/ErrorOverlay.vue, src/components/graph/GraphCanvas.vue, src/components/rightSidePanel/RightSidePanel.vue, src/components/rightSidePanel/parameters/SectionWidgets.vue, src/renderer/extensions/linearMode/LinearControls.vue, src/renderer/extensions/vueNodes/components/LGraphNode.vue, src/renderer/extensions/vueNodes/components/NodeWidgets.vue
Updated components to import and use useExecutionErrorStore instead of useExecutionStore for error-related state and methods.
Composable and Utility Updates
src/components/rightSidePanel/errors/useErrorGroups.ts, src/utils/graphTraversalUtil.ts, src/stores/imagePreviewStore.ts, src/stores/subgraphStore.ts
Migrated error state references to executionErrorStore; extracted and relocated executionIdToNodeLocatorId function to graphTraversalUtil with updated signature requiring rootGraph parameter.
Main Store Refactoring
src/stores/executionStore.ts
Removed all error-related state (lastNodeErrors, lastExecutionError, lastPromptError) and computed properties; delegated error management to executionErrorStore; removed executionIdToNodeLocatorId export; simplified store focus to core execution state.
App Script Updates
src/scripts/app.ts
Imported useExecutionErrorStore; updated lastNodeErrors and lastExecutionError getters to reference executionErrorStore; routed error assignments and state resets through the new error store.
Test Updates
src/components/rightSidePanel/errors/TabErrors.test.ts, src/stores/executionStore.test.ts, src/stores/imagePreviewStore.test.ts
Updated test mocks and store references to use executionErrorStore and the relocated executionIdToNodeLocatorId function with new signature.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰 Hops with glee through error's new home,
No more scattered, they've a store all their own!
Errors consolidated, the system breathes clear,
ExecutionErrorStore brings logic so dear! 🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title '[refactor] Extract executionErrorStore from executionStore' clearly and concisely summarizes the main change: extracting error-related state into a dedicated store for better separation of concerns.
Description check ✅ Passed The pull request description covers all required sections: Summary clearly describes the refactoring objective, Changes lists the new store, moved utility, updated consumers, and backward compatibility notes, and Review Focus identifies the deprecated getters.

✏️ 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/extract-execution-error-store

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

📦 Bundle: 4.37 MB gzip 🔴 +59 B

Details

Summary

  • Raw size: 20.6 MB baseline 20.6 MB — 🔴 +536 B
  • Gzip: 4.37 MB baseline 4.37 MB — 🔴 +59 B
  • Brotli: 3.37 MB baseline 3.37 MB — 🔴 +179 B
  • Bundles: 223 current • 223 baseline • 123 added / 123 removed

Category Glance
Graph Workspace 🔴 +353 B (942 kB) · Data & Services 🔴 +189 B (2.51 MB) · Other 🟢 -3 B (7.61 MB) · Panels & Settings 🟢 -2 B (436 kB) · Views & Navigation 🟢 -1 B (68.8 kB) · Vendor & Third-Party ⚪ 0 B (8.86 MB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-DP72kGxL.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -7.03 kB 🟢 -6.1 kB
assets/index-M1-l2z4h.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +7.03 kB 🔴 +6.1 kB

Status: 1 added / 1 removed

Graph Workspace — 942 kB (baseline 942 kB) • 🔴 +353 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Bz2fEk_w.js (new) 942 kB 🔴 +942 kB 🔴 +202 kB 🔴 +154 kB
assets/GraphView-CojOagun.js (removed) 942 kB 🟢 -942 kB 🟢 -202 kB 🟢 -154 kB

Status: 1 added / 1 removed

Views & Navigation — 68.8 kB (baseline 68.8 kB) • 🟢 -1 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-COtnrlxk.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.83 kB
assets/CloudSurveyView-D2Xb2TsI.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.82 kB
assets/CloudLoginView-BEkqbaGD.js (new) 10 kB 🔴 +10 kB 🔴 +2.93 kB 🔴 +2.58 kB
assets/CloudLoginView-SP9kR6QQ.js (removed) 10 kB 🟢 -10 kB 🟢 -2.93 kB 🟢 -2.58 kB
assets/UserCheckView-DucfqJrf.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.22 kB 🟢 -1.94 kB
assets/UserCheckView-C2QHzRij.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/CloudSignupView-CgYFQ-Fr.js (removed) 7.41 kB 🟢 -7.41 kB 🟢 -2.32 kB 🟢 -2.04 kB
assets/CloudSignupView-DhVF9n_f.js (new) 7.41 kB 🔴 +7.41 kB 🔴 +2.33 kB 🔴 +2.04 kB
assets/CloudLayoutView-D5kGSFn3.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.11 kB 🟢 -1.83 kB
assets/CloudLayoutView-W6JmQSwQ.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.11 kB 🔴 +1.83 kB
assets/CloudForgotPasswordView-B3Y-YpX_.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.94 kB 🔴 +1.72 kB
assets/CloudForgotPasswordView-CzzUpfPY.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.94 kB 🟢 -1.73 kB
assets/CloudAuthTimeoutView-C496avnz.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.56 kB
assets/CloudAuthTimeoutView-DSy4pfpZ.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/CloudSubscriptionRedirectView-CEudCQy1.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.78 kB 🔴 +1.58 kB
assets/CloudSubscriptionRedirectView-DYwcLUTH.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.78 kB 🟢 -1.58 kB
assets/UserSelectView-cv0WDgBQ.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.47 kB
assets/UserSelectView-DuviDw7J.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.47 kB
assets/CloudSorryContactSupportView-BpNQvxFs.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-CY3QTpcy.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

Panels & Settings — 436 kB (baseline 436 kB) • 🟢 -2 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-ByoNkrX2.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.31 kB 🟢 -4.66 kB
assets/SecretsPanel-CVfs7J0B.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.31 kB 🔴 +4.65 kB
assets/LegacyCreditsPanel-DqtJdOJI.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.57 kB 🟢 -4.89 kB
assets/LegacyCreditsPanel-CZxmgVN5.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.57 kB 🔴 +4.89 kB
assets/SubscriptionPanel-Cd3cUHHw.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.73 kB 🟢 -4.17 kB
assets/SubscriptionPanel-B6N6c7OP.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.73 kB 🔴 +4.18 kB
assets/KeybindingPanel-Cfb6bi-L.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.58 kB 🔴 +3.18 kB
assets/KeybindingPanel-Drh2IsNb.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.58 kB 🟢 -3.18 kB
assets/AboutPanel-Bbq1IQbd.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.73 kB 🔴 +2.47 kB
assets/AboutPanel-CZDIujNu.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.47 kB
assets/ExtensionPanel-sSfUP2Jt.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.65 kB 🟢 -2.36 kB
assets/ExtensionPanel-xD1Nsigv.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.65 kB 🔴 +2.36 kB
assets/ServerConfigPanel-CfA3a_9M.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.13 kB 🔴 +1.92 kB
assets/ServerConfigPanel-TsQtOmCV.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.13 kB 🟢 -1.91 kB
assets/UserPanel-CC0ixsua.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -1.99 kB 🟢 -1.75 kB
assets/UserPanel-CGMl_oI7.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +2 kB 🔴 +1.75 kB
assets/cloudRemoteConfig-QESyi6XU.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +712 B 🔴 +610 B
assets/cloudRemoteConfig-y1CHJOuM.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -713 B 🟢 -614 B
assets/refreshRemoteConfig-BpZJ43YX.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -523 B 🟢 -481 B
assets/refreshRemoteConfig-CzoYERbk.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +522 B 🔴 +471 B
assets/config-QxkqTZy6.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-3cK4vYSX.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-AqJa7Oe1.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BOcWl0Qp.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BodhSOuG.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCD8qxmc.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CVDNuOXV.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DLodCRRz.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DLqeCT09.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DP-OgTXN.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRIXyZ_Z.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-IRk9rDbu.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/PasswordFields-DlUohnmK.js (removed) 4.51 kB 🟢 -4.51 kB 🟢 -1.35 kB 🟢 -1.2 kB
assets/PasswordFields-DxVya3YC.js (new) 4.51 kB 🔴 +4.51 kB 🔴 +1.35 kB 🔴 +1.2 kB
assets/auth-CaQH9m-j.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +992 B
assets/auth-CRD1yxtk.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -988 B
assets/SignUpForm-Bf_mgUTQ.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.1 kB
assets/SignUpForm-CUg-3jvy.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.1 kB
assets/UpdatePasswordContent-CELYhIaI.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +948 B
assets/UpdatePasswordContent-DOln2M96.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -952 B
assets/firebaseAuthStore-CRMzU-Nk.js (removed) 790 B 🟢 -790 B 🟢 -393 B 🟢 -351 B
assets/firebaseAuthStore-Cys7CmKx.js (new) 790 B 🔴 +790 B 🔴 +391 B 🔴 +346 B
assets/auth-BB-CrSXA.js (new) 357 B 🔴 +357 B 🔴 +224 B 🔴 +217 B
assets/auth-Dt_hB1ns.js (removed) 357 B 🟢 -357 B 🟢 -220 B 🟢 -209 B
assets/WorkspaceProfilePic-BRX_wv6S.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-CrwbrRMT.js (new) 738 B 🔴 +738 B 🔴 +381 B 🔴 +331 B
assets/useSubscriptionDialog-CvUX_yo0.js (removed) 738 B 🟢 -738 B 🟢 -381 B 🟢 -328 B

Status: 1 added / 1 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-C2_2b8uy.js (removed) 9.85 kB 🟢 -9.85 kB 🟢 -3.4 kB 🟢 -3 kB
assets/useTerminalTabs-DB4yIiIM.js (new) 9.85 kB 🔴 +9.85 kB 🔴 +3.4 kB 🔴 +3.01 kB
assets/ComfyQueueButton-B6L1IzKi.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.49 kB 🔴 +2.22 kB
assets/ComfyQueueButton-bqdSYpmE.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.49 kB 🟢 -2.23 kB
assets/TopbarBadge-3g_6CddN.js (removed) 7.45 kB 🟢 -7.45 kB 🟢 -1.81 kB 🟢 -1.6 kB
assets/TopbarBadge-CVbKPedh.js (new) 7.45 kB 🔴 +7.45 kB 🔴 +1.81 kB 🔴 +1.6 kB
assets/SubscribeButton-BFMbr3qL.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.02 kB 🔴 +890 B
assets/SubscribeButton-Dg1Ezs_e.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.02 kB 🟢 -887 B
assets/cloudFeedbackTopbarButton-BMBxv3US.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -858 B 🟢 -765 B
assets/cloudFeedbackTopbarButton-D_ael8IJ.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +857 B 🔴 +765 B
assets/CloudBadge-aQ2E47Yi.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -607 B 🟢 -528 B
assets/CloudBadge-BtTlxuhK.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +605 B 🔴 +528 B
assets/UserAvatar-DkTACzmk.js (new) 1.17 kB 🔴 +1.17 kB 🔴 +618 B 🔴 +529 B
assets/UserAvatar-GxvsGuiA.js (removed) 1.17 kB 🟢 -1.17 kB 🟢 -618 B 🟢 -528 B
assets/ComfyQueueButton-C9c4FsBE.js (removed) 795 B 🟢 -795 B 🟢 -397 B 🟢 -351 B
assets/ComfyQueueButton-DuO3EZVh.js (new) 795 B 🔴 +795 B 🔴 +398 B 🔴 +351 B
assets/Button-Dty3EQfq.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-CfmzmfrA.js 5.96 kB 5.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-BT3Ds9jk.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

Data & Services — 2.51 MB (baseline 2.51 MB) • 🔴 +189 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-DGTUthBD.js (removed) 1.73 MB 🟢 -1.73 MB 🟢 -386 kB 🟢 -292 kB
assets/dialogService-DZ_sJpIc.js (new) 1.73 MB 🔴 +1.73 MB 🔴 +385 kB 🔴 +292 kB
assets/api-ZpsEjJK7.js (new) 652 kB 🔴 +652 kB 🔴 +147 kB 🔴 +117 kB
assets/api-BWTLWs7w.js (removed) 652 kB 🟢 -652 kB 🟢 -147 kB 🟢 -117 kB
assets/load3dService-BbPiBBhT.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-ByA4eF4G.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/systemStatsStore-ixMEYtzP.js (removed) 12.7 kB 🟢 -12.7 kB 🟢 -4.42 kB 🟢 -3.89 kB
assets/systemStatsStore-yl398z-v.js (new) 12.7 kB 🔴 +12.7 kB 🔴 +4.42 kB 🔴 +3.88 kB
assets/releaseStore-C_VS3M_a.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/releaseStore-DZudY5Am.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/keybindingService-D8CXW0g2.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +1.71 kB 🔴 +1.47 kB
assets/keybindingService-ra5Qsy8o.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -1.71 kB 🟢 -1.47 kB
assets/bootstrapStore-CUbNPTEx.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +875 B 🔴 +795 B
assets/bootstrapStore-Cul9GEAH.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -873 B 🟢 -792 B
assets/userStore-qPsT21Jf.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +721 B 🔴 +677 B
assets/userStore-w7HeKxNW.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -720 B 🟢 -633 B
assets/audioService-CvYnx7a-.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -849 B 🟢 -730 B
assets/audioService-DEKdvtbK.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +849 B 🔴 +724 B
assets/releaseStore-CMPyF938.js (removed) 762 B 🟢 -762 B 🟢 -386 B 🟢 -343 B
assets/releaseStore-Djp-sgSX.js (new) 762 B 🔴 +762 B 🔴 +389 B 🔴 +342 B
assets/settingStore-BhNZBQQ_.js (removed) 746 B 🟢 -746 B 🟢 -389 B 🟢 -341 B
assets/settingStore-ewLw0dtj.js (new) 746 B 🔴 +746 B 🔴 +390 B 🔴 +344 B
assets/workflowDraftStore-CW7iHT7s.js (removed) 738 B 🟢 -738 B 🟢 -380 B 🟢 -331 B
assets/workflowDraftStore-tOWrXAfW.js (new) 738 B 🔴 +738 B 🔴 +380 B 🔴 +333 B
assets/dialogService-DcvMWPUf.js (new) 727 B 🔴 +727 B 🔴 +370 B 🔴 +329 B
assets/dialogService-gBjdxn3I.js (removed) 727 B 🟢 -727 B 🟢 -369 B 🟢 -328 B
assets/serverConfigStore-B17wcfZ1.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-BmPvtHby.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-D3M17iip.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3dViewer-9l2UtdYH.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.8 kB
assets/useLoad3dViewer-Cr2UzDKO.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useFeatureFlags-D5jiOMuF.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.09 kB 🔴 +929 B
assets/useFeatureFlags-Qk0ZFesx.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.09 kB 🟢 -936 B
assets/useWorkspaceUI-BTa_aCLV.js (removed) 3 kB 🟢 -3 kB 🟢 -821 B 🟢 -707 B
assets/useWorkspaceUI-CAlQJnbM.js (new) 3 kB 🔴 +3 kB 🔴 +823 B 🔴 +704 B
assets/useSubscriptionCredits-BdTTsbmK.js (removed) 2.75 kB 🟢 -2.75 kB 🟢 -1.04 kB 🟢 -901 B
assets/useSubscriptionCredits-oXbrLITf.js (new) 2.75 kB 🔴 +2.75 kB 🔴 +1.04 kB 🔴 +901 B
assets/subscriptionCheckoutUtil-BJX2NbqR.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +954 B
assets/subscriptionCheckoutUtil-CUrVJqyl.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -954 B
assets/useExternalLink-CxRHryh9.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -771 B 🟢 -679 B
assets/useExternalLink-vi6qV9yY.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +774 B 🔴 +679 B
assets/useErrorHandling-BSnpM_4R.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +629 B 🔴 +534 B
assets/useErrorHandling-ClFE6n2U.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -629 B 🟢 -534 B
assets/useWorkspaceSwitch-ByLbMh-D.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +545 B 🔴 +484 B
assets/useWorkspaceSwitch-DlxBGp0i.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -544 B 🟢 -481 B
assets/useLoad3d-CKBfVB73.js (new) 861 B 🔴 +861 B 🔴 +428 B 🔴 +381 B
assets/useLoad3d-CzFpfpp1.js (removed) 861 B 🟢 -861 B 🟢 -429 B 🟢 -379 B
assets/audioUtils-BtsOGKh-.js (new) 858 B 🔴 +858 B 🔴 +499 B 🔴 +404 B
assets/audioUtils-CXKzAuv-.js (removed) 858 B 🟢 -858 B 🟢 -501 B 🟢 -404 B
assets/useLoad3dViewer-B0_HNp72.js (new) 840 B 🔴 +840 B 🔴 +414 B 🔴 +368 B
assets/useLoad3dViewer-DPe8LRKJ.js (removed) 840 B 🟢 -840 B 🟢 -414 B 🟢 -367 B
assets/useCurrentUser-BLqqKQMp.js (removed) 724 B 🟢 -724 B 🟢 -373 B 🟢 -325 B
assets/useCurrentUser-hV5CUBAP.js (new) 724 B 🔴 +724 B 🔴 +373 B 🔴 +327 B
assets/_plugin-vue_export-helper-CY4XIWDa.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-CcRT0Prq.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-BQSmRN2Q.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DfJrqNx-.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BputJAFn.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-primevue-Ca9moc73.js (new) 1.73 MB 🔴 +1.73 MB 🔴 +311 kB 🔴 +190 kB
assets/vendor-primevue-CDtYfbOi.js (removed) 1.73 MB 🟢 -1.73 MB 🟢 -311 kB 🟢 -190 kB
assets/vendor-axios-C4mPrLmU.js 70.3 kB 70.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-BxkFiWzp.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-CJliEbVY.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-DDKkCsp-.js 145 kB 145 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-C95vNT5d.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CWMIYdD2.js 379 kB 379 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-LBLOE6BD.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-Bi_34iZD.js 625 kB 625 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-B4hGe0IQ.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-vkxZGffR.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: 1 added / 1 removed

Other — 7.61 MB (baseline 7.61 MB) • 🟢 -3 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-BmN90Lyt.js (removed) 518 kB 🟢 -518 kB 🟢 -99.3 kB 🟢 -77.3 kB
assets/i18n-BUfInTx4.js (new) 518 kB 🔴 +518 kB 🔴 +99.3 kB 🔴 +77.3 kB
assets/core-BcHphl9Z.js (new) 72.8 kB 🔴 +72.8 kB 🔴 +18.8 kB 🔴 +16.1 kB
assets/core-CyFV85q7.js (removed) 72.8 kB 🟢 -72.8 kB 🟢 -18.8 kB 🟢 -16.1 kB
assets/groupNode-ClEhYPn5.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.5 kB
assets/groupNode-CPRDUHYi.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.5 kB
assets/WidgetSelect-DYQ6yUoE.js (removed) 57.6 kB 🟢 -57.6 kB 🟢 -12.2 kB 🟢 -10.5 kB
assets/WidgetSelect-ngf0AQSw.js (new) 57.6 kB 🔴 +57.6 kB 🔴 +12.2 kB 🔴 +10.5 kB
assets/SubscriptionRequiredDialogContentWorkspace-B11ofKBD.js (new) 45.8 kB 🔴 +45.8 kB 🔴 +8.56 kB 🔴 +7.4 kB
assets/SubscriptionRequiredDialogContentWorkspace-kjUxuztM.js (removed) 45.8 kB 🟢 -45.8 kB 🟢 -8.56 kB 🟢 -7.43 kB
assets/Load3DControls-DdFK9yuT.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/Load3DControls-kv9M9g5M.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/WorkspacePanelContent-BUoltZXp.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.14 kB 🔴 +5.41 kB
assets/WorkspacePanelContent-K9U6bXgQ.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.15 kB 🟢 -5.38 kB
assets/SubscriptionRequiredDialogContent-CDmQ9250.js (removed) 26.2 kB 🟢 -26.2 kB 🟢 -6.57 kB 🟢 -5.77 kB
assets/SubscriptionRequiredDialogContent-CgeyGcFP.js (new) 26.2 kB 🔴 +26.2 kB 🔴 +6.57 kB 🔴 +5.77 kB
assets/Load3dViewerContent-Bve6cefy.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.49 kB
assets/Load3dViewerContent-C2IWSHhM.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.5 kB
assets/WidgetImageCrop-golSX8Oa.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.51 kB 🟢 -4.86 kB
assets/WidgetImageCrop-V3wpf1iC.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.51 kB 🔴 +4.85 kB
assets/SubscriptionPanelContentWorkspace-DRqTBpwK.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -5.02 kB 🟢 -4.43 kB
assets/SubscriptionPanelContentWorkspace-BNTXx3rD.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +5.02 kB 🔴 +4.43 kB
assets/CurrentUserPopoverWorkspace-BBYmbyOy.js (removed) 19.8 kB 🟢 -19.8 kB 🟢 -4.87 kB 🟢 -4.33 kB
assets/CurrentUserPopoverWorkspace-B-VfFzW6.js (new) 19.8 kB 🔴 +19.8 kB 🔴 +4.87 kB 🔴 +4.33 kB
assets/SignInContent-Bsm1Tm5K.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.79 kB 🟢 -4.19 kB
assets/SignInContent-BvrZ-3fT.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.79 kB 🔴 +4.19 kB
assets/WidgetInputNumber-C1XYOJ48.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.71 kB 🔴 +4.18 kB
assets/WidgetInputNumber-DFrvggtY.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.71 kB 🟢 -4.17 kB
assets/WidgetRecordAudio-CTUfoi4C.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.95 kB 🔴 +4.42 kB
assets/WidgetRecordAudio-CZbM3eQV.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.95 kB 🟢 -4.42 kB
assets/Load3D-DySabgRN.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.51 kB
assets/Load3D-ULmzRUlC.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.02 kB 🔴 +3.52 kB
assets/load3d-3j0Rp_BN.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.2 kB 🟢 -3.63 kB
assets/load3d-CkLlWox1.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.19 kB 🔴 +3.64 kB
assets/LazyImage-2uMi-pR-.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.8 kB 🟢 -3.36 kB
assets/LazyImage-BMzGEZhx.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.81 kB 🔴 +3.35 kB
assets/AudioPreviewPlayer-BPoErVFC.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.2 kB 🟢 -2.85 kB
assets/AudioPreviewPlayer-DTme5-E_.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.2 kB 🔴 +2.86 kB
assets/changeTracker-BBU5SKCf.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.89 kB 🔴 +2.54 kB
assets/changeTracker-mcM4vy-6.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.9 kB 🟢 -2.55 kB
assets/nodeTemplates-DhB5SWLQ.js (removed) 9.3 kB 🟢 -9.3 kB 🟢 -3.26 kB 🟢 -2.86 kB
assets/nodeTemplates-Dmjekjf5.js (new) 9.3 kB 🔴 +9.3 kB 🔴 +3.26 kB 🔴 +2.87 kB
assets/InviteMemberDialogContent-BdyP6nD3.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.3 kB 🟢 -2 kB
assets/InviteMemberDialogContent-CpBhGOav.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.3 kB 🔴 +2 kB
assets/WidgetToggleSwitch-aBcC1iuD.js (removed) 6.8 kB 🟢 -6.8 kB 🟢 -2.19 kB 🟢 -1.93 kB
assets/WidgetToggleSwitch-U9FuvdzP.js (new) 6.8 kB 🔴 +6.8 kB 🔴 +2.19 kB 🔴 +1.93 kB
assets/Load3DConfiguration-B-FReYZx.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/Load3DConfiguration-Bmd5ZVBa.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.92 kB 🟢 -1.68 kB
assets/CreateWorkspaceDialogContent-DsFz7gGs.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +2 kB 🔴 +1.74 kB
assets/CreateWorkspaceDialogContent-U7yO3hKq.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -2 kB 🟢 -1.75 kB
assets/EditWorkspaceDialogContent-Bwlf6BwK.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.95 kB 🟢 -1.71 kB
assets/EditWorkspaceDialogContent-zEjYrM45.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.95 kB 🔴 +1.7 kB
assets/ValueControlPopover-BQxsLY8v.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.77 kB 🟢 -1.58 kB
assets/ValueControlPopover-DS9RcnsU.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.77 kB 🔴 +1.59 kB
assets/Preview3d-D1hWM-K0.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/Preview3d-DpHPC9Bs.js (new) 4.82 kB 🔴 +4.82 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/CancelSubscriptionDialogContent-BMDKUI4w.js (new) 4.79 kB 🔴 +4.79 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/CancelSubscriptionDialogContent-DdXw6VXZ.js (removed) 4.79 kB 🟢 -4.79 kB 🟢 -1.78 kB 🟢 -1.57 kB
assets/AnimationControls-270uEeow.js (new) 4.61 kB 🔴 +4.61 kB 🔴 +1.6 kB 🔴 +1.41 kB
assets/AnimationControls-DfakB9G0.js (removed) 4.61 kB 🟢 -4.61 kB 🟢 -1.6 kB 🟢 -1.41 kB
assets/DeleteWorkspaceDialogContent-BbbgzovP.js (removed) 4.23 kB 🟢 -4.23 kB 🟢 -1.63 kB 🟢 -1.43 kB
assets/DeleteWorkspaceDialogContent-CJNkTM-M.js (new) 4.23 kB 🔴 +4.23 kB 🔴 +1.64 kB 🔴 +1.42 kB
assets/WidgetWithControl-Bg4gN0P2.js (removed) 4.11 kB 🟢 -4.11 kB 🟢 -1.78 kB 🟢 -1.62 kB
assets/WidgetWithControl-DVAfWxwD.js (new) 4.11 kB 🔴 +4.11 kB 🔴 +1.78 kB 🔴 +1.61 kB
assets/LeaveWorkspaceDialogContent-3UnXEaMn.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.58 kB 🟢 -1.38 kB
assets/LeaveWorkspaceDialogContent-CVDYV1W8.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.58 kB 🔴 +1.38 kB
assets/RemoveMemberDialogContent-CWdjrQjb.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.53 kB 🔴 +1.34 kB
assets/RemoveMemberDialogContent-CzqS9CM5.js (removed) 4.04 kB 🟢 -4.04 kB 🟢 -1.53 kB 🟢 -1.33 kB
assets/RevokeInviteDialogContent-Bd3JtEdE.js (new) 3.96 kB 🔴 +3.96 kB 🔴 +1.54 kB 🔴 +1.36 kB
assets/RevokeInviteDialogContent-BLfyXi8a.js (removed) 3.96 kB 🟢 -3.96 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/InviteMemberUpsellDialogContent-3Rm4VqmW.js (removed) 3.83 kB 🟢 -3.83 kB 🟢 -1.41 kB 🟢 -1.24 kB
assets/InviteMemberUpsellDialogContent-uMB1DVv5.js (new) 3.83 kB 🔴 +3.83 kB 🔴 +1.41 kB 🔴 +1.24 kB
assets/WidgetGalleria-C1mPkXo8.js (new) 3.61 kB 🔴 +3.61 kB 🔴 +1.4 kB 🔴 +1.25 kB
assets/WidgetGalleria-DxUiq10J.js (removed) 3.61 kB 🟢 -3.61 kB 🟢 -1.4 kB 🟢 -1.25 kB
assets/saveMesh-bcfZNZGh.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.46 kB 🔴 +1.29 kB
assets/saveMesh-DEkiPhne.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.46 kB 🟢 -1.3 kB
assets/WidgetTextarea-Bty_kSxO.js (removed) 3.13 kB 🟢 -3.13 kB 🟢 -1.29 kB 🟢 -1.14 kB
assets/WidgetTextarea-Du65hNTL.js (new) 3.13 kB 🔴 +3.13 kB 🔴 +1.29 kB 🔴 +1.13 kB
assets/cloudSessionCookie-bbVjnGUa.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.09 kB 🟢 -962 B
assets/cloudSessionCookie-D27SxR4m.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.09 kB 🔴 +948 B
assets/WidgetMarkdown-BhWgQvMw.js (removed) 2.93 kB 🟢 -2.93 kB 🟢 -1.23 kB 🟢 -1.11 kB
assets/WidgetMarkdown-CByZttTK.js (new) 2.93 kB 🔴 +2.93 kB 🔴 +1.23 kB 🔴 +1.07 kB
assets/GlobalToast-b7AcdqTZ.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.04 kB
assets/GlobalToast-BW26_RIc.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.06 kB
assets/WidgetColorPicker-BebWjEb2.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +1.23 kB 🔴 +1.11 kB
assets/WidgetColorPicker-CZWZ2P2t.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -1.23 kB 🟢 -1.11 kB
assets/ApiNodesSignInContent-Cdgpvp5B.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +922 B
assets/ApiNodesSignInContent-DjCuJRKV.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -961 B
assets/WidgetChart-FXoNjF90.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -954 B 🟢 -824 B
assets/WidgetChart-tDqjft7_.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +952 B 🔴 +823 B
assets/SubscribeToRun-BEdmUwHM.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -888 B
assets/SubscribeToRun-nSrbfsGH.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +880 B
assets/WidgetInputText-D2JCY-oU.js (new) 1.86 kB 🔴 +1.86 kB 🔴 +875 B 🔴 +792 B
assets/WidgetInputText-DNGqyry1.js (removed) 1.86 kB 🟢 -1.86 kB 🟢 -875 B 🟢 -788 B
assets/CloudRunButtonWrapper-83ZJfy5V.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -790 B 🟢 -726 B
assets/CloudRunButtonWrapper-DaNqXRK3.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +790 B 🔴 +716 B
assets/signInSchema-Bbx6mMnW.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +563 B 🔴 +508 B
assets/signInSchema-BEz-vSDq.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -563 B 🟢 -517 B
assets/cloudBadges-DHHmi2D2.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -705 B 🟢 -619 B
assets/cloudBadges-FBbFovlC.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +708 B 🔴 +617 B
assets/cloudSubscription-Bb6VI18V.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +661 B 🔴 +569 B
assets/cloudSubscription-CM7xiaWI.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -659 B 🟢 -573 B
assets/Load3D-A65XQWn3.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +501 B 🔴 +441 B
assets/Load3D-BZN0wqKo.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -499 B 🟢 -442 B
assets/nightlyBadges-CAM3pRlL.js (removed) 1 kB 🟢 -1 kB 🟢 -536 B 🟢 -475 B
assets/nightlyBadges-DlZ3aRF2.js (new) 1 kB 🔴 +1 kB 🔴 +535 B 🔴 +476 B
assets/Load3dViewerContent-BdqVGZk0.js (removed) 995 B 🟢 -995 B 🟢 -471 B 🟢 -417 B
assets/Load3dViewerContent-CIZbi49F.js (new) 995 B 🔴 +995 B 🔴 +471 B 🔴 +420 B
assets/SubscriptionPanelContentWorkspace-DSoEAZR-.js (removed) 932 B 🟢 -932 B 🟢 -439 B 🟢 -383 B
assets/SubscriptionPanelContentWorkspace-hyZekN-n.js (new) 932 B 🔴 +932 B 🔴 +441 B 🔴 +382 B
assets/graphHasMissingNodes-BQPq_Q65.js (removed) 761 B 🟢 -761 B 🟢 -375 B 🟢 -325 B
assets/graphHasMissingNodes-DiLdLpcM.js (new) 761 B 🔴 +761 B 🔴 +372 B 🔴 +322 B
assets/changeTracker-BEgbDg-s.js (removed) 759 B 🟢 -759 B 🟢 -389 B 🟢 -339 B
assets/changeTracker-CBNJtmy7.js (new) 759 B 🔴 +759 B 🔴 +388 B 🔴 +338 B
assets/WidgetLegacy-69Y80ZUI.js (removed) 747 B 🟢 -747 B 🟢 -387 B 🟢 -359 B
assets/WidgetLegacy-CVFckYkM.js (new) 747 B 🔴 +747 B 🔴 +388 B 🔴 +340 B
assets/WidgetInputNumber-BRSOUTQB.js (removed) 469 B 🟢 -469 B 🟢 -263 B 🟢 -226 B
assets/WidgetInputNumber-UwhL2JNT.js (new) 469 B 🔴 +469 B 🔴 +264 B 🔴 +224 B
assets/i18n-CDIyVrk8.js (new) 199 B 🔴 +199 B 🔴 +160 B 🔴 +138 B
assets/i18n-DseiGbFf.js (removed) 199 B 🟢 -199 B 🟢 -159 B 🟢 -138 B
assets/auto-BTnZwrs2.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-sbUO3_hD.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-DhnNuB-i.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-CKD9vwNi.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BIWmUVEc.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BOt38VCw.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C0NcxRH3.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C2xuXGb5.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CmiKIQwc.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DMwP8S5e.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwBt3HhT.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-JX559A2n.js 15.1 kB 15.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-n_2KJWcD.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-OO-8nFm9.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-wq2Y-YKn.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-BIWjk1ar.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BA2V8d-C.js 139 kB 139 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BccLgA47.js 168 kB 168 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C-ZfUqj4.js 194 kB 194 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C1DJg0HU.js 123 kB 123 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CjFsXT_Y.js 160 kB 160 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CNIsXuKE.js 147 kB 147 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CqcSAz7B.js 144 kB 144 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DDxNg4P1.js 174 kB 174 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dr-RBucI.js 122 kB 122 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Gap3UP2p.js 142 kB 142 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-x00Xksju.js 139 kB 139 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-D3QRJ6eZ.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-vXuump5i.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-XsW6Reb5.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-Crhpst_D.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-DLkC3BlW.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-DU5vbYRh.js 2.77 kB 2.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-2U4KtUml.js 360 kB 360 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-5rcOJVex.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BTBSP0IQ.js 480 kB 480 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BZEpP7w6.js 383 kB 383 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C-Tw-7I_.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C76rbmLh.js 441 kB 441 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CxxD1ymF.js 395 kB 395 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DciNsuYe.js 392 kB 392 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-G7wcMpUD.js 356 kB 356 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-nGdg-hIO.js 388 kB 388 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-xiPSrG6S.js 440 kB 440 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-Dz7QVY1n.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DeIFnh1k.js 665 B 665 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-DCc1Zu30.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-B2wM6nig.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-Bomay1-S.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-pAmsiKmj.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DTUjK0ZE.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-Ch7Vnrxm.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-jn-1G6CA.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-BV2GfN2g.js 3.1 kB 3.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-OZHuH8dM.js 1.95 kB 1.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-COB1L9Pj.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-BtuQMzwn.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 60 added / 60 removed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (3)
src/stores/subgraphStore.ts (1)

82-83: Consider a dedicated setter action in executionErrorStore for validation errors.

Direct mutation useExecutionErrorStore().lastNodeErrors = errors works (Pinia auto-unwraps and triggers the store's internal watch), but it bypasses any future invariant enforcement the store might need to add around lastNodeErrors changes. A named action such as setValidationErrors(errors) would also make the intent clearer at call sites. This is consistent with the guideline to establish clear public interfaces for stores.

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

In `@src/stores/subgraphStore.ts` around lines 82 - 83, Replace the direct
assignment to useExecutionErrorStore().lastNodeErrors with a dedicated action on
the execution error store: introduce a method like setValidationErrors(errors)
on the executionErrorStore and call
useExecutionErrorStore().setValidationErrors(errors) from subgraphStore; keep
the property lastNodeErrors internal to the store so the action can perform
validation/invariant checks and emit any side-effects, and update callers to use
the new setValidationErrors API (identify the store by useExecutionErrorStore,
the property lastNodeErrors, and the new action name setValidationErrors).
src/stores/executionStore.test.ts (1)

181-188: Prefer a function-based suite title for Vitest describe.

♻️ Suggested change
-describe('useExecutionErrorStore - Node Error Lookups', () => {
+describe(useExecutionErrorStore, () => {

Based on learnings: In test files under src/**/*.test.ts, follow the vitest/prefer-describe-function-title rule by using describe(ComponentOrFunction, ...) instead of a string literal description when naming test suites.

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

In `@src/stores/executionStore.test.ts` around lines 181 - 188, Replace the string
literal suite title with a function-based title to satisfy
vitest/prefer-describe-function-title; change the describe call that currently
uses a string like "useExecutionErrorStore - Node Error Lookups" to use the
function identifier useExecutionErrorStore (i.e.,
describe(useExecutionErrorStore, () => { ... } ) ), keeping the rest of the
setup (vi.clearAllMocks, setActivePinia, store = useExecutionErrorStore())
unchanged.
src/stores/executionErrorStore.ts (1)

172-192: Prefer function declarations over function expressions.

getNodeErrors, slotHasError are const arrow-function expressions. Per coding guidelines, prefer function declarations for pure/standalone functions. hasInternalErrorForNode on line 189 already uses a function declaration — align the others.

Proposed refactor
-  /** Get node errors by locator ID. */
-  const getNodeErrors = (
-    nodeLocatorId: NodeLocatorId
-  ): NodeError | undefined => {
-    return nodeErrorsByLocatorId.value[nodeLocatorId]
-  }
+  /** Get node errors by locator ID. */
+  function getNodeErrors(
+    nodeLocatorId: NodeLocatorId
+  ): NodeError | undefined {
+    return nodeErrorsByLocatorId.value[nodeLocatorId]
+  }

-  /** Check if a specific slot has validation errors. */
-  const slotHasError = (
-    nodeLocatorId: NodeLocatorId,
-    slotName: string
-  ): boolean => {
-    const nodeError = getNodeErrors(nodeLocatorId)
-    if (!nodeError) return false
-
-    return nodeError.errors.some((e) => e.extra_info?.input_name === slotName)
-  }
+  /** Check if a specific slot has validation errors. */
+  function slotHasError(
+    nodeLocatorId: NodeLocatorId,
+    slotName: string
+  ): boolean {
+    const nodeError = getNodeErrors(nodeLocatorId)
+    if (!nodeError) return false
+
+    return nodeError.errors.some((e) => e.extra_info?.input_name === slotName)
+  }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stores/executionErrorStore.ts` around lines 172 - 192, The two
arrow-function constants getNodeErrors and slotHasError should be converted to
named function declarations to match the existing hasInternalErrorForNode style:
replace "const getNodeErrors = (nodeLocatorId: NodeLocatorId): NodeError |
undefined => { ... }" with "function getNodeErrors(nodeLocatorId:
NodeLocatorId): NodeError | undefined { ... }" and similarly convert "const
slotHasError = (nodeLocatorId: NodeLocatorId, slotName: string): boolean => {
... }" to "function slotHasError(nodeLocatorId: NodeLocatorId, slotName:
string): boolean { ... }"; keep their bodies and return types identical, ensure
they remain in the same module scope so callers (and hoisting) behave the same,
and run tests/TS build to confirm no type or scope regressions.
🤖 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/scripts/app.ts`:
- Around line 1445-1448: executionErrorStore.lastNodeErrors is a record so using
.length is incorrect; change the logic that sets and checks lastNodeErrors
(where res.node_errors is assigned) to normalize to null when empty and use
Object.keys(executionErrorStore.lastNodeErrors).length > 0 to detect errors
before calling this.canvas.draw(true, true); do the same replacement for the
other occurrence that checks lastNodeErrors (the same pattern near the other
assignment) so empty maps become null and detection uses
Object.keys(...).length.

In `@src/stores/executionErrorStore.ts`:
- Around line 140-146: In activeGraphErrorNodeIds, avoid unconditionally calling
String(lastExecutionError.value.node_id); add the same null/undefined guard used
in allErrorExecutionIds so you only call String(...) and pass to
getNodeByExecutionId when lastExecutionError.value.node_id is not null/undefined
— e.g., check lastExecutionError.value.node_id != null before computing
execNodeId and running getNodeByExecutionId(app.rootGraph, execNodeId).

---

Nitpick comments:
In `@src/stores/executionErrorStore.ts`:
- Around line 172-192: The two arrow-function constants getNodeErrors and
slotHasError should be converted to named function declarations to match the
existing hasInternalErrorForNode style: replace "const getNodeErrors =
(nodeLocatorId: NodeLocatorId): NodeError | undefined => { ... }" with "function
getNodeErrors(nodeLocatorId: NodeLocatorId): NodeError | undefined { ... }" and
similarly convert "const slotHasError = (nodeLocatorId: NodeLocatorId, slotName:
string): boolean => { ... }" to "function slotHasError(nodeLocatorId:
NodeLocatorId, slotName: string): boolean { ... }"; keep their bodies and return
types identical, ensure they remain in the same module scope so callers (and
hoisting) behave the same, and run tests/TS build to confirm no type or scope
regressions.

In `@src/stores/executionStore.test.ts`:
- Around line 181-188: Replace the string literal suite title with a
function-based title to satisfy vitest/prefer-describe-function-title; change
the describe call that currently uses a string like "useExecutionErrorStore -
Node Error Lookups" to use the function identifier useExecutionErrorStore (i.e.,
describe(useExecutionErrorStore, () => { ... } ) ), keeping the rest of the
setup (vi.clearAllMocks, setActivePinia, store = useExecutionErrorStore())
unchanged.

In `@src/stores/subgraphStore.ts`:
- Around line 82-83: Replace the direct assignment to
useExecutionErrorStore().lastNodeErrors with a dedicated action on the execution
error store: introduce a method like setValidationErrors(errors) on the
executionErrorStore and call
useExecutionErrorStore().setValidationErrors(errors) from subgraphStore; keep
the property lastNodeErrors internal to the store so the action can perform
validation/invariant checks and emit any side-effects, and update callers to use
the new setValidationErrors API (identify the store by useExecutionErrorStore,
the property lastNodeErrors, and the new action name setValidationErrors).

Comment on lines +1445 to 1448
executionErrorStore.lastNodeErrors = res.node_errors ?? null
if (executionErrorStore.lastNodeErrors?.length) {
this.canvas.draw(true, true)
} else {
Copy link
Contributor

@coderabbitai coderabbitai bot Feb 21, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Fix node error detection — .length doesn’t work on the error map.
lastNodeErrors is a record, so .length is always undefined; node error responses won’t hit the error branch. Normalize via Object.keys and store null when empty.

🐛 Suggested fix
-            executionErrorStore.lastNodeErrors = res.node_errors ?? null
-            if (executionErrorStore.lastNodeErrors?.length) {
+            const nodeErrors = res.node_errors ?? null
+            const hasNodeErrors =
+              !!nodeErrors && Object.keys(nodeErrors).length > 0
+            executionErrorStore.lastNodeErrors = hasNodeErrors ? nodeErrors : null
+            if (hasNodeErrors) {

Also applies to: 1539-1539

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

In `@src/scripts/app.ts` around lines 1445 - 1448,
executionErrorStore.lastNodeErrors is a record so using .length is incorrect;
change the logic that sets and checks lastNodeErrors (where res.node_errors is
assigned) to normalize to null when empty and use
Object.keys(executionErrorStore.lastNodeErrors).length > 0 to detect errors
before calling this.canvas.draw(true, true); do the same replacement for the
other occurrence that checks lastNodeErrors (the same pattern near the other
assignment) so empty maps become null and detection uses
Object.keys(...).length.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Pre-existing issue, out of scope for this refactoring PR. Will address in a follow-up.

Copy link
Contributor

Choose a reason for hiding this comment

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

@jaeone94, understood! Since this is a pre-existing issue from before the refactoring, it makes sense to keep this PR focused on the store extraction.

Would you like me to create a GitHub issue to track this bug as a follow-up? I can include:

  • The problematic .length check on the record object (occurs in two places based on the review)
  • A suggested fix to use Object.keys(nodeErrors).length > 0
  • A link back to this PR and comment as context

Just let me know if you'd like me to open that issue for you! 🐰


🧠 Learnings used
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/AGENTS.md:0-0
Timestamp: 2026-01-27T20:51:47.936Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Avoid `ts-expect-error` - fix the underlying type issue instead

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 8307
File: src/stores/bootstrapStore.ts:61-78
Timestamp: 2026-01-26T18:39:26.986Z
Learning: In src/stores/**/*.ts: Do not suggest exposing internal state or error refs from stores unless there is demonstrated active usage of those properties elsewhere in the codebase. Keep internal state private by default; only expose what is actively consumed.

Comment on lines +140 to +146
if (lastExecutionError.value) {
const execNodeId = String(lastExecutionError.value.node_id)
const graphNode = getNodeByExecutionId(app.rootGraph, execNodeId)
if (graphNode?.graph === activeGraph) {
ids.add(String(graphNode.id))
}
}
Copy link
Contributor

@coderabbitai coderabbitai bot Feb 21, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Missing null guard on node_id — inconsistent with allErrorExecutionIds.

In allErrorExecutionIds (lines 92–96) you guard against node_id being null/undefined before pushing. Here in activeGraphErrorNodeIds, String(lastExecutionError.value.node_id) is called unconditionally, which would produce the string "null" or "undefined" and pass it to getNodeByExecutionId.

Proposed fix
     if (lastExecutionError.value) {
-      const execNodeId = String(lastExecutionError.value.node_id)
-      const graphNode = getNodeByExecutionId(app.rootGraph, execNodeId)
-      if (graphNode?.graph === activeGraph) {
-        ids.add(String(graphNode.id))
+      const nodeId = lastExecutionError.value.node_id
+      if (nodeId !== null && nodeId !== undefined) {
+        const execNodeId = String(nodeId)
+        const graphNode = getNodeByExecutionId(app.rootGraph, execNodeId)
+        if (graphNode?.graph === activeGraph) {
+          ids.add(String(graphNode.id))
+        }
       }
     }
📝 Committable suggestion

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

Suggested change
if (lastExecutionError.value) {
const execNodeId = String(lastExecutionError.value.node_id)
const graphNode = getNodeByExecutionId(app.rootGraph, execNodeId)
if (graphNode?.graph === activeGraph) {
ids.add(String(graphNode.id))
}
}
if (lastExecutionError.value) {
const nodeId = lastExecutionError.value.node_id
if (nodeId !== null && nodeId !== undefined) {
const execNodeId = String(nodeId)
const graphNode = getNodeByExecutionId(app.rootGraph, execNodeId)
if (graphNode?.graph === activeGraph) {
ids.add(String(graphNode.id))
}
}
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stores/executionErrorStore.ts` around lines 140 - 146, In
activeGraphErrorNodeIds, avoid unconditionally calling
String(lastExecutionError.value.node_id); add the same null/undefined guard used
in allErrorExecutionIds so you only call String(...) and pass to
getNodeByExecutionId when lastExecutionError.value.node_id is not null/undefined
— e.g., check lastExecutionError.value.node_id != null before computing
execNodeId and running getNodeByExecutionId(app.rootGraph, execNodeId).

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Pre-existing issue, out of scope for this refactoring PR. Will address in a follow-up.

Copy link
Contributor

Choose a reason for hiding this comment

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

@jaeone94 That makes sense — keeping this refactoring focused is the right approach. Would you like me to create a GitHub issue to track the null guard fix for activeGraphErrorNodeIds as a follow-up task?


🧠 Learnings used
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 8307
File: src/stores/bootstrapStore.ts:61-78
Timestamp: 2026-01-26T18:39:26.986Z
Learning: In src/stores/**/*.ts: Do not suggest exposing internal state or error refs from stores unless there is demonstrated active usage of those properties elsewhere in the codebase. Keep internal state private by default; only expose what is actively consumed.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 8753
File: src/renderer/extensions/vueNodes/widgets/components/WidgetDOM.vue:17-28
Timestamp: 2026-02-09T03:24:50.064Z
Learning: In this codebase: When destructuring reactive properties from Pinia stores, use `storeToRefs()` to maintain reactivity. Example: `const canvasStore = useCanvasStore(); const { canvas } = storeToRefs(canvasStore)`. Then access with `.value` (e.g., `canvas.value`).

Learnt from: kaili-yang
Repo: Comfy-Org/ComfyUI_frontend PR: 7805
File: src/composables/useCoreCommands.ts:439-439
Timestamp: 2025-12-30T22:22:38.162Z
Learning: In Pinia setup stores, when accessing reactive properties directly via `useStore().property` pattern (e.g., `useQueueUIStore().isOverlayExpanded`), Pinia automatically unwraps refs and returns the primitive value. The `.value` accessor is only needed when destructuring store properties or using `storeToRefs()`.

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/AGENTS.md:0-0
Timestamp: 2026-02-20T05:29:49.703Z
Learning: Applies to src/lib/litegraph/**/*.{ts,tsx,js,jsx} : Prefer returning `undefined` over `null` in TypeScript/JavaScript

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/AGENTS.md:0-0
Timestamp: 2026-01-27T20:51:47.936Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Avoid `ts-expect-error` - fix the underlying type issue instead

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-03T20:30:57.039Z
Learning: Applies to **/stores/*Store.ts : Name Pinia stores as `*Store.ts`

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/AGENTS.md:0-0
Timestamp: 2026-01-27T20:51:47.936Z
Learning: Applies to src/**/stores/**/*.{js,ts} : Establish clear public interfaces for stores

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/AGENTS.md:0-0
Timestamp: 2026-01-27T20:51:47.936Z
Learning: Applies to src/**/stores/**/*.{js,ts} : Only expose state and actions that are used externally; keep internal state private

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

Labels

enhancement New feature or request size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants