Skip to content

Feat/errors tab panel#8807

Merged
christian-byrne merged 23 commits intoComfy-Org:mainfrom
jaeone94:feat/errors-tab-panel
Feb 18, 2026
Merged

Feat/errors tab panel#8807
christian-byrne merged 23 commits intoComfy-Org:mainfrom
jaeone94:feat/errors-tab-panel

Conversation

@jaeone94
Copy link
Collaborator

@jaeone94 jaeone94 commented Feb 11, 2026

Summary

Add a dedicated Errors tab to the Right Side Panel that displays prompt-level, node validation, and runtime execution errors in a unified, searchable, grouped view — replacing the need to rely solely on modal dialogs for error inspection.

Changes

  • What:
    • New components (errors/ directory):
      • TabErrors.vue — Main error tab with search, grouping by class type, and canvas navigation (locate node / enter subgraph).
      • ErrorNodeCard.vue — Renders a single error card with node ID badge, title, action buttons, and error details.
      • types.ts — Shared type definitions (ErrorItem, ErrorCardData, ErrorGroup).
    • executionStore.ts — Added PromptError interface, lastPromptError ref and hasAnyError computed getter. Clears lastPromptError alongside existing error state on execution start and graph clear.
    • rightSidePanelStore.ts — Registered 'errors' as a valid tab value.
    • app.ts — On prompt submission failure (PromptExecutionError), stores prompt-level errors (when no node errors exist) into lastPromptError. On both runtime execution error and prompt error, deselects all nodes and opens the errors tab automatically.
    • RightSidePanel.vue — Shows the 'errors' tab (with ⚠ icon) when errors exist and no node is selected. Routes to TabErrors component.
    • TopMenuSection.vue — Highlights the action bar with a red border when any error exists, using hasAnyError.
    • SectionWidgets.vue — Detects per-node errors by matching execution IDs to graph node IDs. Shows an error icon (⚠) and "See Error" button that navigates to the errors tab.
    • en/main.json — Added i18n keys: errors, noErrors, enterSubgraph, seeError, promptErrors.*, and errorHelp*.
    • Testing: 6 unit tests (TabErrors.test.ts) covering prompt/node/runtime errors, search filtering, and clipboard copy.
    • Storybook: 7 stories (ErrorNodeCard.stories.ts) for badge visibility, subgraph buttons, multiple errors, runtime tracebacks, and prompt-only errors.
  • Breaking: None
  • Dependencies: None — uses only existing project dependencies (vue-i18n, pinia, primevue)

Related Work

Note: Upstream PR #8603 (New bottom button and badges) introduced a separate TabError.vue (singular) that shows per-node errors when a specific node is selected. Our TabErrors.vue (plural) provides the global error overview — a different scope. The two tabs coexist:

  • 'error' (singular) → appears when a node with errors is selected → shows only that node's errors
  • 'errors' (plural) → appears when no node is selected and errors exist → shows all errors grouped by class type

A future consolidation of these two tabs may be desirable after design review.

Architecture

executionStore
├── lastPromptError: PromptError | null     ← NEW (prompt-level errors without node IDs)
├── lastNodeErrors: Record<string, NodeError>  (existing)
├── lastExecutionError: ExecutionError         (existing)
└── hasAnyError: ComputedRef<boolean>       ← NEW (centralized error detection)

TabErrors.vue (errors tab - global view)
├── errorGroups: ComputedRef<ErrorGroup[]>  ← normalizes all 3 error sources
├── filteredGroups                          ← search-filtered view
├── locateNode()                            ← pan canvas to node
├── enterSubgraph()                         ← navigate into subgraph
└── ErrorNodeCard.vue                       ← per-node card with copy/locate actions

types.ts
├── ErrorItem      { message, details?, isRuntimeError? }
├── ErrorCardData  { id, title, nodeId?, errors[] }
└── ErrorGroup     { title, cards[], priority }

Review Focus

  1. Error normalization logic (TabErrors.vue L75–150): Three different error sources (prompt, node validation, runtime) are normalized into a common ErrorGroup → ErrorCardData → ErrorItem hierarchy. Edge cases to verify:

    • Prompt errors with known vs unknown types (known types use localized descriptions)
    • Multiple errors on the same node (grouped into one card)
    • Runtime errors with long tracebacks (capped height with scroll)
  2. Canvas navigation (TabErrors.vue L210–250): The locateNode and enterSubgraph functions navigate to potentially nested subgraphs. The double requestAnimationFrame is required due to LiteGraph's asynchronous subgraph switching — worth verifying this timing is sufficient.

  3. Store getter consolidation: hasAnyError replaces duplicated logic in TopMenuSection and RightSidePanel. Confirm that the reactive dependency chain works correctly (it depends on 3 separate refs).

  4. Coexistence with upstream TabError.vue: The singular 'error' tab (upstream, PR New bottom button and badges #8603) and our plural 'errors' tab serve different purposes but share similar naming. Consider whether a unified approach is preferred.

Test Results

✓ renders "no errors" state when store is empty
✓ renders prompt-level errors (Group title = error message)
✓ renders node validation errors grouped by class_type
✓ renders runtime execution errors from WebSocket
✓ filters errors based on search query
✓ calls copyToClipboard when copy button is clicked

Test Files  1 passed (1)
     Tests  6 passed (6)

Screenshots (if applicable)

image image image image

┆Issue is synchronized with this Notion page by Unito

- Define PromptError interface in executionStore
- Add hasAnyError computed getter for centralized error detection
- Register 'errors' tab in rightSidePanelStore
- Extract shared type definitions (ErrorItem, ErrorCardData, ErrorGroup)
- Add TabErrors component with grouped, searchable error display
- Add ErrorNodeCard component for individual error rendering
- Support prompt-level, node validation, and runtime errors
- Add i18n keys for error-related UI strings
- Remove unused modelErrors and searchNodesOrInputs i18n keys
- Show error indicator badge on errors tab in RightSidePanel
- Replace duplicated hasPromptError logic with store getter
- Add per-node error detection and See Error link in SectionWidgets
- Store prompt-level errors separately when no node errors exist
- Improve error handling comments in app.ts
- Add TabErrors unit tests covering all error types and search
- Add ErrorNodeCard stories for visual regression testing
- Remove export from PromptError (used only within executionStore)
- Remove export from ErrorItem (used only within types.ts)
@jaeone94 jaeone94 requested review from a team as code owners February 11, 2026 16:04
@dosubot dosubot bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Feb 11, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 11, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a new consolidated "Errors" tab and related UI (TabErrors, ErrorNodeCard), types, stories and tests; extends execution and right-side-panel stores to track prompt/node/runtime errors; app-level hooks open the errors panel on prompt errors; UI indicators and localization keys added.

Changes

Cohort / File(s) Summary
Error Tab & Components
src/components/rightSidePanel/errors/TabErrors.vue, src/components/rightSidePanel/errors/ErrorNodeCard.vue, src/components/rightSidePanel/errors/types.ts
New TabErrors component for aggregating/grouping/searching errors; ErrorNodeCard renders individual error cards; new exported types ErrorItem, ErrorCardData, ErrorGroup.
Tests & Stories
src/components/rightSidePanel/errors/TabErrors.test.ts, src/components/rightSidePanel/errors/ErrorNodeCard.stories.ts
Adds unit tests covering grouping, filtering, clipboard behavior; Storybook stories demonstrating multiple error scenarios.
Right Panel Integration
src/components/rightSidePanel/RightSidePanel.vue, src/stores/workspace/rightSidePanelStore.ts
Adds 'errors' tab option to store; conditionally shows an Errors tab when global errors exist and no selection; renders TabErrors when active.
Execution & App Flow
src/stores/executionStore.ts, src/scripts/app.ts
Adds lastPromptError, computed flags (hasAnyError, hasPromptError, hasNodeError, errorNodeIds), resets on runs, and app hooks to open right-side panel on prompt errors.
Top Menu & Section Widgets
src/components/TopMenuSection.vue, src/components/rightSidePanel/parameters/SectionWidgets.vue
Dynamic border styling driven by hasAnyError; per-node error indicator and “See Error” action that navigates to Errors tab.
Localization & Minor UI
src/locales/en/main.json, src/renderer/extensions/vueNodes/widgets/components/form/FormSearchInput.vue
Adds localization keys for errors UI and a presentational min-w-0 class tweak.

Sequence Diagram(s)

sequenceDiagram
    participant Executor as Executor
    participant App as app.ts
    participant Store as ExecutionStore
    participant RightPanel as RightSidePanel
    participant UI as TabErrors / ErrorNodeCard

    Executor->>App: emit PromptExecutionError / runtime error
    App->>Store: set `lastPromptError` / update `lastNodeErrors`
    App->>Store: clear selection & open right-side panel (tab: "errors")
    Store-->>RightPanel: `hasAnyError` / `lastPromptError` update
    RightPanel->>UI: render TabErrors -> ErrorNodeCard(s)
    UI->>Store: user actions (locateNode / enterSubgraph / copyToClipboard)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • shinshin86
  • Yorha4D
  • KarryCharon

Poem

🐰 I found a bug beneath a log,
I nibbled traces in the fog,
Cards lined up, errors call,
Prompts and nodes I chased and tall,
Hop, copy, fix — I cleared the bog! 🥕

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'Feat/errors tab panel' clearly identifies the main feature addition but uses unclear naming convention with slash separator and lacks specificity. Consider a clearer title like 'Add dedicated Errors tab to Right Side Panel' that better describes the feature without unconventional formatting.
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The description comprehensively covers all required sections (Summary, Changes, Review Focus) with extensive detail about implementation, architecture, testing, and edge cases.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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

Playwright: ❌ 518 passed, 1 failed · 4 flaky

❌ Failed Tests

📊 Browser Reports
  • chromium: View Report (✅ 506 / ❌ 1 / ⚠️ 4 / ⏭️ 8)
  • 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 11, 2026

🎨 Storybook Build Status

loading Build is starting...

⏰ Started at: 02/18/2026, 01:47:05 AM UTC

🚀 Building Storybook

  • 📦 Installing dependencies...
  • 🔧 Building Storybook components...
  • 🌐 Preparing deployment to Cloudflare Pages...

⏱️ Please wait while the Storybook build is in progress...

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: 5

🤖 Fix all issues with AI agents
In `@src/components/rightSidePanel/errors/ErrorNodeCard.vue`:
- Around line 86-92: Replace the array-based :class binding in ErrorNodeCard.vue
(the element conditioned on error.details) with the cn() utility: import cn from
'@/utils/tailwindUtil' and call cn() to combine the static classes ('rounded-lg
bg-secondary-background-hover p-2.5 overflow-y-auto border
border-interface-stroke/30') with the conditional runtime height class based on
error.isRuntimeError so class merging follows repo conventions; keep the
v-if="error.details" and the same class strings but pass them to cn() instead of
using :class="[]".

In `@src/components/rightSidePanel/errors/TabErrors.vue`:
- Around line 237-245: The locateNode function currently guards
canvasStore.canvas before awaiting navigateToGraph, but uses a non-null
assertion canvasStore.canvas! afterwards which could be null after the async
gap; modify locateNode to re-check canvasStore.canvas after the await (or store
a local reference if appropriate) and only call animateToBounds when the canvas
is still present. Specifically, update the locateNode implementation (which uses
getNodeByExecutionId, navigateToGraph and canvasStore.canvas.animateToBounds) to
perform a second null/undefined check on canvasStore.canvas (or capture it into
a local variable before the await and validate it) prior to calling
animateToBounds to avoid the unsafe non-null assertion.
- Around line 361-369: The two anchor tags that call openGitHubIssues and
contactSupport are not keyboard-accessible; replace each <a ...
`@click`="openGitHubIssues"> and <a ... `@click`="contactSupport"> with semantic
<button> elements styled to look like links (keeping classes and the click
handlers) or, if you must keep anchors, add a valid href, role="button",
tabindex="0" and keydown handlers that trigger openGitHubIssues/contactSupport
on Enter/Space; ensure you update the template entries that reference those
handlers (openGitHubIssues and contactSupport) and preserve existing classes and
i18n calls.
- Around line 185-187: Remove the redundant searcher function and its prop
binding: delete the async function searcher(query: string) { searchQuery.value =
query } and remove the :searcher="searcher" prop on the FormSearchInput (the
v-model="searchQuery" already handles updates); rely on the existing computed
filteredGroups in TabErrors for filtering and ensure no other code references
the searcher symbol.

In `@src/components/rightSidePanel/parameters/SectionWidgets.vue`:
- Around line 94-97: The navigateToErrorTab function should clear any current
selection before opening the global Errors tab so it becomes available; update
navigateToErrorTab to call this.canvas.deselectAll() (or canvas.deselectAll())
before calling rightSidePanelStore.openPanel('errors'), or if there is an active
node selection, route to that node's per-node 'error' tab instead (check
selection state and call openPanel('error') for the selected node); adjust
navigateToErrorTab accordingly to implement this selection check and deselect
behavior.
🧹 Nitpick comments (5)
src/components/rightSidePanel/errors/TabErrors.test.ts (3)

36-36: Avoid any type for i18n.

The coding guidelines prohibit using any. Use the return type of createI18n instead:

Proposed fix
-  let i18n: any
+  let i18n: ReturnType<typeof createI18n>

As per coding guidelines: "Never use any type; use proper TypeScript types."


112-115: Replace as any casts with vi.mocked().

Lines 114 and 135 use as any to mock return values. Use Vitest's vi.mocked() utility instead, which preserves type safety.

Proposed fix (line 114 shown; apply same pattern at line 135)
-    ;(getNodeByExecutionId as any).mockReturnValue({ title: 'CLIP Text Encode' })
+    vi.mocked(getNodeByExecutionId).mockReturnValue({ title: 'CLIP Text Encode' } as any)

Or better yet, create a properly-typed partial mock object. The same pattern applies to line 180 for useCopyToClipboard.

As per coding guidelines: "Never use as any type assertions; fix the underlying type issue instead." For mocking in Vitest, leverage Vitest's utilities where possible.


62-86: Prefer function declaration for mountComponent.

Proposed fix
-  const mountComponent = (initialState = {}) => {
-    return mount(TabErrors, {
+  function mountComponent(initialState = {}) {
+    return mount(TabErrors, {
       ...
-    })
-  }
+    })
+  }

As per coding guidelines: "Do not use function expressions if it's possible to use function declarations instead."

src/scripts/app.ts (1)

1466-1472: respError.details || "" coerces falsy values to empty string.

This is fine for a string field, but ?? "" would be more precise (only catching null/undefined). Minor nit — no behavioral difference expected here since details is always a string or absent.

src/components/rightSidePanel/errors/TabErrors.vue (1)

270-276: Consider noopener,noreferrer on window.open.

While GitHub is a trusted target, it's good practice to include window features to prevent the opened page from accessing window.opener:

Proposed fix
-  window.open(url, '_blank')
+  window.open(url, '_blank', 'noopener,noreferrer')

- TabErrors.test.ts: use proper i18n type, vi.mocked(), function declaration
- TabErrors.vue: remove redundant searcher function, use optional chaining on canvas, add noopener/noreferrer to window.open, replace <a> with <button> for a11y
- ErrorNodeCard.vue: use cn() for class merging, add cn import
- app.ts: use ?? instead of || for nullish coalescing
Only show the error indicator and 'See Error' navigation button when
no canvas items are selected (workflow overview state). When a node is
actively selected, the button is hidden to avoid confusing UX of
deselecting and jumping to the global errors tab.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/components/rightSidePanel/errors/TabErrors.vue`:
- Line 241: The call await navigateToGraph(graphNode.graph as LGraph) can mask a
missing or wrong type because graphNode.graph may be undefined or not an LGraph;
update the code that uses getNodeByExecutionId to first verify graphNode.graph
exists and is the correct type (e.g., check graphNode && graphNode.graph &&
graphNode.graph instanceof LGraph or use a type guard) before calling
navigateToGraph, and handle the fallback (log/notify or skip navigation) when
graph is missing or is a Subgraph so you don't blindly cast to LGraph.
🧹 Nitpick comments (3)
src/components/rightSidePanel/errors/TabErrors.vue (1)

359-367: Consider using the shared Button component with variant="link" instead of raw <button> elements.

Per codebase conventions, raw <button> HTML elements should be replaced with the shared Button component from @/components/ui/button/Button.vue. These inline link-styled buttons could use variant="link" for design system consistency.

That said, since these are inline within a <p> paragraph, the shared Button may need additional styling to render inline. This is a low-priority improvement.

src/components/rightSidePanel/parameters/SectionWidgets.vue (1)

184-226: Template changes are well-integrated.

The error icon, destructive label styling, and "See Error" button are cleanly added within the existing layout. Good use of the shared Button component (line 206) with @click.stop to prevent accordion toggle. flex-wrap on line 184 handles overflow gracefully.

One minor nit: line 192 uses a ternary :class binding that could use cn() for consistency with the codebase convention, though it's not the banned [] syntax.

Optional: use cn() for class merging
+import { cn } from '@/utils/tailwindUtil'
...
             <span
-              class="truncate"
-              :class="nodeHasError ? 'text-destructive-background-hover' : ''"
+              :class="cn('truncate', nodeHasError && 'text-destructive-background-hover')"
             >
src/components/rightSidePanel/errors/TabErrors.test.ts (1)

112-131: as any for mock return values — consider using a narrower partial type.

Lines 114 and 135 use as any for getNodeByExecutionId mock returns. Per coding guidelines, as any should be avoided. Since only title is needed, a targeted cast would be safer:

Suggested improvement
-    vi.mocked(getNodeByExecutionId).mockReturnValue({ title: 'CLIP Text Encode' } as any)
+    vi.mocked(getNodeByExecutionId).mockReturnValue({ title: 'CLIP Text Encode' } as ReturnType<typeof getNodeByExecutionId>)

Alternatively, if that's too verbose, a dedicated createMockNode helper with satisfies Partial<LGraphNode> could be used across tests.

- TabErrors.vue: guard graphNode.graph before navigateToGraph, use
  shared Button component for footer help links
- TabErrors.test.ts: replace 'as any' with ReturnType<typeof getNodeByExecutionId>
- SectionWidgets.vue: use cn() for class merging, restrict error
  indicator to workflow overview via canvasStore.selectedItems check
- Formatting: apply oxc auto-fixes across all changed files
Copy link
Member

@viva-jinyi viva-jinyi left a comment

Choose a reason for hiding this comment

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

Our project convention is that code should be self-expressive and comments should be minimized. It would be better to remove decorative separator comments (e.g. // ─── Sample Data ───...) and redundant JSDoc that just restates parameter names. Also, In our project, <template> goes at the top and <script> at the bottom.

return nodeLocatorId
}

/** Prompt-level errors without node IDs (e.g. invalid_prompt, prompt_no_outputs) */
Copy link
Member

Choose a reason for hiding this comment

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

nit: Could you move this part to the top of the file?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Done

"
>
<p
class="m-0 text-[11px] text-muted-foreground break-words whitespace-pre-wrap font-mono leading-relaxed"
Copy link
Member

Choose a reason for hiding this comment

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

Can you use text-sm or text-xs instead of fixed font size?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Done

variant="secondary"
size="sm"
class="w-full justify-center gap-2 h-8 text-[11px]"
@click="
Copy link
Member

Choose a reason for hiding this comment

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

I think it would be better to make this into a function

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Done

*/
const nodeHasError = computed(() => {
// Only show error indicator in workflow overview (nothing selected on canvas)
if (canvasStore.selectedItems.length > 0) return false
Copy link
Member

Choose a reason for hiding this comment

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

very nit
if (canvasStore.selectedItems.length > 0 || !targetNode.value) return false

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Done

"desc": "The workflow data sent to the server is empty. This may be an unexpected system error."
}
},
"errorHelpPrefix": "For more help, ",
Copy link
Member

Choose a reason for hiding this comment

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

Instead of splitting the help sentence into separate tokens (errorHelpPrefix, errorHelpOr, etc.), it would be better to use interpolation variables for github and support.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Done

return releaseRedDot || shouldShowConflictRedDot.value
})

const { hasAnyError: hasPromptError } = storeToRefs(executionStore)
Copy link
Member

Choose a reason for hiding this comment

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

hasAnyError is renamed to hasPromptError via destructuring, but this computed covers node errors and runtime errors too — not just prompt errors. Why was it renamed?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Done

variant="secondary"
size="sm"
class="rounded-lg text-sm shrink-0"
@click.stop="emit('enterSubgraph', card.nodeId!)"
Copy link
Member

Choose a reason for hiding this comment

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

nit: Can we use a fallback instead of non-null assertion(!)?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Done.
Replaced inline card.nodeId! assertions with dedicated handler functions (handleLocateNode, handleEnterSubgraph) that guard with if (card.nodeId) before emitting.

} else {
useDialogService().showExecutionErrorDialog(detail)
}
this.canvas.deselectAll()
Copy link
Member

Choose a reason for hiding this comment

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

I think deselecting nodes without user intent is not the right UX. If a user is in the middle of configuring a node and an error occurs, having their selection forcefully cleared is disruptive. Errors should be notified, not result in clearing the user's current working context.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I understand the concern. However, this error overview is ultimately designed as a complete replacement for the error modal dialog.

Consider the scenario: a user is editing a specific node (right side panel shows that node's parameters) and clicks the Run button. If an error occurs but we don't deselect, the right side panel stays on that node's parameter tab — and the user has no immediate visual feedback that something went wrong. The error information would be hidden behind a tab they'd have to manually navigate to.

With the current behavior, deselectAll() switches the right side panel to the Workflow Overview, which automatically surfaces the Errors tab with a clear summary of what failed. This mirrors the UX intent of the old modal dialog — errors demand immediate attention — but in a less intrusive, non-blocking way.

That said, I'm open to exploring alternatives if needed. For example, we could show a toast notification instead and let the user decide when to view the errors. But that would mean users could miss critical errors, which is the exact problem the error modal was solving. What do you think?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

@viva-jinyi
To address the concern you raised, I’ve discussed this with the team and we are trying out a non-intrusive overlay positioned below the TopMenuSection (PR #8875).

This allows us to notify the user of errors without interrupting their current workflow or forcing a change in node selection. We are currently awaiting feedback from the QA team on this improved UX.

const nodeId = targetNode.value.id

// Check lastNodeErrors (validation errors from 400 Bad Request)
if (executionStore.lastNodeErrors) {
Copy link
Member

Choose a reason for hiding this comment

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

nodeHasError iterates over all keys in lastNodeErrors and calls getNodeByExecutionId (which traverses the graph) for each one. Since SectionWidgets is rendered per-node, this results in O(n²) complexity. Could we instead pre-compute a Set<nodeId> of error node IDs in the store as a computed, so each component can just do set.has(myId) for O(1) lookup?

Copy link
Collaborator Author

@jaeone94 jaeone94 Feb 16, 2026

Choose a reason for hiding this comment

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

Done.
The per-node iteration over lastNodeErrors with getNodeByExecutionId has been replaced with a pre-computed errorNodeIds Set in the execution store, giving each component an O(1) set.has() lookup.
The graph traversal now runs once in the store's computed, not per-SectionWidgets instance.

@viva-jinyi viva-jinyi assigned jaeone94 and unassigned jaeone94 Feb 12, 2026
jaeone94 and others added 4 commits February 12, 2026 20:32
- Fix misleading hasAnyError alias in TopMenuSection
- Replace non-null assertion with nullish coalescing fallback
- Add pre-computed errorNodeIds Set in executionStore for O(1) lookup
- Consolidate fragmented i18n tokens into single interpolated key
  using <i18n-t> component
- Remove decorative separator comments and redundant JSDoc
When clicking See Error from a node's widget section, the errors tab now expands only the group containing that node and collapses all others.
@viva-jinyi viva-jinyi assigned AustinMroz and DrJKL and unassigned viva-jinyi Feb 12, 2026
Copy link
Collaborator

@AustinMroz AustinMroz left a comment

Choose a reason for hiding this comment

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

Jin Yi was already super thorough here. I only saw a single trivial nit.

</div>

<!-- Fixed Footer: Help Links -->
<div class="shrink-0 border-t border-interface-stroke px-4 py-4 min-w-0">
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
<div class="shrink-0 border-t border-interface-stroke px-4 py-4 min-w-0">
<div class="shrink-0 border-t border-interface-stroke p-4 min-w-0">

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Fixed!

@github-actions
Copy link

github-actions bot commented Feb 13, 2026

Bundle Size Report

Summary

  • Raw size: 19.9 MB baseline 19.9 MB — 🔴 +20.6 kB
  • Gzip: 4.25 MB baseline 4.25 MB — 🔴 +4.71 kB
  • Brotli: 3.3 MB baseline 3.3 MB — 🔴 +3.29 kB
  • Bundles: 231 current • 231 baseline • 118 added / 118 removed

Category Glance
Graph Workspace 🔴 +17.4 kB (905 kB) · Data & Services 🔴 +2.4 kB (2.16 MB) · Other 🔴 +802 B (7.36 MB) · Vendor & Third-Party ⚪ 0 B (8.69 MB) · Panels & Settings ⚪ 0 B (427 kB) · Utilities & Hooks ⚪ 0 B (237 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-B07ZKev6.js (new) 21.7 kB 🔴 +21.7 kB 🔴 +7.03 kB 🔴 +6.11 kB
assets/index-CWCXXQHk.js (removed) 21.7 kB 🟢 -21.7 kB 🟢 -7.03 kB 🟢 -6.13 kB

Status: 1 added / 1 removed

Graph Workspace — 905 kB (baseline 888 kB) • 🔴 +17.4 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-wn3we8a6.js (new) 905 kB 🔴 +905 kB 🔴 +195 kB 🔴 +148 kB
assets/GraphView-B1klGOZv.js (removed) 888 kB 🟢 -888 kB 🟢 -191 kB 🟢 -146 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-B-BuwBaG.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.31 kB 🟢 -2.83 kB
assets/CloudSurveyView-DZqgBSVw.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.83 kB
assets/CloudLoginView-BLzR3O3h.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.95 kB 🔴 +2.59 kB
assets/CloudLoginView-CD2cPREU.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.95 kB 🟢 -2.59 kB
assets/UserCheckView-BrbulDWr.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.23 kB 🟢 -1.93 kB
assets/UserCheckView-CS7X6dqk.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/CloudSignupView-DTL4O1Z9.js (new) 7.46 kB 🔴 +7.46 kB 🔴 +2.34 kB 🔴 +2.05 kB
assets/CloudSignupView-j6N06sRi.js (removed) 7.46 kB 🟢 -7.46 kB 🟢 -2.34 kB 🟢 -2.05 kB
assets/CloudLayoutView-CxS0897T.js (removed) 6.48 kB 🟢 -6.48 kB 🟢 -2.12 kB 🟢 -1.85 kB
assets/CloudLayoutView-wmOI-6pn.js (new) 6.48 kB 🔴 +6.48 kB 🔴 +2.12 kB 🔴 +1.85 kB
assets/CloudForgotPasswordView--DF5vRoP.js (new) 5.61 kB 🔴 +5.61 kB 🔴 +1.95 kB 🔴 +1.73 kB
assets/CloudForgotPasswordView-QMhttYx9.js (removed) 5.61 kB 🟢 -5.61 kB 🟢 -1.95 kB 🟢 -1.73 kB
assets/CloudAuthTimeoutView-aMNAOrOF.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.79 kB 🟢 -1.56 kB
assets/CloudAuthTimeoutView-BVS8rceS.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/CloudSubscriptionRedirectView-CMppxyKM.js (removed) 4.76 kB 🟢 -4.76 kB 🟢 -1.8 kB 🟢 -1.59 kB
assets/CloudSubscriptionRedirectView-D1F8k60L.js (new) 4.76 kB 🔴 +4.76 kB 🔴 +1.8 kB 🔴 +1.59 kB
assets/UserSelectView-CnA-Ntkh.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.47 kB
assets/UserSelectView-OYxltOQR.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.46 kB
assets/CloudSorryContactSupportView-Dt5tckIJ.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-Dw2vG5GB.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-BWaKIBeU.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.3 kB 🔴 +4.65 kB
assets/SecretsPanel-CEyGfKZQ.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.64 kB
assets/LegacyCreditsPanel-CgVRhjUn.js (removed) 20.7 kB 🟢 -20.7 kB 🟢 -5.58 kB 🟢 -4.91 kB
assets/LegacyCreditsPanel-Z6M7iGiZ.js (new) 20.7 kB 🔴 +20.7 kB 🔴 +5.58 kB 🔴 +4.92 kB
assets/SubscriptionPanel-C_onwbGi.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.74 kB 🔴 +4.19 kB
assets/SubscriptionPanel-DBKUyGVk.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.73 kB 🟢 -4.19 kB
assets/KeybindingPanel-DQth3Pdi.js (new) 12.4 kB 🔴 +12.4 kB 🔴 +3.59 kB 🔴 +3.17 kB
assets/KeybindingPanel-wdRD15Dk.js (removed) 12.4 kB 🟢 -12.4 kB 🟢 -3.58 kB 🟢 -3.18 kB
assets/ExtensionPanel-BTTCKZQ3.js (removed) 9.43 kB 🟢 -9.43 kB 🟢 -2.67 kB 🟢 -2.37 kB
assets/ExtensionPanel-hXLz35jP.js (new) 9.43 kB 🔴 +9.43 kB 🔴 +2.67 kB 🔴 +2.38 kB
assets/AboutPanel-5Ky45sui.js (removed) 8.53 kB 🟢 -8.53 kB 🟢 -2.44 kB 🟢 -2.19 kB
assets/AboutPanel-YA3rM18r.js (new) 8.53 kB 🔴 +8.53 kB 🔴 +2.44 kB 🔴 +2.2 kB
assets/ServerConfigPanel-BYNEmjK9.js (new) 6.5 kB 🔴 +6.5 kB 🔴 +2.13 kB 🔴 +1.94 kB
assets/ServerConfigPanel-DAnpng5t.js (removed) 6.5 kB 🟢 -6.5 kB 🟢 -2.13 kB 🟢 -1.93 kB
assets/UserPanel--3buhCjV.js (new) 6.21 kB 🔴 +6.21 kB 🔴 +2.02 kB 🔴 +1.76 kB
assets/UserPanel-Dvd6i-HO.js (removed) 6.21 kB 🟢 -6.21 kB 🟢 -2.01 kB 🟢 -1.76 kB
assets/cloudRemoteConfig-CYajqZui.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -731 B 🟢 -633 B
assets/cloudRemoteConfig-DJUPax2U.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +729 B 🔴 +631 B
assets/refreshRemoteConfig-CqTSZ6Lo.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +521 B 🔴 +453 B
assets/refreshRemoteConfig-DIGG3JJu.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -519 B 🟢 -480 B
assets/config-CH_cdA2N.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BPLxqAe3.js 29.8 kB 29.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BUIbWSEk.js 28 kB 28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C0d1Q_Kv.js 27.1 kB 27.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CAXBW2_0.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cjk3QxCD.js 37.6 kB 37.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CrmQjb0f.js 31.6 kB 31.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D1AmG0ju.js 23.3 kB 23.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D6ltw1Hs.js 29.2 kB 29.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DqZYOPVX.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DubbIIfi.js 28.1 kB 28.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-wh8yrcgf.js 27.3 kB 27.3 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-BW3rMdpA.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +988 B
assets/auth-CJ89UTLA.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -991 B
assets/SignUpForm-Cb4C0Y6x.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.1 kB
assets/SignUpForm-VSIflCXg.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.1 kB
assets/UpdatePasswordContent-dyJEQ50U.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.09 kB 🔴 +965 B
assets/UpdatePasswordContent-nEvcBKen.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.09 kB 🟢 -961 B
assets/firebaseAuthStore-c1kfCRBE.js (removed) 837 B 🟢 -837 B 🟢 -406 B 🟢 -363 B
assets/firebaseAuthStore-C214fIK7.js (new) 837 B 🔴 +837 B 🔴 +406 B 🔴 +366 B
assets/auth-D2oqocYb.js (removed) 357 B 🟢 -357 B 🟢 -227 B 🟢 -195 B
assets/auth-DwcsL-iy.js (new) 357 B 🔴 +357 B 🔴 +224 B 🔴 +195 B
assets/PasswordFields-PRmvmozX.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-BbVtvHlF.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-C2O7AiSY.js (new) 785 B 🔴 +785 B 🔴 +399 B 🔴 +353 B
assets/useSubscriptionDialog-DQF5OMe2.js (removed) 785 B 🟢 -785 B 🟢 -398 B 🟢 -350 B

Status: 1 added / 1 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs--xW8KwRm.js (removed) 9.89 kB 🟢 -9.89 kB 🟢 -3.42 kB 🟢 -3.01 kB
assets/useTerminalTabs-D7y4bPKk.js (new) 9.89 kB 🔴 +9.89 kB 🔴 +3.42 kB 🔴 +3.01 kB
assets/ComfyQueueButton-BBPwOHmL.js (new) 7.17 kB 🔴 +7.17 kB 🔴 +2.32 kB 🔴 +2.07 kB
assets/ComfyQueueButton-ClnTtJTg.js (removed) 7.17 kB 🟢 -7.17 kB 🟢 -2.32 kB 🟢 -2.07 kB
assets/SubscribeButton-C4_8QVSp.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.02 kB 🔴 +888 B
assets/SubscribeButton-CiqvItaF.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.02 kB 🟢 -888 B
assets/cloudFeedbackTopbarButton-DOGjM0SR.js (removed) 1.64 kB 🟢 -1.64 kB 🟢 -875 B 🟢 -775 B
assets/cloudFeedbackTopbarButton-DP0fmU5C.js (new) 1.64 kB 🔴 +1.64 kB 🔴 +875 B 🔴 +779 B
assets/ComfyQueueButton-Cm2Lrz9m.js (new) 842 B 🔴 +842 B 🔴 +413 B 🔴 +371 B
assets/ComfyQueueButton-DOAjcKWQ.js (removed) 842 B 🟢 -842 B 🟢 -413 B 🟢 -369 B
assets/Button-BSbVSHEC.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-QozxHIt4.js 1.24 kB 1.24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-CFCM1GaS.js 7.45 kB 7.45 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-BG_h7fX0.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-C-W7fvtO.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.16 MB (baseline 2.16 MB) • 🔴 +2.4 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-CQ3iSKGj.js (new) 1.38 MB 🔴 +1.38 MB 🔴 +311 kB 🔴 +239 kB
assets/dialogService-BcYeT53x.js (removed) 1.38 MB 🟢 -1.38 MB 🟢 -310 kB 🟢 -239 kB
assets/api-C6DQRRmv.js (new) 647 kB 🔴 +647 kB 🔴 +146 kB 🔴 +117 kB
assets/api-D362CVif.js (removed) 647 kB 🟢 -647 kB 🟢 -146 kB 🟢 -117 kB
assets/load3dService-GEl2uQ8a.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/load3dService-Xu3lP9ZG.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/systemStatsStore-B64q6Pc9.js (removed) 12.2 kB 🟢 -12.2 kB 🟢 -4.27 kB 🟢 -3.74 kB
assets/systemStatsStore-C29B9OSK.js (new) 12.2 kB 🔴 +12.2 kB 🔴 +4.27 kB 🔴 +3.74 kB
assets/releaseStore-CetFnrKF.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/releaseStore-CvQE_smX.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/keybindingService-D-cSzXfR.js (new) 6.57 kB 🔴 +6.57 kB 🔴 +1.72 kB 🔴 +1.49 kB
assets/keybindingService-DdxtvFCF.js (removed) 6.57 kB 🟢 -6.57 kB 🟢 -1.72 kB 🟢 -1.49 kB
assets/bootstrapStore-2BJKkbbJ.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -876 B 🟢 -799 B
assets/bootstrapStore-BV7QaWF0.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +877 B 🔴 +794 B
assets/userStore-C5CtPSQ_.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -720 B 🟢 -636 B
assets/userStore-CGsXLFJZ.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +722 B 🔴 +675 B
assets/audioService-BDUdZWF2.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -847 B 🟢 -725 B
assets/audioService-DbG2WegD.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +847 B 🔴 +725 B
assets/releaseStore-DB3s2dIg.js (removed) 809 B 🟢 -809 B 🟢 -404 B 🟢 -357 B
assets/releaseStore-DD788iv5.js (new) 809 B 🔴 +809 B 🔴 +404 B 🔴 +363 B
assets/settingStore-Cyl5qdlO.js (new) 793 B 🔴 +793 B 🔴 +406 B 🔴 +360 B
assets/settingStore-DGzVmTxv.js (removed) 793 B 🟢 -793 B 🟢 -405 B 🟢 -358 B
assets/workflowDraftStore-6pa_o60r.js (new) 785 B 🔴 +785 B 🔴 +399 B 🔴 +357 B
assets/workflowDraftStore-BcQkQP7T.js (removed) 785 B 🟢 -785 B 🟢 -399 B 🟢 -350 B
assets/dialogService-DtPWyFWo.js (removed) 774 B 🟢 -774 B 🟢 -390 B 🟢 -349 B
assets/dialogService-DXsMGNeA.js (new) 774 B 🔴 +774 B 🔴 +391 B 🔴 +348 B
assets/dialogStore-DqEczCra.js 4.1 kB 4.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-DUe9-l1S.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) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-CkKbCZtg.js (new) 178 kB 🔴 +178 kB 🔴 +39.4 kB 🔴 +32.7 kB
assets/useConflictDetection-DlhG1Z5s.js (removed) 178 kB 🟢 -178 kB 🟢 -39.4 kB 🟢 -32.8 kB
assets/useLoad3d-CNWJeobV.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-DJgep5RV.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3dViewer-CNFpM9Li.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.79 kB
assets/useLoad3dViewer-D69ODGXU.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.79 kB
assets/useFeatureFlags-C6UQCC6x.js (new) 3.5 kB 🔴 +3.5 kB 🔴 +1.08 kB 🔴 +928 B
assets/useFeatureFlags-p2oRuMxJ.js (removed) 3.5 kB 🟢 -3.5 kB 🟢 -1.08 kB 🟢 -930 B
assets/useWorkspaceUI-Beq2xhTj.js (removed) 3 kB 🟢 -3 kB 🟢 -822 B 🟢 -700 B
assets/useWorkspaceUI-D_NxJCWr.js (new) 3 kB 🔴 +3 kB 🔴 +823 B 🔴 +695 B
assets/useSubscriptionCredits-BtPuBSQ7.js (removed) 2.75 kB 🟢 -2.75 kB 🟢 -1.04 kB 🟢 -895 B
assets/useSubscriptionCredits-CqqLt_C6.js (new) 2.75 kB 🔴 +2.75 kB 🔴 +1.04 kB 🔴 +898 B
assets/subscriptionCheckoutUtil-CdaXoAwi.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +954 B
assets/subscriptionCheckoutUtil-DBRqJjBr.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -949 B
assets/useExternalLink-6UmCvRQv.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +773 B 🔴 +680 B
assets/useExternalLink-x_Ly1PFa.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -772 B 🟢 -677 B
assets/useCopyToClipboard-BSAzszd-.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +665 B 🔴 +564 B
assets/useCopyToClipboard-D47N4l6y.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -670 B 🟢 -563 B
assets/useErrorHandling-Bu0o_v72.js (new) 1.47 kB 🔴 +1.47 kB 🔴 +612 B 🔴 +515 B
assets/useErrorHandling-Dt-iB5x5.js (removed) 1.47 kB 🟢 -1.47 kB 🟢 -611 B 🟢 -517 B
assets/useWorkspaceSwitch-Bm4h3i8j.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +543 B 🔴 +485 B
assets/useWorkspaceSwitch-C5uuesbw.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -543 B 🟢 -488 B
assets/useLoad3d-BB0un6TE.js (removed) 908 B 🟢 -908 B 🟢 -444 B 🟢 -402 B
assets/useLoad3d-D6qh2eeF.js (new) 908 B 🔴 +908 B 🔴 +443 B 🔴 +402 B
assets/useLoad3dViewer-C2T2ioYW.js (new) 887 B 🔴 +887 B 🔴 +429 B 🔴 +393 B
assets/useLoad3dViewer-CT2Ga8Fs.js (removed) 887 B 🟢 -887 B 🟢 -427 B 🟢 -386 B
assets/audioUtils-CRYQgvTR.js (removed) 858 B 🟢 -858 B 🟢 -501 B 🟢 -402 B
assets/audioUtils-DpHsvrd-.js (new) 858 B 🔴 +858 B 🔴 +499 B 🔴 +409 B
assets/useCurrentUser-70D3mShI.js (removed) 771 B 🟢 -771 B 🟢 -394 B 🟢 -349 B
assets/useCurrentUser-CH_wbwGF.js (new) 771 B 🔴 +771 B 🔴 +394 B 🔴 +348 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-DbhsokLF.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-CWHPCody.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.36 MB (baseline 7.36 MB) • 🔴 +802 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-dudqiMSP.js (new) 499 kB 🔴 +499 kB 🔴 +95.9 kB 🔴 +74.8 kB
assets/i18n-BY__kdja.js (removed) 499 kB 🟢 -499 kB 🟢 -95.7 kB 🟢 -74.5 kB
assets/core-B8Lk-UxE.js (removed) 72.5 kB 🟢 -72.5 kB 🟢 -18.7 kB 🟢 -16 kB
assets/core-BIgwZLDp.js (new) 72.5 kB 🔴 +72.5 kB 🔴 +18.7 kB 🔴 +16 kB
assets/groupNode-hURZwGVL.js (removed) 72.1 kB 🟢 -72.1 kB 🟢 -17.8 kB 🟢 -15.6 kB
assets/groupNode-q2FDq_au.js (new) 72.1 kB 🔴 +72.1 kB 🔴 +17.8 kB 🔴 +15.6 kB
assets/WidgetSelect-c2n7VMNN.js (removed) 57.8 kB 🟢 -57.8 kB 🟢 -12.3 kB 🟢 -10.6 kB
assets/WidgetSelect-ScCEw9S9.js (new) 57.8 kB 🔴 +57.8 kB 🔴 +12.3 kB 🔴 +10.6 kB
assets/SubscriptionRequiredDialogContentWorkspace-Ci7qaQrK.js (new) 45.9 kB 🔴 +45.9 kB 🔴 +8.58 kB 🔴 +7.44 kB
assets/SubscriptionRequiredDialogContentWorkspace-pn83EYwh.js (removed) 45.9 kB 🟢 -45.9 kB 🟢 -8.58 kB 🟢 -7.42 kB
assets/Load3DControls-CNsXTtw5.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/Load3DControls-DPE1nbQX.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/WorkspacePanelContent-C3_8PjOp.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.13 kB 🔴 +5.38 kB
assets/WorkspacePanelContent-EoTbEewR.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.12 kB 🟢 -5.38 kB
assets/SubscriptionRequiredDialogContent-Fb6k9-Un.js (new) 26.2 kB 🔴 +26.2 kB 🔴 +6.59 kB 🔴 +5.79 kB
assets/SubscriptionRequiredDialogContent-ZQR17CU2.js (removed) 26.2 kB 🟢 -26.2 kB 🟢 -6.59 kB 🟢 -5.79 kB
assets/Load3dViewerContent-CcTEOBWa.js (new) 23.1 kB 🔴 +23.1 kB 🔴 +5.19 kB 🔴 +4.5 kB
assets/Load3dViewerContent-DaYNYRWo.js (removed) 23.1 kB 🟢 -23.1 kB 🟢 -5.19 kB 🟢 -4.5 kB
assets/MissingNodesContent-BgTIRDvA.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.77 kB 🔴 +5.09 kB
assets/MissingNodesContent-DyUKDmd0.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.76 kB 🟢 -5.09 kB
assets/WidgetImageCrop-BuVayAWU.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.51 kB 🟢 -4.86 kB
assets/WidgetImageCrop-DJg7-X0O.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.51 kB 🔴 +4.84 kB
assets/SubscriptionPanelContentWorkspace-C2CpQpXW.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +5.02 kB 🔴 +4.43 kB
assets/SubscriptionPanelContentWorkspace-jOGexRom.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -5.02 kB 🟢 -4.43 kB
assets/CurrentUserPopoverWorkspace-CLvV4aPW.js (new) 19.9 kB 🔴 +19.9 kB 🔴 +4.89 kB 🔴 +4.36 kB
assets/CurrentUserPopoverWorkspace-DP2IAFnI.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -4.88 kB 🟢 -4.35 kB
assets/SignInContent-BPxVcRAg.js (new) 19 kB 🔴 +19 kB 🔴 +4.81 kB 🔴 +4.21 kB
assets/SignInContent-DtFiFACc.js (removed) 19 kB 🟢 -19 kB 🟢 -4.81 kB 🟢 -4.21 kB
assets/WidgetRecordAudio-Cl6Sq9rm.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -4.96 kB 🟢 -4.43 kB
assets/WidgetRecordAudio-Dm6TUtw3.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +4.97 kB 🔴 +4.43 kB
assets/MissingModelsWarning-BaGiQ2sT.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +4.7 kB 🔴 +4.18 kB
assets/MissingModelsWarning-CzCURQod.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -4.7 kB 🟢 -4.18 kB
assets/Load3D-B19FK0__.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.04 kB 🟢 -3.53 kB
assets/Load3D-DKIhbcRi.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.04 kB 🔴 +3.53 kB
assets/WidgetInputNumber-CfeDuuXL.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -4.26 kB 🟢 -3.8 kB
assets/WidgetInputNumber-DxkqmPe8.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.26 kB 🔴 +3.8 kB
assets/load3d-BunXIz3Q.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.2 kB 🟢 -3.64 kB
assets/load3d-CxalBdur.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.21 kB 🔴 +3.64 kB
assets/LazyImage-hkB_HS4m.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.8 kB 🔴 +3.34 kB
assets/LazyImage-DSlFyohh.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.79 kB 🟢 -3.34 kB
assets/AudioPreviewPlayer-B5yIKIsy.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.21 kB 🟢 -2.87 kB
assets/AudioPreviewPlayer-nTUd8cJu.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.21 kB 🔴 +2.86 kB
assets/NodeConflictDialogContent-C0nzd0TE.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.36 kB 🟢 -2.08 kB
assets/NodeConflictDialogContent-caHRRhpu.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.36 kB 🔴 +2.07 kB
assets/changeTracker-C2vIK5un.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.89 kB 🔴 +2.55 kB
assets/changeTracker-Ct__ngWZ.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.89 kB 🟢 -2.54 kB
assets/nodeTemplates-CBBl3u1i.js (new) 9.35 kB 🔴 +9.35 kB 🔴 +3.28 kB 🔴 +2.87 kB
assets/nodeTemplates-DGW2x57k.js (removed) 9.35 kB 🟢 -9.35 kB 🟢 -3.28 kB 🟢 -2.88 kB
assets/MissingNodesFooter-BwEu8zBJ.js (new) 7.54 kB 🔴 +7.54 kB 🔴 +2.47 kB 🔴 +2.21 kB
assets/MissingNodesFooter-YcYAoZVq.js (removed) 7.54 kB 🟢 -7.54 kB 🟢 -2.47 kB 🟢 -2.21 kB
assets/InviteMemberDialogContent-Ca7qjiKW.js (removed) 7.44 kB 🟢 -7.44 kB 🟢 -2.31 kB 🟢 -2.02 kB
assets/InviteMemberDialogContent-DoUEdp10.js (new) 7.44 kB 🔴 +7.44 kB 🔴 +2.31 kB 🔴 +2.01 kB
assets/WidgetWithControl-BoRgAHzu.js (removed) 7.08 kB 🟢 -7.08 kB 🟢 -2.65 kB 🟢 -2.36 kB
assets/WidgetWithControl-CEIHZ__P.js (new) 7.08 kB 🔴 +7.08 kB 🔴 +2.65 kB 🔴 +2.36 kB
assets/Load3DConfiguration-BG9xEOc9.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/Load3DConfiguration-DAULkw5Y.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/CreateWorkspaceDialogContent-CBqjQVkR.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -2.01 kB 🟢 -1.75 kB
assets/CreateWorkspaceDialogContent-D3nocFuQ.js (new) 5.58 kB 🔴 +5.58 kB 🔴 +2.01 kB 🔴 +1.75 kB
assets/EditWorkspaceDialogContent-Bjsho9eX.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.96 kB 🟢 -1.71 kB
assets/EditWorkspaceDialogContent-BKoUzDIx.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.97 kB 🔴 +1.72 kB
assets/ValueControlPopover-CPS7Busl.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.79 kB 🟢 -1.59 kB
assets/ValueControlPopover-CYgzGBGT.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.79 kB 🔴 +1.6 kB
assets/Preview3d-Bi3mZEpS.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.58 kB 🟢 -1.39 kB
assets/Preview3d-ChZKUksH.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.59 kB 🔴 +1.39 kB
assets/CancelSubscriptionDialogContent-DGoqUXoN.js (new) 4.85 kB 🔴 +4.85 kB 🔴 +1.8 kB 🔴 +1.58 kB
assets/CancelSubscriptionDialogContent-VRQZMke2.js (removed) 4.85 kB 🟢 -4.85 kB 🟢 -1.8 kB 🟢 -1.58 kB
assets/DeleteWorkspaceDialogContent-BcgHvFTB.js (new) 4.29 kB 🔴 +4.29 kB 🔴 +1.65 kB 🔴 +1.44 kB
assets/DeleteWorkspaceDialogContent-C3SWwn2s.js (removed) 4.29 kB 🟢 -4.29 kB 🟢 -1.65 kB 🟢 -1.44 kB
assets/LeaveWorkspaceDialogContent-Bvus6N2S.js (new) 4.12 kB 🔴 +4.12 kB 🔴 +1.6 kB 🔴 +1.38 kB
assets/LeaveWorkspaceDialogContent-Cnk-XIkQ.js (removed) 4.12 kB 🟢 -4.12 kB 🟢 -1.6 kB 🟢 -1.38 kB
assets/RemoveMemberDialogContent-goR3COd3.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.55 kB 🟢 -1.34 kB
assets/RemoveMemberDialogContent-QFDw4HgE.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.55 kB 🔴 +1.35 kB
assets/RevokeInviteDialogContent-BmEplSgq.js (removed) 4.01 kB 🟢 -4.01 kB 🟢 -1.56 kB 🟢 -1.37 kB
assets/RevokeInviteDialogContent-Y9qfNhaT.js (new) 4.01 kB 🔴 +4.01 kB 🔴 +1.56 kB 🔴 +1.37 kB
assets/InviteMemberUpsellDialogContent-DvcfM7ct.js (new) 3.88 kB 🔴 +3.88 kB 🔴 +1.42 kB 🔴 +1.25 kB
assets/InviteMemberUpsellDialogContent-FIWxbU4a.js (removed) 3.88 kB 🟢 -3.88 kB 🟢 -1.42 kB 🟢 -1.25 kB
assets/saveMesh-DTXO2AvA.js (new) 3.43 kB 🔴 +3.43 kB 🔴 +1.48 kB 🔴 +1.31 kB
assets/saveMesh-L2E8SGc6.js (removed) 3.43 kB 🟢 -3.43 kB 🟢 -1.48 kB 🟢 -1.32 kB
assets/cloudSessionCookie-BqyJaVLV.js (new) 3.15 kB 🔴 +3.15 kB 🔴 +1.11 kB 🔴 +1.01 kB
assets/cloudSessionCookie-Df2cGuex.js (removed) 3.15 kB 🟢 -3.15 kB 🟢 -1.1 kB 🟢 -980 B
assets/GlobalToast-BHxa2JQG.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.06 kB
assets/GlobalToast-DnBDvnJ1.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/ApiNodesSignInContent-CRL-KWbK.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +921 B
assets/ApiNodesSignInContent-CysTWgRq.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -921 B
assets/NodeConflictFooter-BnZnCoIp.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.03 kB 🟢 -905 B
assets/NodeConflictFooter-Cm8DYGIz.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.03 kB 🔴 +910 B
assets/SubscribeToRun-CBm-jTsc.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +887 B
assets/SubscribeToRun-TElIRYXv.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -893 B
assets/ImportFailedNodeFooter-C6_RS9wU.js (new) 1.88 kB 🔴 +1.88 kB 🔴 +866 B 🔴 +758 B
assets/ImportFailedNodeFooter-CQFqbxsG.js (removed) 1.88 kB 🟢 -1.88 kB 🟢 -868 B 🟢 -758 B
assets/CloudRunButtonWrapper-CjeR2Nkl.js (removed) 1.72 kB 🟢 -1.72 kB 🟢 -803 B 🟢 -717 B
assets/CloudRunButtonWrapper-CU3PRHDn.js (new) 1.72 kB 🔴 +1.72 kB 🔴 +804 B 🔴 +735 B
assets/signInSchema-CPbzlk_C.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -563 B 🟢 -525 B
assets/signInSchema-HzJLzPwi.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +561 B 🔴 +515 B
assets/cloudBadges-CGotQPU1.js (new) 1.42 kB 🔴 +1.42 kB 🔴 +728 B 🔴 +635 B
assets/cloudBadges-DfjE3GXE.js (removed) 1.42 kB 🟢 -1.42 kB 🟢 -725 B 🟢 -625 B
assets/cloudSubscription-B5G_V25l.js (new) 1.38 kB 🔴 +1.38 kB 🔴 +679 B 🔴 +587 B
assets/cloudSubscription-DD8mS33o.js (removed) 1.38 kB 🟢 -1.38 kB 🟢 -678 B 🟢 -588 B
assets/Load3D-BJbLEc43.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -516 B 🟢 -461 B
assets/Load3D-DEha_mPc.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +518 B 🔴 +460 B
assets/nightlyBadges-7-37smJz.js (new) 1.05 kB 🔴 +1.05 kB 🔴 +556 B 🔴 +492 B
assets/nightlyBadges-Cha9r3Cl.js (removed) 1.05 kB 🟢 -1.05 kB 🟢 -554 B 🟢 -494 B
assets/Load3dViewerContent-B_gxIxdp.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -488 B 🟢 -436 B
assets/Load3dViewerContent-CzvrB_q9.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +488 B 🔴 +437 B
assets/SubscriptionPanelContentWorkspace-BNTjxzDF.js (removed) 979 B 🟢 -979 B 🟢 -455 B 🟢 -399 B
assets/SubscriptionPanelContentWorkspace-CWyQAcqh.js (new) 979 B 🔴 +979 B 🔴 +457 B 🔴 +399 B
assets/changeTracker-D4efbeMx.js (removed) 806 B 🟢 -806 B 🟢 -405 B 🟢 -357 B
assets/changeTracker-TuwNrg3l.js (new) 806 B 🔴 +806 B 🔴 +405 B 🔴 +353 B
assets/WidgetLegacy-CKs7luE9.js (new) 794 B 🔴 +794 B 🔴 +404 B 🔴 +355 B
assets/WidgetLegacy-Dksumqv9.js (removed) 794 B 🟢 -794 B 🟢 -404 B 🟢 -352 B
assets/graphHasMissingNodes-BK6T0H6q.js (new) 761 B 🔴 +761 B 🔴 +373 B 🔴 +317 B
assets/graphHasMissingNodes-U96hRiGz.js (removed) 761 B 🟢 -761 B 🟢 -373 B 🟢 -316 B
assets/WidgetInputNumber-BkfqeHlb.js (new) 392 B 🔴 +392 B 🔴 +231 B 🔴 +212 B
assets/WidgetInputNumber-BQyV9PEO.js (removed) 392 B 🟢 -392 B 🟢 -231 B 🟢 -210 B
assets/i18n-CkLLGnFv.js (removed) 199 B 🟢 -199 B 🟢 -160 B 🟢 -137 B
assets/i18n-Di-EEa19.js (new) 199 B 🔴 +199 B 🔴 +159 B 🔴 +139 B
assets/AnimationControls-uhOvrOXP.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--dbbFEs2.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-BcOH_oP5.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-CmrP3hho.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BE-vRwJl.js 16.6 kB 16.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BGHyTYD4.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Bh57dtIu.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BhnFE3Dq.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C0TQG5MC.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CauhF9Qg.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D_1Nwml0.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D6_SlWq_.js 18.4 kB 18.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DDnyk4ZD.js 15.7 kB 15.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Xb1k_0Gj.js 14.7 kB 14.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-yQtLjIyn.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-ogISyp4e.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeContent-Cbt6jZyc.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeHeader-C52A0tqP.js 1.08 kB 1.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-7KhO79U2.js 155 kB 155 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B6lyQvKX.js 168 kB 168 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BBvxedOi.js 162 kB 162 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BM8MKqKu.js 118 kB 118 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cz6EcpEz.js 139 kB 139 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D-Lg1Wa9.js 135 kB 135 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DIeDT-JP.js 188 kB 188 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DUkjvBLJ.js 137 kB 137 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-EXeOXU5P.js 119 kB 119 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-uYlS1Kwa.js 134 kB 134 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-WBc97D5v.js 142 kB 142 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-BHB5UVIn.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-BYoymEsG.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-DVg0EyQw.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-CoCFfqkW.js 2.23 kB 2.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingNodesHeader-JfpleXg9.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictHeader-DgbhznVf.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-0Gpjtfhf.js 417 kB 417 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B_dW1xH5.js 371 kB 371 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B8pysXqY.js 371 kB 371 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BaGUtEt2.js 418 kB 418 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BF0MkEEN.js 341 kB 341 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bk5oYw7N.js 364 kB 364 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C909H8H1.js 456 kB 456 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CttrC3hl.js 368 kB 368 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DjSLMO-X.js 375 kB 375 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DNTmluu-.js 386 kB 386 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-PzbbBC-f.js 338 kB 338 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-BlNc6I0i.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-C8KGUioc.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-DMPeCuhp.js 3.91 kB 3.91 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-F8leYtSX.js 131 B 131 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-BDCRAbXS.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-DfUBpgxw.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-7qXE9PZk.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-CeaLzXAr.js 3.1 kB 3.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-BQ_QzI-O.js 1.86 kB 1.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-CvLvf7SF.js 1.95 kB 1.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-wIs8y1Ja.js 2.88 kB 2.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-C9FcIgiN.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-DurObIpO.js 3.18 kB 3.18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-D4M7QPIz.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: 58 added / 58 removed

jaeone94 and others added 2 commits February 14, 2026 00:45
Add `Comfy.RightSidePanel.ShowErrorsTab` setting (default: false) to control the visibility of the errors tab in the right side panel.

When disabled: - Error/Errors tabs are hidden from the side panel - Side panel no longer auto-opens on execution errors - See Error button and Vue node error button are no-ops - Error dialogs continue to show normally

Changes: - coreSettings.ts: Add new experimental boolean setting - apiSchema.ts: Register setting ID in zSettings schema - settings.json: Add English i18n keys - RightSidePanel.vue: Gate error/errors tab visibility on setting - app.ts: Gate auto-open panel on execution/prompt errors - SectionWidgets.vue: Gate navigateToErrorTab on setting - LGraphNode.vue: Gate node error button click on setting
@jaeone94 jaeone94 force-pushed the feat/errors-tab-panel branch from b821c4e to 3fa2e92 Compare February 14, 2026 13:05
@jaeone94
Copy link
Collaborator Author

jaeone94 commented Feb 14, 2026

I’ve added a commit to register a new setting, Comfy.RightSidePanel.ShowErrorsTab, and wrapped the new features behind this flag to keep them hidden by default. (Apologies for not doing this in the first place!)

Because I wanted to implement a solid baseline where the new UI and core logic work together, this PR has grown quite large. Please let me know if the size is an issue—I’m happy to discuss how to break it down further if you’d prefer!

jaeone94 and others added 3 commits February 18, 2026 10:00
…ddress review feedback

- Extract error grouping/search logic into useErrorGroups.ts composable
  - buildErrorGroups: pure function with dedicated process helpers
    (processPromptError, processNodeErrors, processExecutionError)
  - searchErrorGroups: Fuse.js-based fuzzy search
  - resolveNodeInfo: pre-computes graphNodeId to avoid redundant lookups
- Extract canvas navigation into useFocusNode.ts composable
  - focusNode, enterSubgraph, navigateToGraph functions
- Simplify TabErrors.vue by delegating business logic to composables
- Address reviewer feedback on executionStore.ts:
  - Move PromptError interface to apiSchema.ts as zod schema
  - Clear lastPromptError in resetExecutionState
  - Use isEmpty (es-toolkit) for hasNodeError
  - Scope errorNodeIds to active graph to prevent cross-scope
    ID collisions; rename to activeGraphErrorNodeIds
- Fix search filter test for Fuse.js compatibility
- Remove redundant copyToClipboard wrapper; useCopyToClipboard already
  handles errors internally with toast notifications
- Replace hardcoded GitHub issues URL with staticUrls.githubIssues
  from useExternalLink composable
- Add JSDoc to focusedErrorNodeId clarifying its lifecycle
  (set by SectionWidgets, consumed/cleared by TabErrors)
- Replace instanceof Subgraph with type-only import and
  isRootGraph check to avoid importing the full class
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!

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

Labels

size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants