Skip to content

[refactor] Extract executionErrorStore from executionStore#9060

Merged
christian-byrne merged 5 commits intomainfrom
refactor/extract-execution-error-store
Feb 22, 2026
Merged

[refactor] Extract executionErrorStore from executionStore#9060
christian-byrne merged 5 commits 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, 11:50:17 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Feb 21, 2026

Playwright: ✅ 528 passed, 0 failed · 3 flaky

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

No actionable comments were generated in the recent review. 🎉


📝 Walkthrough

Walkthrough

Introduces a new Pinia store executionErrorStore and migrates error-related state and logic (node, execution, prompt errors, overlays) from executionStore; updates components, utilities, tests, app scripts, and workspace typings to use the new store and a new executionId→NodeLocatorId utility.

Changes

Cohort / File(s) Summary
New Error Store
src/stores/executionErrorStore.ts
Adds useExecutionErrorStore Pinia store: lastNodeErrors, lastExecutionError, lastPromptError, overlay controls, derived flags (hasAnyError, counts, activeGraphErrorNodeIds), lookup helpers, and propagation logic.
Execution Store Refactor
src/stores/executionStore.ts
Removes error state/computeds and delegates all error management to executionErrorStore; internal id→locator resolution made explicit with app.rootGraph.
Component Updates
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
Replaced imports/usages of useExecutionStore with useExecutionErrorStore; components now read/write error state and call overlay methods on executionErrorStore.
Error Grouping & Tests
src/components/rightSidePanel/errors/useErrorGroups.ts, src/components/rightSidePanel/errors/TabErrors.test.ts, src/stores/executionStore.test.ts, src/stores/imagePreviewStore.test.ts
Updated code/tests to consume error data under executionError shape and to use the relocated executionIdToNodeLocatorId(rootGraph, id) utility; mocks adjusted accordingly.
App, Workspace & Types
src/scripts/app.ts, src/stores/workspaceStore.ts, src/types/extensionTypes.ts
App flows and getters switched to executionErrorStore (show/dismiss overlay, reset errors); workspace store exposes read-only lastNodeErrors/lastExecutionError; types extended to surface those properties.
Graph Traversal Utility
src/utils/graphTraversalUtil.ts
Adds exported executionIdToNodeLocatorId(rootGraph, nodeId) and imports createNodeLocatorId to centralize executionId→NodeLocatorId resolution (duplicate insertion noted in diff).
Image Preview & Subgraph
src/stores/imagePreviewStore.ts, src/stores/subgraphStore.ts
Replaced execution-store-dependent id→locator calls with executionIdToNodeLocatorId(app.rootGraph, id); subgraph validation now assigns lastNodeErrors on executionErrorStore.

Sequence Diagram(s)

sequenceDiagram
    participant UI as UI Component
    participant App as App / Scripts
    participant ExecErr as executionErrorStore
    participant Exec as executionStore
    participant Util as graphTraversalUtil

    UI->>ExecErr: read error state (lastNodeErrors, hasAnyError)
    UI->>ExecErr: call overlay methods (showErrorOverlay / dismissErrorOverlay)
    App->>ExecErr: update/clear errors during flows
    Exec->>ExecErr: delegate error recording (no local error refs)
    ExecErr->>Util: executionIdToNodeLocatorId(app.rootGraph, id)
    ExecErr-->>UI: derived flags / lookup results
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Feat/errors tab panel #8807 — Related work touching error UI/state and components that this change centralizes and wires into a dedicated error store.

Suggested labels

size:XXL

Suggested reviewers

  • viva-jinyi
  • AustinMroz
  • christian-byrne

Poem

🐰 I hopped through lines where errors hid,

Gathered them up, made one tidy grid.
Nodes and prompts snug in a new store light,
I twitch my whiskers — everything's right! 🥕

🚥 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' accurately and concisely describes the main change: extracting error-related state from executionStore into a new dedicated executionErrorStore.
Description check ✅ Passed The PR description covers all required template sections: a clear summary of changes, detailed breakdown of what was changed (new store, moved utility, updated consumers, backward compatibility), and identified review focus areas.

✏️ 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

github-actions bot commented Feb 21, 2026

📦 Bundle: 4.37 MB gzip 🔴 +98 B

Details

Summary

  • Raw size: 20.6 MB baseline 20.6 MB — 🔴 +488 B
  • Gzip: 4.37 MB baseline 4.37 MB — 🔴 +98 B
  • Brotli: 3.37 MB baseline 3.37 MB — 🔴 +136 B
  • Bundles: 223 current • 223 baseline • 123 added / 123 removed

Category Glance
Graph Workspace 🔴 +353 B (942 kB) · Data & Services 🔴 +141 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-C1QN6Vzo.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +7.03 kB 🔴 +6.13 kB
assets/index-CoIzrQZA.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -7.02 kB 🟢 -6.09 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-CQPXt3Ln.js (new) 942 kB 🔴 +942 kB 🔴 +202 kB 🔴 +154 kB
assets/GraphView-CYcw5VZM.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-BRNzm1GZ.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.83 kB
assets/CloudSurveyView-i6IhfskW.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.83 kB
assets/CloudLoginView-B0Fyf8_p.js (removed) 10 kB 🟢 -10 kB 🟢 -2.94 kB 🟢 -2.57 kB
assets/CloudLoginView-ByoDyR50.js (new) 10 kB 🔴 +10 kB 🔴 +2.94 kB 🔴 +2.58 kB
assets/UserCheckView-CaWmtXuf.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/UserCheckView-SNft9jEO.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/CloudSignupView-BE963-TH.js (new) 7.41 kB 🔴 +7.41 kB 🔴 +2.33 kB 🔴 +2.03 kB
assets/CloudSignupView-DL5h89pJ.js (removed) 7.41 kB 🟢 -7.41 kB 🟢 -2.33 kB 🟢 -2.04 kB
assets/CloudLayoutView-Bd60T-Of.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.11 kB 🟢 -1.84 kB
assets/CloudLayoutView-BKO0_c-V.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.11 kB 🔴 +1.84 kB
assets/CloudForgotPasswordView-Cupy7gi0.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.94 kB 🔴 +1.73 kB
assets/CloudForgotPasswordView-DJG5-47d.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.94 kB 🟢 -1.73 kB
assets/CloudAuthTimeoutView-0rkPOLK7.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CloudAuthTimeoutView-Cauqa4OT.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.56 kB
assets/CloudSubscriptionRedirectView-Cm3t4Pi0.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.78 kB 🔴 +1.57 kB
assets/CloudSubscriptionRedirectView-D8L-Mr31.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.78 kB 🟢 -1.58 kB
assets/UserSelectView-C6ERfgMx.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.47 kB
assets/UserSelectView-DSrlx6bz.js (new) 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-DhAE4LwC.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.65 kB
assets/SecretsPanel-Tc4pBuJ9.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.3 kB 🔴 +4.65 kB
assets/LegacyCreditsPanel-DBstkvM3.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.57 kB 🟢 -4.9 kB
assets/LegacyCreditsPanel-Dn14Jr2D.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.57 kB 🔴 +4.9 kB
assets/SubscriptionPanel-DmxQnXR-.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.73 kB 🟢 -4.17 kB
assets/SubscriptionPanel-BdwRS4n8.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.74 kB 🔴 +4.18 kB
assets/KeybindingPanel-KR2TAWJW.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.58 kB 🔴 +3.17 kB
assets/KeybindingPanel-zD2mmeiO.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.58 kB 🟢 -3.18 kB
assets/AboutPanel-CnRkB3Pz.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.73 kB 🔴 +2.47 kB
assets/AboutPanel-zAdKXnJO.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.46 kB
assets/ExtensionPanel-B3xPA6Fu.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.66 kB 🔴 +2.35 kB
assets/ExtensionPanel-CV6JGMMw.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.65 kB 🟢 -2.35 kB
assets/ServerConfigPanel-CL9r-mxa.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.13 kB 🟢 -1.91 kB
assets/ServerConfigPanel-D9lF97-w.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.13 kB 🔴 +1.93 kB
assets/UserPanel-C1ObpHzv.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +2 kB 🔴 +1.75 kB
assets/UserPanel-CqgDxJjC.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -2 kB 🟢 -1.75 kB
assets/cloudRemoteConfig-ByPoM-Qo.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -711 B 🟢 -610 B
assets/cloudRemoteConfig-xEkH3OWm.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +713 B 🔴 +613 B
assets/refreshRemoteConfig-BIZzg4zt.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +520 B 🔴 +465 B
assets/refreshRemoteConfig-DLhvk6MI.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -520 B 🟢 -460 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-DffGp57L.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +991 B
assets/auth-Dpe9LkDr.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -985 B
assets/SignUpForm-C-HNtYOX.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.11 kB
assets/SignUpForm-DK3MQHqZ.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.1 kB
assets/UpdatePasswordContent-D-wVBuGn.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +968 B
assets/UpdatePasswordContent-WbRrWcvp.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -944 B
assets/firebaseAuthStore-716pFdx0.js (new) 790 B 🔴 +790 B 🔴 +389 B 🔴 +343 B
assets/firebaseAuthStore-DkpAssG6.js (removed) 790 B 🟢 -790 B 🟢 -391 B 🟢 -374 B
assets/auth-DxeyfKVc.js (removed) 357 B 🟢 -357 B 🟢 -221 B 🟢 -212 B
assets/auth-LhjXmuYz.js (new) 357 B 🔴 +357 B 🔴 +224 B 🔴 +210 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-du6HehL2.js (removed) 738 B 🟢 -738 B 🟢 -383 B 🟢 -327 B
assets/useSubscriptionDialog-PFgBtE4x.js (new) 738 B 🔴 +738 B 🔴 +384 B 🔴 +345 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-Dynb7rS7.js (new) 9.85 kB 🔴 +9.85 kB 🔴 +3.41 kB 🔴 +3.01 kB
assets/useTerminalTabs-J9Wc2aAV.js (removed) 9.85 kB 🟢 -9.85 kB 🟢 -3.41 kB 🟢 -3.01 kB
assets/ComfyQueueButton-D4b0a_3g.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.49 kB 🔴 +2.22 kB
assets/ComfyQueueButton-D8D-N6RC.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.49 kB 🟢 -2.22 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-CKbCl4xa.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.02 kB 🔴 +890 B
assets/SubscribeButton-D9ZQMgzY.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.02 kB 🟢 -888 B
assets/cloudFeedbackTopbarButton-BfoO9g_C.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -858 B 🟢 -767 B
assets/cloudFeedbackTopbarButton-YKP8RdLG.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +859 B 🔴 +767 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-CB0Jiakk.js (removed) 795 B 🟢 -795 B 🟢 -398 B 🟢 -351 B
assets/ComfyQueueButton-Dp05ZLBf.js (new) 795 B 🔴 +795 B 🔴 +400 B 🔴 +353 B
assets/Button-Dty3EQfq.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-DJE0B1NQ.js 5.94 kB 5.94 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) • 🔴 +141 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-YTpNk5lW.js (removed) 1.73 MB 🟢 -1.73 MB 🟢 -386 kB 🟢 -292 kB
assets/dialogService-BEFBOR4I.js (new) 1.73 MB 🔴 +1.73 MB 🔴 +385 kB 🔴 +292 kB
assets/api-BA9tsRJv.js (new) 652 kB 🔴 +652 kB 🔴 +147 kB 🔴 +117 kB
assets/api-BXafhtUh.js (removed) 652 kB 🟢 -652 kB 🟢 -147 kB 🟢 -117 kB
assets/load3dService-0ViqaWfY.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-CZUfGrGz.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/systemStatsStore-C2HG0CG6.js (new) 12.7 kB 🔴 +12.7 kB 🔴 +4.42 kB 🔴 +3.88 kB
assets/systemStatsStore-CHVDvSqo.js (removed) 12.7 kB 🟢 -12.7 kB 🟢 -4.42 kB 🟢 -3.89 kB
assets/releaseStore-BdKomzJ7.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/releaseStore-CP3746O8.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/keybindingService-DES87esF.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -1.71 kB 🟢 -1.47 kB
assets/keybindingService-H4QnU-l7.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +1.71 kB 🔴 +1.47 kB
assets/bootstrapStore-BBQiVOiE.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -871 B 🟢 -794 B
assets/bootstrapStore-Dwu_4_fv.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +874 B 🔴 +795 B
assets/userStore-B79sdcHi.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -719 B 🟢 -678 B
assets/userStore-BZW76gqX.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +722 B 🔴 +681 B
assets/audioService-B3a-niYi.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +848 B 🔴 +724 B
assets/audioService-OCFX_0pn.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -848 B 🟢 -728 B
assets/releaseStore-B3KiUgxW.js (new) 762 B 🔴 +762 B 🔴 +387 B 🔴 +358 B
assets/releaseStore-bMaW7Kvn.js (removed) 762 B 🟢 -762 B 🟢 -390 B 🟢 -338 B
assets/settingStore-1mmMmLXR.js (removed) 746 B 🟢 -746 B 🟢 -391 B 🟢 -342 B
assets/settingStore-D0phETqh.js (new) 746 B 🔴 +746 B 🔴 +392 B 🔴 +364 B
assets/workflowDraftStore-BA4TVanH.js (new) 738 B 🔴 +738 B 🔴 +383 B 🔴 +354 B
assets/workflowDraftStore-CXWe27E3.js (removed) 738 B 🟢 -738 B 🟢 -382 B 🟢 -334 B
assets/dialogService-BUyVm9C7.js (new) 727 B 🔴 +727 B 🔴 +372 B 🔴 +345 B
assets/dialogService-DhFUP2fQ.js (removed) 727 B 🟢 -727 B 🟢 -371 B 🟢 -329 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-BH6HvDq1.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-Dvr_4r9-.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3dViewer-CfJyAp0T.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useLoad3dViewer-DW1snz89.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.8 kB
assets/useFeatureFlags-BRX4vS07.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.09 kB 🟢 -933 B
assets/useFeatureFlags-D3hnA73L.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.09 kB 🔴 +931 B
assets/useWorkspaceUI-B_RBsYYj.js (removed) 3 kB 🟢 -3 kB 🟢 -824 B 🟢 -742 B
assets/useWorkspaceUI-DBJ7oiad.js (new) 3 kB 🔴 +3 kB 🔴 +823 B 🔴 +705 B
assets/useSubscriptionCredits-BckUGYPw.js (removed) 2.75 kB 🟢 -2.75 kB 🟢 -1.04 kB 🟢 -900 B
assets/useSubscriptionCredits-BiHXUjdO.js (new) 2.75 kB 🔴 +2.75 kB 🔴 +1.04 kB 🔴 +901 B
assets/subscriptionCheckoutUtil-CdCPV0mN.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +951 B
assets/subscriptionCheckoutUtil-gKizFXe9.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -965 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-BlsRz778.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -629 B 🟢 -534 B
assets/useErrorHandling-CZlAJSmT.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +629 B 🔴 +535 B
assets/useWorkspaceSwitch-DtaLo3G7.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -546 B 🟢 -481 B
assets/useWorkspaceSwitch-VcTM6VGl.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +548 B 🔴 +483 B
assets/useLoad3d-DS3bsCZi.js (new) 861 B 🔴 +861 B 🔴 +429 B 🔴 +382 B
assets/useLoad3d-ggdZBxPk.js (removed) 861 B 🟢 -861 B 🟢 -429 B 🟢 -381 B
assets/audioUtils-BjdOvh9v.js (new) 858 B 🔴 +858 B 🔴 +500 B 🔴 +402 B
assets/audioUtils-DX9136jV.js (removed) 858 B 🟢 -858 B 🟢 -502 B 🟢 -402 B
assets/useLoad3dViewer-CQ6FDPb6.js (new) 840 B 🔴 +840 B 🔴 +415 B 🔴 +369 B
assets/useLoad3dViewer-DWX2Gv7W.js (removed) 840 B 🟢 -840 B 🟢 -416 B 🟢 -368 B
assets/useCurrentUser-D1qyGy0s.js (removed) 724 B 🟢 -724 B 🟢 -374 B 🟢 -327 B
assets/useCurrentUser-R65OC8D8.js (new) 724 B 🔴 +724 B 🔴 +374 B 🔴 +342 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-1-eTuLqJ.js (removed) 72.8 kB 🟢 -72.8 kB 🟢 -18.8 kB 🟢 -16.1 kB
assets/core-zU1WJOUV.js (new) 72.8 kB 🔴 +72.8 kB 🔴 +18.8 kB 🔴 +16.1 kB
assets/groupNode-D3ynrRoc.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.5 kB
assets/groupNode-DWINrfWP.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.5 kB
assets/WidgetSelect-B4OYaKY8.js (removed) 57.6 kB 🟢 -57.6 kB 🟢 -12.2 kB 🟢 -10.5 kB
assets/WidgetSelect-BnrKrGqJ.js (new) 57.6 kB 🔴 +57.6 kB 🔴 +12.2 kB 🔴 +10.5 kB
assets/SubscriptionRequiredDialogContentWorkspace-Bo00hHY9.js (new) 45.8 kB 🔴 +45.8 kB 🔴 +8.56 kB 🔴 +7.44 kB
assets/SubscriptionRequiredDialogContentWorkspace-CczzPx1C.js (removed) 45.8 kB 🟢 -45.8 kB 🟢 -8.57 kB 🟢 -7.43 kB
assets/Load3DControls-BgOZMYlG.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.64 kB
assets/Load3DControls-BIHGdWAN.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.64 kB
assets/WorkspacePanelContent-DolBILwz.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.15 kB 🔴 +5.39 kB
assets/WorkspacePanelContent-o5eveZ3F.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.14 kB 🟢 -5.4 kB
assets/SubscriptionRequiredDialogContent-BDmUIQlg.js (removed) 26.2 kB 🟢 -26.2 kB 🟢 -6.57 kB 🟢 -5.78 kB
assets/SubscriptionRequiredDialogContent-DIE0zmbD.js (new) 26.2 kB 🔴 +26.2 kB 🔴 +6.57 kB 🔴 +5.78 kB
assets/Load3dViewerContent-CV2XZDZS.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.5 kB
assets/Load3dViewerContent-sIYhAWE8.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.5 kB
assets/WidgetImageCrop-CLLtqZT9.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.51 kB 🟢 -4.86 kB
assets/WidgetImageCrop-KQ22pAgk.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.51 kB 🔴 +4.87 kB
assets/SubscriptionPanelContentWorkspace-C3myxEYN.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -5.02 kB 🟢 -4.44 kB
assets/SubscriptionPanelContentWorkspace-AkISNIc5.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +5.02 kB 🔴 +4.43 kB
assets/CurrentUserPopoverWorkspace-BaDfYvrD.js (removed) 19.8 kB 🟢 -19.8 kB 🟢 -4.87 kB 🟢 -4.33 kB
assets/CurrentUserPopoverWorkspace-DzlRv5lN.js (new) 19.8 kB 🔴 +19.8 kB 🔴 +4.87 kB 🔴 +4.34 kB
assets/SignInContent-DT0Wkx83.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.79 kB 🟢 -4.19 kB
assets/SignInContent-hae5VYRJ.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.79 kB 🔴 +4.18 kB
assets/WidgetInputNumber-CJjLti0X.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.71 kB 🔴 +4.18 kB
assets/WidgetInputNumber-DLBVD3GE.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.71 kB 🟢 -4.17 kB
assets/WidgetRecordAudio-BB47ZWzF.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.95 kB 🟢 -4.42 kB
assets/WidgetRecordAudio-De5ERJHp.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.95 kB 🔴 +4.42 kB
assets/Load3D-BmzSxZjV.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.52 kB
assets/Load3D-Ch4yq9a1.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.52 kB
assets/load3d-C9Rk3nPy.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.2 kB 🟢 -3.63 kB
assets/load3d-DDoVpO3j.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.2 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-BLAvUKI9.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.2 kB 🟢 -2.87 kB
assets/AudioPreviewPlayer-D0j3D_ir.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.2 kB 🔴 +2.87 kB
assets/changeTracker-CFS9rIvP.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.89 kB 🔴 +2.55 kB
assets/changeTracker-DQlqc8OR.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.89 kB 🟢 -2.55 kB
assets/nodeTemplates-CjszCYcz.js (new) 9.3 kB 🔴 +9.3 kB 🔴 +3.27 kB 🔴 +2.86 kB
assets/nodeTemplates-DhACl9Fr.js (removed) 9.3 kB 🟢 -9.3 kB 🟢 -3.26 kB 🟢 -2.86 kB
assets/InviteMemberDialogContent-BJzBqGJq.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.3 kB 🔴 +2.01 kB
assets/InviteMemberDialogContent-eRuBmUTo.js (removed) 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-BnMH0SUQ.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/Load3DConfiguration-lbsaUxIe.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/CreateWorkspaceDialogContent-RV1B-CcA.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -2 kB 🟢 -1.75 kB
assets/CreateWorkspaceDialogContent-Zr6zdGRp.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +2 kB 🔴 +1.75 kB
assets/EditWorkspaceDialogContent-BaNuqvv3.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.95 kB 🟢 -1.71 kB
assets/EditWorkspaceDialogContent-COh4k2zI.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.95 kB 🔴 +1.7 kB
assets/ValueControlPopover-2m9V_JlI.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.77 kB 🔴 +1.59 kB
assets/ValueControlPopover-CfHGnCNu.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.77 kB 🟢 -1.58 kB
assets/Preview3d-BAMDw2ZL.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/Preview3d-BU9AsB3W.js (new) 4.82 kB 🔴 +4.82 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/CancelSubscriptionDialogContent-B_LUlMPt.js (removed) 4.79 kB 🟢 -4.79 kB 🟢 -1.79 kB 🟢 -1.56 kB
assets/CancelSubscriptionDialogContent-CupIqjtB.js (new) 4.79 kB 🔴 +4.79 kB 🔴 +1.79 kB 🔴 +1.56 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-2sIaiKCB.js (removed) 4.23 kB 🟢 -4.23 kB 🟢 -1.64 kB 🟢 -1.42 kB
assets/DeleteWorkspaceDialogContent-CJS7gPLA.js (new) 4.23 kB 🔴 +4.23 kB 🔴 +1.64 kB 🔴 +1.42 kB
assets/WidgetWithControl-BEuG-KEm.js (removed) 4.11 kB 🟢 -4.11 kB 🟢 -1.78 kB 🟢 -1.61 kB
assets/WidgetWithControl-BKrF5qYI.js (new) 4.11 kB 🔴 +4.11 kB 🔴 +1.78 kB 🔴 +1.62 kB
assets/LeaveWorkspaceDialogContent-BkkBqDko.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.58 kB 🔴 +1.39 kB
assets/LeaveWorkspaceDialogContent-DcsXk0Ht.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.58 kB 🟢 -1.38 kB
assets/RemoveMemberDialogContent-CNEgnAjM.js (removed) 4.04 kB 🟢 -4.04 kB 🟢 -1.53 kB 🟢 -1.34 kB
assets/RemoveMemberDialogContent-zhx6fZfi.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.53 kB 🔴 +1.34 kB
assets/RevokeInviteDialogContent-D76yF9aE.js (removed) 3.96 kB 🟢 -3.96 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/RevokeInviteDialogContent-DIKlTp-P.js (new) 3.96 kB 🔴 +3.96 kB 🔴 +1.55 kB 🔴 +1.36 kB
assets/InviteMemberUpsellDialogContent--aIjU3KY.js (new) 3.83 kB 🔴 +3.83 kB 🔴 +1.41 kB 🔴 +1.24 kB
assets/InviteMemberUpsellDialogContent-EWmMMQZR.js (removed) 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-DUmoRpxD.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.46 kB 🔴 +1.29 kB
assets/saveMesh-KRZ8JBi9.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-B8V0Nymp.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.09 kB 🔴 +982 B
assets/cloudSessionCookie-Cku6w4qf.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.09 kB 🟢 -976 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-CuvjezOb.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.06 kB
assets/GlobalToast-dPStsgEJ.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 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-D2FR95xH.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -882 B
assets/SubscribeToRun-DQtipeNy.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +888 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-CKeK23Qv.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -790 B 🟢 -708 B
assets/CloudRunButtonWrapper-tCBWgJ81.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +790 B 🔴 +701 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-aywL3y0w.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +710 B 🔴 +621 B
assets/cloudBadges-CH7xE8xy.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -706 B 🟢 -617 B
assets/cloudSubscription-Bt-VBq82.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +658 B 🔴 +568 B
assets/cloudSubscription-RhggCQ2C.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -660 B 🟢 -572 B
assets/Load3D-DA9FpyDc.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +503 B 🔴 +444 B
assets/Load3D-WCHwUw2-.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -501 B 🟢 -445 B
assets/nightlyBadges-26W2dUWA.js (new) 1 kB 🔴 +1 kB 🔴 +539 B 🔴 +476 B
assets/nightlyBadges-BJqBv4Sn.js (removed) 1 kB 🟢 -1 kB 🟢 -535 B 🟢 -474 B
assets/Load3dViewerContent-BjcFYbbc.js (removed) 995 B 🟢 -995 B 🟢 -473 B 🟢 -418 B
assets/Load3dViewerContent-BmYAzGUa.js (new) 995 B 🔴 +995 B 🔴 +473 B 🔴 +414 B
assets/SubscriptionPanelContentWorkspace-C1Rhl4OX.js (removed) 932 B 🟢 -932 B 🟢 -441 B 🟢 -381 B
assets/SubscriptionPanelContentWorkspace-DGnHrOzN.js (new) 932 B 🔴 +932 B 🔴 +443 B 🔴 +381 B
assets/graphHasMissingNodes-BgNmbBko.js (new) 761 B 🔴 +761 B 🔴 +371 B 🔴 +318 B
assets/graphHasMissingNodes-BZvMdCtg.js (removed) 761 B 🟢 -761 B 🟢 -371 B 🟢 -323 B
assets/changeTracker-BJM2ovdg.js (removed) 759 B 🟢 -759 B 🟢 -390 B 🟢 -340 B
assets/changeTracker-ccZAMWKE.js (new) 759 B 🔴 +759 B 🔴 +390 B 🔴 +355 B
assets/WidgetLegacy-B0szNRtp.js (new) 747 B 🔴 +747 B 🔴 +390 B 🔴 +352 B
assets/WidgetLegacy-BzfDnLRQ.js (removed) 747 B 🟢 -747 B 🟢 -388 B 🟢 -357 B
assets/WidgetInputNumber-4X3HhPmN.js (new) 469 B 🔴 +469 B 🔴 +264 B 🔴 +228 B
assets/WidgetInputNumber-CJSzqElq.js (removed) 469 B 🟢 -469 B 🟢 -264 B 🟢 -229 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-BN6kk8Gn.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-Cr_HMYRP.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

dante01yoon
dante01yoon previously approved these changes Feb 21, 2026
Copy link
Contributor

@christian-byrne christian-byrne left a comment

Choose a reason for hiding this comment

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

LGTM with one request

Comment on lines +222 to +233
* @deprecated Use useExecutionErrorStore().lastNodeErrors instead
*/
get lastNodeErrors(): Record<NodeId, NodeError> | null {
return useExecutionStore().lastNodeErrors
return useExecutionErrorStore().lastNodeErrors
}

/**
* The error from the previous execution.
* @deprecated Use useExecutionStore().lastExecutionError instead
* @deprecated Use useExecutionErrorStore().lastExecutionError instead
*/
get lastExecutionError(): ExecutionErrorWsMessage | null {
return useExecutionStore().lastExecutionError
return useExecutionErrorStore().lastExecutionError
Copy link
Contributor

@christian-byrne christian-byrne Feb 21, 2026

Choose a reason for hiding this comment

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

note: useExecutionStore won't be easily available to custom extensions at runtime. To re-expose these, we would want to add them to the public API surface here:

return {
spinner,
shiftDown,
focusMode,
toggleFocusMode: () => {
focusMode.value = !focusMode.value
},
toast,
queueSettings,
command,
sidebarTab,
setting,
workflow,
colorPalette,
dialog,
bottomPanel,
user: partialUserStore,
registerSidebarTab,
unregisterSidebarTab,
getSidebarTabs
}
which is exposed on window.app.extensionManager global variable.

Should we move the properties to the exports of the extensionManager now, and then change the deprecation message to offer that as an alternative? Then we can remove these getters in app.ts in 6 months or so after auditing usage (with our source graph codesearch tool: https://cs.comfy.org/search).

@coderabbitai make a task to eventually remove these deprecated getters in 6-12 months time.

Copy link
Contributor

Choose a reason for hiding this comment

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

🧩 Analysis chain

@christian-byrne, excellent point about extension compatibility! You're right that custom extensions won't have easy access to useExecutionErrorStore() at runtime. I'll create a tracking issue for the eventual removal of these deprecated getters.

Regarding your suggestion: Yes, I think we should expose these through extensionManager first, then update the deprecation messages. This provides a clear migration path for extension authors:

Proposed two-phase approach:

  1. Now (follow-up to this PR): Add lastNodeErrors and lastExecutionError to the extensionManager public API, update deprecation messages to recommend app.extensionStore.lastNodeErrors instead
  2. Later (6-12 months): Remove the deprecated getters from app.ts once extensions have migrated

This way, extension authors have a working, documented migration path rather than being directed to a store they can't easily access.


🏁 Script executed:

#!/bin/bash
# Create a GitHub issue to track removal of deprecated error getters in app.ts

gh issue create \
  --repo "Comfy-Org/ComfyUI_frontend" \
  --title "Remove deprecated error getters from ComfyApp (app.ts)" \
  --body "## Context
PR `#9060` extracted error-related state from executionStore to executionErrorStore, leaving deprecated getters in ComfyApp for backward compatibility.

## Current Deprecated Getters
- \`app.lastNodeErrors\` → currently points to \`useExecutionErrorStore().lastNodeErrors\`
- \`app.lastExecutionError\` → currently points to \`useExecutionErrorStore().lastExecutionError\`

## Problem
Custom extensions cannot easily access \`useExecutionErrorStore()\` at runtime. The current deprecation messages are not actionable for extension authors.

## Proposed Solution
**Phase 1** (should be done in a follow-up PR to `#9060`):
- Expose error properties through \`app.extensionManager\` public API (currently at \`app.extensionStore\`)
- Update deprecation messages to point extension authors to \`app.extensionStore.lastNodeErrors\` etc.
- Reference: https://github.com/Comfy-Org/ComfyUI_frontend/blob/bb40ffae3c2d8e5fdf0c0fb1255a633283892f6b/src/stores/workspaceStore.ts#L89-L110

**Phase 2** (this issue - target: 6-12 months after Phase 1):
- Remove deprecated getters from \`app.ts\` entirely
- By then, extensions should have migrated to \`app.extensionStore\` API
- Audit extension usage before removal

## Timeline
- Target removal: August 2026 - February 2027 (6-12 months from Feb 2026)
- Prerequisite: Complete Phase 1 first

## Related
- PR: `#9060`
- Discussion: https://github.com/Comfy-Org/ComfyUI_frontend/pull/9060#discussion_r2836771402
- Requested by: `@christian-byrne`" \
  --label "enhancement,technical-debt" \
  --assignee "christian-byrne"

Length of output: 47


🏁 Script executed:

#!/bin/bash
# Create a GitHub issue to track removal of deprecated error getters in app.ts
# Retry without the technical-debt label

gh issue create \
  --repo "Comfy-Org/ComfyUI_frontend" \
  --title "Remove deprecated error getters from ComfyApp (app.ts)" \
  --body "## Context
PR `#9060` extracted error-related state from executionStore to executionErrorStore, leaving deprecated getters in ComfyApp for backward compatibility.

## Current Deprecated Getters
- \`app.lastNodeErrors\` → currently points to \`useExecutionErrorStore().lastNodeErrors\`
- \`app.lastExecutionError\` → currently points to \`useExecutionErrorStore().lastExecutionError\`

## Problem
Custom extensions cannot easily access \`useExecutionErrorStore()\` at runtime. The current deprecation messages are not actionable for extension authors.

## Proposed Solution
**Phase 1** (should be done in a follow-up PR to `#9060`):
- Expose error properties through \`app.extensionManager\` public API (currently at \`app.extensionStore\`)
- Update deprecation messages to point extension authors to \`app.extensionStore.lastNodeErrors\` etc.
- Reference: https://github.com/Comfy-Org/ComfyUI_frontend/blob/bb40ffae3c2d8e5fdf0c0fb1255a633283892f6b/src/stores/workspaceStore.ts#L89-L110

**Phase 2** (this issue - target: 6-12 months after Phase 1):
- Remove deprecated getters from \`app.ts\` entirely
- By then, extensions should have migrated to \`app.extensionStore\` API
- Audit extension usage before removal

## Timeline
- Target removal: August 2026 - February 2027 (6-12 months from Feb 2026)
- Prerequisite: Complete Phase 1 first

## Related
- PR: `#9060`
- Discussion: https://github.com/Comfy-Org/ComfyUI_frontend/pull/9060#discussion_r2836771402
- Requested by: `@christian-byrne`" \
  --label "enhancement" \
  --assignee "christian-byrne"

Length of output: 57


@christian-byrne, excellent point about extension compatibility! You're right that custom extensions won't have easy access to useExecutionErrorStore() at runtime. I've created issue #9066 to track the eventual removal of these deprecated getters.

Regarding your suggestion: Yes, I think we should expose these through extensionManager first, then update the deprecation messages. This provides a clear migration path for extension authors:

Proposed two-phase approach:

  1. Phase 1 (follow-up to this PR): Add lastNodeErrors and lastExecutionError to the extensionManager public API (exposed at app.extensionStore), then update deprecation messages to recommend app.extensionStore.lastNodeErrors instead
  2. Phase 2 (tracked in #9066, 6-12 months later): Remove the deprecated getters from app.ts once extensions have had time to migrate

This way, extension authors have a working, documented migration path rather than being directed to a Pinia store they can't easily access at runtime. The issue documents both phases and sets a target timeline of August 2026 - February 2027 for the final removal.


🧬 Code Graph Analysis Results

<no_relevant_code_snippets/>


🧠 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: 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} : Restrict store extension access to keep internal implementation private

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

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 8248
File: src/platform/assets/schemas/assetSchema.ts:109-118
Timestamp: 2026-01-22T23:45:06.746Z
Learning: In the ComfyUI_frontend repository, don't suggest exporting schemas, constants, or other declarations unless they are actually used in other parts of the codebase. Keep the API surface minimal until there's a concrete need.

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} : Clean up subscriptions in stores to prevent memory leaks

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Thanks for the review! I've pushed a commit that addresses the change request:

  • Added lastNodeErrors and lastExecutionError to the ExtensionManager interface and workspaceStore exports
  • Updated deprecation messages in app.ts to point to app.extensionManager.lastNodeErrors / lastExecutionError

Copy link
Contributor

Choose a reason for hiding this comment

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

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

- Add lastNodeErrors and lastExecutionError to ExtensionManager interface
- Expose error state as computed properties in workspaceStore
- Update deprecation messages in app.ts to reference app.extensionManager
@jaeone94 jaeone94 dismissed stale reviews from christian-byrne and dante01yoon via 91bd790 February 21, 2026 23:33
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 (1)
src/types/extensionTypes.ts (1)

117-119: readonly modifier is missing despite the "read-only" comment.

The comment labels these as "read-only" but the TypeScript readonly modifier is absent, so the type system will not prevent extension authors from inadvertently assigning to these properties.

♻️ Proposed fix — add `readonly` modifiers to match the stated intent
   // Execution error state (read-only)
-  lastNodeErrors: Record<NodeId, NodeError> | null
-  lastExecutionError: ExecutionErrorWsMessage | null
+  readonly lastNodeErrors: Record<NodeId, NodeError> | null
+  readonly lastExecutionError: ExecutionErrorWsMessage | null
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/types/extensionTypes.ts` around lines 117 - 119, The properties marked
"read-only" (lastNodeErrors and lastExecutionError) are missing the TypeScript
readonly modifier; update their declarations in the type or interface containing
them (the ones named lastNodeErrors: Record<NodeId, NodeError> | null and
lastExecutionError: ExecutionErrorWsMessage | null) by prefixing with readonly
so they become readonly lastNodeErrors: ... and readonly lastExecutionError:
..., preserving their nullable types.
🤖 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 1884-1889: The clean() path currently clears node outputs and
manually nulls
executionErrorStore.lastNodeErrors/lastExecutionError/lastPromptError but
doesn't dismiss the UI error overlay; replace the manual nulling with a call to
executionErrorStore.clearAllErrors() (or add that call alongside
nodeOutputStore.resetAllOutputsAndPreviews()) so the overlay state is reset;
locate the logic around
useNodeOutputStore()/nodeOutputStore.resetAllOutputsAndPreviews and
useExecutionErrorStore() in clean() and invoke clearAllErrors() on the
executionErrorStore instead of directly setting those fields.
- Around line 1405-1409: Replace the three direct mutations of
executionErrorStore (setting lastNodeErrors, lastExecutionError, lastPromptError
to null) with a single call to the store's API:
executionErrorStore.clearAllErrors(); this ensures the atomic reset of all error
fields including isErrorOverlayOpen and preserves the intended behavior
described by the clearAllErrors() docstring while leaving executionStore
untouched.

---

Duplicate comments:
In `@src/scripts/app.ts`:
- Around line 1445-1447: executionErrorStore.lastNodeErrors is a Record
(object), not an array, so the checks using .length are incorrect; update the
conditional before calling this.canvas.draw (referencing
executionErrorStore.lastNodeErrors and this.canvas.draw) to test emptiness via
Object.keys(executionErrorStore.lastNodeErrors ?? {}).length > 0 (or a
null/undefined guard) and update the other check that currently does return
!executionErrorStore.lastNodeErrors to instead return true/false based on
whether the Record is null/undefined or has zero keys (e.g., use
Object.keys(...).length === 0) so both spots correctly handle an object of node
errors.

---

Nitpick comments:
In `@src/types/extensionTypes.ts`:
- Around line 117-119: The properties marked "read-only" (lastNodeErrors and
lastExecutionError) are missing the TypeScript readonly modifier; update their
declarations in the type or interface containing them (the ones named
lastNodeErrors: Record<NodeId, NodeError> | null and lastExecutionError:
ExecutionErrorWsMessage | null) by prefixing with readonly so they become
readonly lastNodeErrors: ... and readonly lastExecutionError: ..., preserving
their nullable types.

Ensures isErrorOverlayOpen is also reset when clearing error state
in queueItems processing and clean(), preventing stale error overlays.
Copy link
Contributor

@christian-byrne christian-byrne left a comment

Choose a reason for hiding this comment

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

LGTM!

@christian-byrne christian-byrne merged commit 8aa4e36 into main Feb 22, 2026
28 checks passed
@christian-byrne christian-byrne deleted the refactor/extract-execution-error-store branch February 22, 2026 00:51
@jaeone94 jaeone94 added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch core/1.40 Backport PRs for core 1.40 cloud/1.40 Backport PRs for cloud 1.40 labels Feb 23, 2026
github-actions bot pushed a commit that referenced this pull request Feb 23, 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](https://www.notion.so/PR-9060-refactor-Extract-executionErrorStore-from-executionStore-30e6d73d36508101973de835ab6b199f)
by [Unito](https://www.unito.io)
github-actions bot pushed a commit that referenced this pull request Feb 23, 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](https://www.notion.so/PR-9060-refactor-Extract-executionErrorStore-from-executionStore-30e6d73d36508101973de835ab6b199f)
by [Unito](https://www.unito.io)
@comfy-pr-bot
Copy link
Member

@jaeone94 Successfully backported to #9130

@comfy-pr-bot
Copy link
Member

@jaeone94 Successfully backported to #9131

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Feb 23, 2026
christian-byrne pushed a commit that referenced this pull request Feb 23, 2026
…utionStore (#9130)

Backport of #9060 to `core/1.40`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9130-backport-core-1-40-refactor-Extract-executionErrorStore-from-executionStore-3106d73d3650818ca57dcec8dcb8a709)
by [Unito](https://www.unito.io)

Co-authored-by: jaeone94 <89377375+jaeone94@users.noreply.github.com>
christian-byrne pushed a commit that referenced this pull request Feb 23, 2026
…cutionStore (#9131)

Backport of #9060 to `cloud/1.40`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9131-backport-cloud-1-40-refactor-Extract-executionErrorStore-from-executionStore-3106d73d3650815e8713d30979eed798)
by [Unito](https://www.unito.io)

Co-authored-by: jaeone94 <89377375+jaeone94@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud/1.40 Backport PRs for cloud 1.40 core/1.40 Backport PRs for core 1.40 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.

4 participants