Skip to content

Fix vue node slot position calculation#7877

Merged
christian-byrne merged 5 commits intomainfrom
pysssss/fix-link-position-calc
Jan 14, 2026
Merged

Fix vue node slot position calculation#7877
christian-byrne merged 5 commits intomainfrom
pysssss/fix-link-position-calc

Conversation

@pythongosssss
Copy link
Member

@pythongosssss pythongosssss commented Jan 7, 2026

Summary

Fix slot position for Vue nodes using LiteGraph calculation

Fixes #7446

Changes

  • Updated getInput/OutputPos to call getSlotPosition which handles positions for both LiteGraph & Vue nodes correctly
  • Add regression test

┆Issue is synchronized with this Notion page by Unito

@pythongosssss pythongosssss requested a review from a team as a code owner January 7, 2026 11:18
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jan 7, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 7, 2026

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (2)
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png is excluded by !**/*.png

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

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

📝 Walkthrough

Walkthrough

Refactors slot-position computation to centralize via getSlotPosition and gate Vue-specific logic behind LiteGraph.vueNodesMode; reduces exported slot helpers. Adds test helpers (waitForGraphNodes, enterSubgraph) and an E2E test that drills into subgraphs and verifies slot linking behavior.

Changes

Cohort / File(s) Summary
Slot Calculation & Node Pos
src/lib/litegraph/src/LGraphNode.ts, src/renderer/core/canvas/litegraph/slotCalculations.ts
LGraphNode now delegates input/output position lookups to getSlotPosition. calculateInputSlotPos / calculateOutputSlotPos are no longer exported; getSlotPosition conditionally uses DOM/layout logic when LiteGraph.vueNodesMode is enabled, otherwise falls back to legacy calculations.
Test Fixture: ComfyPage
browser_tests/fixtures/ComfyPage.ts
Added LGraph type import, new waitForGraphNodes(count: number) helper, and extended getNodeRefsByType(type: string, includeSubgraph: boolean = false) to read from window['app'].canvas.graph when includeSubgraph is true.
Test Fixture: VueNodeHelpers
browser_tests/fixtures/VueNodeHelpers.ts
Added async enterSubgraph(nodeId?: string): Promise<void> to click data-testid="subgraph-enter-button" for a node or page-level entry.
End-to-end Test
browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
Added E2E test "Dragging from subgraph input connects to correct slot" (duplicated) that creates a subgraph, enters it, computes DOM slot positions, performs a drag from subgraph input to an internal node slot, and asserts link counts.

Sequence Diagram

sequenceDiagram
    participant Test as E2E Test
    participant ComfyPage as ComfyPage Fixture
    participant VueHelpers as VueNodeHelpers Fixture
    participant App as window['app'] / Canvas Graph
    participant DOM as Browser DOM

    Test->>ComfyPage: create blank workflow & add node
    Test->>ComfyPage: convert node -> subgraph
    Test->>VueHelpers: enterSubgraph(nodeId?)
    VueHelpers->>DOM: click subgraph-enter-button
    Test->>ComfyPage: waitForGraphNodes(count)
    ComfyPage->>App: query `canvas.graph` (includeSubgraph=true)
    App-->>ComfyPage: return node refs
    Test->>DOM: query slot elements for coordinates
    DOM-->>Test: return slot positions
    Test->>DOM: simulate drag from subgraph input -> target slot
    DOM->>App: drop triggers connection creation
    App-->>Test: report link counts on target/other slots
Loading

Possibly related PRs

Suggested reviewers

  • simula-r
  • AustinMroz
🚥 Pre-merge checks | ✅ 2
✅ Passed checks (2 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The pull request correctly addresses issue #7446 by fixing slot position calculation for Vue nodes through refactored getInputPos/getOutputPos methods and adding a regression test.
Out of Scope Changes check ✅ Passed All changes are directly aligned with fixing the subgraph socket joining bug. Helper methods (waitForGraphNodes, enterSubgraph) and test updates support the core fix.

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


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

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/14/2026, 02:03:41 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 7, 2026

🎭 Playwright Tests: ❌ Failed

Results: 499 passed, 2 failed, 2 flaky, 8 skipped (Total: 511)

❌ Failed Tests

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

@github-actions
Copy link

github-actions bot commented Jan 7, 2026

Bundle Size Report

Summary

  • Raw size: 19.4 MB baseline 19.4 MB — 🔴 +8 B
  • Gzip: 3.96 MB baseline 3.96 MB — 🟢 -23 B
  • Brotli: 3.02 MB baseline 3.02 MB — 🟢 -62 B
  • Bundles: 98 current • 98 baseline • 38 added / 38 removed

Category Glance
App Entry Points 🔴 +8 B (3.32 MB) · Vendor & Third-Party ⚪ 0 B (9.19 MB) · Other ⚪ 0 B (5.25 MB) · Graph Workspace ⚪ 0 B (1.04 MB) · Panels & Settings ⚪ 0 B (372 kB) · UI Components ⚪ 0 B (206 kB) · + 3 more

Per-category breakdown
App Entry Points — 3.32 MB (baseline 3.32 MB) • 🔴 +8 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-DHpfVE8o.js (new) 3.12 MB 🔴 +3.12 MB 🔴 +654 kB 🔴 +496 kB
assets/index-1QWEWpzz.js (removed) 3.12 MB 🟢 -3.12 MB 🟢 -654 kB 🟢 -496 kB
assets/index-B_pusviz.js (new) 200 kB 🔴 +200 kB 🔴 +44 kB 🔴 +36.4 kB
assets/index-D92bltYK.js (removed) 200 kB 🟢 -200 kB 🟢 -44 kB 🟢 -36.4 kB
assets/index-CzZX0ppS.js (new) 345 B 🔴 +345 B 🔴 +245 B 🔴 +233 B
assets/index-u_elh3lE.js (removed) 345 B 🟢 -345 B 🟢 -244 B 🟢 -231 B

Status: 3 added / 3 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-C0vHNC3E.js (new) 1.04 MB 🔴 +1.04 MB 🔴 +200 kB 🔴 +152 kB
assets/GraphView-D9BktKbq.js (removed) 1.04 MB 🟢 -1.04 MB 🟢 -200 kB 🟢 -152 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/UserSelectView-BIeyjCly.js (removed) 6.63 kB 🟢 -6.63 kB 🟢 -2.14 kB 🟢 -1.9 kB
assets/UserSelectView-Y5BimpVr.js (new) 6.63 kB 🔴 +6.63 kB 🔴 +2.14 kB 🔴 +1.89 kB

Status: 1 added / 1 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/LegacyCreditsPanel-BewMpGCt.js (removed) 25.1 kB 🟢 -25.1 kB 🟢 -5.74 kB 🟢 -5 kB
assets/LegacyCreditsPanel-Cw-_hOiR.js (new) 25.1 kB 🔴 +25.1 kB 🔴 +5.74 kB 🔴 +5 kB
assets/KeybindingPanel-6-yEmqmx.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +3.57 kB 🔴 +3.12 kB
assets/KeybindingPanel-th-bzp9H.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -3.57 kB 🟢 -3.13 kB
assets/ExtensionPanel-CmAFtmiN.js (new) 11.1 kB 🔴 +11.1 kB 🔴 +2.62 kB 🔴 +2.3 kB
assets/ExtensionPanel-ETe8fPeY.js (removed) 11.1 kB 🟢 -11.1 kB 🟢 -2.62 kB 🟢 -2.3 kB
assets/AboutPanel-D-POkan7.js (new) 9.16 kB 🔴 +9.16 kB 🔴 +2.46 kB 🔴 +2.2 kB
assets/AboutPanel-qYMIuONR.js (removed) 9.16 kB 🟢 -9.16 kB 🟢 -2.46 kB 🟢 -2.2 kB
assets/ServerConfigPanel-BIoGKod1.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -2.04 kB 🟢 -1.8 kB
assets/ServerConfigPanel-BvpUzsOo.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +2.04 kB 🔴 +1.8 kB
assets/UserPanel-BuCpUMjT.js (new) 6.88 kB 🔴 +6.88 kB 🔴 +1.79 kB 🔴 +1.56 kB
assets/UserPanel-PRt1AitG.js (removed) 6.88 kB 🟢 -6.88 kB 🟢 -1.79 kB 🟢 -1.56 kB
assets/settings-BGQfQzTx.js 25.6 kB 25.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BVE4KHTw.js 22.7 kB 22.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BVtpJmlU.js 30.9 kB 30.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C2aO00Dz.js 28.6 kB 28.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cm3ieBXR.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CzQKMdK3.js 26.2 kB 26.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CzYUIUnL.js 27.1 kB 27.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DwKpL7jw.js 26.3 kB 26.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DX8feV4n.js 25.3 kB 25.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-mWzYycGc.js 22 kB 22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-U4AdZ8Rl.js 34.9 kB 34.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/LazyImage.vue_vue_type_script_setup_true_lang-c58X3QsB.js (removed) 65.6 kB 🟢 -65.6 kB 🟢 -13.3 kB 🟢 -11.5 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-V0o1I3XR.js (new) 65.6 kB 🔴 +65.6 kB 🔴 +13.3 kB 🔴 +11.5 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-BFeQz_Yg.js (removed) 56.4 kB 🟢 -56.4 kB 🟢 -8.78 kB 🟢 -7.53 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-CUU3eyDN.js (new) 56.4 kB 🔴 +56.4 kB 🔴 +8.78 kB 🔴 +7.54 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-5W_16_9D.js (new) 49.3 kB 🔴 +49.3 kB 🔴 +10.6 kB 🔴 +9.22 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-CIAG_ZDd.js (removed) 49.3 kB 🟢 -49.3 kB 🟢 -10.6 kB 🟢 -9.23 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-BKI2vpK1.js (removed) 16.4 kB 🟢 -16.4 kB 🟢 -4.11 kB 🟢 -3.64 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-BnAwj6CJ.js (new) 16.4 kB 🔴 +16.4 kB 🔴 +4.11 kB 🔴 +3.64 kB
assets/ComfyQueueButton-bWXdTIgD.js (new) 8.83 kB 🔴 +8.83 kB 🔴 +2.58 kB 🔴 +2.28 kB
assets/ComfyQueueButton-CuNCiFZ6.js (removed) 8.83 kB 🟢 -8.83 kB 🟢 -2.58 kB 🟢 -2.29 kB
assets/WidgetWithControl.vue_vue_type_script_setup_true_lang-BAHCvfB7.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.45 kB 🟢 -1.31 kB
assets/WidgetWithControl.vue_vue_type_script_setup_true_lang-Di4tYJcD.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.45 kB 🔴 +1.31 kB
assets/WidgetButton-B8lL2oLV.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +996 B 🔴 +898 B
assets/WidgetButton-KlGW-fMv.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -997 B 🟢 -869 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-Cx1eIyA0.js (removed) 2.14 kB 🟢 -2.14 kB 🟢 -891 B 🟢 -771 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-DHfgIuFw.js (new) 2.14 kB 🔴 +2.14 kB 🔴 +891 B 🔴 +771 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-DS6yz7Mt.js 1.34 kB 1.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

Data & Services — 12.5 kB (baseline 12.5 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/keybindingService-DkrxZ6kw.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +1.83 kB 🔴 +1.58 kB
assets/keybindingService-OPvluZ0_.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -1.83 kB 🟢 -1.57 kB
assets/audioService-BimKx964.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +964 B 🔴 +831 B
assets/audioService-CDGPZkRA.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -965 B 🟢 -829 B
assets/serverConfigStore-z-_mv47O.js 2.83 kB 2.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 2 added / 2 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioUtils-D24g8fGk.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -653 B 🟢 -548 B
assets/audioUtils-Dx2Atlh_.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +650 B 🔴 +548 B

Status: 1 added / 1 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-CHD-A8ap.js 452 kB 452 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-4NwCOJkF.js 3.9 MB 3.9 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-DdfJwUvW.js 1.95 MB 1.95 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-D_z6a8X7.js 2.08 MB 2.08 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-MtVt4yJr.js 232 kB 232 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-Bsgza-bH.js 160 kB 160 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BF8peZ5_.js 420 kB 420 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 5.25 MB (baseline 5.25 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SubscriptionRequiredDialogContent-Be4hEoSs.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.51 kB 🟢 -5.67 kB
assets/SubscriptionRequiredDialogContent-CD_SQvI5.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.51 kB 🔴 +5.65 kB
assets/WidgetRecordAudio-BDfHf0lm.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -5.24 kB 🟢 -4.63 kB
assets/WidgetRecordAudio-CB1A-2Ih.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +5.23 kB 🔴 +4.62 kB
assets/AudioPreviewPlayer-DgSdvYZB.js (removed) 13.3 kB 🟢 -13.3 kB 🟢 -3.35 kB 🟢 -2.99 kB
assets/AudioPreviewPlayer-s8JNUZ8A.js (new) 13.3 kB 🔴 +13.3 kB 🔴 +3.35 kB 🔴 +2.99 kB
assets/ValueControlPopover-CwC8Jc6j.js (new) 5.49 kB 🔴 +5.49 kB 🔴 +1.71 kB 🔴 +1.51 kB
assets/ValueControlPopover-CyW1HSzT.js (removed) 5.49 kB 🟢 -5.49 kB 🟢 -1.71 kB 🟢 -1.51 kB
assets/WidgetGalleria-BJjKQJVi.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.45 kB 🔴 +1.3 kB
assets/WidgetGalleria-Cj8-qIXL.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.45 kB 🟢 -1.3 kB
assets/WidgetColorPicker-BwtJVct1.js (removed) 3.41 kB 🟢 -3.41 kB 🟢 -1.38 kB 🟢 -1.23 kB
assets/WidgetColorPicker-C3nOODi8.js (new) 3.41 kB 🔴 +3.41 kB 🔴 +1.38 kB 🔴 +1.23 kB
assets/WidgetTextarea--abzC5tz.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.21 kB 🔴 +1.08 kB
assets/WidgetTextarea-BV_XiheF.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.21 kB 🟢 -1.07 kB
assets/WidgetMarkdown-BF_7H-Y6.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.28 kB 🟢 -1.13 kB
assets/WidgetMarkdown-BYKQWxJm.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.28 kB 🔴 +1.13 kB
assets/WidgetAudioUI-BstT7Q3h.js (new) 2.89 kB 🔴 +2.89 kB 🔴 +1.17 kB 🔴 +1.05 kB
assets/WidgetAudioUI-CpdIo21i.js (removed) 2.89 kB 🟢 -2.89 kB 🟢 -1.17 kB 🟢 -1.06 kB
assets/WidgetToggleSwitch-BoV0G5X9.js (new) 2.66 kB 🔴 +2.66 kB 🔴 +1.13 kB 🔴 +1.02 kB
assets/WidgetToggleSwitch-cPImkd3v.js (removed) 2.66 kB 🟢 -2.66 kB 🟢 -1.13 kB 🟢 -1.02 kB
assets/WidgetInputText-klae3h0u.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +920 B 🔴 +847 B
assets/WidgetInputText-zTBzWZjQ.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -920 B 🟢 -858 B
assets/Media3DTop-ByPr_Bo-.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +766 B 🔴 +653 B
assets/Media3DTop-Dhej8Z0R.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -768 B 🟢 -654 B
assets/WidgetSelect-CDlAMcEU.js (removed) 733 B 🟢 -733 B 🟢 -362 B 🟢 -335 B
assets/WidgetSelect-H7G2QjgJ.js (new) 733 B 🔴 +733 B 🔴 +363 B 🔴 +319 B
assets/WidgetInputNumber-D3pFyqLS.js (removed) 673 B 🟢 -673 B 🟢 -349 B 🟢 -297 B
assets/WidgetInputNumber-DStBlOsc.js (new) 673 B 🔴 +673 B 🔴 +346 B 🔴 +297 B
assets/Load3D-DnxW1GyK.js (removed) 424 B 🟢 -424 B 🟢 -268 B 🟢 -223 B
assets/Load3D-QRnN1msh.js (new) 424 B 🔴 +424 B 🔴 +268 B 🔴 +223 B
assets/WidgetLegacy-BUUowlTJ.js (new) 364 B 🔴 +364 B 🔴 +237 B 🔴 +194 B
assets/WidgetLegacy-D6NiyyCM.js (removed) 364 B 🟢 -364 B 🟢 -238 B 🟢 -195 B
assets/commands-B32ZbeYu.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B7wQT83I.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BK3JVjMG.js 15.7 kB 15.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C6twMpaZ.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CDUWpEwM.js 18.3 kB 18.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CfZ6FPZ-.js 15.7 kB 15.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-COIPP_pv.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CoPn_77e.js 14.7 kB 14.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CuRNS4XD.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DBHjCSPA.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DZJaRLKH.js 15.7 kB 15.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-8eC7XcBf.js 95 kB 95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BpcYE6Bq.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BRhbiQsB.js 129 kB 129 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BrWdnTiG.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C-cUNbuc.js 123 kB 123 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CGe0e9vH.js 106 kB 106 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cv9Dlj-b.js 107 kB 107 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CzsdJqwO.js 94.3 kB 94.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dbu4m_fl.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DwAX_AEJ.js 149 kB 149 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-kiVYDd2_.js 110 kB 110 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-DRarQv68.js 1.46 kB 1.46 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-1u1HkF_1.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-Hl-p7bVp.js 2.65 kB 2.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B-XzzBeS.js 317 kB 317 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BGwoeek4.js 329 kB 329 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C6xl5-mL.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CRZGOJB7.js 310 kB 310 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D8-Yzlzh.js 289 kB 289 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Du8VrAwA.js 320 kB 320 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-jjlLVrIs.js 317 kB 317 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-JQwk1kgy.js 292 kB 292 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-JuuXdMpv.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-l2Y20bod.js 314 kB 314 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-VLMdhOwo.js 357 kB 357 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-l6myVx6f.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-DVtMT9qP.js 3.21 kB 3.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 16 added / 16 removed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 11f8cdb and ce56e00.

📒 Files selected for processing (5)
  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/fixtures/VueNodeHelpers.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
🧰 Additional context used
📓 Path-based instructions (11)
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,vue}: Use TypeScript exclusively; do not write new JavaScript code
Use sorted and grouped imports organized by plugin/source
Enforce ESLint rules including Vue + TypeScript rules, disallow floating promises, disallow unused imports, and restrict i18n raw text in templates
Do not use any type or as any type assertions; fix the underlying type issue instead
Write code that is expressive and self-documenting; avoid redundant comments and clean as you go
Keep functions short and functional; minimize nesting and follow the arrow anti-pattern
Avoid mutable state; prefer immutability and assignment at point of declaration
Use function declarations instead of function expressions when possible
Use es-toolkit for utility functions
Implement proper error handling in code

Files:

  • browser_tests/fixtures/VueNodeHelpers.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
**/*.{ts,tsx,vue,js,jsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Apply Prettier formatting with 2-space indentation, single quotes, no trailing semicolons, and 80-character line width

Files:

  • browser_tests/fixtures/VueNodeHelpers.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Minimize the surface area (exported values) of each module and composable

Files:

  • browser_tests/fixtures/VueNodeHelpers.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
src/**/*.ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.ts: Use es-toolkit for utility functions
Use TypeScript for type safety

Files:

  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
src/lib/litegraph/**/*.{js,ts,jsx,tsx}

📄 CodeRabbit inference engine (src/lib/litegraph/CLAUDE.md)

src/lib/litegraph/**/*.{js,ts,jsx,tsx}: Run ESLint instead of manually figuring out whitespace fixes or other trivial style concerns using the pnpm lint:fix command
Take advantage of TypedArray subarray when appropriate
The size and pos properties of Rectangle share the same array buffer (subarray); they may be used to set the rectangle's size and position
Prefer single line if syntax over adding curly braces, when the statement has a very concise expression and concise, single line statement
Do not replace &&= or ||= with = when there is no reason to do so. If you do find a reason to remove either &&= or ||=, leave a comment explaining why the removal occurred
When writing methods, prefer returning idiomatic JavaScript undefined over null

Files:

  • src/lib/litegraph/src/LGraphNode.ts
src/lib/litegraph/**/*.{ts,tsx}

📄 CodeRabbit inference engine (src/lib/litegraph/CLAUDE.md)

Type assertions are an absolute last resort. In almost all cases, they are a crutch that leads to brittle code

Files:

  • src/lib/litegraph/src/LGraphNode.ts
browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (browser_tests/CLAUDE.md)

browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}: Test user workflows in browser tests
Use Playwright fixtures for browser tests
Follow naming conventions for browser tests
Check assets/ directory for test data when writing tests
Prefer specific selectors in browser tests
Test across multiple viewports

Files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
browser_tests/**/*.spec.ts

📄 CodeRabbit inference engine (AGENTS.md)

browser_tests/**/*.spec.ts: Use E2E tests in browser_tests/**/*.spec.ts with Playwright framework
Do not use waitForTimeout in Playwright tests; use Locator actions and retrying assertions instead
Use tags like @mobile and @2x in Playwright tests for relevant test variations; tags are respected by config

Files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
🧠 Learnings (19)
📓 Common learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • browser_tests/fixtures/VueNodeHelpers.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-09T03:39:54.501Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7169
File: src/platform/remote/comfyui/jobs/jobTypes.ts:1-107
Timestamp: 2025-12-09T03:39:54.501Z
Learning: In the ComfyUI_frontend project, Zod is on v3.x. Do not suggest Zod v4 standalone validators (z.uuid, z.ulid, z.cuid2, z.nanoid) until an upgrade to Zod 4 is performed. When reviewing TypeScript files (e.g., src/platform/remote/comfyui/jobs/jobTypes.ts) validate against Zod 3 capabilities and avoid introducing v4-specific features; flag any proposal to upgrade or incorporate v4-only validators and propose staying with compatible 3.x patterns.

Applied to files:

  • browser_tests/fixtures/VueNodeHelpers.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-13T11:03:11.264Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7416
File: src/stores/imagePreviewStore.ts:5-7
Timestamp: 2025-12-13T11:03:11.264Z
Learning: In the ComfyUI_frontend repository, lint rules require keeping 'import type' statements separate from non-type imports, even if importing from the same module. Do not suggest consolidating them into a single import statement. Ensure type imports remain on their own line (import type { ... } from 'module') and regular imports stay on separate lines.

Applied to files:

  • browser_tests/fixtures/VueNodeHelpers.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-17T00:40:09.635Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7537
File: src/components/ui/button/Button.stories.ts:45-55
Timestamp: 2025-12-17T00:40:09.635Z
Learning: Prefer pure function declarations over function expressions (e.g., use function foo() { ... } instead of const foo = () => { ... }) for pure functions in the repository. Function declarations are more functional-leaning, offer better hoisting clarity, and can improve readability and tooling consistency. Apply this guideline across TypeScript files in Comfy-Org/ComfyUI_frontend, including story and UI component code, except where a function expression is semantically required (e.g., callbacks, higher-order functions with closures).

Applied to files:

  • browser_tests/fixtures/VueNodeHelpers.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-30T22:22:33.836Z
Learnt from: kaili-yang
Repo: Comfy-Org/ComfyUI_frontend PR: 7805
File: src/composables/useCoreCommands.ts:439-439
Timestamp: 2025-12-30T22:22:33.836Z
Learning: When accessing reactive properties from Pinia stores in TypeScript files, avoid using .value on direct property access (e.g., useStore().isOverlayExpanded). Pinia auto-wraps refs when accessed directly, returning the primitive value. The .value accessor is only needed when destructuring store properties or when using storeToRefs().

Applied to files:

  • browser_tests/fixtures/VueNodeHelpers.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-11T12:25:15.470Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7358
File: src/components/dialog/content/signin/SignUpForm.vue:45-54
Timestamp: 2025-12-11T12:25:15.470Z
Learning: This repository uses CI automation to format code (pnpm format). Do not include manual formatting suggestions in code reviews for Comfy-Org/ComfyUI_frontend. If formatting issues are detected, rely on the CI formatter or re-run pnpm format. Focus reviews on correctness, readability, performance, accessibility, and maintainability rather than style formatting.

Applied to files:

  • browser_tests/fixtures/VueNodeHelpers.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : The `size` and `pos` properties of `Rectangle` share the same array buffer (`subarray`); they may be used to set the rectangle's size and position

Applied to files:

  • src/lib/litegraph/src/LGraphNode.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues

Applied to files:

  • src/lib/litegraph/src/LGraphNode.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-12-21T06:04:12.562Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-21T06:04:12.562Z
Learning: Applies to **/*.{ts,tsx} : Minimize the surface area (exported values) of each module and composable

Applied to files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Do not replace `&&=` or `||=` with `=` when there is no reason to do so. If you do find a reason to remove either `&&=` or `||=`, leave a comment explaining why the removal occurred

Applied to files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{js,ts,jsx,tsx} : When adding features, always write vitest unit tests using cursor rules in @.cursor

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-13T05:54:35.779Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7415
File: browser_tests/tests/mobileBaseline.spec.ts:17-22
Timestamp: 2025-12-13T05:54:35.779Z
Learning: In browser_tests tests for the Comfy-Org/ComfyUI_frontend repository, the `comfyPage.loadWorkflow()` method already handles all necessary synchronization and waiting. No additional `await comfyPage.nextFrame()` call is needed before taking screenshots after loading a workflow.

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Take advantage of `TypedArray` `subarray` when appropriate

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{ts,tsx} : Type assertions are an absolute last resort. In almost all cases, they are a crutch that leads to brittle code

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Prefer specific selectors in browser tests

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Run ESLint instead of manually figuring out whitespace fixes or other trivial style concerns using the `pnpm lint:fix` command

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Test user workflows in browser tests

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-13T05:34:15.488Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7415
File: browser_tests/tests/mobileBaseline.spec.ts:7-15
Timestamp: 2025-12-13T05:34:15.488Z
Learning: In Playwright tests for the ComfyUI frontend, the toPass() assertion uses incremental backoff during retries. When a test may involve async operations, increasing the timeout (e.g., to 5000 ms) can be sufficient instead of aggressively extending timeouts. Apply this understanding to tests under browser_tests/tests/; if not resolved, review the toPass() backoff behavior and ensure timeouts align with expected async completion without masking issues.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
🧬 Code graph analysis (3)
src/lib/litegraph/src/LGraphNode.ts (1)
src/renderer/core/canvas/litegraph/slotCalculations.ts (1)
  • getSlotPosition (136-189)
browser_tests/fixtures/ComfyPage.ts (3)
src/scripts/app.ts (1)
  • graph (165-167)
browser_tests/fixtures/VueNodeHelpers.ts (1)
  • nodes (14-16)
src/lib/litegraph/src/LGraphNode.ts (4)
  • LGraphNode (209-211)
  • LGraphNode (221-4193)
  • LGraphNode (743-751)
  • LGraphNode (753-759)
browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts (1)
browser_tests/helpers/fitToView.ts (1)
  • fitToViewInstant (15-104)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: test
  • GitHub Check: lint-and-format
  • GitHub Check: setup
  • GitHub Check: collect
🔇 Additional comments (4)
src/lib/litegraph/src/LGraphNode.ts (1)

3346-3348: Centralizing slot position via getSlotPosition looks correct

getInputPos / getOutputPos now delegate to the shared getSlotPosition utility, so both Vue and LiteGraph nodes use the same DOM/layout‑aware path with consistent fallbacks. Signatures are preserved and the change keeps behavior aligned with the new slot calculation pipeline.

Also applies to: 3366-3368

src/renderer/core/canvas/litegraph/slotCalculations.ts (1)

48-56: Slot calculation helpers are correctly internalized behind getSlotPosition

Making calculateInputSlotPos / calculateOutputSlotPos internal and routing external callers through getSlotPosition keeps a single public API while preserving the same collapsed/absolute/default‑stack behavior. The SlotPositionContext construction in getSlotPosition matches usage in LGraphNode, so Vue and LiteGraph paths stay consistent.

Also applies to: 96-126, 136-189

browser_tests/fixtures/ComfyPage.ts (1)

6-6: Subgraph‑aware node lookup and graph‑node wait helper look sound

waitForGraphNodes watching window['app']?.canvas.graph?.nodes?.length plus the updated getNodeRefsByType(type, includeSubgraph) that selects canvas.graph vs graph give tests a clear way to target either the active subgraph or the root graph without changing existing call sites. The use of TS‑only LGraph / LGraphNode types inside page.evaluate is safe at runtime and keeps the browser context unpolluted.

Also applies to: 1594-1619

browser_tests/fixtures/VueNodeHelpers.ts (1)

167-175: enterSubgraph helper is straightforward and matches test usage

Selecting either a specific node container or the whole page and clicking data-testid="subgraph-enter-button" cleanly encapsulates “enter subgraph” behavior for tests; no additional synchronization is strictly required here since callers already wait on layout/graph state.

@pythongosssss pythongosssss marked this pull request as draft January 7, 2026 13:21
@pythongosssss pythongosssss added the New Browser Test Expectations New browser test screenshot should be set by github action label Jan 12, 2026
@github-actions
Copy link

Updating Playwright Expectations

@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Jan 12, 2026
@pythongosssss pythongosssss marked this pull request as ready for review January 12, 2026 17:08
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts:
- Line 105: Remove the commented-out call to comfyPage.setup() on the test line
(the dead code left as "// await comfyPage.setup()") rather than leaving it
commented; if setup is no longer required because loadWorkflow or other test
helpers handle initialization, delete the commented line entirely so the test
file contains no commented-out dead code and version control preserves history
if restoration is needed.
📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ce56e00 and 521c778.

⛔ Files ignored due to path filters (2)
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png is excluded by !**/*.png
📒 Files selected for processing (2)
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
🧰 Additional context used
📓 Path-based instructions (9)
browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (browser_tests/CLAUDE.md)

browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}: Test user workflows in browser tests
Use Playwright fixtures for browser tests
Follow naming conventions for browser tests
Check assets/ directory for test data when writing tests
Prefer specific selectors in browser tests
Test across multiple viewports

Files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
browser_tests/**/*.spec.ts

📄 CodeRabbit inference engine (AGENTS.md)

browser_tests/**/*.spec.ts: E2E tests use Playwright and belong in browser_tests/**/*.spec.ts
Follow Playwright best practices for E2E testing
Do not use waitForTimeout in Playwright tests - use Locator actions and retrying assertions instead
Use tags like @mobile, @2x in Playwright tests for configuration-aware test selection

Files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
+(tests-ui|src|browser_tests)/**/*.+(test.ts|spec.ts)

📄 CodeRabbit inference engine (AGENTS.md)

+(tests-ui|src|browser_tests)/**/*.+(test.ts|spec.ts): Do not write change detector tests - avoid tests that only assert default values
Be parsimonious in testing - do not write redundant tests
Don't Mock What You Don't Own

Files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
src/**/*.ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.ts: Use es-toolkit for utility functions
Use TypeScript for type safety

src/**/*.ts: Derive component types using vue-component-type-helpers (ComponentProps, ComponentSlots) instead of separate type files
Use es-toolkit for utility functions
Minimize the surface area (exported values) of each module and composable
Favor pure functions, especially testable ones

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

src/**/*.{ts,tsx,vue}: Use separate import type statements instead of inline type in mixed imports
Apply Prettier formatting with 2-space indentation, single quotes, no trailing semicolons, 80-character width
Sort and group imports by plugin, run pnpm format before committing
Never use any type - use proper TypeScript types
Never use as any type assertions - fix the underlying type issue
Write code that is expressive and self-documenting - avoid unnecessary comments
Do not add or retain redundant comments - clean as you go
Avoid mutable state - prefer immutability and assignment at point of declaration
Watch out for Code Smells and refactor to avoid them

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
src/**/*.{ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

src/**/*.{ts,vue}: Use ref for reactive state, computed() for derived values, and watch/watchEffect for side effects in Composition API
Avoid using ref with watch if a computed would suffice - minimize refs and derived state
Use provide/inject for dependency injection only when simpler alternatives (Store or shared composable) won't work
Leverage VueUse functions for performance-enhancing composables
Use VueUse function for useI18n in composition API for string literals

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

src/**/*.{ts,tsx}: Keep functions short and functional
Minimize nesting (if statements, for loops, etc.)
Use function declarations instead of function expressions when possible

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
🧠 Learnings (26)
📓 Common learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Prefer specific selectors in browser tests
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Test across multiple viewports
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Test user workflows in browser tests

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{js,ts,jsx,tsx} : When adding features, always write vitest unit tests using cursor rules in @.cursor

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to +(tests-ui|src)/**/*.test.ts : Write tests for all changes, especially bug fixes to catch future regressions

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Prefer specific selectors in browser tests

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to browser_tests/**/*.spec.ts : Do not use waitForTimeout in Playwright tests - use Locator actions and retrying assertions instead

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to browser_tests/**/*.spec.ts : Follow Playwright best practices for E2E testing

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-13T05:54:35.779Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7415
File: browser_tests/tests/mobileBaseline.spec.ts:17-22
Timestamp: 2025-12-13T05:54:35.779Z
Learning: In browser_tests tests for the Comfy-Org/ComfyUI_frontend repository, the `comfyPage.loadWorkflow()` method already handles all necessary synchronization and waiting. No additional `await comfyPage.nextFrame()` call is needed before taking screenshots after loading a workflow.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-13T05:34:15.488Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7415
File: browser_tests/tests/mobileBaseline.spec.ts:7-15
Timestamp: 2025-12-13T05:34:15.488Z
Learning: In Playwright tests for the ComfyUI frontend, the toPass() assertion uses incremental backoff during retries. When a test may involve async operations, increasing the timeout (e.g., to 5000 ms) can be sufficient instead of aggressively extending timeouts. Apply this understanding to tests under browser_tests/tests/; if not resolved, review the toPass() backoff behavior and ensure timeouts align with expected async completion without masking issues.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-10T03:09:19.636Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7303
File: src/components/topbar/CurrentUserPopover.test.ts:199-205
Timestamp: 2025-12-10T03:09:19.636Z
Learning: For test files in the Comfy-Org/ComfyUI_frontend repository: When writing tests, prefer selecting elements by accessible properties (text content, aria-label, role, accessible name) over data-testid attributes. This ensures tests verify actual user-facing behavior and accessibility compliance.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Use Playwright fixtures for browser tests

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Test across multiple viewports

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to browser_tests/**/*.spec.ts : E2E tests use Playwright and belong in `browser_tests/**/*.spec.ts`

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-22T21:36:46.909Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7649
File: tests-ui/tests/platform/cloud/subscription/components/SubscriptionPanel.test.ts:189-194
Timestamp: 2025-12-22T21:36:46.909Z
Learning: In the Comfy-Org/ComfyUI_frontend repository test files: Do not stub primitive UI components or customized primitive components (e.g., Button). Instead, import and register the real components in test setup. This ensures tests accurately reflect production behavior and component API usage.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use setup() function in Vue 3 Composition API

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to +(tests-ui|src)/**/*.test.ts : Use Vue Test Utils for Component testing and follow best practices for making components easy to test

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use setup() function for component logic

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-09T03:39:54.501Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7169
File: src/platform/remote/comfyui/jobs/jobTypes.ts:1-107
Timestamp: 2025-12-09T03:39:54.501Z
Learning: In the ComfyUI_frontend project, Zod is on v3.x. Do not suggest Zod v4 standalone validators (z.uuid, z.ulid, z.cuid2, z.nanoid) until an upgrade to Zod 4 is performed. When reviewing TypeScript files (e.g., src/platform/remote/comfyui/jobs/jobTypes.ts) validate against Zod 3 capabilities and avoid introducing v4-specific features; flag any proposal to upgrade or incorporate v4-only validators and propose staying with compatible 3.x patterns.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
📚 Learning: 2025-12-13T11:03:11.264Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7416
File: src/stores/imagePreviewStore.ts:5-7
Timestamp: 2025-12-13T11:03:11.264Z
Learning: In the ComfyUI_frontend repository, lint rules require keeping 'import type' statements separate from non-type imports, even if importing from the same module. Do not suggest consolidating them into a single import statement. Ensure type imports remain on their own line (import type { ... } from 'module') and regular imports stay on separate lines.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
📚 Learning: 2025-12-17T00:40:09.635Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7537
File: src/components/ui/button/Button.stories.ts:45-55
Timestamp: 2025-12-17T00:40:09.635Z
Learning: Prefer pure function declarations over function expressions (e.g., use function foo() { ... } instead of const foo = () => { ... }) for pure functions in the repository. Function declarations are more functional-leaning, offer better hoisting clarity, and can improve readability and tooling consistency. Apply this guideline across TypeScript files in Comfy-Org/ComfyUI_frontend, including story and UI component code, except where a function expression is semantically required (e.g., callbacks, higher-order functions with closures).

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
📚 Learning: 2025-12-30T22:22:33.836Z
Learnt from: kaili-yang
Repo: Comfy-Org/ComfyUI_frontend PR: 7805
File: src/composables/useCoreCommands.ts:439-439
Timestamp: 2025-12-30T22:22:33.836Z
Learning: When accessing reactive properties from Pinia stores in TypeScript files, avoid using .value on direct property access (e.g., useStore().isOverlayExpanded). Pinia auto-wraps refs when accessed directly, returning the primitive value. The .value accessor is only needed when destructuring store properties or when using storeToRefs().

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
📚 Learning: 2025-12-11T12:25:15.470Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7358
File: src/components/dialog/content/signin/SignUpForm.vue:45-54
Timestamp: 2025-12-11T12:25:15.470Z
Learning: This repository uses CI automation to format code (pnpm format). Do not include manual formatting suggestions in code reviews for Comfy-Org/ComfyUI_frontend. If formatting issues are detected, rely on the CI formatter or re-run pnpm format. Focus reviews on correctness, readability, performance, accessibility, and maintainability rather than style formatting.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Do not replace `&&=` or `||=` with `=` when there is no reason to do so. If you do find a reason to remove either `&&=` or `||=`, leave a comment explaining why the removal occurred

Applied to files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to src/**/*.ts : Minimize the surface area (exported values) of each module and composable

Applied to files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
🧬 Code graph analysis (1)
src/renderer/core/canvas/litegraph/slotCalculations.ts (3)
src/renderer/core/layout/slots/slotIdentifier.ts (1)
  • getSlotKey (25-40)
src/renderer/core/layout/store/layoutStore.ts (1)
  • layoutStore (1485-1485)
src/lib/litegraph/src/LGraphNode.ts (1)
  • SlotPositionContext (3324-3337)
🔇 Additional comments (4)
browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts (1)

997-1042: Good regression test for the subgraph slot positioning fix.

This test properly validates the fix for Issue #7446 by:

  1. Creating a subgraph with a KSampler node
  2. Entering the subgraph and dragging from the subgraph input slot
  3. Verifying the connection lands on the correct slot (positive input, not negative)

The test follows Playwright best practices with proper waiting mechanisms (waitForGraphNodes, nextFrame) instead of arbitrary timeouts.

src/renderer/core/canvas/litegraph/slotCalculations.ts (3)

48-56: Good reduction of module surface area.

Making calculateInputSlotPos internal aligns with the guideline to minimize exported values. The function is now only accessible through the public getSlotPosition API.


96-126: Consistent API surface reduction.

Same treatment as calculateInputSlotPos — now internal and only accessible via getSlotPosition.


141-192: Core fix for slot position calculation looks correct.

The three-tier fallback strategy is well-structured:

  1. DOM-registered slot positions (most precise)
  2. Node layout tree positions (derived)
  3. Legacy LiteGraph calculation (ultimate fallback)

Gating behind LiteGraph.vueNodesMode ensures the Vue-specific layout data is only consulted when Vue nodes are actually enabled, fixing the subgraph socket positioning bug.

await comfyPage.setSetting('Comfy.UseNewMenu', 'Top')
await comfyPage.setSetting('Comfy.VueNodes.Enabled', true)
await comfyPage.setup()
// await comfyPage.setup()
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Remove commented-out code instead of leaving it commented.

Dead code should be removed rather than commented out. If this setup call is truly no longer needed (perhaps because loadWorkflow handles it internally), delete the line entirely. Version control preserves history if it needs to be restored.

Proposed fix
-    // await comfyPage.setup()
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// await comfyPage.setup()
🤖 Prompt for AI Agents
In @browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts at
line 105, Remove the commented-out call to comfyPage.setup() on the test line
(the dead code left as "// await comfyPage.setup()") rather than leaving it
commented; if setup is no longer required because loadWorkflow or other test
helpers handle initialization, delete the commented line entirely so the test
file contains no commented-out dead code and version control preserves history
if restoration is needed.

@christian-byrne
Copy link
Contributor

I am fixing conflicts now

- update get input/output pos to use getSlotPosition, handling both node types
- add regression test
@christian-byrne christian-byrne force-pushed the pysssss/fix-link-position-calc branch from 521c778 to 1a80229 Compare January 14, 2026 02:01
@christian-byrne christian-byrne added the New Browser Test Expectations New browser test screenshot should be set by github action label Jan 14, 2026
@coderabbitai coderabbitai bot requested review from AustinMroz and simula-r January 14, 2026 02:02
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/renderer/core/canvas/litegraph/slotCalculations.ts (2)

48-56: Don’t silently return (nodeX,nodeY) / (nodeX+width,nodeY) on invalid slot index

calculateInputSlotPos / calculateOutputSlotPos now return a “valid-looking” coordinate when the slot is missing. That can mask upstream bugs (bad slot index) and produce confusing link behavior.

Consider returning a clearly-invalid sentinel (e.g. [NaN, NaN]) or at least using a consistent “best effort” (e.g. clamp to last slot) depending on how tolerant callers should be.

Also applies to: 96-126


124-126: Resolve or document the +1 offset

The // TODO: Why +1? is now in the centralized calculation path. Either remove the TODO and document the rationale (pixel alignment / stroke width), or compute it from a named constant so it’s intentional.

🤖 Fix all issues with AI agents
In `@browser_tests/fixtures/ComfyPage.ts`:
- Around line 1594-1598: The test helper waitForGraphNodes is using strict
equality on window['app'].canvas.graph.nodes.length === count which is brittle;
update the implementation in waitForGraphNodes to use a non-strict condition
(e.g., >= count) or add a parameter like exact: boolean to choose between exact
and at-least semantics, and use that parameter to decide whether to compare with
=== or >=; ensure the call to page.waitForFunction passes the count and the
option so the function inside the browser uses the correct comparison.

In `@browser_tests/fixtures/VueNodeHelpers.ts`:
- Around line 167-175: enterSubgraph() can click the wrong button when many
subgraph nodes exist and may race because it doesn't wait for visibility; update
enterSubgraph (and the locator built by getNodeLocator when nodeId is provided)
to scope to the specific node when nodeId is passed and to explicitly pick the
first matching enter button when nodeId is omitted (e.g., use the
locator.first() variant), then wait for the button to be visible/ready before
calling click (use the locator waitFor/visibility check on the
'subgraph-enter-button' locator prior to click).

In `@browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts`:
- Around line 997-1042: Test flakiness: after calling
comfyPage.executeCommand('Comfy.Graph.ConvertToSubgraph') and before querying
the inner KSampler, wait for the subgraph Vue nodes (or the KSampler) to appear,
assert that ksamplerNode is defined, and call comfyPage.vueNodes.enterSubgraph
with the node id (e.g.
comfyPage.vueNodes.enterSubgraph(String(ksamplerNode.id))) instead of the no-arg
enter to avoid ambiguous clicks; then proceed to call
comfyPage.getNodeRefsByType('KSampler', true) and the subsequent slot/position
logic.
♻️ Duplicate comments (1)
browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts (1)

102-107: Remove commented-out dead code in beforeEach
This still has // await comfyPage.setup().

📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 521c778 and 1a80229.

📒 Files selected for processing (5)
  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/fixtures/VueNodeHelpers.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • src/renderer/core/canvas/litegraph/slotCalculations.ts
🧰 Additional context used
📓 Path-based instructions (11)
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • src/lib/litegraph/src/LGraphNode.ts
src/**/*.ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.ts: Use es-toolkit for utility functions
Use TypeScript for type safety

src/**/*.ts: Derive component types using vue-component-type-helpers (ComponentProps, ComponentSlots) instead of separate type files
Use es-toolkit for utility functions
Minimize the surface area (exported values) of each module and composable
Favor pure functions, especially testable ones

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • src/lib/litegraph/src/LGraphNode.ts
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

src/**/*.{ts,tsx,vue}: Use separate import type statements instead of inline type in mixed imports
Apply Prettier formatting with 2-space indentation, single quotes, no trailing semicolons, 80-character width
Sort and group imports by plugin, run pnpm format before committing
Never use any type - use proper TypeScript types
Never use as any type assertions - fix the underlying type issue
Write code that is expressive and self-documenting - avoid unnecessary comments
Do not add or retain redundant comments - clean as you go
Avoid mutable state - prefer immutability and assignment at point of declaration
Watch out for Code Smells and refactor to avoid them

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • src/lib/litegraph/src/LGraphNode.ts
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • src/lib/litegraph/src/LGraphNode.ts
src/**/*.{ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

src/**/*.{ts,vue}: Use ref for reactive state, computed() for derived values, and watch/watchEffect for side effects in Composition API
Avoid using ref with watch if a computed would suffice - minimize refs and derived state
Use provide/inject for dependency injection only when simpler alternatives (Store or shared composable) won't work
Leverage VueUse functions for performance-enhancing composables
Use VueUse function for useI18n in composition API for string literals

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • src/lib/litegraph/src/LGraphNode.ts
src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

src/**/*.{ts,tsx}: Keep functions short and functional
Minimize nesting (if statements, for loops, etc.)
Use function declarations instead of function expressions when possible

Files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • src/lib/litegraph/src/LGraphNode.ts
browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (browser_tests/CLAUDE.md)

browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}: Test user workflows in browser tests
Use Playwright fixtures for browser tests
Follow naming conventions for browser tests
Check assets/ directory for test data when writing tests
Prefer specific selectors in browser tests
Test across multiple viewports

Files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
browser_tests/**/*.spec.ts

📄 CodeRabbit inference engine (AGENTS.md)

browser_tests/**/*.spec.ts: E2E tests use Playwright and belong in browser_tests/**/*.spec.ts
Follow Playwright best practices for E2E testing
Do not use waitForTimeout in Playwright tests - use Locator actions and retrying assertions instead
Use tags like @mobile, @2x in Playwright tests for configuration-aware test selection

Files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
+(tests-ui|src|browser_tests)/**/*.+(test.ts|spec.ts)

📄 CodeRabbit inference engine (AGENTS.md)

+(tests-ui|src|browser_tests)/**/*.+(test.ts|spec.ts): Do not write change detector tests - avoid tests that only assert default values
Be parsimonious in testing - do not write redundant tests
Don't Mock What You Don't Own

Files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
src/lib/litegraph/**/*.{js,ts,jsx,tsx}

📄 CodeRabbit inference engine (src/lib/litegraph/CLAUDE.md)

src/lib/litegraph/**/*.{js,ts,jsx,tsx}: Run ESLint instead of manually figuring out whitespace fixes or other trivial style concerns using the pnpm lint:fix command
Take advantage of TypedArray subarray when appropriate
The size and pos properties of Rectangle share the same array buffer (subarray); they may be used to set the rectangle's size and position
Prefer single line if syntax over adding curly braces, when the statement has a very concise expression and concise, single line statement
Do not replace &&= or ||= with = when there is no reason to do so. If you do find a reason to remove either &&= or ||=, leave a comment explaining why the removal occurred
When writing methods, prefer returning idiomatic JavaScript undefined over null

Files:

  • src/lib/litegraph/src/LGraphNode.ts
src/lib/litegraph/**/*.{ts,tsx}

📄 CodeRabbit inference engine (src/lib/litegraph/CLAUDE.md)

Type assertions are an absolute last resort. In almost all cases, they are a crutch that leads to brittle code

Files:

  • src/lib/litegraph/src/LGraphNode.ts
🧠 Learnings (34)
📓 Common learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{js,ts,jsx,tsx} : When adding features, always write vitest unit tests using cursor rules in @.cursor
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to src/**/*.vue : Define slots via template usage, not via `defineSlots`
Learnt from: simula-r
Repo: Comfy-Org/ComfyUI_frontend PR: 7252
File: src/renderer/extensions/vueNodes/components/ImagePreview.vue:151-158
Timestamp: 2025-12-11T03:55:57.926Z
Learning: In src/renderer/extensions/vueNodes/components/ImagePreview.vue and LGraphNode.vue, keyboard navigation for image galleries should respond to node-level focus (via keyEvent injection from LGraphNode), not require focus within the image preview wrapper itself. This allows users to navigate the gallery with arrow keys immediately when the node is focused/selected.
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Do not replace `&&=` or `||=` with `=` when there is no reason to do so. If you do find a reason to remove either `&&=` or `||=`, leave a comment explaining why the removal occurred

Applied to files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • src/lib/litegraph/src/LGraphNode.ts
📚 Learning: 2025-12-09T03:39:54.501Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7169
File: src/platform/remote/comfyui/jobs/jobTypes.ts:1-107
Timestamp: 2025-12-09T03:39:54.501Z
Learning: In the ComfyUI_frontend project, Zod is on v3.x. Do not suggest Zod v4 standalone validators (z.uuid, z.ulid, z.cuid2, z.nanoid) until an upgrade to Zod 4 is performed. When reviewing TypeScript files (e.g., src/platform/remote/comfyui/jobs/jobTypes.ts) validate against Zod 3 capabilities and avoid introducing v4-specific features; flag any proposal to upgrade or incorporate v4-only validators and propose staying with compatible 3.x patterns.

Applied to files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/VueNodeHelpers.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-12-13T11:03:11.264Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7416
File: src/stores/imagePreviewStore.ts:5-7
Timestamp: 2025-12-13T11:03:11.264Z
Learning: In the ComfyUI_frontend repository, lint rules require keeping 'import type' statements separate from non-type imports, even if importing from the same module. Do not suggest consolidating them into a single import statement. Ensure type imports remain on their own line (import type { ... } from 'module') and regular imports stay on separate lines.

Applied to files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/VueNodeHelpers.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-12-17T00:40:09.635Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7537
File: src/components/ui/button/Button.stories.ts:45-55
Timestamp: 2025-12-17T00:40:09.635Z
Learning: Prefer pure function declarations over function expressions (e.g., use function foo() { ... } instead of const foo = () => { ... }) for pure functions in the repository. Function declarations are more functional-leaning, offer better hoisting clarity, and can improve readability and tooling consistency. Apply this guideline across TypeScript files in Comfy-Org/ComfyUI_frontend, including story and UI component code, except where a function expression is semantically required (e.g., callbacks, higher-order functions with closures).

Applied to files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/VueNodeHelpers.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-12-30T22:22:33.836Z
Learnt from: kaili-yang
Repo: Comfy-Org/ComfyUI_frontend PR: 7805
File: src/composables/useCoreCommands.ts:439-439
Timestamp: 2025-12-30T22:22:33.836Z
Learning: When accessing reactive properties from Pinia stores in TypeScript files, avoid using .value on direct property access (e.g., useStore().isOverlayExpanded). Pinia auto-wraps refs when accessed directly, returning the primitive value. The .value accessor is only needed when destructuring store properties or when using storeToRefs().

Applied to files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/VueNodeHelpers.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-12-11T12:25:15.470Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7358
File: src/components/dialog/content/signin/SignUpForm.vue:45-54
Timestamp: 2025-12-11T12:25:15.470Z
Learning: This repository uses CI automation to format code (pnpm format). Do not include manual formatting suggestions in code reviews for Comfy-Org/ComfyUI_frontend. If formatting issues are detected, rely on the CI formatter or re-run pnpm format. Focus reviews on correctness, readability, performance, accessibility, and maintainability rather than style formatting.

Applied to files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • browser_tests/fixtures/VueNodeHelpers.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2026-01-12T17:39:27.738Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7906
File: src/components/sidebar/tabs/AssetsSidebarTab.vue:545-552
Timestamp: 2026-01-12T17:39:27.738Z
Learning: In Vue/TypeScript files (src/**/*.{ts,tsx,vue}), prefer if/else statements over ternary operators when performing side effects or actions (e.g., mutating state, calling methods with side effects). Ternaries should be reserved for computing and returning values.

Applied to files:

  • src/renderer/core/canvas/litegraph/slotCalculations.ts
  • src/lib/litegraph/src/LGraphNode.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • browser_tests/fixtures/VueNodeHelpers.ts
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Test user workflows in browser tests

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • src/lib/litegraph/src/LGraphNode.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{js,ts,jsx,tsx} : When adding features, always write vitest unit tests using cursor rules in @.cursor

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Prefer specific selectors in browser tests

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to +(tests-ui|src)/**/*.test.ts : Write tests for all changes, especially bug fixes to catch future regressions

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to browser_tests/**/*.spec.ts : Follow Playwright best practices for E2E testing

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to +(tests-ui|src)/**/*.test.ts : Aim for behavioral coverage of critical and new features in unit tests

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to browser_tests/**/*.spec.ts : Do not use waitForTimeout in Playwright tests - use Locator actions and retrying assertions instead

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-12-13T05:54:35.779Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7415
File: browser_tests/tests/mobileBaseline.spec.ts:17-22
Timestamp: 2025-12-13T05:54:35.779Z
Learning: In browser_tests tests for the Comfy-Org/ComfyUI_frontend repository, the `comfyPage.loadWorkflow()` method already handles all necessary synchronization and waiting. No additional `await comfyPage.nextFrame()` call is needed before taking screenshots after loading a workflow.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-12-13T05:34:15.488Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7415
File: browser_tests/tests/mobileBaseline.spec.ts:7-15
Timestamp: 2025-12-13T05:34:15.488Z
Learning: In Playwright tests for the ComfyUI frontend, the toPass() assertion uses incremental backoff during retries. When a test may involve async operations, increasing the timeout (e.g., to 5000 ms) can be sufficient instead of aggressively extending timeouts. Apply this understanding to tests under browser_tests/tests/; if not resolved, review the toPass() backoff behavior and ensure timeouts align with expected async completion without masking issues.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-10T03:09:19.636Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7303
File: src/components/topbar/CurrentUserPopover.test.ts:199-205
Timestamp: 2025-12-10T03:09:19.636Z
Learning: For test files in the Comfy-Org/ComfyUI_frontend repository: When writing tests, prefer selecting elements by accessible properties (text content, aria-label, role, accessible name) over data-testid attributes. This ensures tests verify actual user-facing behavior and accessibility compliance.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Use Playwright fixtures for browser tests

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Test across multiple viewports

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-05T06:11:09.383Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7177
File: src/platform/assets/components/UploadModelFooter.vue:72-78
Timestamp: 2025-12-05T06:11:09.383Z
Learning: For the ComfyUI_frontend repository, avoid suggesting comments that would be redundant when the code is already self-explanatory through descriptive naming (e.g., filenames, prop names, aria-labels). The project prefers clean code without unnecessary documentation comments.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-12T23:02:37.473Z
Learnt from: Myestery
Repo: Comfy-Org/ComfyUI_frontend PR: 7422
File: .github/workflows/pr-update-playwright-expectations.yaml:131-135
Timestamp: 2025-12-12T23:02:37.473Z
Learning: In the `.github/workflows/pr-update-playwright-expectations.yaml` workflow in the Comfy-Org/ComfyUI_frontend repository, the snapshot update process is intentionally scoped to only add and update snapshot images. Deletions of snapshot files are handled explicitly outside this workflow and should not be suggested as part of this automation.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Do not add or retain redundant comments - clean as you go

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-12-22T21:36:46.909Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7649
File: tests-ui/tests/platform/cloud/subscription/components/SubscriptionPanel.test.ts:189-194
Timestamp: 2025-12-22T21:36:46.909Z
Learning: In the Comfy-Org/ComfyUI_frontend repository test files: Do not stub primitive UI components or customized primitive components (e.g., Button). Instead, import and register the real components in test setup. This ensures tests accurately reflect production behavior and component API usage.

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use setup() function in Vue 3 Composition API

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2026-01-10T00:24:17.695Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Applies to +(tests-ui|src)/**/*.test.ts : Use Vue Test Utils for Component testing and follow best practices for making components easy to test

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use setup() function for component logic

Applied to files:

  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : The `size` and `pos` properties of `Rectangle` share the same array buffer (`subarray`); they may be used to set the rectangle's size and position

Applied to files:

  • src/lib/litegraph/src/LGraphNode.ts
📚 Learning: 2026-01-08T02:40:22.621Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7894
File: src/renderer/extensions/vueNodes/widgets/components/WidgetToggleSwitch.test.ts:11-14
Timestamp: 2026-01-08T02:40:22.621Z
Learning: In the Comfy-Org/ComfyUI_frontend repository test files: When testing components, import the real type definitions from the component files instead of duplicating interface definitions in the test files. This prevents type drift and maintains consistency.

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2026-01-09T02:07:59.035Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7898
File: src/composables/usePaste.test.ts:248-248
Timestamp: 2026-01-09T02:07:59.035Z
Learning: In test files at src/**/*.test.ts, when creating mock objects that partially implement an interface (e.g., LGraphNode), use `as Partial<InterfaceType> as InterfaceType` instead of `as any` or `as unknown as InterfaceType` to explicitly acknowledge the incomplete implementation while maintaining type safety.

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Run ESLint instead of manually figuring out whitespace fixes or other trivial style concerns using the `pnpm lint:fix` command

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{ts,tsx} : Type assertions are an absolute last resort. In almost all cases, they are a crutch that leads to brittle code

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
🧬 Code graph analysis (3)
src/renderer/core/canvas/litegraph/slotCalculations.ts (4)
src/lib/litegraph/src/litegraph.ts (1)
  • LiteGraph (17-17)
src/renderer/core/layout/slots/slotIdentifier.ts (1)
  • getSlotKey (25-40)
src/renderer/core/layout/store/layoutStore.ts (1)
  • layoutStore (1485-1485)
src/lib/litegraph/src/LGraphNode.ts (1)
  • SlotPositionContext (3327-3340)
browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts (1)
browser_tests/helpers/fitToView.ts (1)
  • fitToViewInstant (15-104)
src/lib/litegraph/src/LGraphNode.ts (1)
src/renderer/core/canvas/litegraph/slotCalculations.ts (1)
  • getSlotPosition (136-192)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: deploy-and-comment
  • GitHub Check: setup
  • GitHub Check: test
  • GitHub Check: lint-and-format
  • GitHub Check: setup
  • GitHub Check: collect
🔇 Additional comments (1)
src/renderer/core/canvas/litegraph/slotCalculations.ts (1)

141-173: getNodeLayoutRef() returns cached refs, not newly allocated ones

The concern about ref allocation is unfounded—getNodeLayoutRef() caches refs in an internal Map and returns the same ref instance for each nodeId. Subsequent calls for the same node do not allocate new refs, so there's no hot-path allocation cost. The .value accessor is appropriate here since the method explicitly returns a Ref.

Likely an incorrect or invalid review comment.

Comment on lines +1594 to +1598
async waitForGraphNodes(count: number) {
await this.page.waitForFunction((count) => {
return window['app']?.canvas.graph?.nodes?.length === count
}, count)
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

waitForGraphNodes() strict equality is likely to be flaky

Waiting for nodes.length === count is brittle if the app ever adds implicit nodes (or if async graph init briefly overshoots and settles). Prefer >= (or make “exact” vs “at least” explicit via an option).

Proposed change
-  async waitForGraphNodes(count: number) {
+  async waitForGraphNodes(count: number, opts?: { exact?: boolean }) {
     await this.page.waitForFunction((count) => {
-      return window['app']?.canvas.graph?.nodes?.length === count
-    }, count)
+      const len = window['app']?.canvas.graph?.nodes?.length
+      if (len == null) return false
+      return opts?.exact ? len === count : len >= count
+    }, count)
   }
🤖 Prompt for AI Agents
In `@browser_tests/fixtures/ComfyPage.ts` around lines 1594 - 1598, The test
helper waitForGraphNodes is using strict equality on
window['app'].canvas.graph.nodes.length === count which is brittle; update the
implementation in waitForGraphNodes to use a non-strict condition (e.g., >=
count) or add a parameter like exact: boolean to choose between exact and
at-least semantics, and use that parameter to decide whether to compare with ===
or >=; ensure the call to page.waitForFunction passes the count and the option
so the function inside the browser uses the correct comparison.

Comment on lines +1599 to +1616
async getNodeRefsByType(
type: string,
includeSubgraph: boolean = false
): Promise<NodeReference[]> {
return Promise.all(
(
await this.page.evaluate((type) => {
return window['app'].graph.nodes
.filter((n: LGraphNode) => n.type === type)
.map((n: LGraphNode) => n.id)
}, type)
await this.page.evaluate(
({ type, includeSubgraph }) => {
const graph = (
includeSubgraph ? window['app'].canvas.graph : window['app'].graph
) as LGraph
const nodes = graph.nodes
return nodes
.filter((n: LGraphNode) => n.type === type)
.map((n: LGraphNode) => n.id)
},
{ type, includeSubgraph }
)
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Guard against missing graph when includeSubgraph is true

If window['app'].canvas.graph isn’t set yet (or the user isn’t inside a subgraph), this evaluate can throw. Consider returning [] when the graph is unavailable to keep helpers resilient.

Comment on lines +167 to +175
/**
* Enter the subgraph of a node.
* @param nodeId - The ID of the node to enter the subgraph of. If not provided, the first matched subgraph will be entered.
*/
async enterSubgraph(nodeId?: string): Promise<void> {
const locator = nodeId ? this.getNodeLocator(nodeId) : this.page
const editButton = locator.getByTestId('subgraph-enter-button')
await editButton.click()
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

enterSubgraph() should disambiguate + wait for visibility

As written, enterSubgraph() can click an arbitrary matching button when multiple subgraph nodes exist, and it doesn’t wait for the button to be visible/enabled (potential flake).

Proposed change
   async enterSubgraph(nodeId?: string): Promise<void> {
     const locator = nodeId ? this.getNodeLocator(nodeId) : this.page
-    const editButton = locator.getByTestId('subgraph-enter-button')
-    await editButton.click()
+    const editButton = locator.getByTestId('subgraph-enter-button').first()
+    await editButton.waitFor({ state: 'visible' })
+    await editButton.click()
   }
🤖 Prompt for AI Agents
In `@browser_tests/fixtures/VueNodeHelpers.ts` around lines 167 - 175,
enterSubgraph() can click the wrong button when many subgraph nodes exist and
may race because it doesn't wait for visibility; update enterSubgraph (and the
locator built by getNodeLocator when nodeId is provided) to scope to the
specific node when nodeId is passed and to explicitly pick the first matching
enter button when nodeId is omitted (e.g., use the locator.first() variant),
then wait for the button to be visible/ready before calling click (use the
locator waitFor/visibility check on the 'subgraph-enter-button' locator prior to
click).

Comment on lines +997 to +1042
test('Dragging from subgraph input connects to correct slot', async ({
comfyPage,
comfyMouse
}) => {
// Setup workflow with a KSampler node
await comfyPage.executeCommand('Comfy.NewBlankWorkflow')
await comfyPage.waitForGraphNodes(0)
await comfyPage.executeCommand('Workspace.SearchBox.Toggle')
await comfyPage.nextFrame()
await comfyPage.searchBox.fillAndSelectFirstNode('KSampler')
await comfyPage.waitForGraphNodes(1)

// Convert the KSampler node to a subgraph
let ksamplerNode = (await comfyPage.getNodeRefsByType('KSampler'))?.[0]
await comfyPage.vueNodes.selectNode(String(ksamplerNode.id))
await comfyPage.executeCommand('Comfy.Graph.ConvertToSubgraph')

// Enter the subgraph
await comfyPage.vueNodes.enterSubgraph()
await fitToViewInstant(comfyPage)

// Get the KSampler node inside the subgraph
ksamplerNode = (await comfyPage.getNodeRefsByType('KSampler', true))?.[0]
const positiveInput = await ksamplerNode.getInput(1)
const negativeInput = await ksamplerNode.getInput(2)

const positiveInputPos = await getSlotCenter(
comfyPage.page,
ksamplerNode.id,
1,
true
)

const sourceSlot = await comfyPage.getSubgraphInputSlot()
const calculatedSourcePos = await sourceSlot.getOpenSlotPosition()

await comfyMouse.move(calculatedSourcePos)
await comfyMouse.drag(positiveInputPos)
await comfyMouse.drop()

// Verify connection went to the correct slot
const positiveLinks = await positiveInput.getLinkCount()
const negativeLinks = await negativeInput.getLinkCount()
expect(positiveLinks).toBe(1)
expect(negativeLinks).toBe(0)
})
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Subgraph regression test: add sync + avoid “first subgraph” ambiguity

  • After ConvertToSubgraph + enterSubgraph(), add an explicit wait for subgraph Vue nodes (or the KSampler node) before querying getNodeRefsByType('KSampler', true).
  • Use enterSubgraph(String(ksamplerNode.id)) since the helper supports it, to prevent accidental clicks if multiple subgraph-enter buttons exist.
  • Add a quick assertion that ksamplerNode exists before dereferencing .id.
Proposed change
     let ksamplerNode = (await comfyPage.getNodeRefsByType('KSampler'))?.[0]
+    expect(ksamplerNode).toBeTruthy()
     await comfyPage.vueNodes.selectNode(String(ksamplerNode.id))
     await comfyPage.executeCommand('Comfy.Graph.ConvertToSubgraph')

     // Enter the subgraph
-    await comfyPage.vueNodes.enterSubgraph()
+    await comfyPage.vueNodes.enterSubgraph(String(ksamplerNode.id))
     await fitToViewInstant(comfyPage)
+    await comfyPage.vueNodes.waitForNodes()

     // Get the KSampler node inside the subgraph
     ksamplerNode = (await comfyPage.getNodeRefsByType('KSampler', true))?.[0]
+    expect(ksamplerNode).toBeTruthy()
🤖 Prompt for AI Agents
In `@browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts`
around lines 997 - 1042, Test flakiness: after calling
comfyPage.executeCommand('Comfy.Graph.ConvertToSubgraph') and before querying
the inner KSampler, wait for the subgraph Vue nodes (or the KSampler) to appear,
assert that ksamplerNode is defined, and call comfyPage.vueNodes.enterSubgraph
with the node id (e.g.
comfyPage.vueNodes.enterSubgraph(String(ksamplerNode.id))) instead of the no-arg
enter to avoid ambiguous clicks; then proceed to call
comfyPage.getNodeRefsByType('KSampler', true) and the subsequent slot/position
logic.

Comment on lines 3349 to 3351
getInputPos(slot: number): Point {
return calculateInputSlotPos(this.#getSlotPositionContext(), slot)
return getSlotPosition(this, slot, true)
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Avoid ambiguous getSlotPosition symbol resolution (import vs method)

With getInputPos / getOutputPos now delegating to getSlotPosition(...), the class also defines a getSlotPosition(...) method later, which makes call-sites easy to misread. Consider aliasing the import to make it unambiguous.

Proposed change
 import {
   calculateInputSlotPosFromSlot,
-  getSlotPosition
+  getSlotPosition as getSlotPositionFromLayout
 } from '@/renderer/core/canvas/litegraph/slotCalculations'

   getInputPos(slot: number): Point {
-    return getSlotPosition(this, slot, true)
+    return getSlotPositionFromLayout(this, slot, true)
   }

   getOutputPos(outputSlotIndex: number): Point {
-    return getSlotPosition(this, outputSlotIndex, false)
+    return getSlotPositionFromLayout(this, outputSlotIndex, false)
   }

   getSlotPosition(slotIndex: number, isInput: boolean): Point {
-    return getSlotPosition(this, slotIndex, isInput)
+    return getSlotPositionFromLayout(this, slotIndex, isInput)
   }

Also applies to: 3369-3371

@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Jan 14, 2026
@christian-byrne christian-byrne merged commit ebca0cb into main Jan 14, 2026
3 checks passed
@christian-byrne christian-byrne deleted the pysssss/fix-link-position-calc branch January 14, 2026 03:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Nodes v2 - Joining sockets in subgraphs bug

2 participants