Skip to content

fix: dedupe Bypass context-menu items by making legacy entry state-aware#12296

Draft
christian-byrne wants to merge 3 commits into
mainfrom
glary/fix-duplicate-bypass-menu-item
Draft

fix: dedupe Bypass context-menu items by making legacy entry state-aware#12296
christian-byrne wants to merge 3 commits into
mainfrom
glary/fix-duplicate-bypass-menu-item

Conversation

@christian-byrne
Copy link
Copy Markdown
Contributor

@christian-byrne christian-byrne commented May 15, 2026

PR Created by the Glary-Bot Agent


Summary

Right-clicking a bypassed node showed two bypass-related items in the Vue node context menu (see FE-720):

The Vue menu's exact-label deduplicator in contextMenuConverter.ts already collapses the unbypassed case (both registrations emit Bypass → exact match → Vue source wins), but not the bypassed case (Bypass vs Remove Bypass).

Fix

Make the legacy hook emit a stateful label that matches the Vue label, so the existing exact-label dedupe handles both states uniformly — no new label-equivalence rules, no callback-identity coupling, no blacklist that could hide third-party extension items.

The label must reflect what the click action will actually do. The action (toggleSelectedNodesMode) operates on the whole selection and only un-bypasses when every selected node is already in BYPASS. To keep the label and the action in sync (and avoid a misleading Remove Bypass on mixed selections), the predicate is extracted as areAllSelectedNodesInMode on the useSelectedLiteGraphItems composable and reused by both the toggle and the menu label.

options.push({
  content: areAllSelectedNodesInMode(LGraphEventMode.BYPASS)
    ? 'Remove Bypass'
    : 'Bypass',
  callback: () => {
    toggleSelectedNodesMode(LGraphEventMode.BYPASS)
    canvas.setDirty(true, true)
  }
})

Side benefit: the legacy LiteGraph menu (Comfy.UseNewMenu: 'Disabled') also gets the correct conditional label, which previously was stuck on Bypass regardless of node state.

Considered and rejected:

  • Adding bypass: ['bypass', 'remove bypass'] to the equivalents map — would silently drop third-party extension menu items labeled Bypass.
  • Adding 'Bypass' to HARD_BLACKLIST — same third-party problem.
  • Exporting a stable callback identity for filtering — adds cross-file coupling between litegraphService and contextMenuConverter for a 3-line behavioral change.

Tests

  • contextMenuConverter.test.ts: two new tests — legacy + Vue Remove Bypass collapse to the Vue item; Bypass and Remove Bypass are NOT treated as equivalents (locks in that we did not regress by adding a label-equivalence rule that would hide extension items).
  • useSelectedLiteGraphItems.test.ts: one new test for areAllSelectedNodesInMode covering all-bypassed, mixed, and empty-selection cases — directly addresses the review concern that the label could drift from the toggle's predicate.

Local verification:

pnpm test:unit -- --run \
  src/composables/canvas/useSelectedLiteGraphItems.test.ts \
  src/composables/graph/contextMenuConverter.test.ts \
  src/services/litegraphService.test.ts
# 41 tests passed

pnpm typecheck                                # clean
pnpm exec oxlint <touched files>              # 0 warnings, 0 errors

Manual browser verification was attempted via Playwright but the test harness could not reliably reproduce the Vue context-menu open state in headless mode within the available time budget. The behavior is exercised end-to-end by the existing Playwright suite (browser_tests/tests/vueNodes/interactions/node/contextMenu.spec.ts) and gated by the targeted unit tests above.

  • Fixes FE-720

┆Issue is synchronized with this Notion page by Unito

Glary-Bot added 2 commits May 15, 2026 19:29
Right-clicking a bypassed node showed two bypass items in the Vue
context menu: a plain 'Bypass' from the legacy LiteGraph
`getExtraMenuOptions` hook in litegraphService and 'Remove Bypass'
from the Vue `getBypassOption` composable. The Vue menu's exact-label
deduplicator collapses the unbypassed case (both emit 'Bypass') but
not the bypassed case ('Bypass' vs 'Remove Bypass').

Make the legacy hook emit a stateful label that matches the Vue label,
so existing exact-label dedupe (which prefers the Vue source) handles
both states uniformly. The legacy LiteGraph menu (Comfy.UseNewMenu:
Disabled) now also shows the correct conditional label, which was
previously stuck on 'Bypass' regardless of node state.

Fixes FE-720
Address Oracle review on FE-720 fix: the label was derived from the
right-clicked node's mode (`this.mode`), but the click action operates
on the entire selection via `toggleSelectedNodesMode`. On a mixed
multi-selection (some nodes bypassed, some not), right-clicking a
bypassed node would show 'Remove Bypass' even though clicking it
bypasses the rest of the selection.

Extract the predicate as `areAllSelectedNodesInMode` on the
`useSelectedLiteGraphItems` composable so the label and the action
share one source of truth, and have the legacy bypass menu entry use
it. Adds a unit test covering all-bypassed, mixed, and empty cases.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 15, 2026

Review Change Stack

📝 Walkthrough

Walkthrough

Adds an exported helper to check whether all selected nodes share a given mode, refactors toggle logic to use it (switching to ALWAYS when already matching), exposes the helper, and updates context menu labeling and tests so "Remove Bypass" appears when appropriate.

Changes

Conditional Bypass Label Display

Layer / File(s) Summary
Mode helper and toggle refactor
src/composables/canvas/useSelectedLiteGraphItems.ts, src/composables/canvas/useSelectedLiteGraphItems.test.ts
Adds areAllSelectedNodesInMode(mode) reading app.canvas.selected_nodes, updates toggleSelectedNodesMode to choose ALWAYS when all nodes already match the requested mode, exposes the helper from the composable, and adds unit tests covering true/false/empty selection cases.
Context menu conditional labeling
src/services/litegraphService.ts, src/composables/graph/contextMenuConverter.test.ts
Destructures and uses areAllSelectedNodesInMode in useLitegraphService; context menu label now shows "Remove Bypass" when all selected nodes are in BYPASS, otherwise "Bypass". Tests added for menu collapsing (vue precedence) and label distinction.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

size:M, core/1.44

Suggested reviewers

  • DrJKL

Poem

🐰 A quick hop, a tiny cheer,
Checking modes that gather here,
"Remove Bypass" when all agree,
Else "Bypass" waits — toggles free,
Canvas sings, the menu's clear.


Caution

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

  • Ignore (reviewers only)

❌ Failed checks (1 error)

Check name Status Explanation Resolution
End-To-End Regression Coverage For Fixes ❌ Error PR uses "fix:" and changes src/ files but lacks browser_tests/ changes. No concrete explanation given for why E2E regression test was not added. Add Playwright regression test under browser_tests/ for Bypass/Remove Bypass context-menu deduplication, or explain in PR description why E2E test is not practical.
✅ Passed checks (6 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: making the legacy context-menu entry state-aware to deduplicate Bypass items.
Description check ✅ Passed The description provides comprehensive coverage of the problem, solution, rationale, and test verification, exceeding template requirements with detailed context and trade-off analysis.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Adr Compliance For Entity/Litegraph Changes ✅ Passed Modified files are not in scope for ADR check. Changes are in src/composables/ and src/services/, not in src/lib/litegraph/, src/ecs/, or core entity files.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch glary/fix-duplicate-bypass-menu-item

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

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 15, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 05/15/2026, 08:09:06 PM UTC

Links

@glary-bot
Copy link
Copy Markdown

glary-bot Bot commented May 15, 2026

Acknowledged — waiting for the substantive CodeRabbit review pass. Will address any findings once they post.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 15, 2026

🎭 Playwright: ✅ 1592 passed, 0 failed · 8 flaky

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

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 15, 2026

📦 Bundle: 5.36 MB gzip 🔴 +150 B

Details

Summary

  • Raw size: 24.7 MB baseline 24.7 MB — 🔴 +606 B
  • Gzip: 5.36 MB baseline 5.36 MB — 🔴 +150 B
  • Brotli: 4.15 MB baseline 4.14 MB — 🔴 +293 B
  • Bundles: 268 current • 268 baseline • 118 added / 118 removed

Category Glance
Data & Services 🔴 +606 B (3.16 MB) · Vendor & Third-Party ⚪ 0 B (9.94 MB) · Other ⚪ 0 B (9.16 MB) · Graph Workspace ⚪ 0 B (1.24 MB) · Panels & Settings ⚪ 0 B (527 kB) · Utilities & Hooks ⚪ 0 B (366 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-DD4OxWVU.js (removed) 26.1 kB 🟢 -26.1 kB 🟢 -8.76 kB 🟢 -7.55 kB
assets/index-j9wWaTNg.js (new) 26.1 kB 🔴 +26.1 kB 🔴 +8.76 kB 🔴 +7.52 kB

Status: 1 added / 1 removed

Graph Workspace — 1.24 MB (baseline 1.24 MB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CxZilRIu.js (removed) 1.24 MB 🟢 -1.24 MB 🟢 -264 kB 🟢 -199 kB
assets/GraphView-Dgjv2eM_.js (new) 1.24 MB 🔴 +1.24 MB 🔴 +264 kB 🔴 +199 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BuA2_Jr2.js (removed) 19.6 kB 🟢 -19.6 kB 🟢 -5.14 kB 🟢 -4.56 kB
assets/CloudSurveyView-VWbHy2V0.js (new) 19.6 kB 🔴 +19.6 kB 🔴 +5.14 kB 🔴 +4.57 kB
assets/CloudLoginView-BysvBCi1.js (new) 12.5 kB 🔴 +12.5 kB 🔴 +3.55 kB 🔴 +3.13 kB
assets/CloudLoginView-vofDlzt3.js (removed) 12.5 kB 🟢 -12.5 kB 🟢 -3.54 kB 🟢 -3.13 kB
assets/CloudSignupView-DVl2cQhO.js (removed) 10.4 kB 🟢 -10.4 kB 🟢 -3.05 kB 🟢 -2.7 kB
assets/CloudSignupView-ico9sW_M.js (new) 10.4 kB 🔴 +10.4 kB 🔴 +3.06 kB 🔴 +2.69 kB
assets/UserCheckView-BZfJrceC.js (removed) 9.07 kB 🟢 -9.07 kB 🟢 -2.34 kB 🟢 -2.05 kB
assets/UserCheckView-CSuYsqs3.js (new) 9.07 kB 🔴 +9.07 kB 🔴 +2.34 kB 🔴 +2.04 kB
assets/CloudLayoutView-CphW10yQ.js (removed) 7.81 kB 🟢 -7.81 kB 🟢 -2.48 kB 🟢 -2.17 kB
assets/CloudLayoutView-NjgeZJSt.js (new) 7.81 kB 🔴 +7.81 kB 🔴 +2.48 kB 🔴 +2.17 kB
assets/CloudForgotPasswordView-C2ovKnzN.js (removed) 6.22 kB 🟢 -6.22 kB 🟢 -2.21 kB 🟢 -1.94 kB
assets/CloudForgotPasswordView-DG628zIU.js (new) 6.22 kB 🔴 +6.22 kB 🔴 +2.21 kB 🔴 +1.96 kB
assets/CloudAuthTimeoutView-DiqBsJuV.js (new) 5.58 kB 🔴 +5.58 kB 🔴 +2.05 kB 🔴 +1.81 kB
assets/CloudAuthTimeoutView-DkCayKsl.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -2.05 kB 🟢 -1.8 kB
assets/CloudSubscriptionRedirectView-CBe1x9Aa.js (new) 5.36 kB 🔴 +5.36 kB 🔴 +2.03 kB 🔴 +1.8 kB
assets/CloudSubscriptionRedirectView-DAAmkJhB.js (removed) 5.36 kB 🟢 -5.36 kB 🟢 -2.03 kB 🟢 -1.81 kB
assets/UserSelectView-CDxQlvAs.js (new) 4.7 kB 🔴 +4.7 kB 🔴 +1.75 kB 🔴 +1.55 kB
assets/UserSelectView-CuXAa_eu.js (removed) 4.7 kB 🟢 -4.7 kB 🟢 -1.75 kB 🟢 -1.55 kB

Status: 9 added / 9 removed / 2 unchanged

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-BpbQH6Mp.js (removed) 47.5 kB 🟢 -47.5 kB 🟢 -9.87 kB 🟢 -8.74 kB
assets/KeybindingPanel-D5mo4hHD.js (new) 47.5 kB 🔴 +47.5 kB 🔴 +9.86 kB 🔴 +8.74 kB
assets/SecretsPanel-CtWDXVTG.js (new) 23.9 kB 🔴 +23.9 kB 🔴 +5.73 kB 🔴 +5.05 kB
assets/SecretsPanel-D5ICFJjm.js (removed) 23.9 kB 🟢 -23.9 kB 🟢 -5.73 kB 🟢 -5.05 kB
assets/LegacyCreditsPanel-B7JDBn3-.js (removed) 21.8 kB 🟢 -21.8 kB 🟢 -5.94 kB 🟢 -5.25 kB
assets/LegacyCreditsPanel-nP9niZsf.js (new) 21.8 kB 🔴 +21.8 kB 🔴 +5.94 kB 🔴 +5.25 kB
assets/SubscriptionPanel-Bl1expCs.js (removed) 20.2 kB 🟢 -20.2 kB 🟢 -5.18 kB 🟢 -4.53 kB
assets/SubscriptionPanel-DypmG09C.js (new) 20.2 kB 🔴 +20.2 kB 🔴 +5.18 kB 🔴 +4.57 kB
assets/AboutPanel-Cl7vJxHV.js (new) 12 kB 🔴 +12 kB 🔴 +3.33 kB 🔴 +2.98 kB
assets/AboutPanel-CORtzxYo.js (removed) 12 kB 🟢 -12 kB 🟢 -3.33 kB 🟢 -2.99 kB
assets/ExtensionPanel-DNsEZ0Kv.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.94 kB 🟢 -2.61 kB
assets/ExtensionPanel-DqhoXzu3.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.94 kB 🔴 +2.62 kB
assets/ServerConfigPanel-D_qfgVhe.js (removed) 7.13 kB 🟢 -7.13 kB 🟢 -2.39 kB 🟢 -2.13 kB
assets/ServerConfigPanel-UeHwcQEQ.js (new) 7.13 kB 🔴 +7.13 kB 🔴 +2.39 kB 🔴 +2.13 kB
assets/UserPanel-DPvO7Cn6.js (removed) 6.84 kB 🟢 -6.84 kB 🟢 -2.27 kB 🟢 -2 kB
assets/UserPanel-QM7GWlBJ.js (new) 6.84 kB 🔴 +6.84 kB 🔴 +2.27 kB 🔴 +2 kB
assets/cloudRemoteConfig-Bs35mhKI.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -1.02 kB 🟢 -879 B
assets/cloudRemoteConfig-v_J279IS.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +1.02 kB 🔴 +883 B
assets/refreshRemoteConfig-BS1SxC70.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -648 B 🟢 -556 B
assets/refreshRemoteConfig-DFdk9efK.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +649 B 🔴 +557 B

Status: 10 added / 10 removed / 14 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-Cx7TK6G6.js (removed) 3.65 kB 🟢 -3.65 kB 🟢 -1.29 kB 🟢 -1.11 kB
assets/auth-DfPQs-di.js (new) 3.65 kB 🔴 +3.65 kB 🔴 +1.29 kB 🔴 +1.1 kB
assets/SignUpForm-5hqehZUP.js (removed) 3.19 kB 🟢 -3.19 kB 🟢 -1.29 kB 🟢 -1.15 kB
assets/SignUpForm-BfsJj2xQ.js (new) 3.19 kB 🔴 +3.19 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/UpdatePasswordContent-CQubH6z6.js (removed) 2.98 kB 🟢 -2.98 kB 🟢 -1.33 kB 🟢 -1.18 kB
assets/UpdatePasswordContent-CzuiR_B9.js (new) 2.98 kB 🔴 +2.98 kB 🔴 +1.33 kB 🔴 +1.19 kB
assets/authStore-BDU-7qPh.js (removed) 1.27 kB 🟢 -1.27 kB 🟢 -599 B 🟢 -528 B
assets/authStore-CwsE_reB.js (new) 1.27 kB 🔴 +1.27 kB 🔴 +597 B 🔴 +533 B
assets/auth-vfGj4oyT.js (new) 348 B 🔴 +348 B 🔴 +217 B 🔴 +191 B
assets/auth-vV6_aAZi.js (removed) 348 B 🟢 -348 B 🟢 -219 B 🟢 -194 B

Status: 5 added / 5 removed / 2 unchanged

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-C0xFvJJE.js (new) 85.8 kB 🔴 +85.8 kB 🔴 +18.6 kB 🔴 +15.9 kB
assets/ComfyHubPublishDialog-CnaKMJqz.js (removed) 85.8 kB 🟢 -85.8 kB 🟢 -18.6 kB 🟢 -15.9 kB
assets/useShareDialog-CPiTy4ca.js (removed) 23.9 kB 🟢 -23.9 kB 🟢 -5.81 kB 🟢 -5.14 kB
assets/useShareDialog-U7wD8XAz.js (new) 23.9 kB 🔴 +23.9 kB 🔴 +5.81 kB 🔴 +5.15 kB
assets/ComfyHubPublishDialog-BAVgOBBt.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -659 B 🟢 -599 B
assets/ComfyHubPublishDialog-DCaWrv85.js (new) 1.43 kB 🔴 +1.43 kB 🔴 +659 B 🔴 +584 B
assets/useSubscriptionDialog-DIx79DAF.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -592 B 🟢 -520 B
assets/useSubscriptionDialog-zbCP2BUj.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +590 B 🔴 +519 B

Status: 4 added / 4 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-CzMidQx8.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.79 kB 🔴 +3.38 kB
assets/ComfyQueueButton-DPgBUKrG.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.79 kB 🟢 -3.38 kB
assets/useTerminalTabs-BjJVs_HY.js (new) 11.1 kB 🔴 +11.1 kB 🔴 +3.76 kB 🔴 +3.3 kB
assets/useTerminalTabs-QflWjOpm.js (removed) 11.1 kB 🟢 -11.1 kB 🟢 -3.76 kB 🟢 -3.31 kB
assets/SubscribeButton-DiwDjdlf.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.05 kB 🟢 -935 B
assets/SubscribeButton-X6TfoXqK.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.05 kB 🔴 +931 B
assets/cloudFeedbackTopbarButton-A09Uy7uH.js (new) 1.94 kB 🔴 +1.94 kB 🔴 +966 B 🔴 +864 B
assets/cloudFeedbackTopbarButton-CBH4lUsy.js (removed) 1.94 kB 🟢 -1.94 kB 🟢 -963 B 🟢 -860 B
assets/ComfyQueueButton-CMvtOnQb.js (new) 1.35 kB 🔴 +1.35 kB 🔴 +625 B 🔴 +575 B
assets/ComfyQueueButton-DjorRWwB.js (removed) 1.35 kB 🟢 -1.35 kB 🟢 -626 B 🟢 -566 B

Status: 5 added / 5 removed / 8 unchanged

Data & Services — 3.16 MB (baseline 3.16 MB) • 🔴 +606 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-CfAYGz73.js (new) 2.09 MB 🔴 +2.09 MB 🔴 +477 kB 🔴 +361 kB
assets/dialogService-BjHBjJoT.js (removed) 2.09 MB 🟢 -2.09 MB 🟢 -476 kB 🟢 -361 kB
assets/api-2G2zoIDH.js (new) 898 kB 🔴 +898 kB 🔴 +214 kB 🔴 +169 kB
assets/api-BsuQAgAZ.js (removed) 898 kB 🟢 -898 kB 🟢 -215 kB 🟢 -169 kB
assets/load3dService-BZdjZTxS.js (new) 116 kB 🔴 +116 kB 🔴 +25.4 kB 🔴 +21.6 kB
assets/load3dService-DQdBvMpu.js (removed) 116 kB 🟢 -116 kB 🟢 -25.4 kB 🟢 -21.6 kB
assets/workflowShareService-BqGcdfDK.js (removed) 16.7 kB 🟢 -16.7 kB 🟢 -4.92 kB 🟢 -4.36 kB
assets/workflowShareService-ZuIqElvi.js (new) 16.7 kB 🔴 +16.7 kB 🔴 +4.92 kB 🔴 +4.36 kB
assets/keybindingService-BLbMFANU.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.67 kB 🔴 +3.22 kB
assets/keybindingService-JhwWqy33.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.67 kB 🟢 -3.21 kB
assets/releaseStore-C0fuUwDA.js (new) 8.12 kB 🔴 +8.12 kB 🔴 +2.28 kB 🔴 +2 kB
assets/releaseStore-CLczlJcb.js (removed) 8.12 kB 🟢 -8.12 kB 🟢 -2.28 kB 🟢 -2 kB
assets/userStore-Ciu6DDTh.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +932 B 🔴 +814 B
assets/userStore-CRbgYljX.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -930 B 🟢 -823 B
assets/audioService-CwKell_6.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -878 B 🟢 -764 B
assets/audioService-MJC-eYv4.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +880 B 🔴 +764 B
assets/releaseStore-DQduBSxw.js (new) 1.27 kB 🔴 +1.27 kB 🔴 +594 B 🔴 +526 B
assets/releaseStore-DqO0AY-4.js (removed) 1.27 kB 🟢 -1.27 kB 🟢 -595 B 🟢 -527 B
assets/workflowDraftStore-BynWBk8H.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +589 B 🔴 +521 B
assets/workflowDraftStore-CC9qX803.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -591 B 🟢 -523 B
assets/dialogService-B-1VZNNv.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -584 B 🟢 -519 B
assets/dialogService-CgpKES-r.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +582 B 🔴 +521 B
assets/settingStore-ByvDImKo.js (removed) 1.23 kB 🟢 -1.23 kB 🟢 -586 B 🟢 -517 B
assets/settingStore-ebCOWBJs.js (new) 1.23 kB 🔴 +1.23 kB 🔴 +584 B 🔴 +519 B
assets/assetsStore-Bfv0qCZt.js (removed) 1.23 kB 🟢 -1.23 kB 🟢 -587 B 🟢 -518 B
assets/assetsStore-CpnA5_hP.js (new) 1.23 kB 🔴 +1.23 kB 🔴 +585 B 🔴 +516 B

Status: 13 added / 13 removed / 4 unchanged

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-B06ikXws.js (new) 234 kB 🔴 +234 kB 🔴 +52.1 kB 🔴 +42.4 kB
assets/useConflictDetection-B10ZbYxJ.js (removed) 234 kB 🟢 -234 kB 🟢 -52.1 kB 🟢 -42.4 kB
assets/useLoad3d-BuptlN4x.js (removed) 22.7 kB 🟢 -22.7 kB 🟢 -5.22 kB 🟢 -4.61 kB
assets/useLoad3d-Ca9HD-zd.js (new) 22.7 kB 🔴 +22.7 kB 🔴 +5.22 kB 🔴 +4.62 kB
assets/useLoad3dViewer-C51XXBzo.js (new) 21 kB 🔴 +21 kB 🔴 +4.93 kB 🔴 +4.3 kB
assets/useLoad3dViewer-D_0MFlvS.js (removed) 21 kB 🟢 -21 kB 🟢 -4.92 kB 🟢 -4.3 kB
assets/useFeatureFlags-BZEgB3f3.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -1.79 kB 🟢 -1.52 kB
assets/useFeatureFlags-FoBn17Mf.js (new) 5.95 kB 🔴 +5.95 kB 🔴 +1.8 kB 🔴 +1.52 kB
assets/useCopyToClipboard-ccVcMC6o.js (removed) 5.29 kB 🟢 -5.29 kB 🟢 -1.86 kB 🟢 -1.57 kB
assets/useCopyToClipboard-DaG3dnr2.js (new) 5.29 kB 🔴 +5.29 kB 🔴 +1.86 kB 🔴 +1.57 kB
assets/useWorkspaceUI-DeR3xHw8.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -982 B 🟢 -813 B
assets/useWorkspaceUI-DTHBgUPX.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +983 B 🔴 +811 B
assets/subscriptionCheckoutUtil-Dy53mjgD.js (new) 3.31 kB 🔴 +3.31 kB 🔴 +1.37 kB 🔴 +1.18 kB
assets/subscriptionCheckoutUtil-ug2tznd2.js (removed) 3.31 kB 🟢 -3.31 kB 🟢 -1.36 kB 🟢 -1.18 kB
assets/assetPreviewUtil-B_UqK9qF.js (removed) 2.43 kB 🟢 -2.43 kB 🟢 -1.01 kB 🟢 -880 B
assets/assetPreviewUtil-BgR8YqHB.js (new) 2.43 kB 🔴 +2.43 kB 🔴 +1.01 kB 🔴 +884 B
assets/useUpstreamValue-Bb-P8JJq.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -800 B 🟢 -714 B
assets/useUpstreamValue-qAy3T-CF.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +804 B 🔴 +714 B
assets/useLoad3d-9yMobwRC.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -653 B 🟢 -583 B
assets/useLoad3d-C2RDwc5y.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +652 B 🔴 +585 B
assets/useLoad3dViewer-dPwyb8ab.js (removed) 1.35 kB 🟢 -1.35 kB 🟢 -620 B 🟢 -567 B
assets/useLoad3dViewer-Jf9GCDZA.js (new) 1.35 kB 🔴 +1.35 kB 🔴 +619 B 🔴 +571 B
assets/useCurrentUser-BVp3c6M3.js (removed) 1.23 kB 🟢 -1.23 kB 🟢 -587 B 🟢 -519 B
assets/useCurrentUser-DHMUgMpJ.js (new) 1.23 kB 🔴 +1.23 kB 🔴 +586 B 🔴 +518 B
assets/useWorkspaceSwitch-BFTp0kiu.js (removed) 747 B 🟢 -747 B 🟢 -384 B 🟢 -331 B
assets/useWorkspaceSwitch-U-9F8V4D.js (new) 747 B 🔴 +747 B 🔴 +385 B 🔴 +334 B

Status: 13 added / 13 removed / 18 unchanged

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

External libraries and shared vendor chunks

Status: 16 unchanged

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

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-BHDd8HgY.js (removed) 78 kB 🟢 -78 kB 🟢 -20.2 kB 🟢 -17.2 kB
assets/core-Cbq_uNzQ.js (new) 78 kB 🔴 +78 kB 🔴 +20.2 kB 🔴 +17.2 kB
assets/groupNode-CJC1w3Fc.js (new) 74.9 kB 🔴 +74.9 kB 🔴 +18.7 kB 🔴 +16.5 kB
assets/groupNode-D2VqviiP.js (removed) 74.9 kB 🟢 -74.9 kB 🟢 -18.7 kB 🟢 -16.5 kB
assets/WidgetSelect-Bkg2-iyh.js (removed) 68.4 kB 🟢 -68.4 kB 🟢 -15.1 kB 🟢 -13 kB
assets/WidgetSelect-hJ1b46aw.js (new) 68.4 kB 🔴 +68.4 kB 🔴 +15.1 kB 🔴 +13 kB
assets/SubscriptionRequiredDialogContentWorkspace-DWPyhw7C.js (removed) 48.9 kB 🟢 -48.9 kB 🟢 -9.56 kB 🟢 -8.22 kB
assets/SubscriptionRequiredDialogContentWorkspace-KPLO6fQR.js (new) 48.9 kB 🔴 +48.9 kB 🔴 +9.56 kB 🔴 +8.22 kB
assets/Load3DControls-DCVLj8Kv.js (removed) 46.1 kB 🟢 -46.1 kB 🟢 -7.5 kB 🟢 -6.56 kB
assets/Load3DControls-frzWzvc3.js (new) 46.1 kB 🔴 +46.1 kB 🔴 +7.5 kB 🔴 +6.54 kB
assets/WorkspacePanelContent-BkYbT_W9.js (removed) 34.3 kB 🟢 -34.3 kB 🟢 -7.44 kB 🟢 -6.59 kB
assets/WorkspacePanelContent-kcvb54Py.js (new) 34.3 kB 🔴 +34.3 kB 🔴 +7.43 kB 🔴 +6.59 kB
assets/WidgetPainter-B-WM0uHC.js (new) 33.5 kB 🔴 +33.5 kB 🔴 +8.28 kB 🔴 +7.31 kB
assets/WidgetPainter-Co8JjLWr.js (removed) 33.5 kB 🟢 -33.5 kB 🟢 -8.28 kB 🟢 -7.34 kB
assets/Load3dViewerContent-KBmLiFws.js (new) 30.6 kB 🔴 +30.6 kB 🔴 +6.19 kB 🔴 +5.37 kB
assets/Load3dViewerContent-xxlazZhd.js (removed) 30.6 kB 🟢 -30.6 kB 🟢 -6.19 kB 🟢 -5.37 kB
assets/SubscriptionRequiredDialogContent-Cpt2f9wB.js (removed) 27.6 kB 🟢 -27.6 kB 🟢 -7.02 kB 🟢 -6.22 kB
assets/SubscriptionRequiredDialogContent-y8BchtFz.js (new) 27.6 kB 🔴 +27.6 kB 🔴 +7.01 kB 🔴 +6.19 kB
assets/WidgetImageCrop-BjsTgaZk.js (removed) 24.4 kB 🟢 -24.4 kB 🟢 -6.23 kB 🟢 -5.46 kB
assets/WidgetImageCrop-D8VCiiBu.js (new) 24.4 kB 🔴 +24.4 kB 🔴 +6.23 kB 🔴 +5.46 kB
assets/SubscriptionPanelContentWorkspace-DliReLms.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.17 kB 🟢 -4.57 kB
assets/SubscriptionPanelContentWorkspace-V_axnnjG.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.17 kB 🔴 +4.56 kB
assets/SignInContent-B4qGdWKi.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +5.47 kB 🔴 +4.79 kB
assets/SignInContent-D5nIKUAy.js (removed) 20.9 kB 🟢 -20.9 kB 🟢 -5.47 kB 🟢 -4.78 kB
assets/CurrentUserPopoverWorkspace-CETSaNbL.js (removed) 20.9 kB 🟢 -20.9 kB 🟢 -4.99 kB 🟢 -4.46 kB
assets/CurrentUserPopoverWorkspace-DglLUZCN.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +4.99 kB 🔴 +4.46 kB
assets/WidgetInputNumber-Bbyz-4sz.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.3 kB
assets/WidgetInputNumber-CR0FV-B9.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.29 kB
assets/Load3D-C5OWqVR8.js (removed) 18.5 kB 🟢 -18.5 kB 🟢 -4.39 kB 🟢 -3.84 kB
assets/Load3D-DXL69vjm.js (new) 18.5 kB 🔴 +18.5 kB 🔴 +4.39 kB 🔴 +3.84 kB
assets/WidgetRecordAudio-BemVsqh6.js (removed) 17.6 kB 🟢 -17.6 kB 🟢 -5.07 kB 🟢 -4.52 kB
assets/WidgetRecordAudio-P8fmzzV2.js (new) 17.6 kB 🔴 +17.6 kB 🔴 +5.07 kB 🔴 +4.51 kB
assets/WidgetRange-C2H1CQsZ.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.64 kB 🔴 +4.15 kB
assets/WidgetRange-C8_h-ns_.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.64 kB 🟢 -4.13 kB
assets/load3d-BOlVaQL4.js (removed) 15.9 kB 🟢 -15.9 kB 🟢 -4.62 kB 🟢 -4.01 kB
assets/load3d-Dw7J-Qxr.js (new) 15.9 kB 🔴 +15.9 kB 🔴 +4.62 kB 🔴 +4.01 kB
assets/WaveAudioPlayer-Bblw_aBw.js (new) 13.4 kB 🔴 +13.4 kB 🔴 +3.68 kB 🔴 +3.22 kB
assets/WaveAudioPlayer-BFzyy29e.js (removed) 13.4 kB 🟢 -13.4 kB 🟢 -3.68 kB 🟢 -3.22 kB
assets/WidgetCurve-B321O3Ez.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.96 kB 🔴 +3.57 kB
assets/WidgetCurve-vYWmRZ0m.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.96 kB 🟢 -3.57 kB
assets/TeamWorkspacesDialogContent-B60ee5XL.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.45 kB 🔴 +3.08 kB
assets/TeamWorkspacesDialogContent-BQfebRRP.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.45 kB 🟢 -3.07 kB
assets/nodeTemplates-BBdTTJZI.js (new) 9.92 kB 🔴 +9.92 kB 🔴 +3.51 kB 🔴 +3.1 kB
assets/nodeTemplates-BYiIMgjT.js (removed) 9.92 kB 🟢 -9.92 kB 🟢 -3.51 kB 🟢 -3.11 kB
assets/NightlySurveyController-B0b9Xsly.js (new) 9.05 kB 🔴 +9.05 kB 🔴 +3.18 kB 🔴 +2.81 kB
assets/NightlySurveyController-BNRVq1oe.js (removed) 9.05 kB 🟢 -9.05 kB 🟢 -3.18 kB 🟢 -2.81 kB
assets/Load3DConfiguration-C9B6XqsJ.js (removed) 8.77 kB 🟢 -8.77 kB 🟢 -2.61 kB 🟢 -2.29 kB
assets/Load3DConfiguration-DkLn1wc8.js (new) 8.77 kB 🔴 +8.77 kB 🔴 +2.61 kB 🔴 +2.3 kB
assets/InviteMemberDialogContent-BA0OJMV2.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.56 kB 🔴 +2.26 kB
assets/InviteMemberDialogContent-L4BSwh1F.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.56 kB 🟢 -2.25 kB
assets/onboardingCloudRoutes-CTxCXcEE.js (new) 6.94 kB 🔴 +6.94 kB 🔴 +2.17 kB 🔴 +1.88 kB
assets/onboardingCloudRoutes-Deq8PjGd.js (removed) 6.94 kB 🟢 -6.94 kB 🟢 -2.17 kB 🟢 -1.86 kB
assets/CreateWorkspaceDialogContent-Ak8CeW5D.js (removed) 6.23 kB 🟢 -6.23 kB 🟢 -2.27 kB 🟢 -1.98 kB
assets/CreateWorkspaceDialogContent-CjD4EiuV.js (new) 6.23 kB 🔴 +6.23 kB 🔴 +2.27 kB 🔴 +1.98 kB
assets/WidgetWithControl-Cp_oFaO0.js (new) 6.2 kB 🔴 +6.2 kB 🔴 +2.5 kB 🔴 +2.23 kB
assets/WidgetWithControl-DVXugXFu.js (removed) 6.2 kB 🟢 -6.2 kB 🟢 -2.5 kB 🟢 -2.22 kB
assets/FreeTierDialogContent-DuaVVWYo.js (removed) 6.09 kB 🟢 -6.09 kB 🟢 -2.17 kB 🟢 -1.92 kB
assets/FreeTierDialogContent-OkVD2BHv.js (new) 6.09 kB 🔴 +6.09 kB 🔴 +2.17 kB 🔴 +1.93 kB
assets/EditWorkspaceDialogContent-CBVup3vb.js (new) 6.03 kB 🔴 +6.03 kB 🔴 +2.23 kB 🔴 +1.96 kB
assets/EditWorkspaceDialogContent-feYo7rMf.js (removed) 6.03 kB 🟢 -6.03 kB 🟢 -2.23 kB 🟢 -1.95 kB
assets/WidgetTextarea-C_mMXr37.js (removed) 5.84 kB 🟢 -5.84 kB 🟢 -2.31 kB 🟢 -2.03 kB
assets/WidgetTextarea-CoE1Z8I7.js (new) 5.84 kB 🔴 +5.84 kB 🔴 +2.3 kB 🔴 +2.03 kB
assets/Preview3d-CWfC_b0C.js (removed) 5.81 kB 🟢 -5.81 kB 🟢 -1.96 kB 🟢 -1.72 kB
assets/Preview3d-D8zNnWhy.js (new) 5.81 kB 🔴 +5.81 kB 🔴 +1.96 kB 🔴 +1.71 kB
assets/ValueControlPopover-BcxNG109.js (new) 5.61 kB 🔴 +5.61 kB 🔴 +2.05 kB 🔴 +1.84 kB
assets/ValueControlPopover-D8sur-Kt.js (removed) 5.61 kB 🟢 -5.61 kB 🟢 -2.05 kB 🟢 -1.85 kB
assets/CancelSubscriptionDialogContent-CSLZ-Rue.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +2.07 kB 🔴 +1.83 kB
assets/CancelSubscriptionDialogContent-SXr3izLu.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -2.08 kB 🟢 -1.82 kB
assets/DeleteWorkspaceDialogContent--8X2h9wH.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.91 kB 🟢 -1.67 kB
assets/DeleteWorkspaceDialogContent-GTZ70twg.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.91 kB 🔴 +1.66 kB
assets/saveMesh-37yYZyGF.js (removed) 4.78 kB 🟢 -4.78 kB 🟢 -1.9 kB 🟢 -1.69 kB
assets/saveMesh-Deln5y8K.js (new) 4.78 kB 🔴 +4.78 kB 🔴 +1.9 kB 🔴 +1.7 kB
assets/LeaveWorkspaceDialogContent-Cgibrdii.js (removed) 4.76 kB 🟢 -4.76 kB 🟢 -1.86 kB 🟢 -1.61 kB
assets/LeaveWorkspaceDialogContent-DtkDJy_i.js (new) 4.76 kB 🔴 +4.76 kB 🔴 +1.85 kB 🔴 +1.61 kB
assets/RemoveMemberDialogContent-BcB9ttuO.js (new) 4.74 kB 🔴 +4.74 kB 🔴 +1.81 kB 🔴 +1.58 kB
assets/RemoveMemberDialogContent-DoFE4nLF.js (removed) 4.74 kB 🟢 -4.74 kB 🟢 -1.81 kB 🟢 -1.58 kB
assets/RevokeInviteDialogContent-B92dVM4l.js (new) 4.65 kB 🔴 +4.65 kB 🔴 +1.82 kB 🔴 +1.6 kB
assets/RevokeInviteDialogContent-BxHP7D76.js (removed) 4.65 kB 🟢 -4.65 kB 🟢 -1.82 kB 🟢 -1.59 kB
assets/InviteMemberUpsellDialogContent-BaEIxBOr.js (new) 4.55 kB 🔴 +4.55 kB 🔴 +1.68 kB 🔴 +1.48 kB
assets/InviteMemberUpsellDialogContent-ZOsc3kDl.js (removed) 4.55 kB 🟢 -4.55 kB 🟢 -1.68 kB 🟢 -1.48 kB
assets/tierBenefits-B72Iy9S5.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.58 kB 🟢 -1.36 kB
assets/tierBenefits-DyHocE8K.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.58 kB 🔴 +1.36 kB
assets/Media3DTop-DLFQeP6L.js (new) 4.43 kB 🔴 +4.43 kB 🔴 +1.81 kB 🔴 +1.6 kB
assets/Media3DTop-VlWJqKEt.js (removed) 4.43 kB 🟢 -4.43 kB 🟢 -1.81 kB 🟢 -1.6 kB
assets/cloudSessionCookie-BBCZePqj.js (removed) 4.39 kB 🟢 -4.39 kB 🟢 -1.61 kB 🟢 -1.4 kB
assets/cloudSessionCookie-BdndQB15.js (new) 4.39 kB 🔴 +4.39 kB 🔴 +1.6 kB 🔴 +1.4 kB
assets/GlobalToast-BhI-dg8P.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/GlobalToast-BKIZITBH.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.26 kB 🔴 +1.11 kB
assets/CloudRunButtonWrapper-CZGwrOAa.js (new) 2.31 kB 🔴 +2.31 kB 🔴 +1.05 kB 🔴 +943 B
assets/CloudRunButtonWrapper-D5HIuj7A.js (removed) 2.31 kB 🟢 -2.31 kB 🟢 -1.05 kB 🟢 -939 B
assets/SubscribeToRun-DtaN6qNP.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +984 B 🔴 +878 B
assets/SubscribeToRun-Mh34eVp-.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -983 B 🟢 -876 B
assets/MediaAudioTop-DHLxKz9a.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -1 kB 🟢 -889 B
assets/MediaAudioTop-L9_BlpGv.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +1 kB 🔴 +862 B
assets/cloudBadges-D9yglFjG.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +1.01 kB 🔴 +876 B
assets/cloudBadges-k5ZTpkV0.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -1.01 kB 🟢 -878 B
assets/cloudSubscription-CEurJK4-.js (new) 1.96 kB 🔴 +1.96 kB 🔴 +932 B 🔴 +809 B
assets/cloudSubscription-XHfvM2pP.js (removed) 1.96 kB 🟢 -1.96 kB 🟢 -931 B 🟢 -808 B
assets/graphHasMissingNodes-CiLDHwib.js (removed) 1.84 kB 🟢 -1.84 kB 🟢 -859 B 🟢 -771 B
assets/graphHasMissingNodes-D0ukMBZ-.js (new) 1.84 kB 🔴 +1.84 kB 🔴 +860 B 🔴 +756 B
assets/Load3D-CHGW949s.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +743 B 🔴 +661 B
assets/Load3D-DG5NRMBQ.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -741 B 🟢 -655 B
assets/nightlyBadges-56f4uBMJ.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +779 B 🔴 +689 B
assets/nightlyBadges-CtSVSRn9.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -777 B 🟢 -684 B
assets/Load3dViewerContent-BVQuay-c.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +695 B 🔴 +615 B
assets/Load3dViewerContent-D9anzLro.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -697 B 🟢 -616 B
assets/previousFullPath-BpgZJq1F.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +696 B 🔴 +599 B
assets/previousFullPath-DPy5tfd_.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -694 B 🟢 -602 B
assets/SubscriptionPanelContentWorkspace-CMQYeuXL.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -649 B 🟢 -568 B
assets/SubscriptionPanelContentWorkspace-CS4L0pJD.js (new) 1.43 kB 🔴 +1.43 kB 🔴 +648 B 🔴 +584 B
assets/WidgetLegacy-57t5SdhG.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +596 B 🔴 +529 B
assets/WidgetLegacy-DnpAdexE.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -597 B 🟢 -526 B
assets/changeTracker-DEH1gXCC.js (removed) 1.23 kB 🟢 -1.23 kB 🟢 -587 B 🟢 -517 B
assets/changeTracker-Dve1zvVS.js (new) 1.23 kB 🔴 +1.23 kB 🔴 +585 B 🔴 +520 B

Status: 57 added / 57 removed / 86 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.0 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 62.7 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 46.7 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.8 MB heap
large-graph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 62.3 MB heap
large-graph-pan: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 108.7 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 81.6 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.9 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.2 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 63.7 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 60.4 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 146ms TBT · 113.4 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 78.1 MB heap
vue-large-graph-idle: · 58.1 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 197.2 MB heap
vue-large-graph-pan: · 58.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 1ms TBT · 213.4 MB heap
workflow-execution: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.0 MB heap

⚠️ 3 regressions detected

Metric Baseline PR (median) Δ Sig
canvas-idle: task duration 433ms 488ms +13% ⚠️ z=3.0
canvas-mouse-sweep: layout duration 4ms 4ms +18% ⚠️ z=3.6
large-graph-pan: task duration 1033ms 1201ms +16% ⚠️ z=2.8
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms +0% z=-0.1
canvas-idle: p95 frame time 17ms 17ms +0%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 10ms 9ms -13% z=-2.1
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 12 10 -21% z=-2.9
canvas-idle: task duration 433ms 488ms +13% ⚠️ z=3.0
canvas-idle: script duration 23ms 27ms +17% z=0.7
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 66.1 MB 70.0 MB +6%
canvas-idle: DOM nodes -258 -121 -53% z=-112.6
canvas-idle: event listeners -129 -63 -52% z=-15.7
canvas-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.9
canvas-mouse-sweep: p95 frame time 17ms 17ms +0%
canvas-mouse-sweep: layout duration 4ms 4ms +18% ⚠️ z=3.6
canvas-mouse-sweep: style recalc duration 40ms 44ms +8% z=0.4
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 81 78 -4% z=-0.5
canvas-mouse-sweep: task duration 965ms 843ms -13% z=-0.4
canvas-mouse-sweep: script duration 119ms 128ms +8% z=-1.1
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 50.5 MB 62.7 MB +24%
canvas-mouse-sweep: DOM nodes -265 -101 -62% z=-62.9
canvas-mouse-sweep: event listeners -131 -63 -52% z=-17.0
canvas-zoom-sweep: avg frame time 17ms 17ms +0% z=0.5
canvas-zoom-sweep: p95 frame time 17ms 17ms -1%
canvas-zoom-sweep: layout duration 1ms 1ms -6% z=0.2
canvas-zoom-sweep: style recalc duration 16ms 19ms +21% z=-0.3
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 30 31 +3% z=-0.6
canvas-zoom-sweep: task duration 301ms 326ms +8% z=-0.1
canvas-zoom-sweep: script duration 25ms 24ms -4% z=-1.1
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 43.8 MB 46.7 MB +7%
canvas-zoom-sweep: DOM nodes 77 78 +1% z=-1.6
canvas-zoom-sweep: event listeners 21 20 -5% z=-0.7
dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.5
dom-widget-clipping: p95 frame time 17ms 17ms +0%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 8ms 9ms +10% z=-1.1
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 12 10 -17% z=-6.2
dom-widget-clipping: task duration 328ms 335ms +2% z=-1.8
dom-widget-clipping: script duration 56ms 54ms -4% z=-4.2
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 56.2 MB 54.8 MB -2%
dom-widget-clipping: DOM nodes 19 16 -16% z=-4.3
dom-widget-clipping: event listeners 2 2 +0% variance too high
large-graph-idle: avg frame time 17ms 17ms -0% z=-0.6
large-graph-idle: p95 frame time 17ms 17ms +0%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 9ms 10ms +7% z=-2.1
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 11 11 +0% z=-1.9
large-graph-idle: task duration 529ms 585ms +10% z=0.8
large-graph-idle: script duration 83ms 106ms +27% z=0.3
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 63.1 MB 62.3 MB -1%
large-graph-idle: DOM nodes -260 -257 -1% z=-311.7
large-graph-idle: event listeners -129 -130 +1% z=-25.6
large-graph-pan: avg frame time 17ms 17ms +0% z=0.3
large-graph-pan: p95 frame time 17ms 17ms +0%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 19ms 18ms -7% z=0.5
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 69 69 -1% z=-1.7
large-graph-pan: task duration 1033ms 1201ms +16% ⚠️ z=2.8
large-graph-pan: script duration 362ms 402ms +11% z=-0.3
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 63.2 MB 108.7 MB +72%
large-graph-pan: DOM nodes -258 -263 +2% z=-170.9
large-graph-pan: event listeners -127 -128 +1% z=-160.5
large-graph-zoom: avg frame time 17ms 17ms +0%
large-graph-zoom: p95 frame time 17ms 17ms +0%
large-graph-zoom: layout duration 8ms 8ms -4%
large-graph-zoom: style recalc duration 19ms 20ms +5%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 65 66 +2%
large-graph-zoom: task duration 1271ms 1368ms +8%
large-graph-zoom: script duration 472ms 483ms +2%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 51.5 MB 81.6 MB +58%
large-graph-zoom: DOM nodes -265 -266 +0%
large-graph-zoom: event listeners -125 -126 +1%
minimap-idle: avg frame time 17ms 17ms +0% z=0.7
minimap-idle: p95 frame time 17ms 17ms +0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 8ms 8ms +8% z=-1.6
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 9 9 +0% z=-0.8
minimap-idle: task duration 530ms 569ms +7% z=0.9
minimap-idle: script duration 84ms 101ms +20% z=0.2
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 65.0 MB 65.9 MB +1%
minimap-idle: DOM nodes -260 -262 +1% z=-205.2
minimap-idle: event listeners -129 -129 +0% z=-202.3
subgraph-dom-widget-clipping: avg frame time 17ms 17ms -0% z=-0.9
subgraph-dom-widget-clipping: p95 frame time 17ms 17ms +0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 11ms 11ms +7% z=-1.5
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 46 48 +3% z=-0.8
subgraph-dom-widget-clipping: task duration 363ms 357ms -2% z=-1.1
subgraph-dom-widget-clipping: script duration 126ms 119ms -5% z=-1.4
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 55.1 MB 56.2 MB +2%
subgraph-dom-widget-clipping: DOM nodes 16 21 +28% z=-1.5
subgraph-dom-widget-clipping: event listeners 8 8 +0% z=-1.4
subgraph-idle: avg frame time 17ms 17ms +0% z=0.4
subgraph-idle: p95 frame time 17ms 17ms -1%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 8ms 10ms +32% z=-0.5
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 9 11 +22% z=0.2
subgraph-idle: task duration 326ms 415ms +27% z=1.4
subgraph-idle: script duration 12ms 19ms +54% z=-0.4
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 68.2 MB 63.7 MB -7%
subgraph-idle: DOM nodes 14 -119 -950% z=-94.2
subgraph-idle: event listeners 6 -62 -1125% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms +0% z=0.4
subgraph-mouse-sweep: p95 frame time 17ms 17ms -0%
subgraph-mouse-sweep: layout duration 4ms 5ms +7% z=-0.3
subgraph-mouse-sweep: style recalc duration 35ms 37ms +5% z=-1.7
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 76 76 -1% z=-2.4
subgraph-mouse-sweep: task duration 679ms 711ms +5% z=-0.8
subgraph-mouse-sweep: script duration 90ms 91ms +0% z=-1.6
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 56.6 MB 60.4 MB +7%
subgraph-mouse-sweep: DOM nodes -258 -100 -61% z=-74.7
subgraph-mouse-sweep: event listeners -129 -64 -51% variance too high
subgraph-transition-enter: avg frame time 17ms 17ms +0%
subgraph-transition-enter: p95 frame time 17ms 17ms +1%
subgraph-transition-enter: layout duration 11ms 11ms +5%
subgraph-transition-enter: style recalc duration 26ms 24ms -7%
subgraph-transition-enter: layout count 5 4 -20%
subgraph-transition-enter: style recalc count 17 16 -6%
subgraph-transition-enter: task duration 803ms 838ms +4%
subgraph-transition-enter: script duration 28ms 32ms +13%
subgraph-transition-enter: TBT 145ms 146ms +1%
subgraph-transition-enter: heap used 212.1 MB 113.4 MB -47%
subgraph-transition-enter: DOM nodes 13513 12627 -7%
subgraph-transition-enter: event listeners 2527 1637 -35%
viewport-pan-sweep: avg frame time 17ms 17ms +0%
viewport-pan-sweep: p95 frame time 17ms 17ms -1%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 55ms 54ms -3%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 249 250 +0%
viewport-pan-sweep: task duration 3815ms 3931ms +3%
viewport-pan-sweep: script duration 1155ms 1343ms +16%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 128.2 MB 78.1 MB -39%
viewport-pan-sweep: DOM nodes -261 -261 +0%
viewport-pan-sweep: event listeners -125 -128 +2%
vue-large-graph-idle: avg frame time 17ms 17ms -0%
vue-large-graph-idle: p95 frame time 17ms 17ms -0%
vue-large-graph-idle: layout duration 0ms 0ms +0%
vue-large-graph-idle: style recalc duration 0ms 0ms +0%
vue-large-graph-idle: layout count 0 0 +0%
vue-large-graph-idle: style recalc count 0 0 +0%
vue-large-graph-idle: task duration 12715ms 11902ms -6%
vue-large-graph-idle: script duration 563ms 616ms +9%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 164.2 MB 197.2 MB +20%
vue-large-graph-idle: DOM nodes -8331 -8331 +0%
vue-large-graph-idle: event listeners -16468 -16478 +0%
vue-large-graph-pan: avg frame time 17ms 17ms -0%
vue-large-graph-pan: p95 frame time 17ms 17ms +0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 17ms 18ms +2%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 73 70 -4%
vue-large-graph-pan: task duration 14882ms 13966ms -6%
vue-large-graph-pan: script duration 871ms 933ms +7%
vue-large-graph-pan: TBT 0ms 1ms
vue-large-graph-pan: heap used 179.8 MB 213.4 MB +19%
vue-large-graph-pan: DOM nodes -8331 -8331 +0%
vue-large-graph-pan: event listeners -16460 -16475 +0%
workflow-execution: avg frame time 17ms 17ms +0% z=0.6
workflow-execution: p95 frame time 17ms 17ms +0%
workflow-execution: layout duration 1ms 1ms -5% z=-1.1
workflow-execution: style recalc duration 23ms 21ms -8% z=-1.4
workflow-execution: layout count 5 5 -10% z=-0.8
workflow-execution: style recalc count 16 17 +6% z=-0.4
workflow-execution: task duration 111ms 123ms +10% z=-0.0
workflow-execution: script duration 24ms 26ms +9% z=-1.1
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 51.2 MB 53.0 MB +4%
workflow-execution: DOM nodes 155 170 +10% z=1.3
workflow-execution: event listeners 71 71 +0% z=4.4
Historical variance (last 15 runs)
Metric μ σ CV
canvas-idle: avg frame time 17ms 0ms 0.0%
canvas-idle: layout duration 0ms 0ms 0.0%
canvas-idle: style recalc duration 11ms 1ms 8.2%
canvas-idle: layout count 0 0 0.0%
canvas-idle: style recalc count 11 1 5.0%
canvas-idle: task duration 395ms 31ms 7.9%
canvas-idle: script duration 25ms 2ms 8.8%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
canvas-mouse-sweep: avg frame time 17ms 0ms 0.0%
canvas-mouse-sweep: layout duration 4ms 0ms 5.4%
canvas-mouse-sweep: style recalc duration 43ms 3ms 7.4%
canvas-mouse-sweep: layout count 12 0 0.0%
canvas-mouse-sweep: style recalc count 79 2 3.0%
canvas-mouse-sweep: task duration 865ms 58ms 6.7%
canvas-mouse-sweep: script duration 136ms 6ms 4.8%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
canvas-zoom-sweep: avg frame time 17ms 0ms 0.0%
canvas-zoom-sweep: layout duration 1ms 0ms 7.0%
canvas-zoom-sweep: style recalc duration 19ms 2ms 8.0%
canvas-zoom-sweep: layout count 6 0 0.0%
canvas-zoom-sweep: style recalc count 31 0 1.5%
canvas-zoom-sweep: task duration 327ms 23ms 7.1%
canvas-zoom-sweep: script duration 27ms 3ms 11.1%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
dom-widget-clipping: avg frame time 17ms 0ms 0.0%
dom-widget-clipping: layout duration 0ms 0ms 0.0%
dom-widget-clipping: style recalc duration 10ms 1ms 8.0%
dom-widget-clipping: layout count 0 0 0.0%
dom-widget-clipping: style recalc count 13 0 3.8%
dom-widget-clipping: task duration 365ms 16ms 4.5%
dom-widget-clipping: script duration 68ms 3ms 4.8%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
large-graph-idle: avg frame time 17ms 0ms 0.0%
large-graph-idle: layout duration 0ms 0ms 0.0%
large-graph-idle: style recalc duration 12ms 1ms 8.6%
large-graph-idle: layout count 0 0 0.0%
large-graph-idle: style recalc count 12 0 2.7%
large-graph-idle: task duration 542ms 54ms 10.0%
large-graph-idle: script duration 102ms 11ms 10.3%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
large-graph-pan: avg frame time 17ms 0ms 0.0%
large-graph-pan: layout duration 0ms 0ms 0.0%
large-graph-pan: style recalc duration 17ms 1ms 4.6%
large-graph-pan: layout count 0 0 0.0%
large-graph-pan: style recalc count 70 1 0.9%
large-graph-pan: task duration 1082ms 43ms 4.0%
large-graph-pan: script duration 408ms 20ms 4.8%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
minimap-idle: avg frame time 17ms 0ms 0.0%
minimap-idle: layout duration 0ms 0ms 0.0%
minimap-idle: style recalc duration 10ms 1ms 8.6%
minimap-idle: layout count 0 0 0.0%
minimap-idle: style recalc count 10 1 7.1%
minimap-idle: task duration 527ms 47ms 9.0%
minimap-idle: script duration 98ms 10ms 10.1%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
subgraph-dom-widget-clipping: avg frame time 17ms 0ms 0.0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalc duration 13ms 1ms 7.4%
subgraph-dom-widget-clipping: layout count 0 0 0.0%
subgraph-dom-widget-clipping: style recalc count 48 1 1.2%
subgraph-dom-widget-clipping: task duration 378ms 18ms 4.9%
subgraph-dom-widget-clipping: script duration 128ms 6ms 4.9%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.0%
subgraph-dom-widget-clipping: event listeners 16 6 36.0%
subgraph-idle: avg frame time 17ms 0ms 0.0%
subgraph-idle: layout duration 0ms 0ms 0.0%
subgraph-idle: style recalc duration 10ms 1ms 7.5%
subgraph-idle: layout count 0 0 0.0%
subgraph-idle: style recalc count 11 1 6.0%
subgraph-idle: task duration 370ms 31ms 8.5%
subgraph-idle: script duration 20ms 3ms 13.2%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
subgraph-mouse-sweep: avg frame time 17ms 0ms 0.0%
subgraph-mouse-sweep: layout duration 5ms 0ms 6.8%
subgraph-mouse-sweep: style recalc duration 42ms 3ms 7.8%
subgraph-mouse-sweep: layout count 16 0 0.0%
subgraph-mouse-sweep: style recalc count 80 2 2.4%
subgraph-mouse-sweep: task duration 766ms 69ms 9.0%
subgraph-mouse-sweep: script duration 101ms 7ms 6.5%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
workflow-execution: avg frame time 17ms 0ms 0.0%
workflow-execution: layout duration 2ms 0ms 9.4%
workflow-execution: style recalc duration 24ms 2ms 9.1%
workflow-execution: layout count 5 1 11.0%
workflow-execution: style recalc count 18 2 11.5%
workflow-execution: task duration 123ms 11ms 8.8%
workflow-execution: script duration 29ms 3ms 10.2%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: DOM nodes 161 7 4.4%
workflow-execution: event listeners 52 4 8.4%
Trend (last 15 commits on main)
Metric Trend Dir Latest
canvas-idle: avg frame time ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: p95 frame time ➡️ NaNms
canvas-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: style recalc duration ▇▇▆▆▃█▄▃▄▃▇▄▁▆▇ ➡️ 11ms
canvas-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: style recalc count █▃▅▂▅▆▃▁▂▁▂▅▆▅▆ ➡️ 12
canvas-idle: task duration ▃▃▃▆▂▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: script duration ▄▃▅▇▂▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
canvas-mouse-sweep: avg frame time ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: p95 frame time ➡️ NaNms
canvas-mouse-sweep: layout duration ▁▃▂▄▁▂▁▃▆▂█▇▆▄▃ ➡️ 4ms
canvas-mouse-sweep: style recalc duration ▄▄▂▄▁▂▃▃▅▄█▆▂▄▄ ➡️ 43ms
canvas-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: style recalc count █▅▄▃▂▂▁▄▄▅▆▅▂▇▄ ➡️ 79
canvas-mouse-sweep: task duration █▆▄▂▂▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: script duration ▄▅▄▆▄▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
canvas-zoom-sweep: avg frame time ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: p95 frame time ➡️ NaNms
canvas-zoom-sweep: layout duration ▆▅▅▄▁▁█▅▃▅▇▆▁▂▆ ➡️ 1ms
canvas-zoom-sweep: style recalc duration ▆▅▄▆▅▃█▆▇▅▇▄▁▃▅ ➡️ 20ms
canvas-zoom-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: style recalc count ▁▁▃▄▆▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: task duration ▄▂▁▇▂▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: script duration ▃▃▂▇▂▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
dom-widget-clipping: avg frame time ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: p95 frame time ➡️ NaNms
dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: style recalc duration ▆▆▂▆▄▃██▄▁▆▇▆▃▅ ➡️ 10ms
dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: style recalc count ▇█▅█▅▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: task duration ▃▃▁▅▄▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: script duration ▅▄▄▆▆▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
large-graph-idle: avg frame time ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: p95 frame time ➡️ NaNms
large-graph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: style recalc duration ▅▅▅▆▄▅▃▄▅▅▆█▁▄▆ ➡️ 13ms
large-graph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: style recalc count █▆█▃▃▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: task duration ▂▃▂▆▂▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: script duration ▄▅▄▆▄▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
large-graph-pan: avg frame time ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: p95 frame time ➡️ NaNms
large-graph-pan: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: style recalc duration ▃▂▄▄▁▅▂▂▁▄▄█▃▁▂ ➡️ 17ms
large-graph-pan: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: style recalc count ▆▃█▂▃▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: task duration ▄▃▄▆▄▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: script duration ▅▄▅▆▆▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
minimap-idle: avg frame time ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: p95 frame time ➡️ NaNms
minimap-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: style recalc duration ▄█▁█▅▅█▅▅▃▅▁▁▄▆ ➡️ 10ms
minimap-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: style recalc count ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 9
minimap-idle: task duration ▃▄▁▅▁▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: script duration ▄▆▃▇▃▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
subgraph-dom-widget-clipping: avg frame time ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: p95 frame time ➡️ NaNms
subgraph-dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: style recalc duration ▂▄▃▅▅▃▂▅▇▃▄█▁▄▆ ➡️ 14ms
subgraph-dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: style recalc count ▇█▆▃▆▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: task duration ▂▃▃▆▅▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: script duration ▃▃▃▄▅▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
subgraph-idle: avg frame time ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: p95 frame time ➡️ NaNms
subgraph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: style recalc duration ▁▇▃▆▂▄▂▃▃▆▆▄▃▇█ ➡️ 12ms
subgraph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: style recalc count ▃▆▃▃▂▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: task duration ▁▃▁▇▁▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: script duration ▁▃▂▇▁▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
subgraph-mouse-sweep: avg frame time ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: p95 frame time ➡️ NaNms
subgraph-mouse-sweep: layout duration ▁▄▄▄▃▃▅▅▅▂█▇▂▃▆ ➡️ 5ms
subgraph-mouse-sweep: style recalc duration ▃▂▄▅▂▃▄▅█▃█▆▁▂▅ ➡️ 43ms
subgraph-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: style recalc count ▅▂▅▅▁▄▃▅█▅▆▄▂▄▅ ➡️ 81
subgraph-mouse-sweep: task duration ▃▂▄▅▂▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: script duration ▄▅▄▇▅▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
workflow-execution: avg frame time ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: p95 frame time ➡️ NaNms
workflow-execution: layout duration ▁▆▁▃▂▄▃▂▃▃▅█▄▂▅ ➡️ 2ms
workflow-execution: style recalc duration ▃▇▅▇▁▅▆▇█▁██▂▄▆ ➡️ 25ms
workflow-execution: layout count ▁█▂▃▂▃▃▁▃▃▄▃▂▃▂ ➡️ 5
workflow-execution: style recalc count ▃█▅▇▁▄▅▆▅▅▅▅▄▄▂ ➡️ 15
workflow-execution: task duration ▂▅▄▅▁▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: script duration ▄▃▄▄▃▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-05-15T20:17:38.243Z",
  "gitSha": "0931ba705ceb4d9c4b19133b1fc513a090178479",
  "branch": "glary/fix-duplicate-bypass-menu-item",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2062.8340000000094,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.851999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 506.378,
      "heapDeltaBytes": 35032740,
      "heapUsedBytes": 88101552,
      "domNodes": 18,
      "jsHeapTotalBytes": 46661632,
      "scriptDurationMs": 30,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-idle",
      "durationMs": 2013.824999999997,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.064,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 469.441,
      "heapDeltaBytes": -9887464,
      "heapUsedBytes": 58644916,
      "domNodes": -260,
      "jsHeapTotalBytes": 20668416,
      "scriptDurationMs": 23.8,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1892.2259999999937,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 45.648,
      "layouts": 12,
      "layoutDurationMs": 4.595,
      "taskDurationMs": 835.592,
      "heapDeltaBytes": -2798676,
      "heapUsedBytes": 63290968,
      "domNodes": 61,
      "jsHeapTotalBytes": 20541440,
      "scriptDurationMs": 131.67000000000002,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1873.6369999999738,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 42.028999999999996,
      "layouts": 12,
      "layoutDurationMs": 4.037,
      "taskDurationMs": 850.347,
      "heapDeltaBytes": 19165364,
      "heapUsedBytes": 68260356,
      "domNodes": -262,
      "jsHeapTotalBytes": 16904192,
      "scriptDurationMs": 125.10000000000002,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1720.3690000000051,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 17.895,
      "layouts": 6,
      "layoutDurationMs": 0.568,
      "taskDurationMs": 304.19,
      "heapDeltaBytes": 505724,
      "heapUsedBytes": 49137240,
      "domNodes": 77,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 20.232000000000006,
      "eventListeners": 21,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1734.6210000000042,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 19.498,
      "layouts": 6,
      "layoutDurationMs": 0.738,
      "taskDurationMs": 347.1770000000001,
      "heapDeltaBytes": 793788,
      "heapUsedBytes": 48855360,
      "domNodes": 79,
      "jsHeapTotalBytes": 14680064,
      "scriptDurationMs": 27.509999999999998,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 552.9360000000167,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 10.875000000000004,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 345.9220000000001,
      "heapDeltaBytes": 8798840,
      "heapUsedBytes": 57646688,
      "domNodes": 16,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 55.37500000000001,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.669999999999998,
      "p95FrameDurationMs": 16.799999999999727
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 528.3459999999991,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.161999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 324.36999999999995,
      "heapDeltaBytes": 8881200,
      "heapUsedBytes": 57369752,
      "domNodes": 16,
      "jsHeapTotalBytes": 15204352,
      "scriptDurationMs": 52.952,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2021.333999999996,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 10.713000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 592.596,
      "heapDeltaBytes": 8141520,
      "heapUsedBytes": 65688732,
      "domNodes": -258,
      "jsHeapTotalBytes": 3493888,
      "scriptDurationMs": 109.924,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2015.8710000000042,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.264000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 576.743,
      "heapDeltaBytes": 7921020,
      "heapUsedBytes": 64931884,
      "domNodes": -256,
      "jsHeapTotalBytes": 552960,
      "scriptDurationMs": 102.07200000000002,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2207.7500000000045,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 17.338,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1213.1059999999998,
      "heapDeltaBytes": 48126456,
      "heapUsedBytes": 109595088,
      "domNodes": -263,
      "jsHeapTotalBytes": 33030144,
      "scriptDurationMs": 407.43700000000007,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2177.33800000002,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 18.114999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1189.1180000000002,
      "heapDeltaBytes": 58021900,
      "heapUsedBytes": 118334616,
      "domNodes": -263,
      "jsHeapTotalBytes": 40603648,
      "scriptDurationMs": 396.10599999999994,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3219.581000000005,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 18.849,
      "layouts": 60,
      "layoutDurationMs": 7.803999999999999,
      "taskDurationMs": 1405.4379999999999,
      "heapDeltaBytes": 44861952,
      "heapUsedBytes": 106213172,
      "domNodes": -266,
      "jsHeapTotalBytes": 44068864,
      "scriptDurationMs": 485.974,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3219.251999999983,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 20.267,
      "layouts": 60,
      "layoutDurationMs": 7.679,
      "taskDurationMs": 1331.1350000000002,
      "heapDeltaBytes": 3148676,
      "heapUsedBytes": 64985028,
      "domNodes": -266,
      "jsHeapTotalBytes": 5066752,
      "scriptDurationMs": 480.58,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2038.2409999999709,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.674000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 569.5360000000001,
      "heapDeltaBytes": 3940832,
      "heapUsedBytes": 62932800,
      "domNodes": -260,
      "jsHeapTotalBytes": 5795840,
      "scriptDurationMs": 102.64300000000001,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2027.6719999999955,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.820999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 569.172,
      "heapDeltaBytes": 13814532,
      "heapUsedBytes": 75189372,
      "domNodes": -263,
      "jsHeapTotalBytes": 4018176,
      "scriptDurationMs": 98.632,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 553.6309999999958,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 11.124,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 364.36600000000004,
      "heapDeltaBytes": -12540376,
      "heapUsedBytes": 53195440,
      "domNodes": 20,
      "jsHeapTotalBytes": 21065728,
      "scriptDurationMs": 125.919,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.663333333333338,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 543.0730000000494,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 11.38,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 349.65500000000003,
      "heapDeltaBytes": 15381532,
      "heapUsedBytes": 64629636,
      "domNodes": 21,
      "jsHeapTotalBytes": 16777216,
      "scriptDurationMs": 112.61399999999999,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.663333333333338,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2016.715000000005,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 10.916,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 475.30300000000005,
      "heapDeltaBytes": 11570060,
      "heapUsedBytes": 61708904,
      "domNodes": -257,
      "jsHeapTotalBytes": 17260544,
      "scriptDurationMs": 23.076,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2003.7429999999858,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.140999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 353.879,
      "heapDeltaBytes": 22972248,
      "heapUsedBytes": 71851372,
      "domNodes": 19,
      "jsHeapTotalBytes": 15204352,
      "scriptDurationMs": 15.342000000000002,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1724.6459999999786,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 37.009,
      "layouts": 16,
      "layoutDurationMs": 4.537,
      "taskDurationMs": 747.1350000000001,
      "heapDeltaBytes": 13246772,
      "heapUsedBytes": 62461220,
      "domNodes": -262,
      "jsHeapTotalBytes": 19263488,
      "scriptDurationMs": 91.845,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1693.885000000023,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 36.409,
      "layouts": 16,
      "layoutDurationMs": 4.685,
      "taskDurationMs": 674.43,
      "heapDeltaBytes": -4368776,
      "heapUsedBytes": 64183524,
      "domNodes": 62,
      "jsHeapTotalBytes": 19398656,
      "scriptDurationMs": 89.427,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1065.6619999999748,
      "styleRecalcs": 16,
      "styleRecalcDurationMs": 24.443000000000005,
      "layouts": 4,
      "layoutDurationMs": 11.283000000000001,
      "taskDurationMs": 837.539,
      "heapDeltaBytes": -24024924,
      "heapUsedBytes": 118897452,
      "domNodes": 12627,
      "jsHeapTotalBytes": -30216192,
      "scriptDurationMs": 31.992000000000008,
      "eventListeners": 1637,
      "totalBlockingTimeMs": 146,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8178.616000000005,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 55.364999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4037.242,
      "heapDeltaBytes": 23798868,
      "heapUsedBytes": 81178104,
      "domNodes": -260,
      "jsHeapTotalBytes": 8097792,
      "scriptDurationMs": 1413.4719999999998,
      "eventListeners": -113,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8123.287000000005,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 51.706,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3825.5579999999995,
      "heapDeltaBytes": 24479596,
      "heapUsedBytes": 82520376,
      "domNodes": -262,
      "jsHeapTotalBytes": 6262784,
      "scriptDurationMs": 1272.3289999999997,
      "eventListeners": -143,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 13133.935000000009,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13080.639000000001,
      "heapDeltaBytes": -5908808,
      "heapUsedBytes": 248036508,
      "domNodes": -8331,
      "jsHeapTotalBytes": 2420736,
      "scriptDurationMs": 649.5730000000001,
      "eventListeners": -16488,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 10735.455000000002,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 10723.504,
      "heapDeltaBytes": -37408664,
      "heapUsedBytes": 165590628,
      "domNodes": -8331,
      "jsHeapTotalBytes": 16838656,
      "scriptDurationMs": 582.538,
      "eventListeners": -16468,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 15316.821000000004,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 18.338000000000022,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 15294.077000000001,
      "heapDeltaBytes": 7630124,
      "heapUsedBytes": 269574576,
      "domNodes": -8331,
      "jsHeapTotalBytes": -2383872,
      "scriptDurationMs": 1010.977,
      "eventListeners": -16486,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 12653.804000000036,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 17.258999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12637.301,
      "heapDeltaBytes": -32893540,
      "heapUsedBytes": 177920004,
      "domNodes": -8331,
      "jsHeapTotalBytes": -17063936,
      "scriptDurationMs": 855.823,
      "eventListeners": -16464,
      "totalBlockingTimeMs": 2,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 448.49400000003925,
      "styleRecalcs": 15,
      "styleRecalcDurationMs": 21.858,
      "layouts": 5,
      "layoutDurationMs": 1.6360000000000001,
      "taskDurationMs": 122.531,
      "heapDeltaBytes": 5269592,
      "heapUsedBytes": 55531264,
      "domNodes": 165,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 24.799999999999997,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "workflow-execution",
      "durationMs": 482.1470000000545,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 20.647,
      "layouts": 4,
      "layoutDurationMs": 1.1289999999999998,
      "taskDurationMs": 123.08899999999997,
      "heapDeltaBytes": 5297952,
      "heapUsedBytes": 55572812,
      "domNodes": 175,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 27.050000000000004,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    }
  ]
}

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/services/litegraphService.ts`:
- Around line 723-725: Replace the hard-coded labels in the toggle payload with
vue-i18n lookups: call t('main.bypass.remove') when
areAllSelectedNodesInMode(LGraphEventMode.BYPASS) is true, otherwise
t('main.bypass.add'), using the same scope where the current content is set (the
code referencing areAllSelectedNodesInMode and LGraphEventMode.BYPASS). Add
corresponding keys ("main.bypass.remove" and "main.bypass.add") to the English
locale file under the main namespace with values "Remove Bypass" and "Bypass",
and ensure the module has access to the i18n `t` function (import or use
existing composable) so the labels are localized.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 06a8b17f-49b6-429f-84bf-87047ce95b98

📥 Commits

Reviewing files that changed from the base of the PR and between 71092b2 and d82c7ab.

📒 Files selected for processing (4)
  • src/composables/canvas/useSelectedLiteGraphItems.test.ts
  • src/composables/canvas/useSelectedLiteGraphItems.ts
  • src/composables/graph/contextMenuConverter.test.ts
  • src/services/litegraphService.ts

Comment thread src/services/litegraphService.ts Outdated
Comment on lines +723 to +725
content: areAllSelectedNodesInMode(LGraphEventMode.BYPASS)
? 'Remove Bypass'
: 'Bypass',
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot May 15, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Localize the new bypass labels via vue-i18n.

These user-facing labels are raw string literals in a .ts file. Please route them through translation keys (and add the new key to src/locales/en/main.json).

Suggested change
       options.push({
         content: areAllSelectedNodesInMode(LGraphEventMode.BYPASS)
-          ? 'Remove Bypass'
-          : 'Bypass',
+          ? t('contextMenu.RemoveBypass')
+          : t('contextMenu.Bypass'),
         callback: () => {
           toggleSelectedNodesMode(LGraphEventMode.BYPASS)
           canvas.setDirty(true, true)
         }
       })

As per coding guidelines: src/**/*.{ts,tsx,vue} says to “Use vue-i18n for ALL user-facing strings,” with entries in src/locales/en/main.json.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/services/litegraphService.ts` around lines 723 - 725, Replace the
hard-coded labels in the toggle payload with vue-i18n lookups: call
t('main.bypass.remove') when areAllSelectedNodesInMode(LGraphEventMode.BYPASS)
is true, otherwise t('main.bypass.add'), using the same scope where the current
content is set (the code referencing areAllSelectedNodesInMode and
LGraphEventMode.BYPASS). Add corresponding keys ("main.bypass.remove" and
"main.bypass.add") to the English locale file under the main namespace with
values "Remove Bypass" and "Bypass", and ensure the module has access to the
i18n `t` function (import or use existing composable) so the labels are
localized.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Good catch — fixed in ad3ad327b.

Used the existing locale keys contextMenu.Bypass / contextMenu.Remove Bypass (already defined in src/locales/en/main.json and used by the Vue getBypassOption in useNodeMenuOptions.ts) rather than creating new contextMenu.RemoveBypass / main.bypass.* keys, so the legacy LiteGraph entry stays byte-identical to the Vue entry in every locale — which is what the menu deduplicator's exact-label match relies on.

content: areAllSelectedNodesInMode(LGraphEventMode.BYPASS)
  ? t('contextMenu.Remove Bypass')
  : t('contextMenu.Bypass'),

t was already imported in this file (import { st, t } from '@/i18n' at line 14).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Skipped: comment is from another GitHub bot.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 15, 2026

Codecov Report

❌ Patch coverage is 84.61538% with 2 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/services/litegraphService.ts 33.33% 2 Missing ⚠️
@@             Coverage Diff             @@
##             main   #12296       +/-   ##
===========================================
- Coverage   74.07%   59.57%   -14.50%     
===========================================
  Files        1521     1412      -109     
  Lines       87192    71886    -15306     
  Branches    23325    19032     -4293     
===========================================
- Hits        64588    42827    -21761     
- Misses      21772    28586     +6814     
+ Partials      832      473      -359     
Flag Coverage Δ
e2e ?
unit 59.57% <84.61%> (+0.05%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...rc/composables/canvas/useSelectedLiteGraphItems.ts 100.00% <100.00%> (ø)
src/services/litegraphService.ts 15.95% <33.33%> (-52.19%) ⬇️

... and 1003 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Addresses CodeRabbit review: per AGENTS.md, all user-facing strings
must use vue-i18n. The Vue `getBypassOption` already uses
`t('contextMenu.Bypass')` and `t('contextMenu.Remove Bypass')` —
reuse the same keys so the legacy LiteGraph entry stays exact-label
identical to the Vue entry (which is how the menu deduplicator
collapses them) in every locale.
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.

2 participants