Skip to content

Subgraph promoted dynamic widgets#8352

Closed
pythongosssss wants to merge 8 commits intomainfrom
pysssss/dynamic-combos-in-subgraphs
Closed

Subgraph promoted dynamic widgets#8352
pythongosssss wants to merge 8 commits intomainfrom
pysssss/dynamic-combos-in-subgraphs

Conversation

@pythongosssss
Copy link
Member

@pythongosssss pythongosssss commented Jan 28, 2026

Summary

Fixes for dynamic widgets on subgraphs.

Changes

  • What:
  • Add autopromotion of all dynamic widgets when a parent widget is promoted
  • Group dynamic widgets together for re-ordering in side panel
  • Fix issues with showing disconnected, not rendering correctly on reloads
  • Unit tests

Review Focus

  • One large problem here is that when the dynamic widgets are added/removed, this makes it very hard for the graph to know where the backing widget came from, as there is no actual backing widget for it
  • Updated to store flags for dynamic widget metadata where possible, with fallbacks to parsing name based on . - this pattern already exists in the dynamic widgets code

Future update pass to disable/hide the disconencted dynamic widgets in the side panel
We should look at refactoring the proxy widget system, or serialize more data about them to potentially reduce need for the . parsing

Screenshots

dynamic.widget.subgraph.mp4

┆Issue is synchronized with this Notion page by Unito

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 28, 2026

📝 Walkthrough

Walkthrough

Adds grouped handling for dynamic-combo widgets across subgraphs, extends proxy overlays with visibility/re-resolution metadata, updates UI to render grouped widgets and enable group reordering, adds Playwright helpers/tests and litegraph/devtools support for dynamic-combo scenarios.

Changes

Cohort / File(s) Summary
Browser test fixtures & components
browser_tests/fixtures/ComfyPage.ts, browser_tests/fixtures/components/PropertiesPanel.ts, browser_tests/fixtures/components/Topbar.ts
Replace internal properties panel helper with exported PropertiesPanel; add ComfyPage.isInSubgraph() and ComfyPage.createNode() helpers; add Topbar.switchToTab().
Browser test utils
browser_tests/fixtures/utils/litegraphUtils.ts
Add widget helpers: NodeWidgetReference.setValue(), NodeReference.getWidgetByName(), NodeReference.getWidgets(), and extend NodeReference.click() to support 'subgraph'.
Playwright tests
browser_tests/tests/dynamicWidgetsSubgraph.spec.ts
New test suite for dynamic combo widgets in subgraphs covering promotion/demotion, visibility, persistence, auto-promotion, and nested behaviors.
Right-side panel UI
src/components/rightSidePanel/parameters/SectionWidgets.vue, .../TabSubgraphInputs.vue, .../WidgetGroup.vue, .../WidgetItem.vue
Render widgets grouped by parent key via new WidgetGroup component; move group-aware reordering to TabSubgraphInputs; remove isDraggable prop from WidgetItem.
Grouping utilities & tests
src/components/rightSidePanel/shared.ts, src/components/rightSidePanel/shared.test.ts
Add getWidgetGroupKey() (and helper) to derive group keys from dynamicWidgetParent or base name; unit tests for proxy/overlay and grouping edge cases.
Proxy overlay & subgraph logic
src/core/graph/subgraph/proxyWidget.ts, src/core/graph/subgraph/proxyWidgetUtils.ts
Extend Overlay with hidden, needsResolve, dynamicWidgetParent; add hidden-state updates, deferred re-resolution, batch promotion (promoteWidgetsToProxy), autoPromoteDynamicChildren(), and invalidateProxyWidgetsForNode().
Dynamic widget creation
src/core/graph/widgets/dynamicWidgets.ts
Set dynamicWidgetParent on created children, mark roots with dynamicWidgetRoot, trigger auto-promotion and proxy invalidation after arrangement.
Widget types
src/lib/litegraph/src/types/widgets.ts
Add dynamicWidgetRoot?: boolean and dynamicWidgetParent?: string to IBaseWidget.
DevTools nodes
tools/devtools/dev_nodes.py, tools/devtools/nodes/__init__.py, tools/devtools/nodes/inputs.py
Add and export NodeWithDynamicCombo (DevTools node modeling dynamic combo children).

Sequence Diagram(s)

mermaid
sequenceDiagram
participant User as User
participant UI as RightSidePanel (UI)
participant Core as GraphCore
participant Proxy as ProxyOverlay
participant Canvas as CanvasRenderer

User->>UI: request promote widget
UI->>Core: call promoteWidgetsToProxy(node, widgets, parents)
Core->>Core: compute child widgets (getChildWidgets) and mark promoted
Core->>Proxy: update overlays (set dynamicWidgetParent / hidden / needsResolve)
Core->>Core: autoPromoteDynamicChildren(node, parentWidget)
Core->>Proxy: invalidateProxyWidgetsForNode(node)
Proxy->>Canvas: mark canvas dirty / request rerender
Canvas->>UI: reflect updated proxy/grouped state

Possibly related PRs

Suggested reviewers

  • shinshin86
  • KarryCharon
  • christian-byrne
  • Yorha4D
  • Myestery
✨ Finishing touches
  • 📝 Generate docstrings

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

🎭 Playwright Tests: ✅ Passed

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

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

@github-actions
Copy link

github-actions bot commented Jan 28, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/28/2026, 04:31:36 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 28, 2026

Bundle Size Report

Summary

  • Raw size: 22.1 MB baseline 22.1 MB — 🔴 +6.61 kB
  • Gzip: 4.59 MB baseline 4.59 MB — 🔴 +1.35 kB
  • Brotli: 3.41 MB baseline 3.41 MB — 🔴 +1.18 kB
  • Bundles: 172 current • 172 baseline • 81 added / 81 removed

Category Glance
Graph Workspace 🔴 +3.47 kB (963 kB) · Data & Services 🔴 +3.35 kB (2.71 MB) · Other 🟢 -195 B (7.04 MB) · Panels & Settings 🟢 -8 B (471 kB) · Vendor & Third-Party ⚪ 0 B (10.7 MB) · Views & Navigation ⚪ 0 B (80.7 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CEONfreg.js (removed) 25.9 kB 🟢 -25.9 kB 🟢 -7.47 kB 🟢 -6.58 kB
assets/index-DzxBzo0h.js (new) 25.9 kB 🔴 +25.9 kB 🔴 +7.46 kB 🔴 +6.57 kB

Status: 1 added / 1 removed

Graph Workspace — 963 kB (baseline 960 kB) • 🔴 +3.47 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CHwewBZa.js (new) 963 kB 🔴 +963 kB 🔴 +195 kB 🔴 +147 kB
assets/GraphView-ITWXKUyU.js (removed) 960 kB 🟢 -960 kB 🟢 -194 kB 🟢 -147 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-D6zOl5u8.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.61 kB 🟢 -3.06 kB
assets/CloudSurveyView-SkNt87NJ.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.61 kB 🔴 +3.06 kB
assets/CloudLoginView-CmNQ6kUg.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.09 kB 🔴 +2.71 kB
assets/CloudLoginView-Dwf4tgtB.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.71 kB
assets/UserCheckView-C6oRpp4k.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.45 kB 🟢 -2.13 kB
assets/UserCheckView-D5pEREV_.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.44 kB 🔴 +2.13 kB
assets/CloudLayoutView-BiuvUQus.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.25 kB 🔴 +1.96 kB
assets/CloudLayoutView-BlY64SzF.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.25 kB 🟢 -1.96 kB
assets/CloudSignupView-GcTJXSST.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.02 kB
assets/CloudSignupView-wWLjDU7g.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.33 kB 🔴 +2.02 kB
assets/CloudForgotPasswordView-BJuFaaMC.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/CloudForgotPasswordView-DJlVuJVQ.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/UserSelectView-BhDWKuyt.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.58 kB
assets/UserSelectView-DqHlPVhL.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.58 kB
assets/CloudSubscriptionRedirectView-BESW2I1u.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.54 kB
assets/CloudSubscriptionRedirectView-CXKSIVEM.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-b-Jd3vwm.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/CloudAuthTimeoutView-CmkMXCYu.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.71 kB 🔴 +1.49 kB
assets/CloudSorryContactSupportView-BBzzzDkN.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-Rbze1-VP.js 500 B 500 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WorkspacePanel-ClHnnsfD.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +5.89 kB 🔴 +5.14 kB
assets/WorkspacePanel-CwnOHdIE.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -5.89 kB 🟢 -5.15 kB
assets/LegacyCreditsPanel-DhNmeYXV.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.95 kB 🟢 -5.23 kB
assets/LegacyCreditsPanel-Dzd8_bj5.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.95 kB 🔴 +5.23 kB
assets/SubscriptionPanel-fc6q8J2d.js (removed) 21 kB 🟢 -21 kB 🟢 -5.02 kB 🟢 -4.43 kB
assets/SubscriptionPanel-Zw8amG-h.js (new) 21 kB 🔴 +21 kB 🔴 +5.02 kB 🔴 +4.43 kB
assets/KeybindingPanel-COHzjQkR.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.74 kB 🟢 -3.3 kB
assets/KeybindingPanel-Duqj_s2H.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.74 kB 🔴 +3.3 kB
assets/AboutPanel-Bc4scxmi.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.43 kB
assets/AboutPanel-BINtxkCr.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.43 kB
assets/ExtensionPanel-BEamx3cv.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ExtensionPanel-DQeDL7Fc.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/ServerConfigPanel-DteiZTvQ.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.17 kB 🟢 -1.94 kB
assets/ServerConfigPanel-uxxuaa9v.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.17 kB 🔴 +1.94 kB
assets/UserPanel-D8FXxh3L.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.9 kB 🟢 -1.67 kB
assets/UserPanel-Dc_MYKpv.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.9 kB 🔴 +1.67 kB
assets/refreshRemoteConfig-BSZq203f.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +574 B 🔴 +522 B
assets/refreshRemoteConfig-Bx-Lfuqg.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -573 B 🟢 -496 B
assets/config-BNFNqHfS.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -611 B 🟢 -536 B
assets/config-BtPlY6yo.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +604 B 🔴 +536 B
assets/cloudRemoteConfig-clOqnx_d.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +497 B 🔴 +430 B
assets/cloudRemoteConfig-D9ESzBaF.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -496 B 🟢 -428 B
assets/refreshRemoteConfig-D8-kzAhj.js (removed) 169 B 🟢 -169 B 🟢 -108 B 🟢 -105 B
assets/refreshRemoteConfig-DadHjSKj.js (new) 169 B 🔴 +169 B 🔴 +108 B 🔴 +101 B
assets/remoteConfig-BrsVXI_d.js 788 B 788 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B9wKvI1J.js 32 kB 32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BmGbe2N6.js 35.2 kB 35.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bvo_gE5u.js 29.6 kB 29.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C352ZOFL.js 26.4 kB 26.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CfTcklGM.js 30.2 kB 30.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DcSPTvwN.js 29.4 kB 29.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DjnBsCcX.js 39.4 kB 39.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DzHQYae7.js 32.9 kB 32.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-kAwy8UoQ.js 25.8 kB 25.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-KHOuN10S.js 30.4 kB 30.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Y1z1vZwm.js 31.2 kB 31.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-C9NI6ms6.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.06 kB
assets/auth-hRKWEKXI.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.05 kB
assets/firebaseAuthStore-BiA8UW0Y.js (removed) 217 B 🟢 -217 B 🟢 -136 B 🟢 -120 B
assets/firebaseAuthStore-DsvZ8ylF.js (new) 217 B 🔴 +217 B 🔴 +136 B 🔴 +119 B
assets/auth-DjyMTJ7X.js (new) 178 B 🔴 +178 B 🔴 +142 B 🔴 +142 B
assets/auth-w2xwuohN.js (removed) 178 B 🟢 -178 B 🟢 -142 B 🟢 -133 B

Status: 3 added / 3 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-DWw9SF4v.js (removed) 2.68 kB 🟢 -2.68 kB 🟢 -1.27 kB 🟢 -1.12 kB
assets/useSubscriptionDialog-pjQGSKj2.js (new) 2.68 kB 🔴 +2.68 kB 🔴 +1.27 kB 🔴 +1.13 kB
assets/useSubscriptionDialog-CDXgtapK.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -95 B
assets/useSubscriptionDialog-D9YTsXlC.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +99 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-D5FrZ3PL.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.68 kB 🟢 -2.41 kB
assets/ComfyQueueButton-D8cYX8lG.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.42 kB
assets/SubscribeButton-BN9Cdhtv.js (new) 4.63 kB 🔴 +4.63 kB 🔴 +1.57 kB 🔴 +1.39 kB
assets/SubscribeButton-D1j1YfXw.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.57 kB 🟢 -1.39 kB
assets/cloudFeedbackTopbarButton-BHO0j8JQ.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -678 B 🟢 -575 B
assets/cloudFeedbackTopbarButton-hUVLap7Z.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +676 B 🔴 +572 B
assets/ComfyQueueButton-BJK0Q6GD.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +120 B
assets/ComfyQueueButton-Cg1XwvbB.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -112 B
assets/Button-hzNlXzDK.js 3.82 kB 3.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-DHwvysLJ.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-CGy2FpT1.js 8.36 kB 8.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-CWRrnxl9.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DUixEvZU.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 4 added / 4 removed

Data & Services — 2.71 MB (baseline 2.71 MB) • 🔴 +3.35 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-JgG76yG1.js (new) 2.01 MB 🔴 +2.01 MB 🔴 +425 kB 🔴 +325 kB
assets/dialogService-BCk0crVT.js (removed) 2.01 MB 🟢 -2.01 MB 🟢 -424 kB 🟢 -324 kB
assets/api-qHMMaP9X.js (new) 672 kB 🔴 +672 kB 🔴 +148 kB 🔴 +118 kB
assets/api-DSWNzJbX.js (removed) 672 kB 🟢 -672 kB 🟢 -148 kB 🟢 -118 kB
assets/releaseStore-BETf4IyJ.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.4 kB 🟢 -2.12 kB
assets/releaseStore-BTcFptuO.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.4 kB 🔴 +2.12 kB
assets/keybindingService-CzGwGXgQ.js (new) 6.78 kB 🔴 +6.78 kB 🔴 +1.74 kB 🔴 +1.51 kB
assets/keybindingService-jqctbGNY.js (removed) 6.78 kB 🟢 -6.78 kB 🟢 -1.74 kB 🟢 -1.51 kB
assets/bootstrapStore-BOU2fuCY.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.03 kB 🔴 +962 B
assets/bootstrapStore-CNL7o6pZ.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.03 kB 🟢 -955 B
assets/userStore-Bdoy0Bcm.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -810 B 🟢 -723 B
assets/userStore-bScYdrBt.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +810 B 🔴 +724 B
assets/audioService-CIGWKVRQ.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -934 B 🟢 -813 B
assets/audioService-D74JLCPb.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +933 B 🔴 +810 B
assets/releaseStore-C-zQrKuT.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +108 B
assets/releaseStore-CcoEzw6o.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -104 B
assets/serverConfigStore-V1hr6NOk.js 2.64 kB 2.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useErrorHandling-CKVqSMqY.js (removed) 5.21 kB 🟢 -5.21 kB 🟢 -1.53 kB 🟢 -1.34 kB
assets/useErrorHandling-DR9RLDOa.js (new) 5.21 kB 🔴 +5.21 kB 🔴 +1.53 kB 🔴 +1.34 kB
assets/useWorkspaceUI-Cak7HPg3.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -974 B 🟢 -840 B
assets/useWorkspaceUI-KbZhS1AB.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +976 B 🔴 +845 B
assets/useSubscriptionActions-BpsQHPyE.js (new) 2.22 kB 🔴 +2.22 kB 🔴 +871 B 🔴 +762 B
assets/useSubscriptionActions-DOuVHahD.js (removed) 2.22 kB 🟢 -2.22 kB 🟢 -868 B 🟢 -759 B
assets/subscriptionCheckoutUtil-BdsJU1s9.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +876 B 🔴 +768 B
assets/subscriptionCheckoutUtil-DadM0LnJ.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -875 B 🟢 -771 B
assets/useSubscriptionCredits-CfStLtuU.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -597 B 🟢 -530 B
assets/useSubscriptionCredits-CyK-9St2.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +600 B 🔴 +530 B
assets/audioUtils-Cz8eFVtB.js (removed) 970 B 🟢 -970 B 🟢 -547 B 🟢 -454 B
assets/audioUtils-MSm930HD.js (new) 970 B 🔴 +970 B 🔴 +549 B 🔴 +458 B
assets/useCurrentUser-CdBIoG9L.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +104 B
assets/useCurrentUser-CZ5hZL0c.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -106 B
assets/_plugin-vue_export-helper-DuK_Fly3.js 467 B 467 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-DLyjcs70.js 7.2 kB 7.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-Bi2cfnIy.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tailwindUtil-Dm8WXWty.js 488 B 488 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 7 added / 7 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-dHjzWL-2.js 408 kB 408 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-C6rCU2OI.js 4.1 MB 4.1 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-VBlLkufO.js 3.04 MB 3.04 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CR4RbTw1.js 256 kB 256 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-BeIVXtul.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-DdP0ccEc.js 650 kB 650 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-VB6jWz3M.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-Ce2gRtuj.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.04 MB (baseline 7.04 MB) • 🟢 -195 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-ylXSWYy4.js (removed) 180 kB 🟢 -180 kB 🟢 -43.3 kB 🟢 -36.2 kB
assets/core-XwE3ewxP.js (new) 180 kB 🔴 +180 kB 🔴 +43.3 kB 🔴 +36.2 kB
assets/WidgetSelect-CjqXM-Dd.js (removed) 51 kB 🟢 -51 kB 🟢 -11.2 kB 🟢 -9.81 kB
assets/WidgetSelect-LgeeWAEL.js (new) 51 kB 🔴 +51 kB 🔴 +11.2 kB 🔴 +9.8 kB
assets/Load3DControls-Buc0XWcJ.js (removed) 35.9 kB 🟢 -35.9 kB 🟢 -5.87 kB 🟢 -5.08 kB
assets/Load3DControls-zCHW4ene.js (new) 35.9 kB 🔴 +35.9 kB 🔴 +5.87 kB 🔴 +5.07 kB
assets/SubscriptionRequiredDialogContent-CnOlYXPB.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.79 kB 🔴 +5.91 kB
assets/SubscriptionRequiredDialogContent-SElF2iun.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.79 kB 🟢 -5.92 kB
assets/CurrentUserPopoverWorkspace-BeuRgxfA.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +4.99 kB 🔴 +4.43 kB
assets/CurrentUserPopoverWorkspace-C-PTVjTD.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -4.99 kB 🟢 -4.43 kB
assets/Load3D-DPG4JV-g.js (removed) 19.2 kB 🟢 -19.2 kB 🟢 -4.37 kB 🟢 -3.85 kB
assets/Load3D-rj_btkzp.js (new) 19.2 kB 🔴 +19.2 kB 🔴 +4.37 kB 🔴 +3.84 kB
assets/WidgetRecordAudio-Bi85_5Hf.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.97 kB 🔴 +4.44 kB
assets/WidgetRecordAudio-BMxJnkqV.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.97 kB 🟢 -4.45 kB
assets/WidgetInputNumber-B4uoOn-T.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.51 kB 🔴 +4.02 kB
assets/WidgetInputNumber-CMNX6qIS.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.51 kB 🟢 -4.02 kB
assets/SubscriptionPanelContentWorkspace-B7HhJa4B.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.47 kB 🔴 +3.9 kB
assets/SubscriptionPanelContentWorkspace-BjfFKzbB.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.47 kB 🟢 -3.9 kB
assets/WidgetImageCrop-BcbESVBj.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.14 kB 🔴 +3.63 kB
assets/WidgetImageCrop-BFHFenVo.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.63 kB
assets/PanelTemplate-BXUpxOOE.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.46 kB 🟢 -4.8 kB
assets/PanelTemplate-f3dQt8OW.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.8 kB
assets/AudioPreviewPlayer-Dh2VZiA-.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.97 kB 🟢 -2.65 kB
assets/AudioPreviewPlayer-PZay1UWB.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.97 kB 🔴 +2.66 kB
assets/InviteMemberDialogContent-Bh7xKjhN.js (new) 8.36 kB 🔴 +8.36 kB 🔴 +2.51 kB 🔴 +2.17 kB
assets/InviteMemberDialogContent-D9rn81kp.js (removed) 8.36 kB 🟢 -8.36 kB 🟢 -2.5 kB 🟢 -2.17 kB
assets/WidgetWithControl-DdIM504G.js (new) 8.04 kB 🔴 +8.04 kB 🔴 +2.66 kB 🔴 +2.4 kB
assets/WidgetWithControl-ZBVHOguP.js (removed) 8.04 kB 🟢 -8.04 kB 🟢 -2.66 kB 🟢 -2.39 kB
assets/CreateWorkspaceDialogContent-BWC5RVFx.js (new) 5.93 kB 🔴 +5.93 kB 🔴 +1.93 kB 🔴 +1.68 kB
assets/CreateWorkspaceDialogContent-yFhqEgGZ.js (removed) 5.93 kB 🟢 -5.93 kB 🟢 -1.93 kB 🟢 -1.68 kB
assets/EditWorkspaceDialogContent-BxFnY0q0.js (new) 5.7 kB 🔴 +5.7 kB 🔴 +1.88 kB 🔴 +1.64 kB
assets/EditWorkspaceDialogContent-PV1wa3q5.js (removed) 5.7 kB 🟢 -5.7 kB 🟢 -1.88 kB 🟢 -1.64 kB
assets/ValueControlPopover-Bd8ExKBt.js (new) 5.17 kB 🔴 +5.17 kB 🔴 +1.69 kB 🔴 +1.5 kB
assets/ValueControlPopover-BWlQe5e8.js (removed) 5.17 kB 🟢 -5.17 kB 🟢 -1.69 kB 🟢 -1.5 kB
assets/DeleteWorkspaceDialogContent-BfXKTIZG.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.56 kB 🔴 +1.35 kB
assets/DeleteWorkspaceDialogContent-Bl7MzNVG.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.56 kB 🟢 -1.35 kB
assets/LeaveWorkspaceDialogContent-BOzqpSyS.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.5 kB 🔴 +1.31 kB
assets/LeaveWorkspaceDialogContent-HaIx8z9s.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.5 kB 🟢 -1.31 kB
assets/RemoveMemberDialogContent-C08mCSpE.js (new) 4.38 kB 🔴 +4.38 kB 🔴 +1.45 kB 🔴 +1.27 kB
assets/RemoveMemberDialogContent-CCfomoSZ.js (removed) 4.38 kB 🟢 -4.38 kB 🟢 -1.45 kB 🟢 -1.27 kB
assets/RevokeInviteDialogContent-C3SX537q.js (removed) 4.29 kB 🟢 -4.29 kB 🟢 -1.47 kB 🟢 -1.29 kB
assets/RevokeInviteDialogContent-DFDTt8lI.js (new) 4.29 kB 🔴 +4.29 kB 🔴 +1.47 kB 🔴 +1.29 kB
assets/GlobalToast-BKkzNoSs.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -939 B
assets/GlobalToast-CNACfJxt.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +942 B
assets/SubscribeToRun-CsjzP46r.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.15 kB 🟢 -1.01 kB
assets/SubscribeToRun-DQfaRPVf.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.16 kB 🔴 +1.01 kB
assets/cloudSessionCookie-BecqxRQV.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +931 B 🔴 +801 B
assets/cloudSessionCookie-CV-gFnrP.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -929 B 🟢 -807 B
assets/BaseViewTemplate-CxDzBw6l.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +947 B
assets/BaseViewTemplate-tLSchlN1.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -937 B
assets/CloudRunButtonWrapper-Bg-RUYLY.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -643 B 🟢 -567 B
assets/CloudRunButtonWrapper-C8lIeZLc.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +644 B 🔴 +567 B
assets/cloudBadges-D0szGafM.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -537 B 🟢 -489 B
assets/cloudBadges-g6v1EQrS.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +538 B 🔴 +476 B
assets/graphHasMissingNodes-C4Qnvcoo.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -461 B 🟢 -413 B
assets/graphHasMissingNodes-ISRQ4L8N.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +462 B 🔴 +418 B
assets/cloudSubscription-DCE0-Rpm.js (new) 976 B 🔴 +976 B 🔴 +463 B 🔴 +396 B
assets/cloudSubscription-ivMRLjHz.js (removed) 976 B 🟢 -976 B 🟢 -461 B 🟢 -397 B
assets/nightlyBadges-2Jgn4DJk.js (removed) 595 B 🟢 -595 B 🟢 -357 B 🟢 -309 B
assets/nightlyBadges-BINEx2cT.js (new) 595 B 🔴 +595 B 🔴 +357 B 🔴 +309 B
assets/SubscriptionPanelContentWorkspace-B6TMFgq_.js (new) 266 B 🔴 +266 B 🔴 +136 B 🔴 +118 B
assets/SubscriptionPanelContentWorkspace-xcgJSttX.js (removed) 266 B 🟢 -266 B 🟢 -136 B 🟢 -112 B
assets/WidgetInputNumber-B1_FE8Up.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -112 B
assets/WidgetInputNumber-DcXz3V2k.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +109 B
assets/WidgetLegacy-BHxEFWwT.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +107 B
assets/WidgetLegacy-DPDoTZhq.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -112 B
assets/Load3D-BmBkQlPP.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -119 B
assets/Load3D-Cyrt3Bhf.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +108 B
assets/auto-IxU1eXFy.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B5unjTgE.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BsP-x5ri.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BtcJfAd5.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CEbEylFJ.js 18.5 kB 18.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CSE42kAA.js 20.6 kB 20.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CX9qSh0Y.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DgvoXt0v.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Dk-PWJsO.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DKwvlJiD.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DQuDUlM5.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-KhEZ5Fo9.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-Ckejo70h.js 188 B 188 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-DyLIWZ1Y.js 496 kB 496 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-D5HGD2sm.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BAsVw_VR.js 128 kB 128 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BdcuOtW_.js 172 kB 172 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BjdhOMKP.js 112 kB 112 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C1_ALuzX.js 154 kB 154 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CawlsjrP.js 111 kB 111 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CueKFh2S.js 125 kB 125 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CuMAi0Yg.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dgyoixz9.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DrWtIub4.js 150 kB 150 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DZ27z6-O.js 125 kB 125 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-nzg6hhK8.js 129 kB 129 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-B5p5daPP.js 2.38 kB 2.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-LOmU6GXe.js 2 kB 2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-C7M85A9X.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-ChOx-pbs.js 2.82 kB 2.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-DaC789SX.js 143 B 143 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B8DCf1mS.js 413 kB 413 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BAFHrj6M.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BlUt4zjH.js 412 kB 412 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BuHiqTYg.js 342 kB 342 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-cE9XzsAm.js 363 kB 363 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DiynUDVW.js 383 kB 383 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dk1oqXg6.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DpRc9McY.js 339 kB 339 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-NvS3ne6s.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-SBfEQMMs.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-W4n6VSIV.js 448 kB 448 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-0kMFfOzo.js 838 B 838 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-cVp-94Rc.js 1.96 kB 1.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-C5sanYDO.js 4.21 kB 4.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-BJiJuR5i.js 518 B 518 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-CdPxGIkA.js 4.71 kB 4.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-kYf5x876.js 186 B 186 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-BflopHUr.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-BgT2fava.js 3.71 kB 3.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-CYuetUyx.js 4.57 kB 4.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-DG_IjzLF.js 3.79 kB 3.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-BLB-l7ow.js 2.58 kB 2.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-B6sR-d_3.js 2.61 kB 2.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-CeUTWczT.js 3.22 kB 3.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BtBp3h_n.js 1.31 kB 1.31 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-FfGbecfC.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-Cu4DaH99.js 3.08 kB 3.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 34 added / 34 removed

@pythongosssss pythongosssss marked this pull request as ready for review January 28, 2026 03:49
@pythongosssss pythongosssss requested a review from a team as a code owner January 28, 2026 03:49
@dosubot dosubot bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Jan 28, 2026
@pythongosssss pythongosssss self-assigned this Jan 28, 2026
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: 4

🤖 Fix all issues with AI agents
In `@browser_tests/fixtures/components/PropertiesPanel.ts`:
- Around line 30-56: promoteWidget currently performs blind clicks to expand
Advanced Inputs and to refresh the panel (clicking the Toggle properties panel
twice); replace those blind toggles with deterministic checks: reuse
ensureOpen() at the start (already called) and use the same expansion-check
pattern as demoteWidget to only click advancedInputsButton when it is not
already expanded, and after promoting the widget call the class's close() and
ensureOpen() (or ensureOpen() only if you need it open) instead of clicking the
Toggle properties panel twice to deterministically refresh state; update
promoteWidget to reference ensureOpen(), close(), demoteWidget's expansion-check
logic, and the advancedInputsButton locator when making these changes.
- Around line 61-79: The code builds unescaped RegExp from widgetName to find
elements (see inputsContent and widgetRow) which breaks for widget names with
regex metacharacters; replace those locator.filter({ hasText: new
RegExp(`^${widgetName}$`) }) usages with a safe exact-text matcher such as
getByText(widgetName, { exact: true }) or escape widgetName before creating the
RegExp, and update both occurrences (the inputsContent check and the widgetRow
lookup) to use the safe matcher so matching is exact and not treated as a regex.

In `@browser_tests/tests/dynamicWidgetsSubgraph.spec.ts`:
- Line 288: Replace the unconditional sleep at
comfyPage.page.waitForTimeout(500) with a retrying assertion (e.g., expect.poll
or Playwright locator-based waits) that checks the concrete condition indicating
subgraph conversion is finished (for example a specific element becomes
visible/has text, or a status attribute changes); update the test to poll that
condition via expect.poll or await expect(locator).toHaveText()/toBeVisible() so
the test retries until completion instead of using a fixed timeout.
- Line 269: Replace the explicit sleep comfyPage.page.waitForTimeout(500) with a
retrying Playwright assertion that waits for the expected state (for example use
await expect(comfyPage.locator('<selector>')).toHaveText('<expected>') or await
comfyPage.locator('<selector>').waitFor({ state: 'visible' })) and remove the
duplicate assertion further down so only the poll-based assertion remains;
target the comfyPage.page.waitForTimeout call in the test and use Playwright's
expect/locator.waitFor APIs instead.

@pythongosssss pythongosssss enabled auto-merge (squash) January 28, 2026 04:24
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/dynamicWidgetsSubgraph.spec.ts`:
- Around line 311-314: Replace the immediate assertion after pressing Escape
with a retrying Playwright assertion: after calling
comfyPage.page.keyboard.press('Escape') (and keeping comfyPage.nextFrame() if
needed), change expect(await comfyPage.isInSubgraph()).toBe(false) to a
poll-style assertion such as await expect.poll(async () => await
comfyPage.isInSubgraph()).toBe(false) so the test retries until the subgraph
exit completes; reference comfyPage.page.keyboard.press, comfyPage.nextFrame,
and comfyPage.isInSubgraph when locating the change.

@pythongosssss pythongosssss removed their assignment Jan 28, 2026
@coderabbitai coderabbitai bot requested a review from AustinMroz January 28, 2026 04:31
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: 2

🤖 Fix all issues with AI agents
In `@browser_tests/tests/dynamicWidgetsSubgraph.spec.ts`:
- Around line 161-242: The assertions that check widget state immediately after
calling comfyPage.menu.topbar.switchToTab(0) can be flaky; update both tests to
wait/retry for the subgraph and its widgets to be ready before asserting by
polling getSubgraphNode() and reloadedSubgraph.getWidgets() (or using
comfyPage.waitForFunction) with a short timeout/retry loop after switchToTab,
then perform the expect on the stable result (references:
comfyPage.menu.topbar.switchToTab, getSubgraphNode, reloadedSubgraph.getWidgets,
the two test blocks "Promoted combo maintains state after workflow reload" and
"Hidden children remain hidden after workflow reload when combo is none").
- Around line 96-159: Replace immediate synchronous assertions after
comboWidget.setValue with retrying assertions using Playwright's expect.poll():
after each call to comboWidget.setValue(...) call expect.poll(() =>
subgraphNode.getWidgets()).toEqual(...) so the check retries until the UI
updates. Update each occurrence where comboWidget.setValue is followed by
expect(await subgraphNode.getWidgets()) — e.g., the sequences around
comboWidget.setValue in this test — and keep the same expected arrays built with
widget(...) and subgraphWidgetName(...) so the assertion logic and helpers
remain unchanged.

Copy link
Collaborator

@AustinMroz AustinMroz left a comment

Choose a reason for hiding this comment

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

Will need to spend some time poking on the actual code, but figure it's best to report on the issues I've seen so far.

Looks like there's rough edges with nested dynamicCombos

  • There's some concerning (but potentially intentional?) mixing of indexOf('.') and lastIndexOf('.') in the code
  • Promoting a group will sometimes fail to pick all children.
  • These are correctly grabbed when the value of the parent is changed
  • Some widgets which should not be grouped are (positive and negative prompt of default workflow)

And then attempting to promote a dynamicCombo across nested subgraphs is even more rough.

*/
function getBaseWidgetName(widget: IBaseWidget): string {
// Check if it's a proxy widget with _overlay
const overlay = (widget as { _overlay?: { widgetName?: string } })._overlay
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
const overlay = (widget as { _overlay?: { widgetName?: string } })._overlay
const overlay = isProxyWidget(widget) ? widget._overlay : undefined

Super nit, but probably for the best in case the isProxyWidget guard gets tightened in the future.

overlay.hidden = shouldHide
subgraphNode.setDirtyCanvas(true, true)
}
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

Hiding in vue mode currently uses widget.options.hidden instead of widget.hidden. Probably better fixed in useGraphNodeManager.

There's also some potential for shenanigans if a promoted widget already has the hidden flag. Might cause issues with nested promotion of dynamicCombos? 😅

@pythongosssss pythongosssss self-assigned this Jan 29, 2026
@pythongosssss pythongosssss marked this pull request as draft January 29, 2026 00:27
auto-merge was automatically disabled January 29, 2026 00:27

Pull request was converted to draft

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants