Skip to content

fix: Vue mode socket map data not cleaned up on dynamic input changes#8469

Merged
christian-byrne merged 2 commits intomainfrom
fix/api-key-auth-create-customer
Jan 30, 2026
Merged

fix: Vue mode socket map data not cleaned up on dynamic input changes#8469
christian-byrne merged 2 commits intomainfrom
fix/api-key-auth-create-customer

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Jan 30, 2026

Summary

Fixes a bug where socket map data was not properly removed when sockets are dynamically added/removed via DynamicCombo widgets in Vue mode (Nodes 2.0).

Problem

When DynamicCombo widgets (e.g., should_remesh on Meshy nodes) change their selection, inputs are dynamically added/removed. The Vue v-for loop in NodeSlots.vue was using array index as the :key, causing Vue to reuse slot components instead of properly unmounting them.

This led to:

  • Socket map entries leaking (never cleaned up)
  • Socket positions becoming desynced
  • Stale cached offset data

Solution

  1. Use slot name as Vue key instead of array index in NodeSlots.vue

    • Slot names are unique per node (enforced by ComfyUI backend)
    • When a slot is removed, Vue sees the key disappear and properly unmounts the component
    • onUnmounted cleanup in useSlotElementTracking now runs correctly
  2. Add defensive cleanup in useSlotElementTracking.ts

    • Before registering a new slot, check if a stale entry exists with the same key
    • Clean up stale entry to handle any edge cases

Related

Testing

  • Quality checks pass (typecheck, lint, format)
  • Manual testing with DynamicCombo nodes (Meshy, nodes_logic) recommended

┆Issue is synchronized with this Notion page by Unito

Subagent 5 and others added 2 commits January 28, 2026 21:47
Fixes authentication failure when using API key authentication on staging.
The previous code used getFirebaseAuthHeader() which only returns Firebase
tokens. API key users got null and failed with 'no Comfy user associated'.

getAuthHeader() correctly falls back to X-API-KEY header when no Firebase
token is available, and the backend /customers endpoint supports this.

Fixes COM-12398

Amp-Thread-ID: https://ampcode.com/threads/T-019c07f6-f594-76a8-91c7-cb1a8cd1cb5d
Co-authored-by: Amp <amp@ampcode.com>
…put changes

When DynamicCombo widgets add/remove inputs, Vue was reusing slot components
instead of properly unmounting them because the v-for key was based on array
index. This caused socket map data to leak and become desynced.

Changes:
- Use input.name/output.name as Vue :key instead of array index
- Add defensive cleanup in useSlotElementTracking to handle edge cases

Fixes COM-12970

Amp-Thread-ID: https://ampcode.com/threads/T-019c089a-0492-71ff-8ce0-73e08f4f434b
Co-authored-by: Amp <amp@ampcode.com>
@christian-byrne christian-byrne requested a review from a team as a code owner January 30, 2026 02:58
@notion-workspace
Copy link

@dosubot dosubot bot added the size:S This PR changes 10-29 lines, ignoring generated files. label Jan 30, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 30, 2026

Important

Review skipped

Auto reviews are limited based on label configuration.

🚫 Review skipped — only excluded labels are configured. (1)
  • backport

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • 🔍 Trigger a full review
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/api-key-auth-create-customer

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 Jan 30, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/30/2026, 03:00:20 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 30, 2026

🎭 Playwright Tests: ⚠️ Passed with flaky tests

Results: 505 passed, 0 failed, 1 flaky, 8 skipped (Total: 514)

❌ Failed Tests

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

Bundle Size Report

Summary

  • Raw size: 22.1 MB baseline 22.1 MB — ⚪ 0 B
  • Gzip: 4.61 MB baseline 4.61 MB — 🟢 -53 B
  • Brotli: 3.42 MB baseline 3.42 MB — 🟢 -211 B
  • Bundles: 173 current • 173 baseline • 81 added / 81 removed

Category Glance
Data & Services 🔴 +206 B (2.71 MB) · Other 🟢 -198 B (7.1 MB) · Panels & Settings 🟢 -8 B (471 kB) · Vendor & Third-Party ⚪ 0 B (10.7 MB) · Graph Workspace ⚪ 0 B (974 kB) · Views & Navigation ⚪ 0 B (80.7 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-C6jm9IQn.js (new) 26 kB 🔴 +26 kB 🔴 +7.51 kB 🔴 +6.61 kB
assets/index-DzU0Otvt.js (removed) 26 kB 🟢 -26 kB 🟢 -7.5 kB 🟢 -6.61 kB

Status: 1 added / 1 removed

Graph Workspace — 974 kB (baseline 974 kB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Bzm4AsXv.js (new) 974 kB 🔴 +974 kB 🔴 +197 kB 🔴 +149 kB
assets/GraphView-NqK3wMno.js (removed) 974 kB 🟢 -974 kB 🟢 -197 kB 🟢 -149 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BNjgitR5.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.6 kB 🔴 +3.05 kB
assets/CloudSurveyView-Ky5xTgVD.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.6 kB 🟢 -3.05 kB
assets/CloudLoginView-Cz0bAYvs.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.72 kB
assets/CloudLoginView-e9-T0LzO.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.09 kB 🔴 +2.72 kB
assets/UserCheckView-Bg_j0NdH.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.45 kB 🟢 -2.13 kB
assets/UserCheckView-BJ5AbaNq.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.45 kB 🔴 +2.13 kB
assets/CloudLayoutView-BE3feEh4.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.24 kB 🟢 -1.95 kB
assets/CloudLayoutView-Cy5Opu2Z.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.24 kB 🔴 +1.96 kB
assets/CloudSignupView-CsiaoK_S.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.32 kB 🟢 -2.02 kB
assets/CloudSignupView-d0noR21F.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.32 kB 🔴 +2.02 kB
assets/CloudForgotPasswordView-C_xv88am.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.92 kB 🔴 +1.69 kB
assets/CloudForgotPasswordView-C8U7cwpk.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/UserSelectView-DaNblRLk.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.58 kB
assets/UserSelectView-ZuX2Fr-Q.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/CloudSubscriptionRedirectView-BJzZ9Ver.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.54 kB
assets/CloudSubscriptionRedirectView-DKoqVpn7.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.54 kB
assets/CloudAuthTimeoutView-C-ggB57E.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.7 kB 🔴 +1.48 kB
assets/CloudAuthTimeoutView-IH7Yy4py.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.71 kB 🟢 -1.49 kB
assets/CloudSorryContactSupportView-n5f-fGMz.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-V93lMUpe.js 500 B 500 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

Panels & Settings — 471 kB (baseline 471 kB) • 🟢 -8 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WorkspacePanel-DaP--hp6.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -5.89 kB 🟢 -5.13 kB
assets/WorkspacePanel-DjQcnjly.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +5.89 kB 🔴 +5.14 kB
assets/LegacyCreditsPanel-BRSr4r7s.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.94 kB 🔴 +5.22 kB
assets/LegacyCreditsPanel-CapCB9NV.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.95 kB 🟢 -5.22 kB
assets/SubscriptionPanel-DsorX3Xo.js (new) 21 kB 🔴 +21 kB 🔴 +5.04 kB 🔴 +4.44 kB
assets/SubscriptionPanel-KZBrnoIQ.js (removed) 21 kB 🟢 -21 kB 🟢 -5.04 kB 🟢 -4.44 kB
assets/KeybindingPanel-lBawcRmm.js (removed) 14.3 kB 🟢 -14.3 kB 🟢 -3.77 kB 🟢 -3.34 kB
assets/KeybindingPanel-Pmapt0Sd.js (new) 14.3 kB 🔴 +14.3 kB 🔴 +3.76 kB 🔴 +3.34 kB
assets/AboutPanel-B3q1s6PJ.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.43 kB
assets/AboutPanel-DdZlY6It.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.43 kB
assets/ExtensionPanel-8lgBBUpU.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ExtensionPanel-DWFfD-64.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/ServerConfigPanel-CAG0-e0h.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.17 kB 🔴 +1.94 kB
assets/ServerConfigPanel-CKc4VfLS.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.17 kB 🟢 -1.94 kB
assets/UserPanel-nfXaoJhx.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.9 kB 🟢 -1.68 kB
assets/UserPanel-xxQXOrdW.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.9 kB 🔴 +1.68 kB
assets/refreshRemoteConfig-BwSH7sJm.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -572 B 🟢 -497 B
assets/refreshRemoteConfig-CGBiHeo6.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +572 B 🔴 +499 B
assets/config-BJnN3URR.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -608 B 🟢 -537 B
assets/config-DwbC8tqM.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +604 B 🔴 +532 B
assets/cloudRemoteConfig-851AoHFQ.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -513 B 🟢 -438 B
assets/cloudRemoteConfig-CDxSESSO.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +509 B 🔴 +439 B
assets/refreshRemoteConfig-BNpaN_a4.js (removed) 169 B 🟢 -169 B 🟢 -108 B 🟢 -103 B
assets/refreshRemoteConfig-D0irN_lq.js (new) 169 B 🔴 +169 B 🔴 +108 B 🔴 +102 B
assets/remoteConfig-B0mlVvm7.js 788 B 788 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-2UNjEj6k.js 32.9 kB 32.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B2OMGvh7.js 31.2 kB 31.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BcujOfpn.js 29.6 kB 29.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BI09_t23.js 29.4 kB 29.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BKamuseh.js 25.8 kB 25.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BlTun9tZ.js 26.4 kB 26.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CZ62uO3e.js 30.2 kB 30.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DaK-NByz.js 35.2 kB 35.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DaS3cSXp.js 39.4 kB 39.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DWbMuaAa.js 32 kB 32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-S7pA60Hj.js 30.4 kB 30.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BgYRox1Q.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.05 kB
assets/auth-CSj4tYip.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.05 kB
assets/firebaseAuthStore-BiTQDNoZ.js (removed) 217 B 🟢 -217 B 🟢 -138 B 🟢 -123 B
assets/firebaseAuthStore-CKc81TKm.js (new) 217 B 🔴 +217 B 🔴 +138 B 🔴 +122 B
assets/auth-DapesT4a.js (removed) 178 B 🟢 -178 B 🟢 -141 B 🟢 -129 B
assets/auth-MSN8s2pr.js (new) 178 B 🔴 +178 B 🔴 +142 B 🔴 +130 B

Status: 3 added / 3 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-CNNqIoep.js (removed) 2.71 kB 🟢 -2.71 kB 🟢 -1.29 kB 🟢 -1.14 kB
assets/useSubscriptionDialog-oCQI1L6X.js (new) 2.71 kB 🔴 +2.71 kB 🔴 +1.29 kB 🔴 +1.14 kB
assets/useSubscriptionDialog-BFVGC7BU.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +99 B
assets/useSubscriptionDialog-CyT9mcV_.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -97 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-BJupnPkc.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.68 kB 🔴 +2.41 kB
assets/ComfyQueueButton-CRq78ran.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.68 kB 🟢 -2.41 kB
assets/SubscribeButton-C9od-PA_.js (new) 4.63 kB 🔴 +4.63 kB 🔴 +1.57 kB 🔴 +1.39 kB
assets/SubscribeButton-InCtNbGL.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.57 kB 🟢 -1.39 kB
assets/cloudFeedbackTopbarButton-0cksumpp.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +672 B 🔴 +563 B
assets/cloudFeedbackTopbarButton-BAkZBYQe.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -676 B 🟢 -573 B
assets/ComfyQueueButton-BX8NyW1f.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -107 B
assets/ComfyQueueButton-vD6oj7sy.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +114 B
assets/Button-Bb_i0j7c.js 3.82 kB 3.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-CzKMhVcP.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-qACg_vGT.js 8.36 kB 8.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-D80lITos.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DSv9NFvF.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 4 added / 4 removed

Data & Services — 2.71 MB (baseline 2.71 MB) • 🔴 +206 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-DSAZcl9M.js (new) 2.01 MB 🔴 +2.01 MB 🔴 +425 kB 🔴 +324 kB
assets/dialogService-DZz_Mh8J.js (removed) 2.01 MB 🟢 -2.01 MB 🟢 -424 kB 🟢 -324 kB
assets/api-DYpe7X8y.js (new) 675 kB 🔴 +675 kB 🔴 +149 kB 🔴 +119 kB
assets/api-D91jUAt3.js (removed) 675 kB 🟢 -675 kB 🟢 -149 kB 🟢 -119 kB
assets/releaseStore-CJI-wdPp.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.4 kB 🔴 +2.12 kB
assets/releaseStore-CliC1vG8.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.4 kB 🟢 -2.12 kB
assets/keybindingService-ac9a4D6c.js (removed) 6.74 kB 🟢 -6.74 kB 🟢 -1.75 kB 🟢 -1.52 kB
assets/keybindingService-CpG2WzFu.js (new) 6.74 kB 🔴 +6.74 kB 🔴 +1.76 kB 🔴 +1.53 kB
assets/bootstrapStore-BA9NsoX5.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.03 kB 🔴 +964 B
assets/bootstrapStore-DaMVSfR4.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.03 kB 🟢 -967 B
assets/userStore-BKIbtRNw.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +814 B 🔴 +724 B
assets/userStore-BvwKNit6.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -811 B 🟢 -724 B
assets/audioService-D-dFeEju.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -929 B 🟢 -809 B
assets/audioService-ftGyv-du.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +930 B 🔴 +811 B
assets/releaseStore-Bbt74HKi.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -106 B
assets/releaseStore-CtX4WUy6.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +105 B
assets/serverConfigStore-DOoqLe5c.js 2.64 kB 2.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useErrorHandling-b_E1wi9o.js (removed) 5.21 kB 🟢 -5.21 kB 🟢 -1.53 kB 🟢 -1.34 kB
assets/useErrorHandling-PnWzASba.js (new) 5.21 kB 🔴 +5.21 kB 🔴 +1.53 kB 🔴 +1.34 kB
assets/useWorkspaceUI-B5blHS1_.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +976 B 🔴 +839 B
assets/useWorkspaceUI-DmxbPtel.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -976 B 🟢 -842 B
assets/useSubscriptionActions-BBQT2jam.js (new) 2.22 kB 🔴 +2.22 kB 🔴 +868 B 🔴 +763 B
assets/useSubscriptionActions-PsQBLboZ.js (removed) 2.22 kB 🟢 -2.22 kB 🟢 -869 B 🟢 -763 B
assets/subscriptionCheckoutUtil-BfzgQN32.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -873 B 🟢 -771 B
assets/subscriptionCheckoutUtil-C-eqrrMg.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +870 B 🔴 +763 B
assets/useSubscriptionCredits-Cbi58kVP.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -600 B 🟢 -530 B
assets/useSubscriptionCredits-CUaRL3v_.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +598 B 🔴 +528 B
assets/audioUtils-C1oqcUEI.js (new) 970 B 🔴 +970 B 🔴 +548 B 🔴 +458 B
assets/audioUtils-zJfO32AE.js (removed) 970 B 🟢 -970 B 🟢 -550 B 🟢 -481 B
assets/useCurrentUser-CoMc0tUD.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -112 B
assets/useCurrentUser-DvJG0DZt.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +101 B
assets/_plugin-vue_export-helper-DuK_Fly3.js 467 B 467 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-GMAsfHxw.js 7.2 kB 7.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-ivqHoiOs.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tailwindUtil-CJjrIEVR.js 488 B 488 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 7 added / 7 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-DHGfk3hn.js 408 kB 408 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-jpGqhHNG.js 4.1 MB 4.1 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-4Jj8eU28.js 3.04 MB 3.04 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-aCG649nF.js 263 kB 263 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-CERwhPwK.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BxrEVL6s.js 650 kB 650 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-Dwii0E-t.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-IX6P8SWv.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.1 MB (baseline 7.1 MB) • 🟢 -198 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-Z8ZvfqTE.js (removed) 180 kB 🟢 -180 kB 🟢 -43.3 kB 🟢 -36.2 kB
assets/core-BJmDOa2U.js (new) 180 kB 🔴 +180 kB 🔴 +43.3 kB 🔴 +36.2 kB
assets/WidgetSelect-CQuotY6x.js (new) 52.2 kB 🔴 +52.2 kB 🔴 +11.5 kB 🔴 +10 kB
assets/WidgetSelect-D1eH4a0u.js (removed) 52.2 kB 🟢 -52.2 kB 🟢 -11.5 kB 🟢 -10 kB
assets/Load3DControls-B5wm8_24.js (new) 35.9 kB 🔴 +35.9 kB 🔴 +5.87 kB 🔴 +5.08 kB
assets/Load3DControls-XGz6NS-i.js (removed) 35.9 kB 🟢 -35.9 kB 🟢 -5.87 kB 🟢 -5.08 kB
assets/SubscriptionRequiredDialogContent-DDVijZ38.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.78 kB 🔴 +5.91 kB
assets/SubscriptionRequiredDialogContent-Dx6TlYGb.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.79 kB 🟢 -5.91 kB
assets/CurrentUserPopoverWorkspace-B1ESAw_6.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -4.99 kB 🟢 -4.42 kB
assets/CurrentUserPopoverWorkspace-BPNavGUT.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +4.99 kB 🔴 +4.43 kB
assets/Load3D-D0vMnzVO.js (new) 19.2 kB 🔴 +19.2 kB 🔴 +4.37 kB 🔴 +3.84 kB
assets/Load3D-DnSYPh6f.js (removed) 19.2 kB 🟢 -19.2 kB 🟢 -4.37 kB 🟢 -3.85 kB
assets/WidgetInputNumber-BgybV_3w.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.53 kB 🟢 -4.02 kB
assets/WidgetInputNumber-mUgiEW5X.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.53 kB 🔴 +4.03 kB
assets/WidgetRecordAudio-B65nB-Q6.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.97 kB 🟢 -4.43 kB
assets/WidgetRecordAudio-UVsQG1I7.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.97 kB 🔴 +4.44 kB
assets/SubscriptionPanelContentWorkspace-CLcJ6p9-.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.47 kB 🟢 -3.9 kB
assets/SubscriptionPanelContentWorkspace-rgO-MgUl.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.47 kB 🔴 +3.9 kB
assets/WidgetImageCrop-CbLxxpv0.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.63 kB
assets/WidgetImageCrop-DFZLiJLF.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.14 kB 🔴 +3.63 kB
assets/PanelTemplate-DCV9TqAV.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.46 kB 🟢 -4.8 kB
assets/PanelTemplate-exsyhn__.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.8 kB
assets/AudioPreviewPlayer--JfhwJbw.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.97 kB 🔴 +2.65 kB
assets/AudioPreviewPlayer-DKSijW1v.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.98 kB 🟢 -2.65 kB
assets/InviteMemberDialogContent-BDyNF8hV.js (new) 8.36 kB 🔴 +8.36 kB 🔴 +2.51 kB 🔴 +2.17 kB
assets/InviteMemberDialogContent-mnYtOwjD.js (removed) 8.36 kB 🟢 -8.36 kB 🟢 -2.5 kB 🟢 -2.17 kB
assets/WidgetWithControl-BbmICMNV.js (removed) 8.07 kB 🟢 -8.07 kB 🟢 -2.68 kB 🟢 -2.41 kB
assets/WidgetWithControl-DlMPVyAN.js (new) 8.07 kB 🔴 +8.07 kB 🔴 +2.68 kB 🔴 +2.42 kB
assets/CreateWorkspaceDialogContent-B-zgW6XQ.js (new) 5.93 kB 🔴 +5.93 kB 🔴 +1.93 kB 🔴 +1.68 kB
assets/CreateWorkspaceDialogContent-D-h0R6KO.js (removed) 5.93 kB 🟢 -5.93 kB 🟢 -1.93 kB 🟢 -1.68 kB
assets/EditWorkspaceDialogContent-BI3F8fJs.js (removed) 5.7 kB 🟢 -5.7 kB 🟢 -1.88 kB 🟢 -1.64 kB
assets/EditWorkspaceDialogContent-Cm7UVX5x.js (new) 5.7 kB 🔴 +5.7 kB 🔴 +1.88 kB 🔴 +1.64 kB
assets/ValueControlPopover-Be0FfQ4s.js (removed) 5.17 kB 🟢 -5.17 kB 🟢 -1.68 kB 🟢 -1.49 kB
assets/ValueControlPopover-BirVX9Uw.js (new) 5.17 kB 🔴 +5.17 kB 🔴 +1.68 kB 🔴 +1.5 kB
assets/DeleteWorkspaceDialogContent-Be7pTQ7Z.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.56 kB 🔴 +1.35 kB
assets/DeleteWorkspaceDialogContent-CBG1qsbk.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.56 kB 🟢 -1.35 kB
assets/LeaveWorkspaceDialogContent-CWOO6jpb.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.5 kB 🟢 -1.31 kB
assets/LeaveWorkspaceDialogContent-KZ8E6G1k.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.5 kB 🔴 +1.31 kB
assets/RemoveMemberDialogContent-679OSiFt.js (removed) 4.38 kB 🟢 -4.38 kB 🟢 -1.46 kB 🟢 -1.27 kB
assets/RemoveMemberDialogContent-Cmv_w8s3.js (new) 4.38 kB 🔴 +4.38 kB 🔴 +1.45 kB 🔴 +1.27 kB
assets/RevokeInviteDialogContent-CIFb45pW.js (removed) 4.29 kB 🟢 -4.29 kB 🟢 -1.47 kB 🟢 -1.29 kB
assets/RevokeInviteDialogContent-DHw1CORo.js (new) 4.29 kB 🔴 +4.29 kB 🔴 +1.47 kB 🔴 +1.29 kB
assets/GlobalToast-BO_hO5Z7.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -944 B
assets/GlobalToast-DAmx6hv-.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +948 B
assets/SubscribeToRun-ePJMYJ0N.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.16 kB 🟢 -1.01 kB
assets/SubscribeToRun-mNh6dy5K.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.15 kB 🔴 +1.01 kB
assets/cloudSessionCookie-21zw5-7V.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -933 B 🟢 -802 B
assets/cloudSessionCookie-ByVCdLGk.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +930 B 🔴 +799 B
assets/BaseViewTemplate-COh2ik87.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -937 B
assets/BaseViewTemplate-t5mV4aBO.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +938 B
assets/CloudRunButtonWrapper-D8ZoHILy.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +647 B 🔴 +605 B
assets/CloudRunButtonWrapper-YwaQwIDV.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -646 B 🟢 -565 B
assets/cloudBadges-CYCida5c.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +536 B 🔴 +500 B
assets/cloudBadges-Xr_xyr7M.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -536 B 🟢 -480 B
assets/graphHasMissingNodes-B4YDrBYw.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +461 B 🔴 +410 B
assets/graphHasMissingNodes-DYu8Kr8j.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -462 B 🟢 -415 B
assets/cloudSubscription-DuXSC9xR.js (removed) 976 B 🟢 -976 B 🟢 -466 B 🟢 -403 B
assets/cloudSubscription-HWoFveQK.js (new) 976 B 🔴 +976 B 🔴 +466 B 🔴 +402 B
assets/nightlyBadges-B0qZstsr.js (removed) 595 B 🟢 -595 B 🟢 -355 B 🟢 -308 B
assets/nightlyBadges-DYQtj8At.js (new) 595 B 🔴 +595 B 🔴 +355 B 🔴 +309 B
assets/SubscriptionPanelContentWorkspace-DLiwu_hb.js (new) 266 B 🔴 +266 B 🔴 +136 B 🔴 +124 B
assets/SubscriptionPanelContentWorkspace-XpfhxKzP.js (removed) 266 B 🟢 -266 B 🟢 -136 B 🟢 -119 B
assets/WidgetInputNumber-BG4U_5uz.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -111 B
assets/WidgetInputNumber-CmUfq7lh.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +119 B
assets/WidgetLegacy-DzT3TKrx.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +109 B
assets/WidgetLegacy-eXIyydFn.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -104 B
assets/Load3D-DT68h1jT.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +103 B
assets/Load3D-e40Iezpt.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -110 B
assets/auto-DWs2ctGL.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BEw5ErI4.js 18.5 kB 18.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BGeHkplA.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BV0l36Iz.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C_Y3D6Cn.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C6piRza5.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cf8Zq1td.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CiziP3Xs.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D1595tOr.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DXauvccL.js 20.6 kB 20.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-P5QCEfZc.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-WbYP_D61.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-BlyhGDPa.js 500 kB 500 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-byadgsvD.js 188 B 188 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-DHwPdKGO.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BHtk4Fg_.js 174 kB 174 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BMSlgLcp.js 155 kB 155 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BQCWi9e4.js 112 kB 112 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CJicmTR7.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CNOkBy-u.js 126 kB 126 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CySb1R5_.js 151 kB 151 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D0g10ZKf.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DMUPIFMF.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DpsGU4si.js 126 kB 126 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dz6IPJXM.js 144 kB 144 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-lrEzMywH.js 128 kB 128 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-DUmUhXD6.js 2.38 kB 2.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-CD66_Mw_.js 2 kB 2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-Bqe7yvm_.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-De3MzVmp.js 2.82 kB 2.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-CC2-PIpB.js 143 B 143 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-A7pvB7zM.js 370 kB 370 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BIVjUijC.js 345 kB 345 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Chkn0HaI.js 343 kB 343 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CK_6GHao.js 452 kB 452 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CToVAwnT.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DDabdWgx.js 417 kB 417 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DgvJyE3d.js 386 kB 386 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DjxaeFt_.js 416 kB 416 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DslnWEGg.js 377 kB 377 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-EPAM3kwk.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-NrulhNyH.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-CmezY7As.js 838 B 838 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-cVp-94Rc.js 1.96 kB 1.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-D4lsf6Ob.js 4.21 kB 4.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-BJiJuR5i.js 518 B 518 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-CUtab2CB.js 4.71 kB 4.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-D79nBMxa.js 186 B 186 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-CiXfBVBH.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-BxNqMlFv.js 3.71 kB 3.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-DDD96zwa.js 4.57 kB 4.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-A6pZMGtc.js 3.79 kB 3.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-DSMUKRnt.js 2.58 kB 2.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-MDImyvc3.js 2.7 kB 2.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-a8bZhyc5.js 3.49 kB 3.49 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-ERx8czR8.js 1.31 kB 1.31 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-CV3BoahN.js 3.87 kB 3.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-ZdaYkxkD.js 3.26 kB 3.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-KPj-zM0O.js 573 B 573 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 34 added / 34 removed

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.

I think the auth changes is leaking from a different PR?

I was aware that this was a problem, but expected fixing it to be really involved. Happy to see a simple fix for it.

@christian-byrne christian-byrne merged commit ee4a205 into main Jan 30, 2026
32 checks passed
@christian-byrne christian-byrne deleted the fix/api-key-auth-create-customer branch January 30, 2026 03:47
snomiao pushed a commit that referenced this pull request Jan 30, 2026
…#8469)

## Summary

Fixes a bug where socket map data was not properly removed when sockets
are dynamically added/removed via DynamicCombo widgets in Vue mode
(Nodes 2.0).

## Problem

When DynamicCombo widgets (e.g., `should_remesh` on Meshy nodes) change
their selection, inputs are dynamically added/removed. The Vue `v-for`
loop in `NodeSlots.vue` was using array index as the `:key`, causing Vue
to **reuse** slot components instead of properly unmounting them.

This led to:
- Socket map entries leaking (never cleaned up)
- Socket positions becoming desynced
- Stale cached offset data

## Solution

1. **Use slot `name` as Vue key** instead of array index in
`NodeSlots.vue`
   - Slot names are unique per node (enforced by ComfyUI backend)
- When a slot is removed, Vue sees the key disappear and properly
unmounts the component
- `onUnmounted` cleanup in `useSlotElementTracking` now runs correctly

2. **Add defensive cleanup** in `useSlotElementTracking.ts`
- Before registering a new slot, check if a stale entry exists with the
same key
   - Clean up stale entry to handle any edge cases

## Related

- Fixes COM-12970
- Related to #7837 (fixed LiteGraph version of this bug, but not Vue
mode)

## Testing

- Quality checks pass (typecheck, lint, format)
- Manual testing with DynamicCombo nodes (Meshy, nodes_logic)
recommended

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8469-fix-Vue-mode-socket-map-data-not-cleaned-up-on-dynamic-input-changes-2f86d73d365081e599eadca4f15e6b6e)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Subagent 5 <subagent@example.com>
Co-authored-by: Amp <amp@ampcode.com>
DrJKL pushed a commit that referenced this pull request Jan 31, 2026
…#8469)

## Summary

Fixes a bug where socket map data was not properly removed when sockets
are dynamically added/removed via DynamicCombo widgets in Vue mode
(Nodes 2.0).

## Problem

When DynamicCombo widgets (e.g., `should_remesh` on Meshy nodes) change
their selection, inputs are dynamically added/removed. The Vue `v-for`
loop in `NodeSlots.vue` was using array index as the `:key`, causing Vue
to **reuse** slot components instead of properly unmounting them.

This led to:
- Socket map entries leaking (never cleaned up)
- Socket positions becoming desynced
- Stale cached offset data

## Solution

1. **Use slot `name` as Vue key** instead of array index in
`NodeSlots.vue`
   - Slot names are unique per node (enforced by ComfyUI backend)
- When a slot is removed, Vue sees the key disappear and properly
unmounts the component
- `onUnmounted` cleanup in `useSlotElementTracking` now runs correctly

2. **Add defensive cleanup** in `useSlotElementTracking.ts`
- Before registering a new slot, check if a stale entry exists with the
same key
   - Clean up stale entry to handle any edge cases

## Related

- Fixes COM-12970
- Related to #7837 (fixed LiteGraph version of this bug, but not Vue
mode)

## Testing

- Quality checks pass (typecheck, lint, format)
- Manual testing with DynamicCombo nodes (Meshy, nodes_logic)
recommended

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8469-fix-Vue-mode-socket-map-data-not-cleaned-up-on-dynamic-input-changes-2f86d73d365081e599eadca4f15e6b6e)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Subagent 5 <subagent@example.com>
Co-authored-by: Amp <amp@ampcode.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S This PR changes 10-29 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants