Skip to content

fix: show load widget inputs in media dropdown#9670

Merged
DrJKL merged 6 commits intomainfrom
drjkl/computed-async-filtered-items
Mar 9, 2026
Merged

fix: show load widget inputs in media dropdown#9670
DrJKL merged 6 commits intomainfrom
drjkl/computed-async-filtered-items

Conversation

@DrJKL
Copy link
Contributor

@DrJKL DrJKL commented Mar 9, 2026

Main targeted, built on #9551

Summary

Fix Load Image/Load Video input dropdown tabs not showing available input assets in Vue node select dropdown.

Changes

  • What: Keep combo widget options object identity while exposing dynamic values for cloud/remote combos.
  • What: Remove temporary debug logging and restore clearer dropdown filter branching.
  • What: Remove stale searcher/updateKey prop plumbing in dropdown menu/actions and update related tests.

Review Focus

Verify Load Image / Load Video Inputs tab behavior and confirm cloud/remote combo option values still update correctly.

Relates to #9551

┆Issue is synchronized with this Notion page by Unito

christian-byrne and others added 3 commits March 7, 2026 16:21
Replace computed itemsKey with a Symbol ref and add a watcher that
re-runs the searcher whenever the items prop changes. This fixes
the Load Video node not showing videos in the Media Assets panel
dropdown when switching between asset types with identical or empty
item sets.
- keep combo widget options object identity while providing dynamic values

- remove temporary dropdown debug logs and stale search prop plumbing

- update dropdown/combo tests and mock typing compatibility

Amp-Thread-ID: https://ampcode.com/threads/T-019cd3ac-3866-73df-93be-226ebe67fa09
Co-authored-by: Amp <amp@ampcode.com>
@DrJKL DrJKL requested a review from a team as a code owner March 9, 2026 18:34
@DrJKL DrJKL added area:widgets area:vue-nodes Vue Nodes 2.0 implementation labels Mar 9, 2026
@DrJKL DrJKL self-assigned this Mar 9, 2026
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Mar 9, 2026
@github-actions
Copy link

github-actions bot commented Mar 9, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/09/2026, 07:12:26 PM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 9, 2026

🎭 Playwright: ✅ 556 passed, 0 failed · 2 flaky

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 9, 2026

📝 Walkthrough

Walkthrough

Refactors FormDropdown filtering from synchronous local search to debounced asynchronous filtering via computedAsync/refDebounced, removes searcher/updateKey props from menu components, and replaces Proxy-based dynamic widget value binding with a dedicated helper in the combo widget composable. Tests added/updated accordingly.

Changes

Cohort / File(s) Summary
FormDropdown Async Filtering
src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue
Replaced synchronous custom searcher and itemsKey logic with refDebounced(searchQuery, 250, { maxWait: 1000 }) and computedAsync-based filteredItems. Removed customSearcher and no longer passes :searcher/:update-key to menu. Added imports from @vueuse/core.
FormDropdown Child Components
src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenu.vue, src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue
Removed searcher and updateKey props and related type/imports and bindings; cleaned up prop destructuring and downstream prop forwarding to form search input/actions.
FormDropdown Tests
src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.test.ts
Added unit tests for FormDropdown covering filteredItems behavior when items prop changes, item identity/name updates, and empty↔non-empty transitions; includes mocked toast store and stubbed FormDropdownMenu.
Combo Widget Dynamic Values
src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts, src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.test.ts
Introduced bindDynamicValuesOption helper replacing Proxy-based getters for options.values; applied in createInputMappingWidget and addComboWidget. Tests updated: addWidget mock accepts options and verifies widget.options identity preservation.
Other
package.json
Minor manifest adjustments reflected by changed line counts.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐇 I nibble code with careful paws,

Debounced searches break old laws,
Props hop off and helpers stay,
Tests keep watch as changes play,
A tiny rabbit cheers the day 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'fix: show load widget inputs in media dropdown' directly describes the core issue being resolved and is specific to the functionality change.
Description check ✅ Passed The description covers all required sections with sufficient detail: summary explains the fix, changes section details three key improvements with 'What' subsections, and review focus provides testing guidance.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch drjkl/computed-async-filtered-items

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

@DrJKL DrJKL changed the base branch from ticket/bug-load-video-node-doesnt-show-videos-in-media-as to main March 9, 2026 18:35
@DrJKL DrJKL assigned AustinMroz and pythongosssss and unassigned DrJKL Mar 9, 2026
DrJKL and others added 2 commits March 9, 2026 11:47
The getter was discarding non-array values like 'Loading...' and returning empty fallback array instead.

Amp-Thread-ID: https://ampcode.com/threads/T-019cd3ec-0132-730b-b6e7-b30df01bd775
Co-authored-by: Amp <amp@ampcode.com>
@github-actions
Copy link

github-actions bot commented Mar 9, 2026

📦 Bundle: 4.57 MB gzip 🔴 +464 B

Details

Summary

  • Raw size: 21.4 MB baseline 21.4 MB — 🔴 +1.18 kB
  • Gzip: 4.57 MB baseline 4.57 MB — 🔴 +464 B
  • Brotli: 3.53 MB baseline 3.53 MB — 🟢 -6 B
  • Bundles: 232 current • 232 baseline • 119 added / 119 removed

Category Glance
Vendor & Third-Party 🔴 +1.36 kB (8.88 MB) · Other 🟢 -435 B (8.04 MB) · Data & Services 🔴 +253 B (2.77 MB) · Graph Workspace 🔴 +1 B (967 kB) · Panels & Settings ⚪ 0 B (436 kB) · Editors & Dialogs ⚪ 0 B (77.5 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-ClrM1RrP.js (removed) 28.9 kB 🟢 -28.9 kB 🟢 -11.4 kB 🟢 -9.36 kB
assets/index-zEN3xK7x.js (new) 28.9 kB 🔴 +28.9 kB 🔴 +11.4 kB 🔴 +9.35 kB

Status: 1 added / 1 removed

Graph Workspace — 967 kB (baseline 967 kB) • 🔴 +1 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-TtAKZX79.js (new) 967 kB 🔴 +967 kB 🔴 +204 kB 🔴 +154 kB
assets/GraphView-DIslSjz8.js (removed) 967 kB 🟢 -967 kB 🟢 -204 kB 🟢 -154 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-Bga8Ss8Q.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.81 kB
assets/CloudSurveyView-BsxwdU-8.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.81 kB
assets/CloudLoginView-Bv9A9OgI.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.21 kB 🔴 +2.84 kB
assets/CloudLoginView-gyz-i8vd.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.2 kB 🟢 -2.83 kB
assets/CloudSignupView-CJwDKB6C.js (new) 9.41 kB 🔴 +9.41 kB 🔴 +2.72 kB 🔴 +2.38 kB
assets/CloudSignupView-DYXTtwzg.js (removed) 9.41 kB 🟢 -9.41 kB 🟢 -2.71 kB 🟢 -2.37 kB
assets/UserCheckView-BjsTCuv5.js (removed) 8.42 kB 🟢 -8.42 kB 🟢 -2.22 kB 🟢 -1.94 kB
assets/UserCheckView-SnXPWwHc.js (new) 8.42 kB 🔴 +8.42 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/CloudLayoutView-B6dqSjLo.js (removed) 6.47 kB 🟢 -6.47 kB 🟢 -2.12 kB 🟢 -1.85 kB
assets/CloudLayoutView-Dc691Q5A.js (new) 6.47 kB 🔴 +6.47 kB 🔴 +2.12 kB 🔴 +1.84 kB
assets/CloudForgotPasswordView-B-iFDqVg.js (new) 5.59 kB 🔴 +5.59 kB 🔴 +1.95 kB 🔴 +1.72 kB
assets/CloudForgotPasswordView-BW7NaysW.js (removed) 5.59 kB 🟢 -5.59 kB 🟢 -1.95 kB 🟢 -1.72 kB
assets/CloudAuthTimeoutView-B7mCavU6.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/CloudAuthTimeoutView-DwuMBKoC.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.79 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-C-ZS-WK8.js (removed) 4.78 kB 🟢 -4.78 kB 🟢 -1.8 kB 🟢 -1.6 kB
assets/CloudSubscriptionRedirectView-McyOLav9.js (new) 4.78 kB 🔴 +4.78 kB 🔴 +1.8 kB 🔴 +1.6 kB
assets/UserSelectView-BEkAc4PT.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.46 kB
assets/UserSelectView-CoSeqQh7.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/CloudSorryContactSupportView-Deer4x8G.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-BEfSPHAy.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-DwI2HAl5.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.29 kB 🔴 +4.64 kB
assets/SecretsPanel-wnZ7Icmc.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.29 kB 🟢 -4.64 kB
assets/LegacyCreditsPanel-PqBkh8Y9.js (new) 20.7 kB 🔴 +20.7 kB 🔴 +5.59 kB 🔴 +4.92 kB
assets/LegacyCreditsPanel-qSlvFDa3.js (removed) 20.7 kB 🟢 -20.7 kB 🟢 -5.58 kB 🟢 -4.92 kB
assets/SubscriptionPanel-Bo5AJyFn.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.76 kB 🔴 +4.17 kB
assets/SubscriptionPanel-CzLGmztC.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.75 kB 🟢 -4.18 kB
assets/KeybindingPanel-Bfuoxwof.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.54 kB 🔴 +3.14 kB
assets/KeybindingPanel-C8NVrkLe.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.54 kB 🟢 -3.14 kB
assets/AboutPanel-9gZ4G8k8.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.46 kB
assets/AboutPanel-BOn6SwsA.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.73 kB 🔴 +2.47 kB
assets/ExtensionPanel-qLd3etNL.js (removed) 9.42 kB 🟢 -9.42 kB 🟢 -2.66 kB 🟢 -2.37 kB
assets/ExtensionPanel-ZMaWSqff.js (new) 9.42 kB 🔴 +9.42 kB 🔴 +2.67 kB 🔴 +2.37 kB
assets/ServerConfigPanel-Cn_6nou3.js (new) 6.49 kB 🔴 +6.49 kB 🔴 +2.13 kB 🔴 +1.93 kB
assets/ServerConfigPanel-DrxjlKCg.js (removed) 6.49 kB 🟢 -6.49 kB 🟢 -2.13 kB 🟢 -1.91 kB
assets/UserPanel-aV68scmc.js (removed) 6.2 kB 🟢 -6.2 kB 🟢 -2 kB 🟢 -1.76 kB
assets/UserPanel-DhOhxvpC.js (new) 6.2 kB 🔴 +6.2 kB 🔴 +2.01 kB 🔴 +1.76 kB
assets/cloudRemoteConfig-Bax_WasV.js (new) 1.48 kB 🔴 +1.48 kB 🔴 +724 B 🔴 +633 B
assets/cloudRemoteConfig-DuQ59qp9.js (removed) 1.48 kB 🟢 -1.48 kB 🟢 -722 B 🟢 -631 B
assets/refreshRemoteConfig-_dHSwkoL.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -518 B 🟢 -457 B
assets/refreshRemoteConfig-D2-rZ-IU.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +521 B 🔴 +478 B
assets/config-DrIhAAj_.js 1.22 kB 1.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BH2NzvA8.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BlDXFCUy.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BPjNSOku.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BSfPhDgX.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CTDqwZOP.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CY1qXPWG.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D4yKfrVw.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DKN0RxMZ.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-hSQJdwwK.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-rqXXfmcr.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-So53ZGaK.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-Blx8G_51.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -991 B
assets/auth-ds2eYkex.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +993 B
assets/SignUpForm-BYFr4VK7.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/SignUpForm-DvoZV68B.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/UpdatePasswordContent-0OwbXRa5.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1.09 kB 🔴 +965 B
assets/UpdatePasswordContent-CoL8Lctp.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1.09 kB 🟢 -962 B
assets/firebaseAuthStore-BnWOHcxV.js (removed) 831 B 🟢 -831 B 🟢 -407 B 🟢 -358 B
assets/firebaseAuthStore-uRM9vxun.js (new) 831 B 🔴 +831 B 🔴 +410 B 🔴 +362 B
assets/auth-DmSVFM28.js (new) 357 B 🔴 +357 B 🔴 +225 B 🔴 +211 B
assets/auth-soiHsmTY.js (removed) 357 B 🟢 -357 B 🟢 -224 B 🟢 -210 B
assets/PasswordFields-D5kX5MXM.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-BorJpYlL.js 1.59 kB 1.59 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-COg6fIBU.js (removed) 76.8 kB 🟢 -76.8 kB 🟢 -16.4 kB 🟢 -14.1 kB
assets/useShareDialog-XMyvm0b6.js (new) 76.8 kB 🔴 +76.8 kB 🔴 +16.4 kB 🔴 +14.1 kB
assets/useSubscriptionDialog-C2FG8q-1.js (new) 779 B 🔴 +779 B 🔴 +400 B 🔴 +342 B
assets/useSubscriptionDialog-cwZmfzFR.js (removed) 779 B 🟢 -779 B 🟢 -397 B 🟢 -340 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-BybwjOhS.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.9 kB 🔴 +3.49 kB
assets/ComfyQueueButton-N4YlkY9b.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.91 kB 🟢 -3.49 kB
assets/useTerminalTabs-BixnsrQA.js (removed) 9.87 kB 🟢 -9.87 kB 🟢 -3.41 kB 🟢 -3.01 kB
assets/useTerminalTabs-CM7gvCPr.js (new) 9.87 kB 🔴 +9.87 kB 🔴 +3.41 kB 🔴 +3.01 kB
assets/ScrubableNumberInput-DM6wHLPh.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -2.06 kB 🟢 -1.84 kB
assets/ScrubableNumberInput-v3EfWwGB.js (new) 5.95 kB 🔴 +5.95 kB 🔴 +2.06 kB 🔴 +1.83 kB
assets/FormSearchInput-D3QLfJ-O.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/FormSearchInput-DPNyHNXp.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/SubscribeButton-C8NW9rU_.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1.01 kB 🟢 -878 B
assets/SubscribeButton-CN_jzRqX.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.01 kB 🔴 +879 B
assets/cloudFeedbackTopbarButton-Dj3xXhiA.js (new) 1.42 kB 🔴 +1.42 kB 🔴 +748 B 🔴 +658 B
assets/cloudFeedbackTopbarButton-DlAiduh0.js (removed) 1.42 kB 🟢 -1.42 kB 🟢 -746 B 🟢 -651 B
assets/ComfyQueueButton-DkAWCtzz.js (new) 836 B 🔴 +836 B 🔴 +415 B 🔴 +366 B
assets/ComfyQueueButton-PLwEsYtR.js (removed) 836 B 🟢 -836 B 🟢 -413 B 🟢 -363 B
assets/Button-C54TnyIk.js 3.2 kB 3.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-BJr1VDd1.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/toggle-group-tF66I_um.js 3.83 kB 3.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-B95EAjGD.js 7.39 kB 7.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-xfn08Ppk.js 1.19 kB 1.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-CeVzA6qN.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 7 added / 7 removed

Data & Services — 2.77 MB (baseline 2.77 MB) • 🔴 +253 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-DfcqAxKa.js (new) 1.93 MB 🔴 +1.93 MB 🔴 +433 kB 🔴 +325 kB
assets/dialogService-B79mP_V4.js (removed) 1.93 MB 🟢 -1.93 MB 🟢 -433 kB 🟢 -325 kB
assets/api-B9_x-yJb.js (new) 693 kB 🔴 +693 kB 🔴 +156 kB 🔴 +124 kB
assets/api-D12Dk-RO.js (removed) 693 kB 🟢 -693 kB 🟢 -156 kB 🟢 -124 kB
assets/load3dService-BXGY27ms.js (new) 91.1 kB 🔴 +91.1 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-D1llOIVp.js (removed) 91.1 kB 🟢 -91.1 kB 🟢 -19.1 kB 🟢 -16.5 kB
assets/extensionStore-Dk6Gevxm.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -4.63 kB 🟢 -4.1 kB
assets/extensionStore-DNBwbbu5.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +4.63 kB 🔴 +4.1 kB
assets/workflowShareService-0Y3mCwRE.js (new) 13.3 kB 🔴 +13.3 kB 🔴 +4.1 kB 🔴 +3.63 kB
assets/workflowShareService-CwgnQvEu.js (removed) 13.3 kB 🟢 -13.3 kB 🟢 -4.1 kB 🟢 -3.63 kB
assets/releaseStore-BSjBGkyX.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/releaseStore-BzIGlB9b.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/keybindingService-DBmMScas.js (new) 7.16 kB 🔴 +7.16 kB 🔴 +1.72 kB 🔴 +1.48 kB
assets/keybindingService-R7QGQ1jG.js (removed) 7.16 kB 🟢 -7.16 kB 🟢 -1.72 kB 🟢 -1.48 kB
assets/bootstrapStore-DE-3MDWE.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +873 B 🔴 +797 B
assets/bootstrapStore-osgYVfMh.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -871 B 🟢 -791 B
assets/userStore-D88Q0p63.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +720 B 🔴 +635 B
assets/userStore-DKq_gmml.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -719 B 🟢 -640 B
assets/audioService-BdPtyrlb.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -846 B 🟢 -725 B
assets/audioService-Du37mPlO.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +849 B 🔴 +724 B
assets/releaseStore-BmB03gN2.js (new) 803 B 🔴 +803 B 🔴 +405 B 🔴 +358 B
assets/releaseStore-DquHtX5H.js (removed) 803 B 🟢 -803 B 🟢 -404 B 🟢 -354 B
assets/settingStore-BDsPCZey.js (removed) 787 B 🟢 -787 B 🟢 -406 B 🟢 -354 B
assets/settingStore-DAllnmhH.js (new) 787 B 🔴 +787 B 🔴 +408 B 🔴 +356 B
assets/workflowDraftStore-B7hGGRnB.js (new) 779 B 🔴 +779 B 🔴 +399 B 🔴 +350 B
assets/workflowDraftStore-Bbh2MmU3.js (removed) 779 B 🟢 -779 B 🟢 -396 B 🟢 -348 B
assets/dialogService-B3Fhv7bk.js (removed) 768 B 🟢 -768 B 🟢 -389 B 🟢 -339 B
assets/dialogService-ClAW2cSj.js (new) 768 B 🔴 +768 B 🔴 +391 B 🔴 +343 B
assets/serverConfigStore-Ze5zvB9a.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 14 added / 14 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-D66lMLet.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-VvHSNOwM.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3dViewer-BpBXLUxp.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.8 kB
assets/useLoad3dViewer-DkH8oJMf.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useFeatureFlags-D0ytz326.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.37 kB 🔴 +1.17 kB
assets/useFeatureFlags-eP5xLUhv.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.37 kB 🟢 -1.17 kB
assets/useWorkspaceUI-3bDVSli-.js (new) 3 kB 🔴 +3 kB 🔴 +821 B 🔴 +703 B
assets/useWorkspaceUI-foaS9psD.js (removed) 3 kB 🟢 -3 kB 🟢 -821 B 🟢 -707 B
assets/subscriptionCheckoutUtil-BbRZ4EgH.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -930 B
assets/subscriptionCheckoutUtil-C2H-DNFA.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +927 B
assets/useErrorHandling-B6MJAg8d.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +631 B 🔴 +534 B
assets/useErrorHandling-DSsKzl0N.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -631 B 🟢 -534 B
assets/useCopyToClipboard-Dhmy-x1U.js (removed) 944 B 🟢 -944 B 🟢 -423 B 🟢 -362 B
assets/useCopyToClipboard-DsiILYYo.js (new) 944 B 🔴 +944 B 🔴 +427 B 🔴 +366 B
assets/useLoad3d-Bco8x0OB.js (removed) 902 B 🟢 -902 B 🟢 -443 B 🟢 -399 B
assets/useLoad3d-BhPFnPco.js (new) 902 B 🔴 +902 B 🔴 +444 B 🔴 +396 B
assets/useLoad3dViewer-ClnefIQH.js (new) 881 B 🔴 +881 B 🔴 +430 B 🔴 +383 B
assets/useLoad3dViewer-Zy4xbkHK.js (removed) 881 B 🟢 -881 B 🟢 -428 B 🟢 -383 B
assets/audioUtils-B5pF_KaC.js (new) 858 B 🔴 +858 B 🔴 +500 B 🔴 +408 B
assets/audioUtils-C1C5MPC_.js (removed) 858 B 🟢 -858 B 🟢 -500 B 🟢 -402 B
assets/useCurrentUser-B-QWppnU.js (removed) 765 B 🟢 -765 B 🟢 -393 B 🟢 -341 B
assets/useCurrentUser-DRTkyzZB.js (new) 765 B 🔴 +765 B 🔴 +395 B 🔴 +344 B
assets/useWorkspaceSwitch-BYT5LVMD.js (removed) 688 B 🟢 -688 B 🟢 -353 B 🟢 -297 B
assets/useWorkspaceSwitch-wWikJFTm.js (new) 688 B 🔴 +688 B 🔴 +350 B 🔴 +296 B
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-Bz3E3A2O.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-CC-l-L9z.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DOdPeMQc.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-Cybe2l6l.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-DZeo_ZWQ.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

Vendor & Third-Party — 8.88 MB (baseline 8.88 MB) • 🔴 +1.36 kB

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-vueuse-BAp4Syx9.js (new) 125 kB 🔴 +125 kB 🔴 +30.2 kB 🔴 +26.3 kB
assets/vendor-vueuse-CH_Hqnyl.js (removed) 124 kB 🟢 -124 kB 🟢 -29.9 kB 🟢 -26 kB
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-D82zUMvC.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DccD0mxo.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-u14f4tgD.js 1.54 MB 1.54 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-prq_Rlnc.js 1.72 MB 1.72 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-DAnHd-7G.js 413 kB 413 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-C69yBO64.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-DTO2QA4Q.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-CmHHRvL9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-Co8jWZ4q.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

Other — 8.04 MB (baseline 8.04 MB) • 🟢 -435 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-CGtu2zBW.js (new) 73.8 kB 🔴 +73.8 kB 🔴 +19 kB 🔴 +16.3 kB
assets/core-DvtCy7nT.js (removed) 73.8 kB 🟢 -73.8 kB 🟢 -19 kB 🟢 -16.3 kB
assets/groupNode-8gnfUDHA.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.5 kB
assets/groupNode-NN4RTVyL.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.6 kB
assets/WidgetSelect-p9H5EU8e.js (removed) 58.3 kB 🟢 -58.3 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/WidgetSelect-CY9mNfUJ.js (new) 57.8 kB 🔴 +57.8 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-CGs6ZCo9.js (removed) 46.2 kB 🟢 -46.2 kB 🟢 -8.65 kB 🟢 -7.49 kB
assets/SubscriptionRequiredDialogContentWorkspace-CKkmHnMi.js (new) 46.2 kB 🔴 +46.2 kB 🔴 +8.65 kB 🔴 +7.51 kB
assets/WidgetPainter-DM1OcgWt.js (new) 32.9 kB 🔴 +32.9 kB 🔴 +7.97 kB 🔴 +7.07 kB
assets/WidgetPainter-DSOJoPxR.js (removed) 32.9 kB 🟢 -32.9 kB 🟢 -7.97 kB 🟢 -7.08 kB
assets/Load3DControls-B88ji56f.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/Load3DControls-DEWZtABr.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/WorkspacePanelContent-AqVl8qpD.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.16 kB 🔴 +5.42 kB
assets/WorkspacePanelContent-Di2H5WfX.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.15 kB 🟢 -5.42 kB
assets/SubscriptionRequiredDialogContent-8XRYe42v.js (new) 25.6 kB 🔴 +25.6 kB 🔴 +6.57 kB 🔴 +5.78 kB
assets/SubscriptionRequiredDialogContent-DyqpwE7N.js (removed) 25.6 kB 🟢 -25.6 kB 🟢 -6.56 kB 🟢 -5.78 kB
assets/Load3dViewerContent-BIjcf-JS.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.5 kB
assets/Load3dViewerContent-yEspyOdo.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.5 kB
assets/WidgetImageCrop-C7SpJUKm.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.51 kB 🔴 +4.86 kB
assets/WidgetImageCrop-CAloKhIO.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.51 kB 🟢 -4.86 kB
assets/SubscriptionPanelContentWorkspace-BHJDv1b1.js (new) 22 kB 🔴 +22 kB 🔴 +5.11 kB 🔴 +4.49 kB
assets/SubscriptionPanelContentWorkspace-G3B1Guym.js (removed) 22 kB 🟢 -22 kB 🟢 -5.11 kB 🟢 -4.49 kB
assets/CurrentUserPopoverWorkspace-BL18BPRL.js (new) 20.5 kB 🔴 +20.5 kB 🔴 +4.95 kB 🔴 +4.42 kB
assets/CurrentUserPopoverWorkspace-DZS2JQnl.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -4.95 kB 🟢 -4.41 kB
assets/SignInContent-BFu3XHHs.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.77 kB 🟢 -4.18 kB
assets/SignInContent-D90emXvk.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.77 kB 🔴 +4.17 kB
assets/WidgetInputNumber-DjdL2SxD.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +4.79 kB 🔴 +4.25 kB
assets/WidgetInputNumber-DuPOPqcI.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -4.79 kB 🟢 -4.26 kB
assets/WidgetRecordAudio-D_GSjJDI.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -5.01 kB 🟢 -4.48 kB
assets/WidgetRecordAudio-GhhXf5Ph.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +5.01 kB 🔴 +4.48 kB
assets/Load3D-CVrf3SPS.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.02 kB 🔴 +3.5 kB
assets/Load3D-e8czhkIC.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.02 kB 🟢 -3.51 kB
assets/load3d-a1WBvIHH.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.21 kB 🟢 -3.65 kB
assets/load3d-Dp3GHTQO.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.21 kB 🔴 +3.65 kB
assets/AudioPreviewPlayer-CgLqPt4W.js (new) 11 kB 🔴 +11 kB 🔴 +3.25 kB 🔴 +2.91 kB
assets/AudioPreviewPlayer-Clbw5_Og.js (removed) 11 kB 🟢 -11 kB 🟢 -3.25 kB 🟢 -2.9 kB
assets/nodeTemplates-Csa2u_pD.js (new) 9.34 kB 🔴 +9.34 kB 🔴 +3.27 kB 🔴 +2.87 kB
assets/nodeTemplates-DZBOMBb7.js (removed) 9.34 kB 🟢 -9.34 kB 🟢 -3.27 kB 🟢 -2.88 kB
assets/InviteMemberDialogContent-9pX_fNa1.js (removed) 7.37 kB 🟢 -7.37 kB 🟢 -2.3 kB 🟢 -2 kB
assets/InviteMemberDialogContent-CmYBSP5j.js (new) 7.37 kB 🔴 +7.37 kB 🔴 +2.31 kB 🔴 +2.01 kB
assets/WidgetImageCompare-C48Z80Vu.js (new) 7 kB 🔴 +7 kB 🔴 +2.07 kB 🔴 +1.81 kB
assets/WidgetImageCompare-Dqesk5zj.js (removed) 7 kB 🟢 -7 kB 🟢 -2.07 kB 🟢 -1.81 kB
assets/Load3DConfiguration-DliGNfaq.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.92 kB 🟢 -1.68 kB
assets/Load3DConfiguration-DrL9SIY7.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/CreateWorkspaceDialogContent-5HMjRAy0.js (removed) 5.54 kB 🟢 -5.54 kB 🟢 -2 kB 🟢 -1.75 kB
assets/CreateWorkspaceDialogContent-C4HfpcWv.js (new) 5.54 kB 🔴 +5.54 kB 🔴 +2 kB 🔴 +1.74 kB
assets/onboardingCloudRoutes-CjTj_KuW.js (removed) 5.51 kB 🟢 -5.51 kB 🟢 -1.87 kB 🟢 -1.62 kB
assets/onboardingCloudRoutes-DaQ9m5qo.js (new) 5.51 kB 🔴 +5.51 kB 🔴 +1.88 kB 🔴 +1.63 kB
assets/FreeTierDialogContent-5a-L5-tC.js (new) 5.42 kB 🔴 +5.42 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/FreeTierDialogContent-BYZlcKJy.js (removed) 5.42 kB 🟢 -5.42 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/EditWorkspaceDialogContent-DpbmoFMD.js (new) 5.35 kB 🔴 +5.35 kB 🔴 +1.96 kB 🔴 +1.71 kB
assets/EditWorkspaceDialogContent-TzsEv4SC.js (removed) 5.35 kB 🟢 -5.35 kB 🟢 -1.96 kB 🟢 -1.71 kB
assets/ValueControlPopover-BiBQL_A8.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.77 kB 🔴 +1.58 kB
assets/ValueControlPopover-CN6IsvLb.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.77 kB 🟢 -1.59 kB
assets/Preview3d-C4bo08Hw.js (removed) 4.89 kB 🟢 -4.89 kB 🟢 -1.61 kB 🟢 -1.4 kB
assets/Preview3d-y_mpD5qF.js (new) 4.89 kB 🔴 +4.89 kB 🔴 +1.61 kB 🔴 +1.4 kB
assets/CancelSubscriptionDialogContent-CWoxZkPk.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.8 kB 🟢 -1.58 kB
assets/CancelSubscriptionDialogContent-hDe0qkvg.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.8 kB 🔴 +1.58 kB
assets/AnimationControls-CYf59ukW.js (removed) 4.61 kB 🟢 -4.61 kB 🟢 -1.6 kB 🟢 -1.41 kB
assets/AnimationControls-Dqd5kQXM.js (new) 4.61 kB 🔴 +4.61 kB 🔴 +1.6 kB 🔴 +1.41 kB
assets/WidgetTextarea-CngzXUeU.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.64 kB 🔴 +1.44 kB
assets/WidgetTextarea-DEIU0xzk.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.64 kB 🟢 -1.44 kB
assets/DeleteWorkspaceDialogContent-77Rv7NBN.js (new) 4.25 kB 🔴 +4.25 kB 🔴 +1.65 kB 🔴 +1.43 kB
assets/DeleteWorkspaceDialogContent-onfLQ04y.js (removed) 4.25 kB 🟢 -4.25 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/WidgetWithControl-CzwgdBWm.js (new) 4.17 kB 🔴 +4.17 kB 🔴 +1.82 kB 🔴 +1.63 kB
assets/WidgetWithControl-D6bXm4gI.js (removed) 4.17 kB 🟢 -4.17 kB 🟢 -1.82 kB 🟢 -1.62 kB
assets/LeaveWorkspaceDialogContent-BzhN5A1A.js (new) 4.08 kB 🔴 +4.08 kB 🔴 +1.59 kB 🔴 +1.38 kB
assets/LeaveWorkspaceDialogContent-D0zJfXZX.js (removed) 4.08 kB 🟢 -4.08 kB 🟢 -1.59 kB 🟢 -1.38 kB
assets/RemoveMemberDialogContent-CfAQVrpy.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.54 kB 🔴 +1.35 kB
assets/RemoveMemberDialogContent-CWDMq57z.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.54 kB 🟢 -1.35 kB
assets/RevokeInviteDialogContent-B036rWj0.js (removed) 3.97 kB 🟢 -3.97 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/RevokeInviteDialogContent-CEipkZmo.js (new) 3.97 kB 🔴 +3.97 kB 🔴 +1.55 kB 🔴 +1.37 kB
assets/InviteMemberUpsellDialogContent-B9jLnDCn.js (new) 3.86 kB 🔴 +3.86 kB 🔴 +1.42 kB 🔴 +1.25 kB
assets/InviteMemberUpsellDialogContent-Q3FKhbpJ.js (removed) 3.86 kB 🟢 -3.86 kB 🟢 -1.42 kB 🟢 -1.25 kB
assets/tierBenefits-CsSRm0ei.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.3 kB 🟢 -1.17 kB
assets/tierBenefits-RwJwa3p1.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.3 kB 🔴 +1.17 kB
assets/Slider-BsMXunsY.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.36 kB 🔴 +1.18 kB
assets/Slider-DXTiDs1x.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.36 kB 🟢 -1.18 kB
assets/saveMesh-BQb90mD7.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +1.48 kB 🔴 +1.32 kB
assets/saveMesh-D4bY3fNl.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -1.47 kB 🟢 -1.31 kB
assets/WidgetBoundingBox-6fIeENmI.js (new) 3.19 kB 🔴 +3.19 kB 🔴 +895 B 🔴 +779 B
assets/WidgetBoundingBox-B_AOifbD.js (removed) 3.19 kB 🟢 -3.19 kB 🟢 -895 B 🟢 -778 B
assets/cloudSessionCookie-BR6F1qJq.js (new) 3.14 kB 🔴 +3.14 kB 🔴 +1.11 kB 🔴 +964 B
assets/cloudSessionCookie-SFmU9xgA.js (removed) 3.14 kB 🟢 -3.14 kB 🟢 -1.11 kB 🟢 -992 B
assets/GlobalToast-BFFeX5sr.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.03 kB
assets/GlobalToast-CPvKcfcZ.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/SubscribeToRun-BBSganrR.js (new) 2.06 kB 🔴 +2.06 kB 🔴 +947 B 🔴 +833 B
assets/SubscribeToRun-g6QVnWrN.js (removed) 2.06 kB 🟢 -2.06 kB 🟢 -950 B 🟢 -830 B
assets/MediaImageTop-BAvfKQcM.js (new) 1.81 kB 🔴 +1.81 kB 🔴 +894 B 🔴 +768 B
assets/MediaImageTop-imvNSlox.js (removed) 1.81 kB 🟢 -1.81 kB 🟢 -892 B 🟢 -766 B
assets/CloudRunButtonWrapper-C8xG_cwX.js (removed) 1.72 kB 🟢 -1.72 kB 🟢 -805 B 🟢 -743 B
assets/CloudRunButtonWrapper-ConRtxYY.js (new) 1.72 kB 🔴 +1.72 kB 🔴 +806 B 🔴 +737 B
assets/cloudBadges-BN5dXYIT.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +798 B 🔴 +693 B
assets/cloudBadges-DxofatxQ.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -794 B 🟢 -695 B
assets/previousFullPath-Kw4BFYte.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +652 B 🔴 +582 B
assets/previousFullPath-sM4hIL6e.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -650 B 🟢 -559 B
assets/cloudSubscription-BS9KlyzN.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +679 B 🔴 +590 B
assets/cloudSubscription-jUyEfm0p.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -675 B 🟢 -587 B
assets/Load3D-Cmp9v6RJ.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +516 B 🔴 +458 B
assets/Load3D-DFrsyseu.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -516 B 🟢 -458 B
assets/nightlyBadges-BA4wQm1g.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +552 B 🔴 +497 B
assets/nightlyBadges-Dk55b0Vc.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -549 B 🟢 -484 B
assets/Load3dViewerContent-5w8sruTX.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +489 B 🔴 +432 B
assets/Load3dViewerContent-BEDLTbwU.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -486 B 🟢 -429 B
assets/SubscriptionPanelContentWorkspace-CAuKli_K.js (removed) 963 B 🟢 -963 B 🟢 -456 B 🟢 -394 B
assets/SubscriptionPanelContentWorkspace-Q9W2xn7s.js (new) 963 B 🔴 +963 B 🔴 +457 B 🔴 +395 B
assets/WidgetLegacy-BFnh_CEx.js (new) 787 B 🔴 +787 B 🔴 +405 B 🔴 +351 B
assets/WidgetLegacy-CDSjTuWf.js (removed) 787 B 🟢 -787 B 🟢 -401 B 🟢 -347 B
assets/changeTracker-DAZK-rny.js (removed) 763 B 🟢 -763 B 🟢 -393 B 🟢 -337 B
assets/changeTracker-GutZfwB_.js (new) 763 B 🔴 +763 B 🔴 +395 B 🔴 +342 B
assets/graphHasMissingNodes-CFDXIYjD.js (removed) 761 B 🟢 -761 B 🟢 -374 B 🟢 -324 B
assets/graphHasMissingNodes-DETAyPK0.js (new) 761 B 🔴 +761 B 🔴 +375 B 🔴 +324 B
assets/WidgetBoundingBox-BzDU_tL5.js (new) 283 B 🔴 +283 B 🔴 +184 B 🔴 +164 B
assets/WidgetBoundingBox-CMrmV2Za.js (removed) 283 B 🟢 -283 B 🟢 -186 B 🟢 -163 B
assets/ApiNodesSignInContent-KB6aDxFL.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-DaAGiCO7.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-D2Wl6A4b.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-BcOH_oP5.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-CVUg6Znj.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-4Ex6JXL0.js 19.2 kB 19.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-4eY_jIIw.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B2u5OAt2.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BAAf-WrY.js 16.4 kB 16.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BwgnbfCS.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CMf3AlGU.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Db23kZm5.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DTom9f1s.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-uXFULtu8.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-y391QX3e.js 15.6 kB 15.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-ZTJwiV8a.js 17.3 kB 17.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-ogISyp4e.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-BNlrEPku.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-Dfk52C9I.js 545 kB 545 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Loader-cdpDz0uu.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-4PccOdiO.js 199 kB 199 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-A9K8E17X.js 140 kB 140 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BERG8Y4E.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bo_nk-LH.js 167 kB 167 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BODcCr1I.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C9ucaZMP.js 158 kB 158 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CM3j3xAc.js 164 kB 164 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-cwloH2g5.js 139 kB 139 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CZ_ZoKrz.js 190 kB 190 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-De96SAcR.js 222 kB 222 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-KB02fdvg.js 159 kB 159 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-CIss1NZp.js 1.83 kB 1.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-CcX--__P.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-FC1oe-E1.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-quKrqFV_.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-L08_iM14.js 2.78 kB 2.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B8HFl03z.js 406 kB 406 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bhwr0_qt.js 452 kB 452 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BnwYZsRe.js 494 kB 494 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BQQ7epXP.js 394 kB 394 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C4H2Yzrv.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Ci3336-6.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CVMvffJd.js 453 kB 453 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Cxe4eF5X.js 402 kB 402 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D3rH0GXo.js 418 kB 418 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-LI1J_566.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ZRmGudls.js 402 kB 402 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-VXP92-HL.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-BR6SEI0c.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-yLg8Ua1p.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-BwR6vNpJ.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-J8f-bQt0.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Textarea-tnAz8KeU.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-BUItZo5F.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DIRwAHBY.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-DLkq0NID.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-L4hCPhOA.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-BZyvlEbQ.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-CyRqphmc.js 3.6 kB 3.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-D0ea31DA.js 2.89 kB 2.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-Dq9_JfRn.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-BUuB6s0W.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-tYaGazrB.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-DKi1iU_7.js 3.54 kB 3.54 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DYLaC2lj.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 57 added / 57 removed

@github-actions
Copy link

github-actions bot commented Mar 9, 2026

⚡ Performance Report

ℹ️ Collecting baseline variance data (0/5 runs). Significance will appear after 2 main branch runs.

Metric Baseline PR Δ
canvas-idle: style recalcs 124 125 +1%
canvas-idle: layouts 1 0 -50%
canvas-idle: task duration 440ms 464ms +5%
canvas-mouse-sweep: style recalcs 180 180 +0%
canvas-mouse-sweep: layouts 12 13 +6%
canvas-mouse-sweep: task duration 970ms 965ms -1%
dom-widget-clipping: style recalcs 43 43 +0%
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 384ms 380ms -1%
subgraph-dom-widget-clipping: style recalcs 75 74 -0%
subgraph-dom-widget-clipping: layouts 0 0 +0%
subgraph-dom-widget-clipping: task duration 432ms 434ms +0%
subgraph-idle: style recalcs 122 121 -1%
subgraph-idle: layouts 0 0 -100%
subgraph-idle: task duration 415ms 458ms +10%
subgraph-mouse-sweep: style recalcs 168 161 -4%
subgraph-mouse-sweep: layouts 16 16 -2%
subgraph-mouse-sweep: task duration 922ms 870ms -6%
Raw data
{
  "timestamp": "2026-03-09T19:15:31.128Z",
  "gitSha": "c0f586f625b2bff34f6becc4eac9d386906a6fe2",
  "branch": "drjkl/computed-async-filtered-items",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2042.6889999999958,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 26.066000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 460.22200000000004,
      "heapDeltaBytes": -3774536
    },
    {
      "name": "canvas-idle",
      "durationMs": 2026.9720000000007,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 28.012,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 459.68199999999996,
      "heapDeltaBytes": -3808168
    },
    {
      "name": "canvas-idle",
      "durationMs": 2068.1040000000053,
      "styleRecalcs": 128,
      "styleRecalcDurationMs": 31.392999999999997,
      "layouts": 1,
      "layoutDurationMs": 0.192,
      "taskDurationMs": 471.52699999999993,
      "heapDeltaBytes": -3069764
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2207.3579999999993,
      "styleRecalcs": 193,
      "styleRecalcDurationMs": 68.44399999999999,
      "layouts": 12,
      "layoutDurationMs": 3.954,
      "taskDurationMs": 1185.4959999999999,
      "heapDeltaBytes": -2671804
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1900.622999999996,
      "styleRecalcs": 175,
      "styleRecalcDurationMs": 55.68000000000001,
      "layouts": 13,
      "layoutDurationMs": 4.162,
      "taskDurationMs": 860.341,
      "heapDeltaBytes": -2346512
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1853.9030000000025,
      "styleRecalcs": 171,
      "styleRecalcDurationMs": 52.894999999999996,
      "layouts": 13,
      "layoutDurationMs": 3.7160000000000006,
      "taskDurationMs": 848.3159999999999,
      "heapDeltaBytes": -3105708
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 638.2830000000013,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 15.125000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 408.66400000000004,
      "heapDeltaBytes": 7366236
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 570.3800000000001,
      "styleRecalcs": 42,
      "styleRecalcDurationMs": 13.524999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 358.71,
      "heapDeltaBytes": 6543356
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 576.6249999999786,
      "styleRecalcs": 42,
      "styleRecalcDurationMs": 14.583,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 372.52699999999993,
      "heapDeltaBytes": 6878712
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 625.3900000000385,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 17.256,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 435.008,
      "heapDeltaBytes": -8969984
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 621.9110000000114,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 16.286,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 432.78700000000003,
      "heapDeltaBytes": -8868972
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 613.4860000000231,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 16.216,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 434.47400000000005,
      "heapDeltaBytes": -8518148
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2020.8959999999934,
      "styleRecalcs": 122,
      "styleRecalcDurationMs": 29.583,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 502.66300000000007,
      "heapDeltaBytes": -2714048
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1998.817000000031,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 25.153,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 428.781,
      "heapDeltaBytes": -4675696
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2003.5890000000336,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 25.998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 441.62,
      "heapDeltaBytes": -3823768
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1714.2939999999953,
      "styleRecalcs": 156,
      "styleRecalcDurationMs": 53.854,
      "layouts": 16,
      "layoutDurationMs": 5.182,
      "taskDurationMs": 843.6779999999999,
      "heapDeltaBytes": -6167072
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1969.1520000000082,
      "styleRecalcs": 171,
      "styleRecalcDurationMs": 58.84400000000001,
      "layouts": 16,
      "layoutDurationMs": 4.713,
      "taskDurationMs": 1002.248,
      "heapDeltaBytes": -5187976
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1708.9320000000043,
      "styleRecalcs": 155,
      "styleRecalcDurationMs": 46.597,
      "layouts": 16,
      "layoutDurationMs": 4.249,
      "taskDurationMs": 763.76,
      "heapDeltaBytes": -5151788
    }
  ]
}

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

🧹 Nitpick comments (2)
src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.test.ts (1)

338-353: Turn this into a live-update regression test.

This only proves the options object identity is preserved. A stale snapshot implementation would still pass. Please mutate mockAssetsStoreState.inputAssets after construction and assert widget.options.values changes, then add the same coverage for the inputSpec.remote path since bindDynamicValuesOption() now backs both call sites.

As per coding guidelines, do not write tests that just test the mocks; aim for behavioral coverage of critical and new features.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.test.ts`
around lines 338 - 353, Update the test for useComboWidget to be a live-update
regression: after constructing the widget via constructor(mockNode, inputSpec)
(and for a second case with inputSpec.remote = true), mutate
mockAssetsStoreState.inputAssets and then assert that widget.options.values
reflects the updated assets (verifying dynamic binding via
bindDynamicValuesOption); keep the original identity assertion but replace
static identity-only verification with the mutation + expectation for both the
local options path and the inputSpec.remote path so the test proves live updates
rather than snapshot/mocked identity.
src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts (1)

47-67: The setter narrowing is asymmetric but not a practical issue in current use.

Line 64's setter accepts unknown[] and only preserves arrays in fallbackValues, but the getter returns any non-null value from getValues(). While ComboWidget historically supports function-valued options.values, this pattern is deprecated (see ComboWidget.ts:131) and no code in the codebase writes non-array values to this property. The actual dynamic use case (useRemoteWidget.ts) bypasses options.values entirely, updating widget.value directly instead. Consider storing the original value descriptor or converting non-array values to a stable representation if defensive preservation is needed, but this is not required for current functionality.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts`
around lines 47 - 67, The current bindDynamicValuesOption redefines
options.values asymmetrically (setter accepts unknown[] and preserves only
arrays while getter may return any non-null getValues() result); to fix, capture
the original descriptor via Object.getOwnPropertyDescriptor(options, 'values')
before redefining and either (a) delegate to the original getter/setter when
non-array or function values are encountered, or (b) normalize non-array sets
into a stable array fallback (e.g., wrap single values or ignore non-arrays
consistently) so setter/getter behavior is symmetric; update
bindDynamicValuesOption (and ensure compatibility with ComboWidget and
useRemoteWidget) to use the preserved descriptor or normalization approach.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.test.ts`:
- Around line 65-119: The tests use stacked await nextTick() calls which don't
wait for promises produced by the component's computedAsync to settle, causing
flakiness; replace each pair of await nextTick(); await nextTick() in the test
cases ("updates displayed items when items prop changes", "updates when items
change but IDs stay the same", and "updates when switching between empty and
non-empty items") with a single await flushPromises() and add an import for
flushPromises from 'flush-promises' at the top of the test file; update
occurrences around the mountDropdown/getMenuItems/createItem interactions so the
assertions run after promise resolution.

In
`@src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue`:
- Around line 107-114: The computedAsync block that defines filteredItems awaits
the public async prop searcher without handling rejections; wrap the searcher
call inside a try-catch in the filteredItems computedAsync callback (preserving
onCancel and cleanupFn behavior) and on error call the app error toast (either
via useErrorHandling().toastErrorHandler or toastStore.add(t('...'))) to show a
user-facing, localized message using t(), then return an empty/fallback result
so the dropdown doesn't fail silently; update references to searcher,
filteredItems, onCancel and cleanupFn accordingly.

---

Nitpick comments:
In `@src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.test.ts`:
- Around line 338-353: Update the test for useComboWidget to be a live-update
regression: after constructing the widget via constructor(mockNode, inputSpec)
(and for a second case with inputSpec.remote = true), mutate
mockAssetsStoreState.inputAssets and then assert that widget.options.values
reflects the updated assets (verifying dynamic binding via
bindDynamicValuesOption); keep the original identity assertion but replace
static identity-only verification with the mutation + expectation for both the
local options path and the inputSpec.remote path so the test proves live updates
rather than snapshot/mocked identity.

In `@src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts`:
- Around line 47-67: The current bindDynamicValuesOption redefines
options.values asymmetrically (setter accepts unknown[] and preserves only
arrays while getter may return any non-null getValues() result); to fix, capture
the original descriptor via Object.getOwnPropertyDescriptor(options, 'values')
before redefining and either (a) delegate to the original getter/setter when
non-array or function values are encountered, or (b) normalize non-array sets
into a stable array fallback (e.g., wrap single values or ignore non-arrays
consistently) so setter/getter behavior is symmetric; update
bindDynamicValuesOption (and ensure compatibility with ComboWidget and
useRemoteWidget) to use the preserved descriptor or normalization approach.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d7894fee-3a92-4b97-8436-59952885d899

📥 Commits

Reviewing files that changed from the base of the PR and between 7f0472f and 2977e3d.

📒 Files selected for processing (6)
  • src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.test.ts
  • src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue
  • src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenu.vue
  • src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue
  • src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.test.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts
💤 Files with no reviewable changes (1)
  • src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue

computedAsync produces promises that nextTick alone does not reliably drain. Use flushPromises from @vue/test-utils to properly settle the async computed before asserting.

Amp-Thread-ID: https://ampcode.com/threads/T-019cd3ff-0573-71c3-8e8f-0bb8e52870cb
Co-authored-by: Amp <amp@ampcode.com>
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.

🧹 Nitpick comments (1)
src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.test.ts (1)

10-12: Consider using satisfies for explicit shape validation.

Per test helper conventions, satisfies at the return site provides shape validation at the point of construction rather than relying on the function signature.

♻️ Optional refinement
 function createItem(id: string, name: string): FormDropdownItem {
-  return { id, preview_url: '', name, label: name }
+  return { id, preview_url: '', name, label: name } satisfies FormDropdownItem
 }

Based on learnings: "In test files matching **/*.test.ts under src, when creating test helper functions that construct mock objects implementing an interface, prefer using satisfies InterfaceType for shape validation."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.test.ts`
around lines 10 - 12, The createItem helper returns a FormDropdownItem but
currently relies on the function signature for shape validation; update the
return expression to use TypeScript's `satisfies FormDropdownItem` at the
construction site (the object literal returned in createItem) so the literal is
validated against FormDropdownItem without changing the function
signature—locate the createItem function and append the `satisfies
FormDropdownItem` assertion to the returned object literal to enforce shape
validation in the test helper.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In
`@src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.test.ts`:
- Around line 10-12: The createItem helper returns a FormDropdownItem but
currently relies on the function signature for shape validation; update the
return expression to use TypeScript's `satisfies FormDropdownItem` at the
construction site (the object literal returned in createItem) so the literal is
validated against FormDropdownItem without changing the function
signature—locate the createItem function and append the `satisfies
FormDropdownItem` assertion to the returned object literal to enforce shape
validation in the test helper.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b0626d5f-eeae-4586-bf07-1c941a6831e1

📥 Commits

Reviewing files that changed from the base of the PR and between 2977e3d and 39638c1.

📒 Files selected for processing (1)
  • src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.test.ts

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.

Some potential overlap with #8775?

Changes to searcher seem very healthy.

@DrJKL
Copy link
Contributor Author

DrJKL commented Mar 9, 2026

Some potential overlap with #8775?

Changes to searcher seem very healthy.

Very probably

@DrJKL DrJKL merged commit 3b5af49 into main Mar 9, 2026
31 checks passed
@DrJKL DrJKL deleted the drjkl/computed-async-filtered-items branch March 9, 2026 19:49
@DrJKL DrJKL added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch cloud/1.41 Backport PRs for cloud 1.41 labels Mar 9, 2026
github-actions bot pushed a commit that referenced this pull request Mar 9, 2026
Main targeted, built on
#9551

## Summary

Fix Load Image/Load Video input dropdown tabs not showing available
input assets in Vue node select dropdown.

## Changes

- **What**: Keep combo widget `options` object identity while exposing
dynamic `values` for cloud/remote combos.
- **What**: Remove temporary debug logging and restore clearer dropdown
filter branching.
- **What**: Remove stale `searcher`/`updateKey` prop plumbing in
dropdown menu/actions and update related tests.

## Review Focus

Verify `Load Image` / `Load Video` Inputs tab behavior and confirm
cloud/remote combo option values still update correctly.

Relates to #9551

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9670-fix-show-load-widget-inputs-in-media-dropdown-31e6d73d36508148b845e18268a60c2a)
by [Unito](https://www.unito.io)

---------

Co-authored-by: bymyself <cbyrne@comfy.org>
Co-authored-by: Amp <amp@ampcode.com>
@comfy-pr-bot
Copy link
Member

@DrJKL Successfully backported to #9673

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Mar 9, 2026
DrJKL added a commit that referenced this pull request Mar 9, 2026
…9673)

Backport of #9670 to `cloud/1.41`

Automatically created by backport workflow.

Co-authored-by: Alexander Brown <drjkl@comfy.org>
Co-authored-by: bymyself <cbyrne@comfy.org>
Co-authored-by: Amp <amp@ampcode.com>
@DrJKL DrJKL added core/1.40 Backport PRs for core 1.40 core/1.41 Backport PRs for core 1.41 labels Mar 9, 2026
DrJKL added a commit that referenced this pull request Mar 10, 2026
Main targeted, built on
#9551

## Summary

Fix Load Image/Load Video input dropdown tabs not showing available
input assets in Vue node select dropdown.

## Changes

- **What**: Keep combo widget `options` object identity while exposing
dynamic `values` for cloud/remote combos.
- **What**: Remove temporary debug logging and restore clearer dropdown
filter branching.
- **What**: Remove stale `searcher`/`updateKey` prop plumbing in
dropdown menu/actions and update related tests.

## Review Focus

Verify `Load Image` / `Load Video` Inputs tab behavior and confirm
cloud/remote combo option values still update correctly.

Relates to #9551

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9670-fix-show-load-widget-inputs-in-media-dropdown-31e6d73d36508148b845e18268a60c2a)
by [Unito](https://www.unito.io)

---------

Co-authored-by: bymyself <cbyrne@comfy.org>
Co-authored-by: Amp <amp@ampcode.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:vue-nodes Vue Nodes 2.0 implementation area:widgets cloud/1.41 Backport PRs for cloud 1.41 core/1.40 Backport PRs for core 1.40 core/1.41 Backport PRs for core 1.41 size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants