Skip to content

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Feb 4, 2026

Add cloud asset widget creation in _createWidget() using isAssetBrowserEligible()

  • Extract shared createAssetWidget factory to src/platform/assets/utils/
  • Refactor useComboWidget.ts to use the shared factory
  • Add _finalizeWidget() helper to DRY up widget sizing/callback setup
  • Pass target node's comfyClass and input name to Asset Browser for correct model filtering
  • Check Comfy.Assets.UseAssetAPI setting (matches useComboWidget.ts behavior)
  • Sync existing target widget value to asset widget
  • Add toast notifications for asset validation errors
  • Add i18n translations for invalidAsset and invalidFilename errors

Supersedes #8461 (clean rebase, no merge commits)

┆Issue is synchronized with this Notion page by Unito

Summary by CodeRabbit

  • New Features
    • Introduced asset widget integration for cloud-based model selection, enabling users to browse and select assets through an improved interface.
    • Added comprehensive asset validation with enhanced error messages for invalid assets and filenames.

christian-byrne and others added 5 commits February 3, 2026 16:47
On Comfy Cloud, PrimitiveNode now creates asset widgets (opening Asset Browser)
instead of combo widgets for model-eligible inputs like checkpoints, LoRAs, etc.

- Add cloud asset widget creation in #createWidget() using isAssetBrowserEligible()
- Add #createAssetWidget() helper following useComboWidget.ts pattern
- Add #finalizeWidget() helper to DRY up widget sizing/callback setup
- Pass target node's comfyClass to Asset Browser for correct model filtering

Amp-Thread-ID: https://ampcode.com/threads/T-019c0839-bbdc-754a-9d3b-151417058ded
Co-authored-by: Amp <amp@ampcode.com>
- Extract createAssetWidget factory to src/platform/assets/utils/
- Refactor useComboWidget.ts to use the shared factory
- Simplify PrimitiveNode to use shared factory
- Convert JS # privates to underscore convention
- Add knip ignore for isAssetWidget (litegraph public API)

Amp-Thread-ID: https://ampcode.com/threads/T-019c0839-bbdc-754a-9d3b-151417058ded
Co-authored-by: Amp <amp@ampcode.com>
- Add Comfy.Assets.UseAssetAPI toggle check (matches useComboWidget behavior)
- Sync existing target widget value to asset widget (fixes placeholder issue)

Amp-Thread-ID: https://ampcode.com/threads/T-019c0839-bbdc-754a-9d3b-151417058ded
Co-authored-by: Amp <amp@ampcode.com>
…odo.md

- Add toast notifications for asset validation errors (surfacing to user)
- Add i18n translations for invalidAsset and invalidFilename errors
- Remove todo.md that was accidentally committed

Amp-Thread-ID: https://ampcode.com/threads/T-019c0c78-3249-72eb-9c45-0db1bf7067d6
Co-authored-by: Amp <amp@ampcode.com>
- Merge latest main to resolve conflicts
- Fix asset browser filtering: pass target input name (e.g.,
'ckpt_name') instead of PrimitiveNode's widget name ('value')

**Changes:**
- Add `inputNameForBrowser` param to `createAssetWidget`
- Pass `targetInputName` from `PrimitiveNode._createAssetWidget`

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8596-fix-merge-main-and-pass-target-input-name-to-asset-browser-2fd6d73d36508112bb17cf5d3fe54687)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Subagent 5 <subagent@example.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: guill <jacob.e.segal@gmail.com>
Co-authored-by: Jin Yi <jin12cc@gmail.com>
Co-authored-by: Alexander Brown <drjkl@comfy.org>
Co-authored-by: AustinMroz <austin@comfy.org>
Co-authored-by: Comfy Org PR Bot <snomiao+comfy-pr@gmail.com>
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Johnpaul Chiwetelu <49923152+Myestery@users.noreply.github.com>
Co-authored-by: Rizumu Ayaka <rizumu@ayaka.moe>
Co-authored-by: Kelly Yang <124ykl@gmail.com>
Co-authored-by: sno <snomiao@gmail.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: Benjamin Lu <benjaminlu1107@gmail.com>
Co-authored-by: Terry Jia <terryjia88@gmail.com>
Co-authored-by: Luke Mino-Altherr <luke@comfy.org>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019c25ec-864d-75be-8964-2056b6662bc2
@christian-byrne christian-byrne requested review from a team as code owners February 4, 2026 00:49
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Feb 4, 2026
@github-actions
Copy link

github-actions bot commented Feb 4, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/04/2026, 12:50:48 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 4, 2026

📝 Walkthrough

Walkthrough

Cloud-asset widget integration is introduced for model-eligible inputs in node widget creation, alongside a new asset widget utility function. Supporting changes include export restructuring, translation keys for asset error handling, and refactored widget composition logic.

Changes

Cohort / File(s) Summary
Cloud-Asset Widget Integration
src/extensions/core/widgetInputs.ts
Adds new private helpers _createAssetWidget and _finalizeWidget to PrimitiveNode that construct asset-based widgets with validation callbacks and dynamic sizing, integrated into the existing _createWidget flow for eligible cloud-distributed inputs.
Asset Widget Creation Utility
src/platform/assets/utils/createAssetWidget.ts
New utility function that builds asset-type widgets with integrated asset browser dialog, validation against asset and filename schemas, error handling via toasts, and value change callbacks for widget interaction.
Widget Composition Refactoring
src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts
Refactored createAssetBrowserWidget to delegate asset widget creation to the new createAssetWidget utility, removing inline modal and validation logic while preserving value change propagation.
Exports & API Surface
src/lib/litegraph/src/litegraph.ts, src/lib/litegraph/src/widgets/widgetMap.ts
Splits combined export into separate declarations for isComboWidget and isAssetWidget, adding JSDoc annotation /** @knipIgnoreUnusedButUsedByCustomNodes */ to isAssetWidget.
Graph Canvas Field Reference
src/lib/litegraph/src/LGraphCanvas.ts
Updates private field reference from this.#visibleReroutes to this._visibleReroutes in Vue nodes connection drawing path.
Asset Error Localization
src/locales/en/main.json
Adds four new translation keys for asset error handling: invalidAsset, invalidAssetDetail, invalidFilename, and invalidFilenameDetail.

Sequence Diagram

sequenceDiagram
    participant Node as PrimitiveNode
    participant Widget as Asset Widget
    participant Dialog as Asset Browser Dialog
    participant Validation as Validation Service
    participant Callback as onValueChange

    Node->>Widget: _createAssetWidget(InputSpec)
    Widget->>Widget: Set default value from InputSpec
    Node->>Widget: _finalizeWidget()
    Widget->>Dialog: Open Asset Browser (user opens widget)
    Dialog->>Dialog: User selects asset
    Widget->>Validation: Validate asset schema
    Validation-->>Widget: Asset valid/invalid
    alt Asset Valid
        Widget->>Validation: Get & validate filename
        Validation-->>Widget: Filename valid/invalid
        alt Filename Valid
            Widget->>Widget: Update widget value
            Widget->>Callback: Invoke onValueChange(newValue, oldValue)
            Callback->>Node: Trigger node change
        else Filename Invalid
            Widget->>Widget: Show error toast
        end
    else Asset Invalid
        Widget->>Widget: Show error toast
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 A hop and a flutter, new assets take flight,
Cloud widgets now shimmer with validation so bright,
With browser dialogs and schemas so keen,
Our nodes grow more elegant than ever seen,
Refactored with care, the code sings just right! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.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 accurately describes the main feature: adding asset widget support for PrimitiveNode model selection in cloud environments, which aligns with the primary changes across multiple files.
Description check ✅ Passed The PR description covers core functionality, breaking changes, dependencies, and review focus, matching the template structure adequately.

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

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch cloud/model-selection-primitive-v6

Important

Action Needed: IP Allowlist Update

If your organization protects your Git platform with IP whitelisting, please add the new CodeRabbit IP address to your allowlist:

  • 136.113.208.247/32 (new)
  • 34.170.211.100/32
  • 35.222.179.152/32

Reviews will stop working after February 8, 2026 if the new IP is not added to your allowlist.


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

@github-actions
Copy link

github-actions bot commented Feb 4, 2026

🎭 Playwright Tests: ⚠️ Passed with flaky tests

Results: 506 passed, 0 failed, 1 flaky, 8 skipped (Total: 515)

❌ Failed Tests

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

@github-actions
Copy link

github-actions bot commented Feb 4, 2026

Bundle Size Report

Summary

  • Raw size: 20.1 MB baseline 20.1 MB — 🔴 +3.71 kB
  • Gzip: 4.3 MB baseline 4.3 MB — 🔴 +488 B
  • Brotli: 3.33 MB baseline 3.33 MB — 🔴 +441 B
  • Bundles: 233 current • 233 baseline • 116 added / 116 removed

Category Glance
Data & Services 🔴 +1.81 kB (2.1 MB) · Other 🔴 +1.57 kB (7 MB) · Graph Workspace 🔴 +327 B (838 kB) · Vendor & Third-Party ⚪ 0 B (9.37 MB) · Panels & Settings ⚪ 0 B (446 kB) · Utilities & Hooks ⚪ 0 B (234 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-DOHck6vJ.js (new) 22.5 kB 🔴 +22.5 kB 🔴 +7.18 kB 🔴 +6.24 kB
assets/index-ne5k3iIJ.js (removed) 22.5 kB 🟢 -22.5 kB 🟢 -7.19 kB 🟢 -6.25 kB

Status: 1 added / 1 removed

Graph Workspace — 838 kB (baseline 837 kB) • 🔴 +327 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-DZE_zgOQ.js (new) 838 kB 🔴 +838 kB 🔴 +180 kB 🔴 +137 kB
assets/GraphView-hOPATulL.js (removed) 837 kB 🟢 -837 kB 🟢 -180 kB 🟢 -137 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-C_Oodlxz.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -3.46 kB 🟢 -2.94 kB
assets/CloudSurveyView-C0amVh--.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +3.46 kB 🔴 +2.94 kB
assets/CloudLoginView-Cj5HsWIa.js (removed) 10 kB 🟢 -10 kB 🟢 -2.93 kB 🟢 -2.58 kB
assets/CloudLoginView-DV97qeRv.js (new) 10 kB 🔴 +10 kB 🔴 +2.93 kB 🔴 +2.57 kB
assets/UserCheckView-B_8ByLqB.js (new) 8.39 kB 🔴 +8.39 kB 🔴 +2.23 kB 🔴 +1.93 kB
assets/UserCheckView-DB8Ed7r2.js (removed) 8.39 kB 🟢 -8.39 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/CloudSignupView-B_8omqJr.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.31 kB 🔴 +2.02 kB
assets/CloudSignupView-J3I-LDy_.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.32 kB 🟢 -2.02 kB
assets/CloudLayoutView-CirkiY5P.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.11 kB 🔴 +1.82 kB
assets/CloudLayoutView-YxKZt2SR.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.12 kB 🟢 -1.84 kB
assets/CloudForgotPasswordView-CBWOyBSu.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.94 kB 🔴 +1.7 kB
assets/CloudForgotPasswordView-DTim2ufo.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.94 kB 🟢 -1.71 kB
assets/CloudAuthTimeoutView-CcThSfSI.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CloudAuthTimeoutView-DkfnxcRb.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/CloudSubscriptionRedirectView-_H5CNYqA.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.78 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-Ds0yO_VS.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.77 kB 🔴 +1.56 kB
assets/UserSelectView-65Fo26ip.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.64 kB 🟢 -1.46 kB
assets/UserSelectView-mz-JowDk.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.64 kB 🔴 +1.47 kB
assets/CloudSorryContactSupportView-BPXBOTez.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-ncetNFDR.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WorkspacePanel-DGkUf2Kz.js (new) 26.9 kB 🔴 +26.9 kB 🔴 +5.66 kB 🔴 +4.96 kB
assets/WorkspacePanel-DuyzYyob.js (removed) 26.9 kB 🟢 -26.9 kB 🟢 -5.66 kB 🟢 -4.96 kB
assets/SecretsPanel-Cg88WJhE.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.27 kB 🔴 +4.63 kB
assets/SecretsPanel-DV_zyQ3F.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.28 kB 🟢 -4.63 kB
assets/LegacyCreditsPanel-Dqz0SVwO.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -5.62 kB 🟢 -4.93 kB
assets/LegacyCreditsPanel-gM_hVD50.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +5.62 kB 🔴 +4.93 kB
assets/SubscriptionPanel-BXxvIQW8.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -4.77 kB 🟢 -4.21 kB
assets/SubscriptionPanel-Cz4O_WnG.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +4.77 kB 🔴 +4.22 kB
assets/KeybindingPanel-Ch48ynCO.js (removed) 12.6 kB 🟢 -12.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/KeybindingPanel-CXlthvEz.js (new) 12.6 kB 🔴 +12.6 kB 🔴 +3.62 kB 🔴 +3.19 kB
assets/ExtensionPanel-Cn9Omv86.js (new) 9.49 kB 🔴 +9.49 kB 🔴 +2.69 kB 🔴 +2.39 kB
assets/ExtensionPanel-DU3093do.js (removed) 9.49 kB 🟢 -9.49 kB 🟢 -2.69 kB 🟢 -2.41 kB
assets/AboutPanel-CaohwJc1.js (new) 8.62 kB 🔴 +8.62 kB 🔴 +2.46 kB 🔴 +2.22 kB
assets/AboutPanel-VM3mEu9A.js (removed) 8.62 kB 🟢 -8.62 kB 🟢 -2.46 kB 🟢 -2.21 kB
assets/ServerConfigPanel-BRe8PZJ6.js (new) 6.64 kB 🔴 +6.64 kB 🔴 +2.15 kB 🔴 +1.95 kB
assets/ServerConfigPanel-DkuQ14af.js (removed) 6.64 kB 🟢 -6.64 kB 🟢 -2.16 kB 🟢 -1.94 kB
assets/UserPanel-B8UXlVBT.js (removed) 6.28 kB 🟢 -6.28 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/UserPanel-lXmlM9DO.js (new) 6.28 kB 🔴 +6.28 kB 🔴 +2.02 kB 🔴 +1.77 kB
assets/cloudRemoteConfig-BN129o0c.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +700 B 🔴 +603 B
assets/cloudRemoteConfig-D_wFpe4A.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -700 B 🟢 -608 B
assets/refreshRemoteConfig-azQVOETY.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +514 B 🔴 +460 B
assets/refreshRemoteConfig-O7VZvTnO.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -512 B 🟢 -449 B
assets/refreshRemoteConfig-CeECxmb0.js (removed) 345 B 🟢 -345 B 🟢 -206 B 🟢 -201 B
assets/refreshRemoteConfig-DDfbmw7I.js (new) 345 B 🔴 +345 B 🔴 +203 B 🔴 +206 B
assets/config-HAvaVehF.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/remoteConfig-CUBB_j_I.js 581 B 581 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-6hs8XKh-.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BjdlD31f.js 26.4 kB 26.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-brD4EDY3.js 26.6 kB 26.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BxFKdi98.js 36.5 kB 36.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-COBzPrlr.js 30 kB 30 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CtCbfR-e.js 22.8 kB 22.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D3JwDEwu.js 29 kB 29 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DT9m3J57.js 32.3 kB 32.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DzprV-N9.js 28.3 kB 28.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-syv1T4fS.js 27.4 kB 27.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Z1s0lmEj.js 23.5 kB 23.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-CDiu0QE2.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -992 B
assets/auth-Gc8ph5hi.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +987 B
assets/SignUpForm-5JF0yeaZ.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/SignUpForm-BxRwiT3R.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/UpdatePasswordContent-Rdt_tc_m.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +946 B
assets/UpdatePasswordContent-xl_07Ff6.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -947 B
assets/firebaseAuthStore-C-hCEvwW.js (new) 790 B 🔴 +790 B 🔴 +391 B 🔴 +347 B
assets/firebaseAuthStore-Cz2g7BKE.js (removed) 790 B 🟢 -790 B 🟢 -391 B 🟢 -351 B
assets/auth-C_9Gy74l.js (new) 347 B 🔴 +347 B 🔴 +221 B 🔴 +186 B
assets/auth-qExzzaTa.js (removed) 347 B 🟢 -347 B 🟢 -222 B 🟢 -212 B
assets/PasswordFields-BAi3GPM-.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-B0BztYjc.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-BEfYLQ8r.js (new) 2.68 kB 🔴 +2.68 kB 🔴 +1.32 kB 🔴 +1.17 kB
assets/useSubscriptionDialog-BjhcoOUR.js (removed) 2.68 kB 🟢 -2.68 kB 🟢 -1.32 kB 🟢 -1.18 kB
assets/useSubscriptionDialog-DEyOl0aP.js (removed) 783 B 🟢 -783 B 🟢 -389 B 🟢 -346 B
assets/useSubscriptionDialog-Di2wZqnc.js (new) 783 B 🔴 +783 B 🔴 +386 B 🔴 +337 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-0XC3EUBQ.js (removed) 9.9 kB 🟢 -9.9 kB 🟢 -3.41 kB 🟢 -3 kB
assets/useTerminalTabs-Cr7pnykx.js (new) 9.9 kB 🔴 +9.9 kB 🔴 +3.4 kB 🔴 +2.98 kB
assets/ComfyQueueButton-Bl5gsYOA.js (removed) 7.13 kB 🟢 -7.13 kB 🟢 -2.31 kB 🟢 -2.06 kB
assets/ComfyQueueButton-BSOHCIOp.js (new) 7.13 kB 🔴 +7.13 kB 🔴 +2.31 kB 🔴 +2.06 kB
assets/SubscribeButton-CE9IU_HX.js (new) 3.68 kB 🔴 +3.68 kB 🔴 +1.39 kB 🔴 +1.24 kB
assets/SubscribeButton-DF-udrmy.js (removed) 3.68 kB 🟢 -3.68 kB 🟢 -1.38 kB 🟢 -1.25 kB
assets/cloudFeedbackTopbarButton-CccoDZ6H.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -858 B 🟢 -764 B
assets/cloudFeedbackTopbarButton-mG5cKM2H.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +858 B 🔴 +734 B
assets/CloudBadge-BR5YKjBF.js (new) 1.2 kB 🔴 +1.2 kB 🔴 +594 B 🔴 +512 B
assets/CloudBadge-J1jK1OKa.js (removed) 1.2 kB 🟢 -1.2 kB 🟢 -594 B 🟢 -512 B
assets/ComfyQueueButton-CWWxiQYw.js (removed) 795 B 🟢 -795 B 🟢 -395 B 🟢 -352 B
assets/ComfyQueueButton-DXnfcdnh.js (new) 795 B 🔴 +795 B 🔴 +392 B 🔴 +345 B
assets/Button-ChqYCdrL.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-BsZTG314.js 7.52 kB 7.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-Dtdiv1Hu.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DVfWCi_V.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

Data & Services — 2.1 MB (baseline 2.1 MB) • 🔴 +1.81 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-bQ4h5B-8.js (new) 1.3 MB 🔴 +1.3 MB 🔴 +298 kB 🔴 +232 kB
assets/dialogService-DJykaKo7.js (removed) 1.3 MB 🟢 -1.3 MB 🟢 -298 kB 🟢 -231 kB
assets/api-B33VyP29.js (new) 640 kB 🔴 +640 kB 🔴 +144 kB 🔴 +116 kB
assets/api-CiQBNAud.js (removed) 640 kB 🟢 -640 kB 🟢 -144 kB 🟢 -115 kB
assets/load3dService-B_DgGwJq.js (new) 91.1 kB 🔴 +91.1 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-CspJIRbg.js (removed) 91.1 kB 🟢 -91.1 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/teamWorkspaceStore-DC778S80.js (new) 27.1 kB 🔴 +27.1 kB 🔴 +6.13 kB 🔴 +5.41 kB
assets/teamWorkspaceStore-o3ZrI03b.js (removed) 27.1 kB 🟢 -27.1 kB 🟢 -6.12 kB 🟢 -5.41 kB
assets/systemStatsStore-BGu-7GST.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -4.29 kB 🟢 -3.77 kB
assets/systemStatsStore-DTXgj6l7.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +4.29 kB 🔴 +3.77 kB
assets/releaseStore-10RPn8Pd.js (removed) 8.14 kB 🟢 -8.14 kB 🟢 -2.24 kB 🟢 -1.97 kB
assets/releaseStore-DgjyHuZK.js (new) 8.14 kB 🔴 +8.14 kB 🔴 +2.24 kB 🔴 +1.97 kB
assets/keybindingService-C4CjIIXy.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.71 kB 🔴 +1.47 kB
assets/keybindingService-Dw1mqI7x.js (removed) 6.4 kB 🟢 -6.4 kB 🟢 -1.68 kB 🟢 -1.46 kB
assets/bootstrapStore-C7CuOX9O.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +883 B 🔴 +813 B
assets/bootstrapStore-CppKKQiS.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -882 B 🟢 -814 B
assets/userStore-_cnIlI6t.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -719 B 🟢 -681 B
assets/userStore-Cfy7RGb7.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +721 B 🔴 +680 B
assets/audioService-CQoAZXk3.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -846 B 🟢 -733 B
assets/audioService-DZYvzD0u.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +847 B 🔴 +727 B
assets/releaseStore-DIY4hskw.js (new) 762 B 🔴 +762 B 🔴 +384 B 🔴 +335 B
assets/releaseStore-lGR1n7FT.js (removed) 762 B 🟢 -762 B 🟢 -386 B 🟢 -337 B
assets/dialogStore-D2gUGUn6.js 4.1 kB 4.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-DB58Z5s2.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-D12CjUeR.js (new) 177 kB 🔴 +177 kB 🔴 +38.9 kB 🔴 +32.3 kB
assets/useConflictDetection-DI-75TZC.js (removed) 177 kB 🟢 -177 kB 🟢 -38.9 kB 🟢 -32.4 kB
assets/useLoad3d-BMSFKXwF.js (new) 14.4 kB 🔴 +14.4 kB 🔴 +3.56 kB 🔴 +3.14 kB
assets/useLoad3d-DNj4btTd.js (removed) 14.4 kB 🟢 -14.4 kB 🟢 -3.56 kB 🟢 -3.14 kB
assets/useLoad3dViewer-CZrc2lBv.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.16 kB 🟢 -2.8 kB
assets/useLoad3dViewer-le06zk9C.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.16 kB 🔴 +2.8 kB
assets/useErrorHandling-B60GD_4_.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.34 kB 🔴 +1.19 kB
assets/useErrorHandling-CWH51xks.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.35 kB 🟢 -1.18 kB
assets/useWorkspaceUI-Bt9hE7dv.js (new) 3.16 kB 🔴 +3.16 kB 🔴 +883 B 🔴 +764 B
assets/useWorkspaceUI-V0E1A9FZ.js (removed) 3.16 kB 🟢 -3.16 kB 🟢 -883 B 🟢 -766 B
assets/useSubscriptionActions-B48SaC9I.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +759 B 🔴 +652 B
assets/useSubscriptionActions-Bo-wRJ-0.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -755 B 🟢 -652 B
assets/subscriptionCheckoutUtil-C3HLeUrx.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -785 B 🟢 -685 B
assets/subscriptionCheckoutUtil-D2-QnXxt.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +785 B 🔴 +686 B
assets/useExternalLink-JRQhZb1j.js (removed) 1.63 kB 🟢 -1.63 kB 🟢 -758 B 🟢 -669 B
assets/useExternalLink-SCP8V3Pt.js (new) 1.63 kB 🔴 +1.63 kB 🔴 +756 B 🔴 +670 B
assets/useCopyToClipboard-C9zorTlJ.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +667 B 🔴 +561 B
assets/useCopyToClipboard-CaobVHWG.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -669 B 🟢 -566 B
assets/useSubscriptionCredits-Cma6tmvB.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +501 B 🔴 +454 B
assets/useSubscriptionCredits-TD5vQ7xU.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -502 B 🟢 -455 B
assets/useLoad3d-CiWuzAeV.js (new) 861 B 🔴 +861 B 🔴 +425 B 🔴 +380 B
assets/useLoad3d-Dl2LCi7F.js (removed) 861 B 🟢 -861 B 🟢 -427 B 🟢 -379 B
assets/audioUtils-BCtTxmOZ.js (new) 858 B 🔴 +858 B 🔴 +500 B 🔴 +421 B
assets/audioUtils-DV5hqnKt.js (removed) 858 B 🟢 -858 B 🟢 -499 B 🟢 -418 B
assets/useLoad3dViewer-DH9Xf7gy.js (new) 840 B 🔴 +840 B 🔴 +409 B 🔴 +367 B
assets/useLoad3dViewer-LbUdDpOX.js (removed) 840 B 🟢 -840 B 🟢 -410 B 🟢 -369 B
assets/useCurrentUser-fjoUfk4B.js (removed) 724 B 🟢 -724 B 🟢 -373 B 🟢 -331 B
assets/useCurrentUser-iDvZY2K1.js (new) 724 B 🔴 +724 B 🔴 +370 B 🔴 +325 B
assets/_plugin-vue_export-helper-CAbbkOlw.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-FW_Ghng2.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Djb4sHrV.js 524 B 524 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-Cc2LFa5s.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/networkUtil-Du2a_n7V.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-DwBAnKr-.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 14 added / 14 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-D0w6WYH0.js 71.6 kB 71.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-CIdI9Yl4.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-CLEC0CcJ.js 842 kB 842 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-C6_f776o.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-BkVHYrKV.js 102 kB 102 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-DPcKX1Hx.js 2.16 MB 2.16 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-Dw8RivU1.js 1.74 MB 1.74 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CPrt7lw0.js 240 kB 240 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-BVA5kbUC.js 183 kB 183 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-CJhOuqDg.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-CvX7mojg.js 632 kB 632 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-BBP9kkTE.js 312 kB 312 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-CS5mlw4Q.js 111 kB 111 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-DOEEpxXk.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-BtrvIr1x.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-gAWmQIF-.js 110 kB 110 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7 MB (baseline 6.99 MB) • 🔴 +1.57 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-Cp1_PLw2.js (new) 478 kB 🔴 +478 kB 🔴 +91.7 kB 🔴 +71.5 kB
assets/i18n-X9Z2cXOj.js (removed) 477 kB 🟢 -477 kB 🟢 -91.6 kB 🟢 -71.5 kB
assets/groupNode-D4gA6OMi.js (new) 72.2 kB 🔴 +72.2 kB 🔴 +17.8 kB 🔴 +15.7 kB
assets/core-BIeIgfBN.js (new) 71.4 kB 🔴 +71.4 kB 🔴 +18.4 kB 🔴 +15.8 kB
assets/core-zl4exyII.js (removed) 71.4 kB 🟢 -71.4 kB 🟢 -18.4 kB 🟢 -15.8 kB
assets/groupNode-Dmr45Y8E.js (removed) 70.9 kB 🟢 -70.9 kB 🟢 -17.5 kB 🟢 -15.4 kB
assets/WidgetSelect-Cc5rN8ZO.js (new) 56.6 kB 🔴 +56.6 kB 🔴 +12 kB 🔴 +10.4 kB
assets/WidgetSelect-Kol9eZRb.js (removed) 56.6 kB 🟢 -56.6 kB 🟢 -12 kB 🟢 -10.4 kB
assets/SettingDialogContent-BQX8gVH-.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -8.01 kB 🟢 -7.05 kB
assets/SettingDialogContent-D5UiTwUH.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +8 kB 🔴 +7.05 kB
assets/Load3DControls-a43DnjLE.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -5.33 kB 🟢 -4.63 kB
assets/Load3DControls-C6b2zWc6.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +5.33 kB 🔴 +4.63 kB
assets/SubscriptionRequiredDialogContent-oGzIbQ1v.js (new) 25.4 kB 🔴 +25.4 kB 🔴 +6.36 kB 🔴 +5.58 kB
assets/SubscriptionRequiredDialogContent-RNBNNYy3.js (removed) 25.4 kB 🟢 -25.4 kB 🟢 -6.36 kB 🟢 -5.58 kB
assets/Load3dViewerContent-BkBX_V9A.js (new) 23.2 kB 🔴 +23.2 kB 🔴 +5.24 kB 🔴 +4.54 kB
assets/Load3dViewerContent-C5v1TLTI.js (removed) 23.2 kB 🟢 -23.2 kB 🟢 -5.24 kB 🟢 -4.54 kB
assets/WidgetImageCrop-B7zktpVB.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.51 kB 🔴 +4.85 kB
assets/WidgetImageCrop-QtmRzwG0.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.51 kB 🟢 -4.85 kB
assets/FormItem-D7OsHLOy.js (new) 20.2 kB 🔴 +20.2 kB 🔴 +4.87 kB 🔴 +4.25 kB
assets/FormItem-DPRtPeIH.js (removed) 20.2 kB 🟢 -20.2 kB 🟢 -4.87 kB 🟢 -4.25 kB
assets/CurrentUserPopoverWorkspace-4_ycRzRH.js (new) 19.7 kB 🔴 +19.7 kB 🔴 +4.74 kB 🔴 +4.22 kB
assets/CurrentUserPopoverWorkspace-D5upI_YJ.js (removed) 19.7 kB 🟢 -19.7 kB 🟢 -4.74 kB 🟢 -4.23 kB
assets/SignInContent-BQuUTxlf.js (new) 19 kB 🔴 +19 kB 🔴 +4.8 kB 🔴 +4.2 kB
assets/SignInContent-Mt9oSYIt.js (removed) 19 kB 🟢 -19 kB 🟢 -4.8 kB 🟢 -4.2 kB
assets/WidgetRecordAudio-BNxq2p8S.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +4.93 kB 🔴 +4.41 kB
assets/WidgetRecordAudio-BrZpz-Mw.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -4.93 kB 🟢 -4.4 kB
assets/TopUpCreditsDialogContent-BWoCsUZG.js (removed) 16.9 kB 🟢 -16.9 kB 🟢 -4.8 kB 🟢 -4.25 kB
assets/TopUpCreditsDialogContent-qH2aMOqN.js (new) 16.9 kB 🔴 +16.9 kB 🔴 +4.8 kB 🔴 +4.25 kB
assets/Load3D-CfH-PZzy.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.04 kB 🟢 -3.51 kB
assets/Load3D-VWc5XSDx.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.04 kB 🔴 +3.51 kB
assets/MissingModelsWarning-DyAO1hpS.js (new) 16.1 kB 🔴 +16.1 kB 🔴 +4.4 kB 🔴 +3.91 kB
assets/MissingModelsWarning-eYTJYbgJ.js (removed) 16.1 kB 🟢 -16.1 kB 🟢 -4.4 kB 🟢 -3.92 kB
assets/SubscriptionPanelContentWorkspace-CsVJ5_Fu.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -4.04 kB 🟢 -3.56 kB
assets/SubscriptionPanelContentWorkspace-CYHnw2R0.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.04 kB 🔴 +3.55 kB
assets/WidgetInputNumber-7AWP-56b.js (removed) 15.2 kB 🟢 -15.2 kB 🟢 -4.15 kB 🟢 -3.69 kB
assets/WidgetInputNumber-B-xJTJY3.js (new) 15.2 kB 🔴 +15.2 kB 🔴 +4.15 kB 🔴 +3.7 kB
assets/load3d-Cxgnbu3E.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.18 kB 🔴 +3.64 kB
assets/load3d-D1LgMv6c.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.18 kB 🟢 -3.64 kB
assets/NodeConflictDialogContent-biar4Xn7.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.37 kB 🟢 -2.07 kB
assets/NodeConflictDialogContent-D4dVFT07.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.36 kB 🔴 +2.06 kB
assets/AudioPreviewPlayer-BAfMe_OR.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.99 kB 🔴 +2.68 kB
assets/AudioPreviewPlayer-D6AB0PtU.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.99 kB 🟢 -2.68 kB
assets/nodeTemplates-27zalhhk.js (removed) 9.33 kB 🟢 -9.33 kB 🟢 -3.27 kB 🟢 -2.88 kB
assets/nodeTemplates-CfIhCSxl.js (new) 9.33 kB 🔴 +9.33 kB 🔴 +3.27 kB 🔴 +2.88 kB
assets/InviteMemberDialogContent-CEHqqo26.js (removed) 7.95 kB 🟢 -7.95 kB 🟢 -2.57 kB 🟢 -2.24 kB
assets/InviteMemberDialogContent-DHfbg8EV.js (new) 7.95 kB 🔴 +7.95 kB 🔴 +2.56 kB 🔴 +2.22 kB
assets/WidgetWithControl-C3QgDlHc.js (removed) 6.97 kB 🟢 -6.97 kB 🟢 -2.59 kB 🟢 -2.32 kB
assets/WidgetWithControl-GDlMIaY_.js (new) 6.97 kB 🔴 +6.97 kB 🔴 +2.59 kB 🔴 +2.31 kB
assets/Load3DConfiguration-D2re9bna.js (new) 6.36 kB 🔴 +6.36 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/Load3DConfiguration-Do4V8CNb.js (removed) 6.36 kB 🟢 -6.36 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/MissingNodesContent-C905TLvF.js (new) 6.14 kB 🔴 +6.14 kB 🔴 +2.08 kB 🔴 +1.85 kB
assets/MissingNodesContent-DqkkAoGI.js (removed) 6.14 kB 🟢 -6.14 kB 🟢 -2.09 kB 🟢 -1.86 kB
assets/CreateWorkspaceDialogContent-B0leYcIz.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -2 kB 🟢 -1.75 kB
assets/CreateWorkspaceDialogContent-Cwuj8GPt.js (new) 5.58 kB 🔴 +5.58 kB 🔴 +2 kB 🔴 +1.74 kB
assets/EditWorkspaceDialogContent-CLAnkOWv.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.96 kB 🔴 +1.7 kB
assets/EditWorkspaceDialogContent-DeXiQpU_.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.96 kB 🟢 -1.71 kB
assets/ValueControlPopover-DAwCCRLC.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.78 kB 🟢 -1.59 kB
assets/ValueControlPopover-DOwk8kHu.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.77 kB 🔴 +1.58 kB
assets/Preview3d-C_HbjOgH.js (new) 4.82 kB 🔴 +4.82 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/Preview3d-CIyjBpaC.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.57 kB 🟢 -1.36 kB
assets/MissingNodesFooter-9oJQsOlh.js (removed) 4.8 kB 🟢 -4.8 kB 🟢 -1.78 kB 🟢 -1.58 kB
assets/MissingNodesFooter-CL3xaq5F.js (new) 4.8 kB 🔴 +4.8 kB 🔴 +1.78 kB 🔴 +1.58 kB
assets/DeleteWorkspaceDialogContent-CH1dljTg.js (new) 4.28 kB 🔴 +4.28 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/DeleteWorkspaceDialogContent-xNIBouXd.js (removed) 4.28 kB 🟢 -4.28 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/LeaveWorkspaceDialogContent-bD4Ldtl0.js (removed) 4.11 kB 🟢 -4.11 kB 🟢 -1.59 kB 🟢 -1.38 kB
assets/LeaveWorkspaceDialogContent-UYkbQeTF.js (new) 4.11 kB 🔴 +4.11 kB 🔴 +1.59 kB 🔴 +1.38 kB
assets/RemoveMemberDialogContent-BAD3RKck.js (removed) 4.09 kB 🟢 -4.09 kB 🟢 -1.54 kB 🟢 -1.34 kB
assets/RemoveMemberDialogContent-DTso0N8L.js (new) 4.09 kB 🔴 +4.09 kB 🔴 +1.54 kB 🔴 +1.34 kB
assets/RevokeInviteDialogContent-BS43YreO.js (removed) 4 kB 🟢 -4 kB 🟢 -1.56 kB 🟢 -1.36 kB
assets/RevokeInviteDialogContent-DWKBFLN7.js (new) 4 kB 🔴 +4 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/saveMesh-CVta-SJw.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.29 kB
assets/saveMesh-DjEbXslN.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.45 kB 🔴 +1.29 kB
assets/cloudSessionCookie-CWoPIVPu.js (new) 3.07 kB 🔴 +3.07 kB 🔴 +1.08 kB 🔴 +977 B
assets/cloudSessionCookie-DKvFozo5.js (removed) 3.07 kB 🟢 -3.07 kB 🟢 -1.09 kB 🟢 -960 B
assets/ApiNodesSignInContent-8mJCVw1_.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +949 B
assets/ApiNodesSignInContent-MvbV6G3r.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -918 B
assets/NodeConflictFooter-Bs4Hjjms.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.03 kB 🔴 +902 B
assets/NodeConflictFooter-uM2WmU4B.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.03 kB 🟢 -900 B
assets/GlobalToast-C_-iz-5k.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -964 B 🟢 -799 B
assets/GlobalToast-C1Zl-cv6.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +966 B 🔴 +805 B
assets/SubscribeToRun-ABEE-zoJ.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -990 B 🟢 -869 B
assets/SubscribeToRun-Dh4oXDta.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +989 B 🔴 +855 B
assets/ImportFailedNodeFooter-5_F1JKgF.js (new) 1.88 kB 🔴 +1.88 kB 🔴 +866 B 🔴 +756 B
assets/ImportFailedNodeFooter-BCU1GFLx.js (removed) 1.88 kB 🟢 -1.88 kB 🟢 -867 B 🟢 -753 B
assets/CloudRunButtonWrapper-B9K_KHs9.js (removed) 1.67 kB 🟢 -1.67 kB 🟢 -781 B 🟢 -703 B
assets/CloudRunButtonWrapper-DRVnofs2.js (new) 1.67 kB 🔴 +1.67 kB 🔴 +779 B 🔴 +696 B
assets/signInSchema-CG7cfLMB.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +563 B 🔴 +521 B
assets/signInSchema-DvZ_GQDz.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -563 B 🟢 -521 B
assets/cloudBadges-C3b0HroG.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -699 B 🟢 -614 B
assets/cloudBadges-CzQKDNlg.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +701 B 🔴 +612 B
assets/cloudSubscription-CHnQx3om.js (removed) 1.32 kB 🟢 -1.32 kB 🟢 -650 B 🟢 -564 B
assets/cloudSubscription-D9faEp2Z.js (new) 1.32 kB 🔴 +1.32 kB 🔴 +651 B 🔴 +564 B
assets/SubscriptionPanelContentWorkspace-BN0iX0em.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +478 B 🔴 +413 B
assets/SubscriptionPanelContentWorkspace-CKlT65V6.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -480 B 🟢 -423 B
assets/Load3D-BlfWDy3m.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -486 B 🟢 -436 B
assets/Load3D-dx1Q0n64.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +485 B 🔴 +430 B
assets/nightlyBadges-COh56Jme.js (new) 1 kB 🔴 +1 kB 🔴 +535 B 🔴 +474 B
assets/nightlyBadges-DCKTY-CI.js (removed) 1 kB 🟢 -1 kB 🟢 -537 B 🟢 -474 B
assets/Load3dViewerContent-CHAp9UMY.js (new) 961 B 🔴 +961 B 🔴 +455 B 🔴 +404 B
assets/Load3dViewerContent-tHcW2VzU.js (removed) 961 B 🟢 -961 B 🟢 -455 B 🟢 -405 B
assets/SettingDialogContent-Be9Zu5Cr.js (new) 917 B 🔴 +917 B 🔴 +439 B 🔴 +387 B
assets/SettingDialogContent-DG3l0ojI.js (removed) 917 B 🟢 -917 B 🟢 -444 B 🟢 -394 B
assets/graphHasMissingNodes-CzQ87gYO.js (new) 761 B 🔴 +761 B 🔴 +377 B 🔴 +320 B
assets/graphHasMissingNodes-DWo7soWK.js (removed) 761 B 🟢 -761 B 🟢 -373 B 🟢 -321 B
assets/WidgetLegacy-B_ovM54s.js (new) 747 B 🔴 +747 B 🔴 +385 B 🔴 +334 B
assets/WidgetLegacy-cY0VzkRq.js (removed) 747 B 🟢 -747 B 🟢 -387 B 🟢 -335 B
assets/WidgetInputNumber-BQLFwvJd.js (new) 392 B 🔴 +392 B 🔴 +231 B 🔴 +197 B
assets/WidgetInputNumber-PJRqhk0K.js (removed) 392 B 🟢 -392 B 🟢 -231 B 🟢 -196 B
assets/i18n-BRdeD0XW.js (new) 199 B 🔴 +199 B 🔴 +160 B 🔴 +139 B
assets/i18n-CnBvnK6p.js (removed) 199 B 🟢 -199 B 🟢 -162 B 🟢 -140 B
assets/AnimationControls-bPyINTJI.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-DjoqfnTX.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-BnXUotno.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-DCVL1uOL.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-32ZIoIYN.js 909 B 909 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-7WXVxhf9.js 14.6 kB 14.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BNcWkRcH.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cchriln7.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-COsT3jlc.js 16 kB 16 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CpqJ59mV.js 16.8 kB 16.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-dco-b4jy.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Dj4qNjPR.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-gwZZf095.js 14.4 kB 14.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-jn33Krva.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-kIN_T4OP.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-mTEY_dzO.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeContent-VPjQzi79.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeHeader-DUns4_x2.js 1.08 kB 1.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-CVvKb-rW.js 12.3 kB 12.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-52xlT-Ug.js 123 kB 123 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BSDehj2g.js 110 kB 110 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CNrh2EXC.js 142 kB 142 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-COWu6IjP.js 148 kB 148 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CsstU8yN.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CVzat0oT.js 127 kB 127 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D8nPCauY.js 123 kB 123 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D8tb-3cK.js 172 kB 172 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DVf2v3c_.js 126 kB 126 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-t49CeUL3.js 130 kB 130 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-zSeBmQdW.js 153 kB 153 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-DTYkrVtB.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-AFmsiWi3.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-ATOoJCQr.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-CQw3f2T6.js 2.23 kB 2.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingNodesHeader-BOlbqJ0O.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-Dq6XmUX_.js 92 B 92 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictHeader-DRxQs5TH.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BBikL99U.js 402 kB 402 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bgtag9DY.js 327 kB 327 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BnZXyvbU.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CAPDgxpo.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CnTAWKol.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DApAVd9P.js 438 kB 438 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Ddt5btWO.js 362 kB 362 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-J5vOBP7A.js 371 kB 371 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-JbslHoIm.js 330 kB 330 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-tOnwJjdt.js 351 kB 351 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-xgKzeW17.js 355 kB 355 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/PanelTemplate-C1h0RxBM.js 1.2 kB 1.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DsBk66MD.js 665 B 665 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-Ca2S-reV.js 1.87 kB 1.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-RIZ7-gt8.js 8.81 kB 8.81 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SettingDialogHeader-BHt-6Ao_.js 1.62 kB 1.62 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SettingDialogHeader-D5wathvf.js 244 B 244 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-Bh_ZdHn9.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-DAMctjF_.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-VDank0gz.js 318 B 318 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-RLUqfB5N.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-2w5BjjHm.js 3.94 kB 3.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-Djm16aYN.js 131 B 131 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-Dsp6bf_j.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-jDbRm4n6.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-C8ikSQqn.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-B1RSu0_k.js 3.1 kB 3.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-MXN3EUoN.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-BcUSnWUK.js 1.95 kB 1.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-wePHc2fh.js 2.88 kB 2.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DyQHILEf.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-COgaptkR.js 3.09 kB 3.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-CoKD027B.js 2.5 kB 2.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-BCsKJASV.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 55 added / 55 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: 2

🤖 Fix all issues with AI agents
In `@src/platform/assets/utils/createAssetWidget.ts`:
- Around line 67-72: The console.error call in createAssetWidget.ts currently
logs the entire asset payload (asset) on validation failure; change it to avoid
printing sensitive data by removing the asset object from the log and instead
log only safe identifiers or metadata (e.g., asset.id, asset.name, or
validatedAsset.error.errors) or a redacted placeholder; update the call that
references validatedAsset and asset so it emits a concise message with those
identifiers and the validation errors rather than the full payload.

In `@src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts`:
- Around line 85-99: The asset browser is missing the inputNameForBrowser so
nodes with multiple model inputs can get incorrect asset lists; update
createAssetBrowserWidget to pass inputNameForBrowser into the createAssetWidget
call (use inputSpec.inputNameForBrowser, falling back to inputSpec.name if
absent) so the widget receives the correct input identifier for asset filtering;
modify the object passed to createAssetWidget in createAssetBrowserWidget to
include this property while keeping the existing onValueChange, node,
widgetName, nodeTypeForBrowser and defaultValue fields.

Comment on lines +67 to +72
console.error(
'Invalid asset item:',
validatedAsset.error.errors,
'Received:',
asset
)
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

Avoid logging full asset payloads.

Line 67 logs the entire asset object on validation failure, which can expose user-provided paths/URLs in logs. Log only safe identifiers or omit the payload entirely.

🛡️ Suggested change
-          console.error(
-            'Invalid asset item:',
-            validatedAsset.error.errors,
-            'Received:',
-            asset
-          )
+          console.error('Invalid asset item:', validatedAsset.error.errors)
As per coding guidelines: Never log secrets.
📝 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
console.error(
'Invalid asset item:',
validatedAsset.error.errors,
'Received:',
asset
)
console.error('Invalid asset item:', validatedAsset.error.errors)
🤖 Prompt for AI Agents
In `@src/platform/assets/utils/createAssetWidget.ts` around lines 67 - 72, The
console.error call in createAssetWidget.ts currently logs the entire asset
payload (asset) on validation failure; change it to avoid printing sensitive
data by removing the asset object from the log and instead log only safe
identifiers or metadata (e.g., asset.id, asset.name, or
validatedAsset.error.errors) or a redacted placeholder; update the call that
references validatedAsset and asset so it emits a concise message with those
identifiers and the validation errors rather than the full payload.

Comment on lines +85 to 99
function createAssetBrowserWidget(
node: LGraphNode,
inputSpec: ComboInputSpec,
defaultValue: string | undefined
): IBaseWidget => {
const currentValue = defaultValue
const displayLabel = currentValue ?? t('widgets.selectModel')
const assetBrowserDialog = useAssetBrowserDialog()

async function openModal(widget: IBaseWidget) {
if (!isAssetWidget(widget)) {
throw new Error(`Expected asset widget but received ${widget.type}`)
): IBaseWidget {
return createAssetWidget({
node,
widgetName: inputSpec.name,
nodeTypeForBrowser: node.comfyClass ?? '',
defaultValue,
onValueChange: (widget, newValue, oldValue) => {
node.onWidgetChanged?.(widget.name, newValue, oldValue, widget)
}
await assetBrowserDialog.show({
nodeType: node.comfyClass || '',
inputName: inputSpec.name,
currentValue: widget.value,
onAssetSelected: (asset) => {
const validatedAsset = assetItemSchema.safeParse(asset)

if (!validatedAsset.success) {
console.error(
'Invalid asset item:',
validatedAsset.error.errors,
'Received:',
asset
)
return
}

const filename = getAssetFilename(validatedAsset.data)
const validatedFilename = assetFilenameSchema.safeParse(filename)

if (!validatedFilename.success) {
console.error(
'Invalid asset filename:',
validatedFilename.error.errors,
'for asset:',
validatedAsset.data.id
)
return
}

const oldValue = widget.value
widget.value = validatedFilename.data
node.onWidgetChanged?.(
widget.name,
validatedFilename.data,
oldValue,
widget
)
}
})
}
const options: IWidgetAssetOptions = { openModal }

const widget = node.addWidget(
'asset',
inputSpec.name,
displayLabel,
() => undefined,
options
)

return widget
})
}
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

Pass inputNameForBrowser to keep asset filtering accurate.
Without it, nodes with multiple model inputs (e.g., checkpoint vs LoRA) can surface the wrong asset set.

Suggested fix
 return createAssetWidget({
   node,
   widgetName: inputSpec.name,
   nodeTypeForBrowser: node.comfyClass ?? '',
+  inputNameForBrowser: inputSpec.name,
   defaultValue,
   onValueChange: (widget, newValue, oldValue) => {
     node.onWidgetChanged?.(widget.name, newValue, oldValue, widget)
   }
 })
📝 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
function createAssetBrowserWidget(
node: LGraphNode,
inputSpec: ComboInputSpec,
defaultValue: string | undefined
): IBaseWidget => {
const currentValue = defaultValue
const displayLabel = currentValue ?? t('widgets.selectModel')
const assetBrowserDialog = useAssetBrowserDialog()
async function openModal(widget: IBaseWidget) {
if (!isAssetWidget(widget)) {
throw new Error(`Expected asset widget but received ${widget.type}`)
): IBaseWidget {
return createAssetWidget({
node,
widgetName: inputSpec.name,
nodeTypeForBrowser: node.comfyClass ?? '',
defaultValue,
onValueChange: (widget, newValue, oldValue) => {
node.onWidgetChanged?.(widget.name, newValue, oldValue, widget)
}
await assetBrowserDialog.show({
nodeType: node.comfyClass || '',
inputName: inputSpec.name,
currentValue: widget.value,
onAssetSelected: (asset) => {
const validatedAsset = assetItemSchema.safeParse(asset)
if (!validatedAsset.success) {
console.error(
'Invalid asset item:',
validatedAsset.error.errors,
'Received:',
asset
)
return
}
const filename = getAssetFilename(validatedAsset.data)
const validatedFilename = assetFilenameSchema.safeParse(filename)
if (!validatedFilename.success) {
console.error(
'Invalid asset filename:',
validatedFilename.error.errors,
'for asset:',
validatedAsset.data.id
)
return
}
const oldValue = widget.value
widget.value = validatedFilename.data
node.onWidgetChanged?.(
widget.name,
validatedFilename.data,
oldValue,
widget
)
}
})
}
const options: IWidgetAssetOptions = { openModal }
const widget = node.addWidget(
'asset',
inputSpec.name,
displayLabel,
() => undefined,
options
)
return widget
})
}
function createAssetBrowserWidget(
node: LGraphNode,
inputSpec: ComboInputSpec,
defaultValue: string | undefined
): IBaseWidget {
return createAssetWidget({
node,
widgetName: inputSpec.name,
nodeTypeForBrowser: node.comfyClass ?? '',
inputNameForBrowser: inputSpec.name,
defaultValue,
onValueChange: (widget, newValue, oldValue) => {
node.onWidgetChanged?.(widget.name, newValue, oldValue, widget)
}
})
}
🤖 Prompt for AI Agents
In `@src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts`
around lines 85 - 99, The asset browser is missing the inputNameForBrowser so
nodes with multiple model inputs can get incorrect asset lists; update
createAssetBrowserWidget to pass inputNameForBrowser into the createAssetWidget
call (use inputSpec.inputNameForBrowser, falling back to inputSpec.name if
absent) so the widget receives the correct input identifier for asset filtering;
modify the object passed to createAssetWidget in createAssetBrowserWidget to
include this property while keeping the existing onValueChange, node,
widgetName, nodeTypeForBrowser and defaultValue fields.

@christian-byrne
Copy link
Contributor Author

This was approved on the previous PR (this one is just a re-opening of that)

@christian-byrne
Copy link
Contributor Author

@coderabbitai make a tracking Issue: After #8594 is merged, refactor this code to be simpler if possible.

@christian-byrne christian-byrne merged commit c91d811 into main Feb 8, 2026
33 checks passed
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 8, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

@christian-byrne: I'll create a tracking issue for this refactoring task.


🏁 Script executed:

#!/bin/bash
# Create a GitHub issue for the refactoring task

gh issue create \
  --title "Refactor PrimitiveNode asset widget code after PR `#8594` merges" \
  --body "## Background

This is a follow-up refactoring task for the asset widget support added in PR `#8598`.

## Task

After PR `#8594` is merged, review and refactor the PrimitiveNode asset widget code (specifically in \`src/extensions/core/widgetInputs.ts\` and related files) to simplify it if possible.

## Dependencies

- Blocked by: `#8594`
- Original implementation: `#8598`

## Context

Requested by `@christian-byrne` in https://github.com/Comfy-Org/ComfyUI_frontend/pull/8598" \
  --assignee christian-byrne

Length of output: 57


@christian-byrne: I've created tracking issue #8744 to refactor the PrimitiveNode asset widget code after PR #8594 merges. The issue has been assigned to you.

#8744


🧠 Learnings used
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.

Learnt from: benceruleanlu
Repo: Comfy-Org/ComfyUI_frontend PR: 7297
File: src/components/actionbar/ComfyActionbar.vue:33-43
Timestamp: 2025-12-09T21:40:19.792Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, inline Tailwind CSS class strings, even when long, are acceptable and preferred over extracting them to computed properties when the classes are static. This is a common Tailwind pattern and doesn't need to be flagged as a readability issue.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7649
File: src/platform/cloud/subscription/components/PricingTable.vue:185-201
Timestamp: 2025-12-22T21:36:16.031Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, avoid creating single-use variants for the Button component (and other UI components). Variants should be reusable across multiple use cases. It's acceptable to use a mix of variant props and manual Tailwind classes temporarily when a specific styling need exists in only one place, with consolidation deferred to a later phase when patterns emerge.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 8248
File: src/platform/assets/schemas/assetSchema.ts:109-118
Timestamp: 2026-01-22T23:45:06.746Z
Learning: In the ComfyUI_frontend repository, don't suggest exporting schemas, constants, or other declarations unless they are actually used in other parts of the codebase. Keep the API surface minimal until there's a concrete need.

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.

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:24.164Z
Learning: The project has CI automation that handles code formatting (pnpm format) automatically, so manual formatting suggestions should not be provided in code reviews for the Comfy-Org/ComfyUI_frontend repository.

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:17.361Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, prefer pure function declarations (e.g., `function foo() { ... }`) over function expressions (e.g., `const foo = () => { ... }`) for pure functions, as function declarations are considered more functional than function expressions.

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.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7537
File: pnpm-workspace.yaml:50-50
Timestamp: 2025-12-16T22:22:06.840Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, the project uses cva1.0.0-beta.4 (beta version) by deliberate choice. Do not suggest replacing it with class-variance-authority or flagging it as a beta dependency concern.

Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 6300
File: src/platform/updates/components/WhatsNewPopup.vue:5-13
Timestamp: 2025-12-09T03:50:03.127Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, when avoiding PrimeVue components, prefer using the repo's common button components from src/components/button/ (IconButton.vue, TextButton.vue, IconTextButton.vue) rather than plain HTML buttons. These components wrap PrimeVue with custom design system styling.

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.

1 participant