Skip to content

[feat] Add Storybook stories for Error Tab missing assets UX#8988

Closed
jaeone94 wants to merge 9 commits intomainfrom
feat/missing-assets-storybook
Closed

[feat] Add Storybook stories for Error Tab missing assets UX#8988
jaeone94 wants to merge 9 commits intomainfrom
feat/missing-assets-storybook

Conversation

@jaeone94
Copy link
Collaborator

@jaeone94 jaeone94 commented Feb 19, 2026

Summary

Adds 7 Storybook stories for the Error Tab to collect design feedback on missing node pack and missing model UX flows across OSS and Cloud environments.

Changes

  • What: New TabErrors.stories.ts with stories covering [Local OSS] missing node packs (tab-only + full layout flow), [Cloud] missing node packs, [Local OSS] missing models, [Cloud] missing models (basic + with model type selector). Each scenario backed by a dedicated mock Vue component under __stories__/.
  • Note: eslint.config.ts is modified solely to suppress lint errors within Storybook mock files.

Review Focus

  • Mock components are self-contained UI-only fixtures for Storybook — no real store/API wiring
  • Stories are intended for design review of the missing assets error tab layout; feedback is welcome

Intent

This is a draft PR for design feedback only and will not be merged. Once the final design is confirmed, the mock components will be discarded and the feature will be fully reimplemented using real components.

┆Issue is synchronized with this Notion page by Unito

Screenshots

image image image image

jaeone94 and others added 9 commits February 18, 2026 17:09
…erlay

- Remove TabError.vue; consolidate all error display into TabErrors.vue and
  remove the separate 'error' tab type from rightSidePanelStore
- Single-node selection mode: regroup errors by message instead of class_type
  and render ErrorNodeCard in compact mode (hiding redundant header/message)
- Container node support: detect internal errors in subgraph/group nodes by
  matching execution ID prefixes against selected container node IDs
- SectionWidgets: show error badge and 'See Error' button for subgraph/group
  nodes that contain child-node errors, navigating directly to the errors tab
- Add ErrorOverlay component: floating card after execution failure showing a
  deduplicated error summary with 'Dismiss' and 'See Errors' actions;
  'See Errors' deselects all nodes and opens Errors tab in overview mode
- Add isErrorOverlayOpen, showErrorOverlay, dismissErrorOverlay to
  executionStore; reset overlay state on execution_start
- Add allErrorExecutionIds computed to executionStore to centralize
  error ID collection from lastNodeErrors and lastExecutionError
- Add hasInternalErrorForNode helper to executionStore to
  encapsulate prefix-based container error detection
- Replace duplicated error ID collection and prefix checks in
  RightSidePanel and SectionWidgets with store computed/helper
- Split errorGroups into allErrorGroups (unfiltered) and
  tabErrorGroups (selection-filtered) in useErrorGroups
- Add filterBySelection param (default: false) to
  addNodeErrorToGroup, processNodeErrors, processExecutionError
- Add groupedErrorMessages computed derived from allErrorGroups
  for deduped message list used by ErrorOverlay
- Migrate ErrorOverlay business logic to useErrorGroups composable,
  removing inline groupedErrors computed and redundant totalErrorCount wrapper
…ed by reset

- Replace :class='cn('...')' with static class and remove unused cn import
  in ErrorOverlay
- Fix prompt-only cloud validation errors being wiped by resetExecutionState
  by capturing the error before reset and applying it after
- Replace isEmpty(node_id) with explicit presence check to prevent
  numeric node IDs from being misclassified as service-level errors
- Guard exception_type in message template to avoid 'null: ...' output
  when exception_type is absent
- Remove unused isEmpty import from es-toolkit/compat
…ErrorExecutionIds

- Add lastNodeErrors.value = null in handleExecutionStart to prevent
  stale node errors from persisting into the next execution
- Guard against null/undefined node_id before pushing to allErrorExecutionIds
This commit adds 7 comprehensive Storybook stories for the error tab to
collect design feedback.
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 19, 2026

📝 Walkthrough

Walkthrough

This PR implements a comprehensive error overlay system that adds a floating error display panel, refactors error grouping and navigation logic, introduces enhanced error state management, and includes multiple Storybook story components for testing error workflows. Configuration updates exempt Storybook stories from i18n validation.

Changes

Cohort / File(s) Summary
Configuration
eslint.config.ts
Added ESLint override for Storybook mock components in __stories__ folders to disable i18n and Vue property usage checks.
Error Overlay Feature
src/components/error/ErrorOverlay.vue, src/components/TopMenuSection.vue
Introduced new ErrorOverlay component with visibility toggling, error count display, grouped error messages, and dismiss/see errors actions. Imported and rendered in TopMenuSection.
Right Side Panel Refactoring
src/components/rightSidePanel/RightSidePanel.vue
Replaced per-node error aggregation with nuanced error determination (hasDirectNodeError, hasContainerInternalError, hasRelevantErrors); refactored tab visibility and content rendering logic; removed TabError usage.
Error Tab Removal
src/components/rightSidePanel/TabError.vue
Removed entire TabError component; error display now consolidated into ErrorOverlay and enhanced TabErrors component.
Error Display Components
src/components/rightSidePanel/errors/ErrorNodeCard.vue, src/components/rightSidePanel/errors/TabErrors.vue
Added compact mode prop to ErrorNodeCard for header/message visibility toggling; replaced event emissions with internal handlers (handleLocateNode, handleEnterSubgraph); updated TabErrors to use new handlers and pass errorNodeCache for navigation.
Error Grouping Logic
src/components/rightSidePanel/errors/useErrorGroups.ts
Comprehensive refactoring: replaced static errorGroups with selection-aware multiple groupings (allErrorGroups, tabErrorGroups, filteredGroups); added error caching (errorNodeCache), single-node mode detection (isSingleNodeSelected), and group expansion logic; modularized error processing via createErrorCard, regroupByErrorMessage, and per-error-type handlers.
Canvas & Node Navigation
src/composables/canvas/useFocusNode.ts, src/renderer/extensions/vueNodes/components/LGraphNode.vue
Enhanced focusNode and enterSubgraph to accept optional executionIdMap parameter for faster node lookup; added group node detection to navigate to parent graph before focusing; updated error button visibility in LGraphNode to respect ShowErrorsTab setting.
Store & State Management
src/stores/executionStore.ts, src/stores/workspace/rightSidePanelStore.ts
Added CloudValidationError parsing and error overlay state management (showErrorOverlay, dismissErrorOverlay, isErrorOverlayOpen); expanded error tracking with allErrorExecutionIds, totalErrorCount, and hasInternalErrorForNode; removed 'error' tab from RightSidePanelTab union type.
Error Handling Flow
src/scripts/app.ts, src/components/rightSidePanel/parameters/SectionWidgets.vue
Reworked execution error paths to display error overlay instead of opening errors panel when ShowErrorsTab is enabled; updated error checking in SectionWidgets to detect container-level internal errors.
Storybook Story Components
src/components/rightSidePanel/errors/TabErrors.stories.ts, src/components/rightSidePanel/errors/__stories__/*
Added comprehensive test stories (6 stories covering OSS/Cloud workflows with missing node packs and models) and 5 mock components (MockCloudMissingModel/Basic, MockCloudMissingNodePack, MockManagerDialog, MockOSSMissingModel/NodePack, StoryOSSMissingNodePackFlow) simulating interactive error and model import flows with state management and animations.
Localization
src/locales/en/main.json
Added Error System settings category, error messages (executionErrorOccurred, contactSupportFailed), and errorOverlay keys (errorCount with pluralization, seeErrors).

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

  • Feat/errors tab panel #8807 — Directly related error UI feature work involving RightSidePanel errors tab, error components, and error store management.

Suggested labels

size:XXL

Suggested reviewers

  • viva-jinyi
  • AustinMroz
  • christian-byrne

Poem

🐰 Whiskers twitch with joy so bright,
Error overlay shines in the night,
Groups and cache and stores align,
Navigation flows so fine!
Stories test each flow and dance,
Comfy's errors get their chance! 🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.29% 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 clearly and specifically describes the main change: adding Storybook stories for Error Tab missing assets UX flows.
Description check ✅ Passed The description includes a summary, detailed changes, review focus, and clearly states the draft/design-feedback intent. It meets the template structure with meaningful content.

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

✨ Finishing Touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/missing-assets-storybook

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

Playwright: ✅ 510 passed, 0 failed · 8 flaky

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

@github-actions
Copy link

github-actions bot commented Feb 19, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/19/2026, 04:48:31 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

Bundle Size Report

Summary

  • Raw size: 20 MB baseline 20 MB — 🔴 +10.7 kB
  • Gzip: 4.28 MB baseline 4.28 MB — 🔴 +2.85 kB
  • Brotli: 3.32 MB baseline 3.32 MB — 🔴 +1.63 kB
  • Bundles: 232 current • 232 baseline • 117 added / 117 removed

Category Glance
Graph Workspace 🔴 +7.31 kB (921 kB) · Data & Services 🔴 +3.12 kB (2.17 MB) · Other 🔴 +302 B (7.45 MB) · Utilities & Hooks 🔴 +1 B (237 kB) · Vendor & Third-Party ⚪ 0 B (8.69 MB) · Panels & Settings ⚪ 0 B (430 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-4bDiRuYv.js (removed) 21.7 kB 🟢 -21.7 kB 🟢 -7.05 kB 🟢 -6.13 kB
assets/index-DwoAhYdP.js (new) 21.7 kB 🔴 +21.7 kB 🔴 +7.06 kB 🔴 +6.14 kB

Status: 1 added / 1 removed

Graph Workspace — 921 kB (baseline 914 kB) • 🔴 +7.31 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BPyb5tLs.js (new) 921 kB 🔴 +921 kB 🔴 +198 kB 🔴 +150 kB
assets/GraphView-ByzsX8Kt.js (removed) 914 kB 🟢 -914 kB 🟢 -196 kB 🟢 -149 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CmpZ73HU.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.82 kB
assets/CloudSurveyView-CRJc5dgj.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.31 kB 🟢 -2.83 kB
assets/CloudLoginView-BfYhGclQ.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.95 kB 🟢 -2.59 kB
assets/CloudLoginView-IMiUZQ-N.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.95 kB 🔴 +2.59 kB
assets/UserCheckView-Cf53O0jm.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.23 kB 🟢 -1.95 kB
assets/UserCheckView-DkJ_ZyiT.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/CloudSignupView-DFocg3ap.js (removed) 7.46 kB 🟢 -7.46 kB 🟢 -2.34 kB 🟢 -2.05 kB
assets/CloudSignupView-o_RRcaAO.js (new) 7.46 kB 🔴 +7.46 kB 🔴 +2.34 kB 🔴 +2.05 kB
assets/CloudLayoutView-C0ix5CRI.js (new) 6.48 kB 🔴 +6.48 kB 🔴 +2.12 kB 🔴 +1.85 kB
assets/CloudLayoutView-CTko2kfe.js (removed) 6.48 kB 🟢 -6.48 kB 🟢 -2.12 kB 🟢 -1.88 kB
assets/CloudForgotPasswordView-DuzR00MC.js (removed) 5.61 kB 🟢 -5.61 kB 🟢 -1.95 kB 🟢 -1.75 kB
assets/CloudForgotPasswordView-fnNybsS6.js (new) 5.61 kB 🔴 +5.61 kB 🔴 +1.95 kB 🔴 +1.73 kB
assets/CloudAuthTimeoutView-BTe9-S_P.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.79 kB 🟢 -1.57 kB
assets/CloudAuthTimeoutView-fkYVBlF9.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/CloudSubscriptionRedirectView-116t3nvX.js (removed) 4.76 kB 🟢 -4.76 kB 🟢 -1.8 kB 🟢 -1.58 kB
assets/CloudSubscriptionRedirectView-BBQBy7ja.js (new) 4.76 kB 🔴 +4.76 kB 🔴 +1.8 kB 🔴 +1.59 kB
assets/UserSelectView-Cnyayjey.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.47 kB
assets/UserSelectView-D2EWtde3.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.47 kB
assets/CloudSorryContactSupportView-Dopf9g6e.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-BfEfWBGo.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-COzgF2im.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.3 kB 🔴 +4.64 kB
assets/SecretsPanel-CXVoGDro.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.64 kB
assets/LegacyCreditsPanel-BLOaz89m.js (removed) 20.7 kB 🟢 -20.7 kB 🟢 -5.58 kB 🟢 -4.92 kB
assets/LegacyCreditsPanel-DH4gyJ52.js (new) 20.7 kB 🔴 +20.7 kB 🔴 +5.59 kB 🔴 +4.91 kB
assets/SubscriptionPanel-BKq3LrDp.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.73 kB 🔴 +4.17 kB
assets/SubscriptionPanel-DnU5GzfM.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.73 kB 🟢 -4.18 kB
assets/KeybindingPanel-BhJdgVgt.js (new) 12.4 kB 🔴 +12.4 kB 🔴 +3.59 kB 🔴 +3.19 kB
assets/KeybindingPanel-JG6li_TP.js (removed) 12.4 kB 🟢 -12.4 kB 🟢 -3.59 kB 🟢 -3.17 kB
assets/ExtensionPanel-BTxXdlqt.js (new) 9.43 kB 🔴 +9.43 kB 🔴 +2.67 kB 🔴 +2.38 kB
assets/ExtensionPanel-CxNLjTri.js (removed) 9.43 kB 🟢 -9.43 kB 🟢 -2.67 kB 🟢 -2.38 kB
assets/AboutPanel-B-7H7EY1.js (new) 8.53 kB 🔴 +8.53 kB 🔴 +2.44 kB 🔴 +2.2 kB
assets/AboutPanel-D0YYs6VE.js (removed) 8.53 kB 🟢 -8.53 kB 🟢 -2.44 kB 🟢 -2.2 kB
assets/ServerConfigPanel-BDI0MF5v.js (new) 6.5 kB 🔴 +6.5 kB 🔴 +2.13 kB 🔴 +1.92 kB
assets/ServerConfigPanel-N6RXc1RO.js (removed) 6.5 kB 🟢 -6.5 kB 🟢 -2.13 kB 🟢 -1.9 kB
assets/UserPanel-ByVUSJiQ.js (new) 6.21 kB 🔴 +6.21 kB 🔴 +2.02 kB 🔴 +1.77 kB
assets/UserPanel-DRWAYKte.js (removed) 6.21 kB 🟢 -6.21 kB 🟢 -2.01 kB 🟢 -1.76 kB
assets/cloudRemoteConfig-BXyptDMi.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -729 B 🟢 -630 B
assets/cloudRemoteConfig-lcEX4uRE.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +731 B 🔴 +626 B
assets/refreshRemoteConfig-CmQEVRb6.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -521 B 🟢 -462 B
assets/refreshRemoteConfig-qBr94Z7c.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +522 B 🔴 +472 B
assets/config-DVXhTcN-.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BdC30R3n.js 23.6 kB 23.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bl6OADKm.js 28.4 kB 28.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C16FMmHQ.js 38 kB 38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CGtbLe_V.js 27.6 kB 27.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-ChhtiO5P.js 27.4 kB 27.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CtdYHbe4.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CUDlxYNz.js 32 kB 32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DrlmpX0N.js 33.7 kB 33.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dzns-DGL.js 30.1 kB 30.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-fF_gBqEs.js 28.4 kB 28.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-q4NHzNGR.js 29.5 kB 29.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BpFrAMQZ.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -985 B
assets/auth-BS0f2M-D.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +986 B
assets/SignUpForm-Cu1uoCTC.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/SignUpForm-CXQrYS7C.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.1 kB
assets/UpdatePasswordContent-6AxkMF__.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.09 kB 🔴 +964 B
assets/UpdatePasswordContent-q51lM9j5.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.09 kB 🟢 -961 B
assets/firebaseAuthStore-BbNBoDsC.js (removed) 837 B 🟢 -837 B 🟢 -406 B 🟢 -370 B
assets/firebaseAuthStore-CpQXXish.js (new) 837 B 🔴 +837 B 🔴 +408 B 🔴 +360 B
assets/auth-BfikyXG0.js (removed) 357 B 🟢 -357 B 🟢 -223 B 🟢 -218 B
assets/auth-TSBzOL92.js (new) 357 B 🔴 +357 B 🔴 +225 B 🔴 +217 B
assets/PasswordFields-BMKNUiV3.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-Cnfc3ZO2.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-0MyHjefl.js (removed) 785 B 🟢 -785 B 🟢 -396 B 🟢 -349 B
assets/useSubscriptionDialog-Dylssi_U.js (new) 785 B 🔴 +785 B 🔴 +401 B 🔴 +347 B

Status: 1 added / 1 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-CEiucTUa.js (new) 9.89 kB 🔴 +9.89 kB 🔴 +3.42 kB 🔴 +3.01 kB
assets/useTerminalTabs-D2KQEBlW.js (removed) 9.89 kB 🟢 -9.89 kB 🟢 -3.42 kB 🟢 -3.01 kB
assets/ComfyQueueButton-Dp6hj-W6.js (removed) 7.17 kB 🟢 -7.17 kB 🟢 -2.32 kB 🟢 -2.07 kB
assets/ComfyQueueButton-eI6PhfZw.js (new) 7.17 kB 🔴 +7.17 kB 🔴 +2.32 kB 🔴 +2.07 kB
assets/SubscribeButton-CJSyJD29.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.02 kB 🟢 -888 B
assets/SubscribeButton-DMepV3Sl.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.02 kB 🔴 +888 B
assets/cloudFeedbackTopbarButton-B8Azqadv.js (removed) 1.64 kB 🟢 -1.64 kB 🟢 -874 B 🟢 -777 B
assets/cloudFeedbackTopbarButton-C5j5AePt.js (new) 1.64 kB 🔴 +1.64 kB 🔴 +879 B 🔴 +780 B
assets/ComfyQueueButton-DfYQ0-43.js (removed) 842 B 🟢 -842 B 🟢 -410 B 🟢 -366 B
assets/ComfyQueueButton-FtmNINnY.js (new) 842 B 🔴 +842 B 🔴 +414 B 🔴 +369 B
assets/Button-BSbVSHEC.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge---rkZbzE.js 1.24 kB 1.24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-WfbEdKCZ.js 5.96 kB 5.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-DPkSREWG.js 7.45 kB 7.45 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-5-MljvF0.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-BQtllWqj.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.17 MB (baseline 2.17 MB) • 🔴 +3.12 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-DuYKZn0W.js (new) 1.39 MB 🔴 +1.39 MB 🔴 +313 kB 🔴 +241 kB
assets/dialogService-Ba4dE3MV.js (removed) 1.39 MB 🟢 -1.39 MB 🟢 -313 kB 🟢 -241 kB
assets/api-B0uof-rH.js (removed) 648 kB 🟢 -648 kB 🟢 -146 kB 🟢 -117 kB
assets/api-BTmmQuoS.js (new) 648 kB 🔴 +648 kB 🔴 +146 kB 🔴 +117 kB
assets/load3dService-BhI2-HoJ.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-CulY76XG.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/systemStatsStore-AcY0PwvT.js (new) 12.2 kB 🔴 +12.2 kB 🔴 +4.26 kB 🔴 +3.74 kB
assets/systemStatsStore-TAZ-CWW-.js (removed) 12.2 kB 🟢 -12.2 kB 🟢 -4.26 kB 🟢 -3.74 kB
assets/releaseStore-B5Oe_siQ.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/releaseStore-XfPkzVoW.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.96 kB
assets/keybindingService--hfbTjqc.js (removed) 6.57 kB 🟢 -6.57 kB 🟢 -1.72 kB 🟢 -1.49 kB
assets/keybindingService-YrJPygCz.js (new) 6.57 kB 🔴 +6.57 kB 🔴 +1.72 kB 🔴 +1.49 kB
assets/bootstrapStore-5pDYoXBS.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -873 B 🟢 -794 B
assets/bootstrapStore-Bkk2Y8z7.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +870 B 🔴 +791 B
assets/userStore-CSA3uYVO.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -718 B 🟢 -633 B
assets/userStore-D-vaM1dR.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +717 B 🔴 +636 B
assets/audioService-B4iz-NSg.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +846 B 🔴 +726 B
assets/audioService-CgA5CTAF.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -846 B 🟢 -724 B
assets/releaseStore-7ILBCV6p.js (removed) 809 B 🟢 -809 B 🟢 -401 B 🟢 -361 B
assets/releaseStore-QX8MYZHW.js (new) 809 B 🔴 +809 B 🔴 +406 B 🔴 +357 B
assets/settingStore-BARr12cs.js (new) 793 B 🔴 +793 B 🔴 +407 B 🔴 +352 B
assets/settingStore-D-T52k2Q.js (removed) 793 B 🟢 -793 B 🟢 -403 B 🟢 -358 B
assets/workflowDraftStore-CEX8Tn2i.js (removed) 785 B 🟢 -785 B 🟢 -396 B 🟢 -354 B
assets/workflowDraftStore-GAUK3FCY.js (new) 785 B 🔴 +785 B 🔴 +400 B 🔴 +351 B
assets/dialogService-DSTjqNQw.js (removed) 774 B 🟢 -774 B 🟢 -388 B 🟢 -350 B
assets/dialogService-PJMNNcDv.js (new) 774 B 🔴 +774 B 🔴 +393 B 🔴 +344 B
assets/dialogStore-DqEczCra.js 4.1 kB 4.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-xj2wiTkX.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

Utilities & Hooks — 237 kB (baseline 237 kB) • 🔴 +1 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-D5aLOExa.js (new) 178 kB 🔴 +178 kB 🔴 +39.4 kB 🔴 +32.8 kB
assets/useConflictDetection-CtV6uE9A.js (removed) 178 kB 🟢 -178 kB 🟢 -39.4 kB 🟢 -32.8 kB
assets/useLoad3d-BKalQGst.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.2 kB
assets/useLoad3d-BZ6JUI-H.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3dViewer-BJPwqAMl.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.79 kB
assets/useLoad3dViewer-CIKpM8xn.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.79 kB
assets/useFeatureFlags-B_xWDWxP.js (new) 3.5 kB 🔴 +3.5 kB 🔴 +1.08 kB 🔴 +933 B
assets/useFeatureFlags-X17oFlZe.js (removed) 3.5 kB 🟢 -3.5 kB 🟢 -1.08 kB 🟢 -925 B
assets/useWorkspaceUI-BMhMaF2P.js (removed) 3 kB 🟢 -3 kB 🟢 -822 B 🟢 -704 B
assets/useWorkspaceUI-DC9ddc1b.js (new) 3 kB 🔴 +3 kB 🔴 +822 B 🔴 +701 B
assets/useSubscriptionCredits-BrGramyw.js (new) 2.75 kB 🔴 +2.75 kB 🔴 +1.04 kB 🔴 +905 B
assets/useSubscriptionCredits-Zmqsnkgf.js (removed) 2.75 kB 🟢 -2.75 kB 🟢 -1.04 kB 🟢 -902 B
assets/subscriptionCheckoutUtil-BvCGAaZn.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -955 B
assets/subscriptionCheckoutUtil-CjKp5B72.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +953 B
assets/useExternalLink-Bf-K0qvM.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +774 B 🔴 +680 B
assets/useExternalLink-D3e-bVsc.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -773 B 🟢 -678 B
assets/useCopyToClipboard-CMqJfgTc.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +668 B 🔴 +567 B
assets/useCopyToClipboard-DCZrNTR0.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -670 B 🟢 -563 B
assets/useErrorHandling-DT4VHO3W.js (removed) 1.47 kB 🟢 -1.47 kB 🟢 -612 B 🟢 -517 B
assets/useErrorHandling-XzzTS9IB.js (new) 1.47 kB 🔴 +1.47 kB 🔴 +611 B 🔴 +517 B
assets/useWorkspaceSwitch-BaOmErPq.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +545 B 🔴 +477 B
assets/useWorkspaceSwitch-DlzZja5J.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -547 B 🟢 -480 B
assets/useLoad3d-CtOOTVXi.js (removed) 908 B 🟢 -908 B 🟢 -441 B 🟢 -398 B
assets/useLoad3d-DzLv8eWN.js (new) 908 B 🔴 +908 B 🔴 +444 B 🔴 +394 B
assets/useLoad3dViewer-BfpdZG7D.js (new) 887 B 🔴 +887 B 🔴 +431 B 🔴 +384 B
assets/useLoad3dViewer-pn0uoCZA.js (removed) 887 B 🟢 -887 B 🟢 -426 B 🟢 -390 B
assets/audioUtils-D33gh8IF.js (new) 858 B 🔴 +858 B 🔴 +501 B 🔴 +406 B
assets/audioUtils-DCo9ZHRf.js (removed) 858 B 🟢 -858 B 🟢 -502 B 🟢 -401 B
assets/useCurrentUser-7dKghQZr.js (new) 771 B 🔴 +771 B 🔴 +394 B 🔴 +342 B
assets/useCurrentUser-B8ago_mI.js (removed) 771 B 🟢 -771 B 🟢 -391 B 🟢 -351 B
assets/_plugin-vue_export-helper-BYZQdlgo.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-CZQOOTdR.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-C9Y4v_FL.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-Dct6u2-O.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-CsnHjXS0.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 15 added / 15 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-C4mPrLmU.js 70.3 kB 70.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-l-KY-tZQ.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-cR3vmlFu.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-oliHT-H5.js 102 kB 102 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-DIFkoP9Z.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-CbtWAzOu.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-DAi_xVZa.js 255 kB 255 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-ueviNA60.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-DN5cees9.js 625 kB 625 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-BjA-tjXK.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-DcEOrMQz.js 112 kB 112 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-Co8jWZ4q.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
Other — 7.45 MB (baseline 7.45 MB) • 🔴 +302 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-LjzHWu3n.js (new) 506 kB 🔴 +506 kB 🔴 +96.9 kB 🔴 +75.6 kB
assets/i18n-nbGUZFga.js (removed) 505 kB 🟢 -505 kB 🟢 -96.9 kB 🟢 -75.4 kB
assets/core-D9NseSBE.js (new) 72.5 kB 🔴 +72.5 kB 🔴 +18.7 kB 🔴 +16 kB
assets/core-Eac6J1NH.js (removed) 72.5 kB 🟢 -72.5 kB 🟢 -18.7 kB 🟢 -16 kB
assets/groupNode-CY0ExKRV.js (new) 72.1 kB 🔴 +72.1 kB 🔴 +17.7 kB 🔴 +15.6 kB
assets/groupNode-CyGV-nKt.js (removed) 72.1 kB 🟢 -72.1 kB 🟢 -17.8 kB 🟢 -15.6 kB
assets/WidgetSelect-CQ7pUPxi.js (new) 57.8 kB 🔴 +57.8 kB 🔴 +12.3 kB 🔴 +10.6 kB
assets/WidgetSelect-DugiU2lP.js (removed) 57.8 kB 🟢 -57.8 kB 🟢 -12.3 kB 🟢 -10.6 kB
assets/SubscriptionRequiredDialogContentWorkspace-D0QN_K5C.js (new) 45.9 kB 🔴 +45.9 kB 🔴 +8.59 kB 🔴 +7.43 kB
assets/SubscriptionRequiredDialogContentWorkspace-DaJuMDX7.js (removed) 45.9 kB 🟢 -45.9 kB 🟢 -8.58 kB 🟢 -7.42 kB
assets/Load3DControls-B-CTdl66.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.66 kB
assets/Load3DControls-Crdk1Q7f.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/WorkspacePanelContent-BcEhFX_0.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.12 kB 🔴 +5.37 kB
assets/WorkspacePanelContent-DqtGJHpG.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.12 kB 🟢 -5.39 kB
assets/SubscriptionRequiredDialogContent-dsQznpN_.js (new) 26.2 kB 🔴 +26.2 kB 🔴 +6.59 kB 🔴 +5.8 kB
assets/SubscriptionRequiredDialogContent-om_GOTjK.js (removed) 26.2 kB 🟢 -26.2 kB 🟢 -6.59 kB 🟢 -5.79 kB
assets/Load3dViewerContent-CUt2_oat.js (removed) 23.1 kB 🟢 -23.1 kB 🟢 -5.19 kB 🟢 -4.5 kB
assets/Load3dViewerContent-TEDPo7el.js (new) 23.1 kB 🔴 +23.1 kB 🔴 +5.19 kB 🔴 +4.5 kB
assets/WidgetImageCrop-9b69P7f_.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.54 kB 🟢 -4.86 kB
assets/WidgetImageCrop-Ck0MDcdg.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.53 kB 🔴 +4.86 kB
assets/MissingNodesContent-aY8GxXXF.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.77 kB 🔴 +5.1 kB
assets/MissingNodesContent-B15NHCzG.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.76 kB 🟢 -5.1 kB
assets/SubscriptionPanelContentWorkspace-BgLUIPjr.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -5.02 kB 🟢 -4.43 kB
assets/SubscriptionPanelContentWorkspace-BoERrPi0.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +5.01 kB 🔴 +4.43 kB
assets/CurrentUserPopoverWorkspace-B9-JYkap.js (new) 19.9 kB 🔴 +19.9 kB 🔴 +4.88 kB 🔴 +4.37 kB
assets/CurrentUserPopoverWorkspace-DGYIZuSj.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -4.88 kB 🟢 -4.35 kB
assets/SignInContent-Crt8wNeX.js (new) 19 kB 🔴 +19 kB 🔴 +4.81 kB 🔴 +4.22 kB
assets/SignInContent-QTvFYoB1.js (removed) 19 kB 🟢 -19 kB 🟢 -4.81 kB 🟢 -4.21 kB
assets/WidgetRecordAudio-BFBRfgT-.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +4.97 kB 🔴 +4.44 kB
assets/WidgetRecordAudio-BigzuNt1.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -4.96 kB 🟢 -4.44 kB
assets/MissingModelsWarning-7dEkH2Q7.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -4.7 kB 🟢 -4.16 kB
assets/MissingModelsWarning-DGeCXPRl.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +4.7 kB 🔴 +4.18 kB
assets/Load3D-BlVm_ulw.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.04 kB 🔴 +3.53 kB
assets/Load3D-DM9790Bs.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.04 kB 🟢 -3.52 kB
assets/load3d-6U2WZNT8.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.2 kB 🟢 -3.64 kB
assets/load3d-x0edUCmM.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.21 kB 🔴 +3.64 kB
assets/WidgetInputNumber-BnTCxVqa.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.31 kB 🟢 -2.96 kB
assets/WidgetInputNumber-qbV6pY3E.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.31 kB 🔴 +2.97 kB
assets/AudioPreviewPlayer-BG64K2g3.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.22 kB 🔴 +2.89 kB
assets/AudioPreviewPlayer-vNwa0VWq.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.22 kB 🟢 -2.88 kB
assets/NodeConflictDialogContent-B5NUWTB4.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.37 kB 🔴 +2.07 kB
assets/NodeConflictDialogContent-CY-Hfs59.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.37 kB 🟢 -2.06 kB
assets/changeTracker-C-ay6qkh.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.89 kB 🔴 +2.55 kB
assets/changeTracker-spvBprhN.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.89 kB 🟢 -2.54 kB
assets/nodeTemplates-BRwe6fAf.js (new) 9.35 kB 🔴 +9.35 kB 🔴 +3.28 kB 🔴 +2.88 kB
assets/nodeTemplates-cSW0927p.js (removed) 9.35 kB 🟢 -9.35 kB 🟢 -3.27 kB 🟢 -2.87 kB
assets/MissingNodesFooter-DDRS1Vvl.js (removed) 7.54 kB 🟢 -7.54 kB 🟢 -2.47 kB 🟢 -2.2 kB
assets/MissingNodesFooter-DX0tGbez.js (new) 7.54 kB 🔴 +7.54 kB 🔴 +2.47 kB 🔴 +2.2 kB
assets/InviteMemberDialogContent-CGZ0qwBS.js (removed) 7.44 kB 🟢 -7.44 kB 🟢 -2.31 kB 🟢 -2.02 kB
assets/InviteMemberDialogContent-CQfHJwcK.js (new) 7.44 kB 🔴 +7.44 kB 🔴 +2.31 kB 🔴 +2.02 kB
assets/WidgetWithControl-BK3gdvoo.js (new) 7.08 kB 🔴 +7.08 kB 🔴 +2.65 kB 🔴 +2.36 kB
assets/WidgetWithControl-C-TJKLvz.js (removed) 7.08 kB 🟢 -7.08 kB 🟢 -2.65 kB 🟢 -2.37 kB
assets/Load3DConfiguration-BcP8nDTr.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/Load3DConfiguration-BDdcInV0.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/CreateWorkspaceDialogContent-CcE4lVod.js (new) 5.58 kB 🔴 +5.58 kB 🔴 +2.01 kB 🔴 +1.75 kB
assets/CreateWorkspaceDialogContent-CDbRMAFP.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -2.01 kB 🟢 -1.75 kB
assets/EditWorkspaceDialogContent-BdLJZTGN.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.97 kB 🔴 +1.71 kB
assets/EditWorkspaceDialogContent-BT8VgTuH.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.96 kB 🟢 -1.71 kB
assets/ValueControlPopover-BEw3drxl.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.79 kB 🟢 -1.6 kB
assets/ValueControlPopover-hF8T1dla.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.79 kB 🔴 +1.6 kB
assets/Preview3d-Cjb9rGxG.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.58 kB 🟢 -1.38 kB
assets/Preview3d-CRSbAkOo.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.59 kB 🔴 +1.39 kB
assets/CancelSubscriptionDialogContent-aJ5FD3zI.js (removed) 4.85 kB 🟢 -4.85 kB 🟢 -1.8 kB 🟢 -1.58 kB
assets/CancelSubscriptionDialogContent-D4jEbbmd.js (new) 4.85 kB 🔴 +4.85 kB 🔴 +1.8 kB 🔴 +1.58 kB
assets/DeleteWorkspaceDialogContent-BLh8QQNa.js (new) 4.29 kB 🔴 +4.29 kB 🔴 +1.65 kB 🔴 +1.43 kB
assets/DeleteWorkspaceDialogContent-C3FKvmoq.js (removed) 4.29 kB 🟢 -4.29 kB 🟢 -1.65 kB 🟢 -1.44 kB
assets/LeaveWorkspaceDialogContent-C5tLfr1e.js (new) 4.12 kB 🔴 +4.12 kB 🔴 +1.6 kB 🔴 +1.4 kB
assets/LeaveWorkspaceDialogContent-D9ipgYIg.js (removed) 4.12 kB 🟢 -4.12 kB 🟢 -1.6 kB 🟢 -1.39 kB
assets/RemoveMemberDialogContent-BMHNXm3W.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.54 kB 🟢 -1.35 kB
assets/RemoveMemberDialogContent-TOCgFFvE.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.55 kB 🔴 +1.35 kB
assets/RevokeInviteDialogContent-C0F5nRP9.js (removed) 4.01 kB 🟢 -4.01 kB 🟢 -1.56 kB 🟢 -1.37 kB
assets/RevokeInviteDialogContent-Oiwf7v_B.js (new) 4.01 kB 🔴 +4.01 kB 🔴 +1.56 kB 🔴 +1.37 kB
assets/InviteMemberUpsellDialogContent-B-zvDFER.js (new) 3.88 kB 🔴 +3.88 kB 🔴 +1.42 kB 🔴 +1.25 kB
assets/InviteMemberUpsellDialogContent-DPThI0eH.js (removed) 3.88 kB 🟢 -3.88 kB 🟢 -1.42 kB 🟢 -1.25 kB
assets/saveMesh-CPz456Rd.js (removed) 3.43 kB 🟢 -3.43 kB 🟢 -1.48 kB 🟢 -1.32 kB
assets/saveMesh-CvcM4PPV.js (new) 3.43 kB 🔴 +3.43 kB 🔴 +1.48 kB 🔴 +1.31 kB
assets/cloudSessionCookie-0Zpp-3BC.js (removed) 3.15 kB 🟢 -3.15 kB 🟢 -1.1 kB 🟢 -973 B
assets/cloudSessionCookie-Bdf2qYRj.js (new) 3.15 kB 🔴 +3.15 kB 🔴 +1.11 kB 🔴 +993 B
assets/GlobalToast-B8HKaX_W.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/GlobalToast-DuCnumbo.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.03 kB
assets/ApiNodesSignInContent-Cx0rXs8X.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -956 B
assets/ApiNodesSignInContent-DglOkywA.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +958 B
assets/NodeConflictFooter-B_9doK9f.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.03 kB 🟢 -916 B
assets/NodeConflictFooter-B_wRs2Vs.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.03 kB 🔴 +911 B
assets/SubscribeToRun-D_dbw23I.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +890 B
assets/SubscribeToRun-TPrLnScJ.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -893 B
assets/ImportFailedNodeFooter-Cdg8lY9-.js (removed) 1.88 kB 🟢 -1.88 kB 🟢 -867 B 🟢 -755 B
assets/ImportFailedNodeFooter-DCMTa-fR.js (new) 1.88 kB 🔴 +1.88 kB 🔴 +868 B 🔴 +754 B
assets/CloudRunButtonWrapper-BS94U_HY.js (removed) 1.72 kB 🟢 -1.72 kB 🟢 -805 B 🟢 -735 B
assets/CloudRunButtonWrapper-Cj_2Yw0B.js (new) 1.72 kB 🔴 +1.72 kB 🔴 +806 B 🔴 +732 B
assets/signInSchema-Bt4JkYHW.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +564 B 🔴 +525 B
assets/signInSchema-DxIK0WZB.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -563 B 🟢 -517 B
assets/cloudBadges-B6fKM2xE.js (new) 1.42 kB 🔴 +1.42 kB 🔴 +731 B 🔴 +629 B
assets/cloudBadges-DxDyJju0.js (removed) 1.42 kB 🟢 -1.42 kB 🟢 -726 B 🟢 -633 B
assets/cloudSubscription-B2cYgLQ5.js (new) 1.38 kB 🔴 +1.38 kB 🔴 +681 B 🔴 +587 B
assets/cloudSubscription-B82MFLzN.js (removed) 1.38 kB 🟢 -1.38 kB 🟢 -680 B 🟢 -586 B
assets/Load3D-Di9PRpGR.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -512 B 🟢 -461 B
assets/Load3D-DqPcQBcP.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +515 B 🔴 +458 B
assets/nightlyBadges-BFKvA2C2.js (removed) 1.05 kB 🟢 -1.05 kB 🟢 -551 B 🟢 -492 B
assets/nightlyBadges-BvJ5-hhq.js (new) 1.05 kB 🔴 +1.05 kB 🔴 +557 B 🔴 +494 B
assets/Load3dViewerContent-CEGPMYxM.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +487 B 🔴 +434 B
assets/Load3dViewerContent-DUF1tMHD.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -486 B 🟢 -436 B
assets/SubscriptionPanelContentWorkspace-6L0Yo9MS.js (new) 979 B 🔴 +979 B 🔴 +456 B 🔴 +396 B
assets/SubscriptionPanelContentWorkspace-BlQ8zzgQ.js (removed) 979 B 🟢 -979 B 🟢 -453 B 🟢 -401 B
assets/changeTracker-BRpLSrxM.js (new) 806 B 🔴 +806 B 🔴 +405 B 🔴 +354 B
assets/changeTracker-DpjeiTS8.js (removed) 806 B 🟢 -806 B 🟢 -401 B 🟢 -356 B
assets/WidgetLegacy-Bizw3Bzj.js (new) 794 B 🔴 +794 B 🔴 +407 B 🔴 +348 B
assets/WidgetLegacy-CZl3tM5r.js (removed) 794 B 🟢 -794 B 🟢 -402 B 🟢 -357 B
assets/graphHasMissingNodes-CCSoPawI.js (removed) 761 B 🟢 -761 B 🟢 -370 B 🟢 -317 B
assets/graphHasMissingNodes-CJPsGq1o.js (new) 761 B 🔴 +761 B 🔴 +373 B 🔴 +327 B
assets/WidgetInputNumber-CPUOltSf.js (new) 437 B 🔴 +437 B 🔴 +247 B 🔴 +214 B
assets/WidgetInputNumber-D-roCuaa.js (removed) 437 B 🟢 -437 B 🟢 -247 B 🟢 -210 B
assets/i18n-C1I5x5JO.js (removed) 199 B 🟢 -199 B 🟢 -161 B 🟢 -139 B
assets/i18n-La0KKloM.js (new) 199 B 🔴 +199 B 🔴 +160 B 🔴 +139 B
assets/AnimationControls-BcW_luDp.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-Bt3L7FBS.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-CBbgFv9j.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-B810ZRS_.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-CTdDIL79.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-8341he__.js 16.6 kB 16.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BfYA-6W-.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BgAs7KVZ.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BVWTuswJ.js 14.7 kB 14.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CCtTeOf1.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CrMAiWgs.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D2TwPxZf.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DC3hZBvg.js 18.4 kB 18.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DLUZjDoW.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-IOkk_3T2.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-rPqSC0M_.js 15.7 kB 15.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-KYihJEkp.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeContent-DFoq6kti.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeHeader-B1n-xqqB.js 1.08 kB 1.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-DiT6c_gA.js 12.3 kB 12.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-awxVnzsw.js 170 kB 170 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B98CI4eM.js 121 kB 121 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C3nv9kDt.js 137 kB 137 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C3o5fEfE.js 144 kB 144 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Ca7Eeiz4.js 190 kB 190 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CvQ12exX.js 136 kB 136 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Ddo0IR5Z.js 120 kB 120 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Def0uEpp.js 139 kB 139 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DS27V6NV.js 141 kB 141 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-FLRCaU3I.js 164 kB 164 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-JwCGO2aL.js 157 kB 157 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-B8swZVwo.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-nCx5pl8A.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-DezJhpVh.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-CJFEgO5M.js 2.23 kB 2.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingNodesHeader-ByWQy4iA.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictHeader-CEIGoZWL.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bd4CHa-U.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BqT3ZV-5.js 346 kB 346 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C8EEdlty.js 463 kB 463 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CAIbbkfM.js 377 kB 377 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CSkN7O0u.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D03E_Kzg.js 343 kB 343 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D1lAZk-Z.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DLqclSKl.js 377 kB 377 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DnyKff9w.js 424 kB 424 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-UELmmk5d.js 424 kB 424 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-WApEcuCv.js 381 kB 381 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DvPJbfbs.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-BLaUzhId.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-0H4iS-Qs.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-D5pbLGY2.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/widget-DTUjK0ZE.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-Br2Sa2_S.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-CnfNlgwP.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-DYXOzgzf.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-DO1qllXc.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-Bc-bWiT9.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-0odWRM2K.js 3.1 kB 3.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-Jqw1b8Rg.js 1.86 kB 1.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-4U6mdeZs.js 1.95 kB 1.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-C-zu7uox.js 2.88 kB 2.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BFdmuHeM.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-CYEi5L6X.js 3.18 kB 3.18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-Ba3ojFdL.js 2.5 kB 2.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DhbPR9pT.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 57 added / 57 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: 8

🧹 Nitpick comments (6)
src/components/rightSidePanel/errors/__stories__/MockOSSMissingModel.vue (2)

397-405: Avoid scoped <style>; use Tailwind utilities or shared classes.

Consider moving the no-scrollbar styling to a Tailwind utility or a shared/global class so the component stays style-block free.

As per coding guidelines: "Use Tailwind 4 for styling in Vue components; avoid <style> blocks".

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

In `@src/components/rightSidePanel/errors/__stories__/MockOSSMissingModel.vue`
around lines 397 - 405, The component contains a scoped <style> block defining
.no-scrollbar; remove that style block from MockOSSMissingModel.vue and replace
usages of the .no-scrollbar class with a global/shared solution: either add the
scrollbar CSS (the existing rules for .no-scrollbar and ::-webkit-scrollbar)
into the global stylesheet/Tailwind entry (e.g., app CSS or a Tailwind layer) or
create a Tailwind utility/class that applies those properties, then update the
component to use that global/shared class so the Vue file has no <style> block
and styling follows the Tailwind/global guidelines.

252-257: Replace :class array bindings with cn().

The chevron class array (and similar bindings) should use cn() for tailwind-merge behavior and guideline consistency.

♻️ Example refactor
+import { cn } from '@/utils/tailwindUtil'
@@
-                :class="[
-                  category !== 'VAE' ? 'group-hover:text-white' : '',
-                  collapsedCategories[category] ? '-rotate-180' : ''
-                ]"
+                :class="
+                  cn(
+                    category !== 'VAE' && 'group-hover:text-white',
+                    collapsedCategories[category] && '-rotate-180'
+                  )
+                "
As per coding guidelines: "Use cn() utility from '@/utils/tailwindUtil' to merge class names; never use :class=\"[]\" syntax."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/rightSidePanel/errors/__stories__/MockOSSMissingModel.vue`
around lines 252 - 257, Replace the array-style Vue class binding on the chevron
icon with the cn() utility: import cn from '@/utils/tailwindUtil' and change the
:class="[...]" usage on the <i> element (and any similar :class="[]" bindings in
this file) to use :class="cn(...)" so conditional classes are passed as
arguments to cn (e.g., category !== 'VAE' && 'group-hover:text-white',
collapsedCategories[category] && '-rotate-180') alongside the static classes;
ensure you keep the existing static classes (like "icon-[lucide--chevron-up]
size-4 text-[`#8a8a8a`] transition-all") outside or inside cn as appropriate.
src/components/rightSidePanel/errors/__stories__/MockManagerDialog.vue (2)

130-136: Use cn() instead of :class="[]" arrays.

The dynamic class array should be merged with cn() to match the repo rule.

Proposed fix
-            :class="[
-              'rounded-xl border p-4 flex flex-col gap-3 cursor-pointer transition-colors',
-              i === 0 && selectedPack
-                ? 'border-[`#0b8ce9`]/70 ring-1 ring-[`#0b8ce9`]/40'
-                : 'border-[`#494a50`] hover:border-[`#55565e`]'
-            ]"
+            :class="cn(
+              'rounded-xl border p-4 flex flex-col gap-3 cursor-pointer transition-colors',
+              i === 0 && selectedPack
+                ? 'border-[`#0b8ce9`]/70 ring-1 ring-[`#0b8ce9`]/40'
+                : 'border-[`#494a50`] hover:border-[`#55565e`]'
+            )"

You’ll also need to import cn:

import { cn } from '@/utils/tailwindUtil'

As per coding guidelines: Use cn() utility from @/utils/tailwindUtil to merge class names; never use :class="[]" syntax.

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

In `@src/components/rightSidePanel/errors/__stories__/MockManagerDialog.vue`
around lines 130 - 136, Replace the array-style dynamic class binding with the
cn() utility and add the import; specifically, in MockManagerDialog.vue stop
using :class="[]" and instead call cn(...) to merge the base classes with the
conditional ones (preserving the same strings and condition i === 0 &&
selectedPack ? 'border-[`#0b8ce9`]/70 ring-1 ring-[`#0b8ce9`]/40' :
'border-[`#494a50`] hover:border-[`#55565e`]'), and add the import statement import
{ cn } from '@/utils/tailwindUtil' in the script block so the template uses cn
to produce the same combined class string.

160-173: Replace raw <button> elements with the shared Button component.

Use the design-system Button for consistency (icon-only buttons can use variant="textonly" + proper aria-labels).

Proposed fix
-        <button
-          class="flex items-center justify-center text-[`#8a8a8a`] hover:text-white p-1"
-          style="background:none;border:none;outline:none;cursor:pointer;"
-        >
-          <i class="icon-[lucide--panel-right] size-4" />
-        </button>
+        <Button
+          variant="textonly"
+          size="icon"
+          class="text-[`#8a8a8a`] hover:text-white"
+          aria-label="Collapse panel"
+        >
+          <i class="icon-[lucide--panel-right] size-4" />
+        </Button>
         <!-- Close X Icon -->
-        <button
-          class="flex items-center justify-center text-[`#8a8a8a`] hover:text-white p-1"
-          style="background:none;border:none;outline:none;cursor:pointer;"
-          `@click`="emit('close')"
-        >
-          <i class="icon-[lucide--x] size-4" />
-        </button>
+        <Button
+          variant="textonly"
+          size="icon"
+          class="text-[`#8a8a8a`] hover:text-white"
+          aria-label="Close"
+          `@click`="emit('close')"
+        >
+          <i class="icon-[lucide--x] size-4" />
+        </Button>
Based on learnings: In the ComfyUI_frontend Vue codebase, replace raw HTML elements with the shared Button component located at src/components/ui/button/Button.vue.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/rightSidePanel/errors/__stories__/MockManagerDialog.vue`
around lines 160 - 173, The two raw <button> elements (the panel-right icon
button and the Close X button that calls emit('close')) should be replaced with
the shared Button component (src/components/ui/button/Button.vue) using
variant="textonly" and appropriate aria-labels; for the close button preserve
the `@click`="emit('close')" binding by moving it to the Button and ensure the
icon markup (i.e., <i class="icon-[lucide--panel-right] ..."> and <i
class="icon-[lucide--x] ...">) is placed inside the Button slot or its default
content so styling remains consistent.
src/components/rightSidePanel/errors/__stories__/MockCloudMissingModelBasic.vue (1)

49-54: Interval/timeout timers are never cleaned up on unmount.

When navigating between Storybook stories, the component unmounts but setInterval (download timers) and setTimeout (input reveal timers) keep firing, causing stale updates and potential errors. Add onUnmounted cleanup:

Proposed fix
-import { ref, watch, computed } from 'vue'
+import { ref, watch, computed, onUnmounted } from 'vue'

Then at the end of the script setup:

onUnmounted(() => {
  for (const id in downloadTimers.value) {
    clearInterval(downloadTimers.value[id])
  }
  for (const id in inputTimeouts.value) {
    clearTimeout(inputTimeouts.value[id])
  }
})
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/components/rightSidePanel/errors/__stories__/MockCloudMissingModelBasic.vue`
around lines 49 - 54, The component creates timers in inputTimeouts (setTimeout)
and downloadTimers (setInterval) but never clears them on unmount; add an
onUnmounted hook that iterates over downloadTimers.value and calls clearInterval
for each stored interval and over inputTimeouts.value and calls clearTimeout for
each stored timeout to prevent stale callbacks and errors (refer to the
inputTimeouts and downloadTimers refs and the setInterval/setTimeout usage to
locate where to clear them).
src/components/rightSidePanel/errors/__stories__/MockOSSMissingNodePack.vue (1)

74-104: Stale setTimeout timers on unmount.

onInstall and onInstallAll schedule timeouts that are never tracked or cleared on component unmount. When switching stories in Storybook, these fire against stale reactive state. Consider storing timer IDs and clearing them in onUnmounted, similar to the pattern already used by resetAll.

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

In `@src/components/rightSidePanel/errors/__stories__/MockOSSMissingNodePack.vue`
around lines 74 - 104, The onInstall and onInstallAll functions schedule
setTimeouts that are not tracked or cleared on unmount; add a timers collection
(e.g., an array of timer IDs) and push each setTimeout return value from
onInstall and onInstallAll into it, ensure resetAll also clears and empties this
collection, and register an onUnmounted hook that iterates the timers, calls
clearTimeout on each ID, and empties the collection so
installStates/hasSuccessfulInstall/MOCK_MISSING_PACKS-related timeouts cannot
run after unmount.
🤖 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/components/rightSidePanel/errors/__stories__/MockCloudMissingModelBasic.vue`:
- Line 305: The TransitionGroup child uses v-show so leave hooks never fire;
change the rendering logic in the loop (the element with v-for="model in models"
and :key="model.id") to use v-if="!removedModels[model.id]" instead of v-show,
or alternatively filter the models in a computed (e.g., computedFilteredModels)
and iterate over that list so the key is removed from the DOM and
TransitionGroup/@leave transitions on the surrounding <TransitionGroup> will run
correctly.

In `@src/components/rightSidePanel/errors/__stories__/MockManagerDialog.vue`:
- Around line 12-18: The props block currently uses withDefaults and the props
object (withDefaults and props); replace this with typed destructuring from
defineProps — e.g., use defineProps<...>() and destructure selectedPack with a
default (selectedPack = null) instead of withDefaults, and update all
template/script references from props.selectedPack to selectedPack (search for
usages of props and withDefaults and update references accordingly).

In
`@src/components/rightSidePanel/errors/__stories__/StoryOSSMissingNodePackFlow.vue`:
- Around line 36-63: The template in StoryOSSMissingNodePackFlow.vue contains
hardcoded user-facing strings ("ComfyUI Canvas" and "Click the
buttons…"/statusLog fallback) that must be localized; replace these literals
with vue-i18n translation lookups (e.g. $t('...')) in the template where the
text nodes appear (the element showing "ComfyUI Canvas" and the v-else fallback
that says "Click the buttons in the right-side error tab" and any statusLog
default label), add corresponding keys to src/locales/en/main.json (e.g.
comfyCanvas, clickButtonsRightErrorTab, statusLogDefault or similar), and ensure
the story registers or provides the vue-i18n instance so $t is available in this
component during story rendering.
- Around line 15-33: Replace the hard-coded user-visible strings in functions
log, openManager, closeManager, and onLocate with vue-i18n keys: import/use the
i18n instance (e.g., useI18n or this.$t) and call t('...') instead of literal
strings; add corresponding keys (e.g., rightSidePanel.errors.openManager,
rightSidePanel.errors.managerClosed, rightSidePanel.errors.locatingOnCanvas and
any status fallback) to src/locales/en/main.json and use those keys when calling
log (e.g., log(t('rightSidePanel.errors.openManager', { name:
pack.displayName.split('//')[0].trim() }))). Ensure interpolation for
pack.displayName is used where needed and remove the original English literals.

In `@src/components/rightSidePanel/errors/TabErrors.stories.ts`:
- Around line 82-92: The Story Cloud_MissingNodePacks currently listens for a
non-existent `@log` event on MockCloudMissingNodePack; since
MockCloudMissingNodePack defines defineEmits<{ 'locate': [pack: MissingNodePack]
}>(), replace the dead `@log` listener with `@locate` (e.g., `@locate`="msg =>
console.log('Locate:', msg)") or simply remove the handler if you don't need to
react to the emit; update the template in the Cloud_MissingNodePacks render to
reference MockCloudMissingNodePack and its 'locate' emit accordingly.

In `@src/components/rightSidePanel/errors/useErrorGroups.ts`:
- Around line 41-66: The resolveNodeInfo function uses Number(parentId) when
calling app.rootGraph.getNodeById, which breaks for non-numeric IDs; update
resolveNodeInfo to pass the string parentId directly to
app.rootGraph.getNodeById (or the graph API's expected string id variant)
instead of coercing to Number, and ensure isParentGroupNode detection
(isGroupNode) and title resolution (parentNode?.title) use that string-based
lookup; reference resolveNodeInfo, parseNodeExecutionId,
app.rootGraph.getNodeById, isGroupNode, and resolveNodeDisplayName when making
the change.

In `@src/locales/en/main.json`:
- Around line 1364-1367: There is a duplicate localization key "Error System" in
settingsCategories (settingsCategories.Error System); remove the redundant entry
so only one "Error System": "Error System" mapping remains in
src/locales/en/main.json, ensuring translators see a single canonical key and no
earlier duplicate is left behind.

In `@src/stores/executionStore.ts`:
- Around line 445-459: The service-level error message can include
"undefined"/"null" because exception_message is interpolated directly; in
handleServiceLevelError update the construction of lastPromptError.value.message
to guard against missing exception_message (e.g., use a conditional that appends
": " + exception_message only when exception_message is
non-null/non-undefined/non-empty, otherwise fall back to exception_type or an
empty string), ensuring you still set type and details as currently done; keep
calls to clearInitializationByPromptId and resetExecutionState unchanged.

---

Duplicate comments:
In `@src/components/rightSidePanel/errors/__stories__/MockCloudMissingModel.vue`:
- Around line 61-66: Add an onUnmounted cleanup that iterates over both
inputTimeouts and downloadTimers to clear each stored timer (clearTimeout for
inputTimeouts entries and clearInterval for downloadTimers entries) and then
reset those refs to empty objects; locate the refs inputTimeouts and
downloadTimers in MockCloudMissingModel.vue and implement the cleanup using
Vue's onUnmounted() so timers are cleared when the component unmounts.
- Line 338: In MockCloudMissingModel.vue the leave transitions don’t run because
each item is hidden with v-show instead of being removed from the list; replace
the v-for over "models" that uses v-show="!removedModels[model.id]" with a v-for
over a computed/derived list (e.g., "visibleModels" computed as models.filter(m
=> !removedModels[m.id])) and remove the v-show from the template so the
<TransitionGroup> sees items actually removed; keep the same :key="model.id" and
adjust any references to "models" in that block to use the new computed
"visibleModels".

---

Nitpick comments:
In
`@src/components/rightSidePanel/errors/__stories__/MockCloudMissingModelBasic.vue`:
- Around line 49-54: The component creates timers in inputTimeouts (setTimeout)
and downloadTimers (setInterval) but never clears them on unmount; add an
onUnmounted hook that iterates over downloadTimers.value and calls clearInterval
for each stored interval and over inputTimeouts.value and calls clearTimeout for
each stored timeout to prevent stale callbacks and errors (refer to the
inputTimeouts and downloadTimers refs and the setInterval/setTimeout usage to
locate where to clear them).

In `@src/components/rightSidePanel/errors/__stories__/MockManagerDialog.vue`:
- Around line 130-136: Replace the array-style dynamic class binding with the
cn() utility and add the import; specifically, in MockManagerDialog.vue stop
using :class="[]" and instead call cn(...) to merge the base classes with the
conditional ones (preserving the same strings and condition i === 0 &&
selectedPack ? 'border-[`#0b8ce9`]/70 ring-1 ring-[`#0b8ce9`]/40' :
'border-[`#494a50`] hover:border-[`#55565e`]'), and add the import statement import
{ cn } from '@/utils/tailwindUtil' in the script block so the template uses cn
to produce the same combined class string.
- Around line 160-173: The two raw <button> elements (the panel-right icon
button and the Close X button that calls emit('close')) should be replaced with
the shared Button component (src/components/ui/button/Button.vue) using
variant="textonly" and appropriate aria-labels; for the close button preserve
the `@click`="emit('close')" binding by moving it to the Button and ensure the
icon markup (i.e., <i class="icon-[lucide--panel-right] ..."> and <i
class="icon-[lucide--x] ...">) is placed inside the Button slot or its default
content so styling remains consistent.

In `@src/components/rightSidePanel/errors/__stories__/MockOSSMissingModel.vue`:
- Around line 397-405: The component contains a scoped <style> block defining
.no-scrollbar; remove that style block from MockOSSMissingModel.vue and replace
usages of the .no-scrollbar class with a global/shared solution: either add the
scrollbar CSS (the existing rules for .no-scrollbar and ::-webkit-scrollbar)
into the global stylesheet/Tailwind entry (e.g., app CSS or a Tailwind layer) or
create a Tailwind utility/class that applies those properties, then update the
component to use that global/shared class so the Vue file has no <style> block
and styling follows the Tailwind/global guidelines.
- Around line 252-257: Replace the array-style Vue class binding on the chevron
icon with the cn() utility: import cn from '@/utils/tailwindUtil' and change the
:class="[...]" usage on the <i> element (and any similar :class="[]" bindings in
this file) to use :class="cn(...)" so conditional classes are passed as
arguments to cn (e.g., category !== 'VAE' && 'group-hover:text-white',
collapsedCategories[category] && '-rotate-180') alongside the static classes;
ensure you keep the existing static classes (like "icon-[lucide--chevron-up]
size-4 text-[`#8a8a8a`] transition-all") outside or inside cn as appropriate.

In `@src/components/rightSidePanel/errors/__stories__/MockOSSMissingNodePack.vue`:
- Around line 74-104: The onInstall and onInstallAll functions schedule
setTimeouts that are not tracked or cleared on unmount; add a timers collection
(e.g., an array of timer IDs) and push each setTimeout return value from
onInstall and onInstallAll into it, ensure resetAll also clears and empties this
collection, and register an onUnmounted hook that iterates the timers, calls
clearTimeout on each ID, and empties the collection so
installStates/hasSuccessfulInstall/MOCK_MISSING_PACKS-related timeouts cannot
run after unmount.

<Transition :css="false" @enter="enterTransition" @leave="leaveTransition">
<div v-if="!collapsedCategories[category]" class="pt-2">
<TransitionGroup :css="false" @enter="enterTransition" @leave="leaveTransition">
<div v-for="model in models" v-show="!removedModels[model.id]" :key="model.id" class="flex flex-col w-full mb-6 last:mb-4">
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

v-show inside <TransitionGroup> won't trigger leave transitions.

TransitionGroup hooks (@leave) only fire when an element is removed from the DOM via v-if (or when the key disappears from the list). v-show just toggles display: none, so leaveTransition will never be called — models will vanish instantly instead of animating out.

Switch to v-if or filter the list in a computed to exclude removed models:

Proposed fix
-              <TransitionGroup :css="false" `@enter`="enterTransition" `@leave`="leaveTransition">
-                <div v-for="model in models" v-show="!removedModels[model.id]" :key="model.id" class="flex flex-col w-full mb-6 last:mb-4">
+              <TransitionGroup :css="false" `@enter`="enterTransition" `@leave`="leaveTransition">
+                <div v-for="model in models.filter(m => !removedModels[m.id])" :key="model.id" class="flex flex-col w-full mb-6 last:mb-4">
📝 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
<div v-for="model in models" v-show="!removedModels[model.id]" :key="model.id" class="flex flex-col w-full mb-6 last:mb-4">
<div v-for="model in models.filter(m => !removedModels[m.id])" :key="model.id" class="flex flex-col w-full mb-6 last:mb-4">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/components/rightSidePanel/errors/__stories__/MockCloudMissingModelBasic.vue`
at line 305, The TransitionGroup child uses v-show so leave hooks never fire;
change the rendering logic in the loop (the element with v-for="model in models"
and :key="model.id") to use v-if="!removedModels[model.id]" instead of v-show,
or alternatively filter the models in a computed (e.g., computedFilteredModels)
and iterate over that list so the key is removed from the DOM and
TransitionGroup/@leave transitions on the surrounding <TransitionGroup> will run
correctly.

Comment on lines +12 to +18
// Props / Emits
const props = withDefaults(
defineProps<{
selectedPack?: MissingNodePack | null
}>(),
{ selectedPack: null }
)
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Avoid withDefaults for props; use typed destructuring with defaults.

Repo standard prefers const { prop = default } = defineProps<...>() instead of withDefaults. Update template references from props.selectedPack to selectedPack accordingly.

Proposed fix
-const props = withDefaults(
-  defineProps<{
-    selectedPack?: MissingNodePack | null
-  }>(),
-  { selectedPack: null }
-)
+const { selectedPack = null } = defineProps<{
+  selectedPack?: MissingNodePack | null
+}>()
As per coding guidelines: Define props using TypeScript style with reactive destructuring; do not use withDefaults.
📝 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
// Props / Emits
const props = withDefaults(
defineProps<{
selectedPack?: MissingNodePack | null
}>(),
{ selectedPack: null }
)
// Props / Emits
const { selectedPack = null } = defineProps<{
selectedPack?: MissingNodePack | null
}>()
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/rightSidePanel/errors/__stories__/MockManagerDialog.vue`
around lines 12 - 18, The props block currently uses withDefaults and the props
object (withDefaults and props); replace this with typed destructuring from
defineProps — e.g., use defineProps<...>() and destructure selectedPack with a
default (selectedPack = null) instead of withDefaults, and update all
template/script references from props.selectedPack to selectedPack (search for
usages of props and withDefaults and update references accordingly).

Comment on lines +15 to +33
function log(msg: string) {
statusLog.value = msg
}

function openManager(pack: MissingNodePack) {
selectedPack.value = pack
isManagerOpen.value = true
log(`ⓘ Opening Manager: "${pack.displayName.split('//')[0].trim()}"`)
}

function closeManager() {
isManagerOpen.value = false
selectedPack.value = null
log('Manager closed')
}

function onLocate(pack: MissingNodePack) {
log(`◎ Locating on canvas: "${pack.displayName.split('//')[0].trim()}"`)
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Localize log/status strings.

The log messages are user-visible in the mock UI; move these strings into i18n keys to match the repo standard. As per coding guidelines: Use vue-i18n for ALL user-facing strings, configured in src/locales/en/main.json.

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

In
`@src/components/rightSidePanel/errors/__stories__/StoryOSSMissingNodePackFlow.vue`
around lines 15 - 33, Replace the hard-coded user-visible strings in functions
log, openManager, closeManager, and onLocate with vue-i18n keys: import/use the
i18n instance (e.g., useI18n or this.$t) and call t('...') instead of literal
strings; add corresponding keys (e.g., rightSidePanel.errors.openManager,
rightSidePanel.errors.managerClosed, rightSidePanel.errors.locatingOnCanvas and
any status fallback) to src/locales/en/main.json and use those keys when calling
log (e.g., log(t('rightSidePanel.errors.openManager', { name:
pack.displayName.split('//')[0].trim() }))). Ensure interpolation for
pack.displayName is used where needed and remove the original English literals.

Comment on lines +36 to +63
<template>
<!-- ComfyUI layout simulation: canvas + right side panel + manager overlay -->
<div class="relative w-full h-full flex overflow-hidden bg-[#0d0e10]">

<!-- Canvas area -->
<div class="flex-1 min-w-0 relative flex flex-col items-center justify-center gap-4 overflow-hidden">
<!-- Grid background -->
<div
class="absolute inset-0 opacity-15"
style="background-image: repeating-linear-gradient(#444 0 1px, transparent 1px 100%), repeating-linear-gradient(90deg, #444 0 1px, transparent 1px 100%); background-size: 32px 32px;"
/>
<div class="relative z-10 flex flex-col items-center gap-4">
<div class="text-[#8a8a8a]/30 text-sm select-none">ComfyUI Canvas</div>
<div class="flex gap-5 flex-wrap justify-center px-8">
<div v-for="i in 4" :key="i" class="w-[160px] h-[80px] rounded-lg border border-[#3a3b3d] bg-[#1a1b1d]/80 flex flex-col p-3 gap-2">
<div class="h-3 w-24 rounded bg-[#2a2b2d]" />
<div class="h-2 w-16 rounded bg-[#2a2b2d]" />
<div class="h-2 w-20 rounded bg-[#2a2b2d]" />
</div>
</div>
<div class="flex items-center justify-center min-h-[36px]">
<div
v-if="statusLog"
class="px-4 py-1.5 rounded-lg text-xs text-center bg-blue-950/70 border border-blue-500/40 text-blue-300"
>{{ statusLog }}</div>
<div v-else class="px-4 py-1.5 text-xs text-[#8a8a8a]/30 border border-dashed border-[#2a2b2d] rounded-lg">
Click the buttons in the right-side error tab
</div>
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Localize visible UI text in the story template.

Text like “ComfyUI Canvas” and “Click the buttons…” should be sourced via i18n even in story mocks. As per coding guidelines: Use vue-i18n for ALL user-facing strings, configured in src/locales/en/main.json.

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

In
`@src/components/rightSidePanel/errors/__stories__/StoryOSSMissingNodePackFlow.vue`
around lines 36 - 63, The template in StoryOSSMissingNodePackFlow.vue contains
hardcoded user-facing strings ("ComfyUI Canvas" and "Click the
buttons…"/statusLog fallback) that must be localized; replace these literals
with vue-i18n translation lookups (e.g. $t('...')) in the template where the
text nodes appear (the element showing "ComfyUI Canvas" and the v-else fallback
that says "Click the buttons in the right-side error tab" and any statusLog
default label), add corresponding keys to src/locales/en/main.json (e.g.
comfyCanvas, clickButtonsRightErrorTab, statusLogDefault or similar), and ensure
the story registers or provides the vue-i18n instance so $t is available in this
component during story rendering.

Comment on lines +82 to +92
export const Cloud_MissingNodePacks: Story = {
name: '[Cloud] Missing Node Pack',
render: () => ({
components: { MockCloudMissingNodePack },
template: `
<div class="h-[800px] border border-[#494a50] rounded-lg overflow-hidden">
<MockCloudMissingNodePack @log="msg => console.log('Log:', msg)" />
</div>
`
})
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

@log handler won't fire — MockCloudMissingNodePack only emits locate.

MockCloudMissingNodePack defines defineEmits<{ 'locate': [pack: MissingNodePack] }>() — there is no log emit. The @log listener here is dead code. Either remove it or switch to @locate:

-        <MockCloudMissingNodePack `@log`="msg => console.log('Log:', msg)" />
+        <MockCloudMissingNodePack `@locate`="pack => console.log('Locate:', pack)" />
📝 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
export const Cloud_MissingNodePacks: Story = {
name: '[Cloud] Missing Node Pack',
render: () => ({
components: { MockCloudMissingNodePack },
template: `
<div class="h-[800px] border border-[#494a50] rounded-lg overflow-hidden">
<MockCloudMissingNodePack @log="msg => console.log('Log:', msg)" />
</div>
`
})
}
export const Cloud_MissingNodePacks: Story = {
name: '[Cloud] Missing Node Pack',
render: () => ({
components: { MockCloudMissingNodePack },
template: `
<div class="h-[800px] border border-[`#494a50`] rounded-lg overflow-hidden">
<MockCloudMissingNodePack `@locate`="pack => console.log('Locate:', pack)" />
</div>
`
})
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/rightSidePanel/errors/TabErrors.stories.ts` around lines 82 -
92, The Story Cloud_MissingNodePacks currently listens for a non-existent `@log`
event on MockCloudMissingNodePack; since MockCloudMissingNodePack defines
defineEmits<{ 'locate': [pack: MissingNodePack] }>(), replace the dead `@log`
listener with `@locate` (e.g., `@locate`="msg => console.log('Locate:', msg)") or
simply remove the handler if you don't need to react to the emit; update the
template in the Cloud_MissingNodePacks render to reference
MockCloudMissingNodePack and its 'locate' emit accordingly.

Comment on lines +41 to 66
/**
* Resolve display info for a node by its execution ID.
* For group node internals, resolves the parent group node's title instead.
*/
function resolveNodeInfo(nodeId: string) {
const graphNode = getNodeByExecutionId(app.rootGraph, nodeId)

const parts = parseNodeExecutionId(nodeId)
const parentId = parts && parts.length > 1 ? String(parts[0]) : null
const parentNode = parentId
? app.rootGraph.getNodeById(Number(parentId))
: null
const isParentGroupNode = parentNode ? isGroupNode(parentNode) : false

return {
title: resolveNodeDisplayName(graphNode, {
emptyLabel: '',
untitledLabel: '',
st
}),
graphNodeId: graphNode ? String(graphNode.id) : undefined
title: isParentGroupNode
? parentNode?.title || ''
: resolveNodeDisplayName(graphNode, {
emptyLabel: '',
untitledLabel: '',
st
}),
graphNodeId: graphNode ? String(graphNode.id) : undefined,
isParentGroupNode
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Avoid numeric coercion for parent node IDs.

Number(parentId) will fail for non-numeric node IDs, which would prevent parent group title resolution. Use the string ID directly.

Proposed fix
-  const parentNode = parentId
-    ? app.rootGraph.getNodeById(Number(parentId))
+  const parentNode = parentId
+    ? app.rootGraph.getNodeById(parentId)
     : null
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/rightSidePanel/errors/useErrorGroups.ts` around lines 41 - 66,
The resolveNodeInfo function uses Number(parentId) when calling
app.rootGraph.getNodeById, which breaks for non-numeric IDs; update
resolveNodeInfo to pass the string parentId directly to
app.rootGraph.getNodeById (or the graph API's expected string id variant)
instead of coercing to Number, and ensure isParentGroupNode detection
(isGroupNode) and title resolution (parentNode?.title) use that string-based
lookup; reference resolveNodeInfo, parseNodeExecutionId,
app.rootGraph.getNodeById, isGroupNode, and resolveNodeDisplayName when making
the change.

Comment on lines +1364 to 1367
"Error System": "Error System",
"Other": "Other",
"Secrets": "Secrets",
"Error System": "Error System"
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Remove duplicate settingsCategories.Error System key.

JSON duplicates drop the earlier entry and can confuse translators; keep a single key.

🧹 Suggested cleanup
@@
-    "Workspace": "Workspace",
-    "Error System": "Error System",
-    "Other": "Other",
-    "Secrets": "Secrets",
-    "Error System": "Error System"
+    "Workspace": "Workspace",
+    "Error System": "Error System",
+    "Other": "Other",
+    "Secrets": "Secrets"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/locales/en/main.json` around lines 1364 - 1367, There is a duplicate
localization key "Error System" in settingsCategories (settingsCategories.Error
System); remove the redundant entry so only one "Error System": "Error System"
mapping remains in src/locales/en/main.json, ensuring translators see a single
canonical key and no earlier duplicate is left behind.

Comment on lines +445 to +459
function handleServiceLevelError(detail: ExecutionErrorWsMessage): boolean {
const nodeId = detail.node_id
if (nodeId !== null && nodeId !== undefined && String(nodeId) !== '')
return false

clearInitializationByPromptId(detail.prompt_id)
resetExecutionState(detail.prompt_id)
lastPromptError.value = {
type: detail.exception_type ?? 'error',
message: detail.exception_type
? `${detail.exception_type}: ${detail.exception_message}`
: (detail.exception_message ?? ''),
details: detail.traceback?.join('\n') ?? ''
}
return true
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Avoid rendering “undefined/null” in service-level error messages.

If exception_message is missing, the current template string will surface undefined/null to users. Consider guarding the message to keep it clean.

Proposed fix
-    lastPromptError.value = {
-      type: detail.exception_type ?? 'error',
-      message: detail.exception_type
-        ? `${detail.exception_type}: ${detail.exception_message}`
-        : (detail.exception_message ?? ''),
-      details: detail.traceback?.join('\n') ?? ''
-    }
+    const exceptionType = detail.exception_type ?? 'error'
+    const exceptionMessage = detail.exception_message ?? ''
+    const message =
+      exceptionMessage.length > 0
+        ? `${exceptionType}: ${exceptionMessage}`
+        : exceptionType
+    lastPromptError.value = {
+      type: exceptionType,
+      message,
+      details: detail.traceback?.join('\n') ?? ''
+    }
As per coding guidelines: Provide user-friendly and actionable error messages.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stores/executionStore.ts` around lines 445 - 459, The service-level error
message can include "undefined"/"null" because exception_message is interpolated
directly; in handleServiceLevelError update the construction of
lastPromptError.value.message to guard against missing exception_message (e.g.,
use a conditional that appends ": " + exception_message only when
exception_message is non-null/non-undefined/non-empty, otherwise fall back to
exception_type or an empty string), ensuring you still set type and details as
currently done; keep calls to clearInitializationByPromptId and
resetExecutionState unchanged.

@jaeone94 jaeone94 closed this Mar 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant