Skip to content

Updates: Model Management#8248

Merged
DrJKL merged 14 commits intomainfrom
drjkl/mm-1
Jan 23, 2026
Merged

Updates: Model Management#8248
DrJKL merged 14 commits intomainfrom
drjkl/mm-1

Conversation

@DrJKL
Copy link
Contributor

@DrJKL DrJKL commented Jan 22, 2026

Summary

Model management improvements: refactored tag API, enhanced UX for trigger phrases and editing.

Changes

API Refactor

  • Add addAssetTags (POST) and removeAssetTags (DELETE) endpoints in assetService
  • updateAssetTags now computes diff and calls remove/add serially
  • Add TagsOperationResult schema; cache syncs with server response

UX Improvements

  • Trigger phrases: click to copy individual phrases, copy-all button in header
  • Display name: show edit icon on hover instead of relying on double-click
  • Model type: show plain text when immutable instead of disabled select
  • Tags input: only show edit icon on hover
  • Field labels: updated styling to use muted foreground color
  • Optimistic update for model type selection

DrJKL and others added 2 commits January 22, 2026 12:33
- Add addAssetTags (POST) and removeAssetTags (DELETE) in assetService

- Add TagsOperationResult schema and type

- Update updateAssetTags to compute diff with es-toolkit difference

- Update cache with server response after operations

- Pass asset object to updateAssetTags for current tags access

Amp-Thread-ID: https://ampcode.com/threads/T-019be775-4085-750c-a7a8-190760deaae4
Co-authored-by: Amp <amp@ampcode.com>
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 22, 2026

📝 Walkthrough

Walkthrough

Adds tag add/remove APIs and store logic with diffed optimistic updates, updates model info UI with copy/edit controls and pendingModelType handling, introduces a new button size variant unset, and adds localization keys (g.copyAll, assetBrowser.modelInfo.editDisplayName). Method signatures changed to accept asset objects.

Changes

Cohort / File(s) Summary
UI Button & Input
src/components/ui/button/button.variants.ts, src/components/ui/tags-input/TagsInput.vue
Added new unset size key to button variants; made TagsInput pen icon hidden by default and visible on group hover via transition/opacity classes.
Model Info UI
src/platform/assets/components/modelInfo/ModelInfoField.vue, src/platform/assets/components/modelInfo/ModelInfoPanel.vue, src/platform/assets/components/modelInfo/ModelInfoPanel.test.ts
Reworked layout/styling, added label-action slot and edit-toggle for display name, conditional Select/read-only model type rendering, trigger-phrases copy-all and per-item copy buttons using copyToClipboard (mocked in tests), introduced pendingModelType with debounced save, and updated call sites to pass asset objects to store methods.
Localization
src/locales/en/main.json
Added g.copyAll = "Copy All" and assetBrowser.modelInfo.editDisplayName = "Edit display name".
Asset Schemas
src/platform/assets/schemas/assetSchema.ts
Added tagsOperationResultSchema (Zod) and exported TagsOperationResult type (total_tags, added, removed, already_present, not_present).
Asset Service Layer
src/platform/assets/services/assetService.ts
Added addAssetTags(id, tags) and removeAssetTags(id, tags) API methods returning TagsOperationResult, with response validation and error handling; exported new methods/types.
Asset State Management
src/stores/assetsStore.ts
Refactored updateAssetMetadata and updateAssetTags to accept AssetItem objects; compute tag diffs (es-toolkit difference), perform optimistic cache updates, call service add/remove sequentially, reconcile cache with server result, and revert on error.

Sequence Diagram(s)

sequenceDiagram
  participant User as User
  participant MIP as ModelInfoPanel
  participant Store as AssetsStore
  participant Service as AssetService
  participant Server as Server

  User->>MIP: request tag change (add/remove)
  MIP->>Store: updateAssetTags(asset, newTags)
  Store->>Store: compute diff (adds, removes)
  Store->>Store: optimistic cache update (new tag set)
  alt has adds
    Store->>Service: addAssetTags(asset.id, adds)
    Service->>Server: POST /assets/{id}/tags
    Server-->>Service: TagsOperationResult
    Service-->>Store: result
  end
  alt has removes
    Store->>Service: removeAssetTags(asset.id, removes)
    Service->>Server: DELETE /assets/{id}/tags
    Server-->>Service: TagsOperationResult
    Service-->>Store: result
  end
  Store->>Store: update cache with final server tag state
  Store-->>MIP: success
  alt failure
    Store->>Store: revert cache to original tags
    Store-->>MIP: error
  end
Loading

Possibly related PRs

Suggested reviewers

  • luke-mino-altherr
  • shinshin86
  • KarryCharon
  • christian-byrne
  • Yorha4D
  • viva-jinyi
✨ Finishing touches
  • 📝 Generate docstrings

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

@github-actions
Copy link

github-actions bot commented Jan 22, 2026

🎭 Playwright Tests: ⚠️ Passed with flaky tests

Results: 503 passed, 0 failed, 2 flaky, 8 skipped (Total: 513)

❌ Failed Tests

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

@github-actions
Copy link

github-actions bot commented Jan 22, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/23/2026, 12:06:56 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 22, 2026

Bundle Size Report

Summary

  • Raw size: 21.8 MB baseline 21.8 MB — 🔴 +5.01 kB
  • Gzip: 4.53 MB baseline 4.53 MB — 🔴 +963 B
  • Brotli: 3.36 MB baseline 3.36 MB — 🔴 +523 B
  • Bundles: 166 current • 166 baseline • 97 added / 97 removed

Category Glance
Data & Services 🔴 +5.15 kB (3.17 MB) · Other 🟢 -192 B (6.36 MB) · Vendor & Third-Party 🔴 +42 B (10.7 MB) · UI Components 🔴 +15 B (33.7 kB) · Panels & Settings 🟢 -8 B (440 kB) · Graph Workspace ⚪ 0 B (948 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CuzZZ5GU.js (removed) 22.7 kB 🟢 -22.7 kB 🟢 -6.82 kB 🟢 -5.98 kB
assets/index-Px1IwI1q.js (new) 22.7 kB 🔴 +22.7 kB 🔴 +6.83 kB 🔴 +6.02 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BnXzAT9p.js (removed) 948 kB 🟢 -948 kB 🟢 -191 kB 🟢 -145 kB
assets/GraphView-DPBbCQr5.js (new) 948 kB 🔴 +948 kB 🔴 +191 kB 🔴 +145 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BW8OX_xb.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.6 kB 🔴 +3.05 kB
assets/CloudSurveyView-DKKCw3dJ.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.6 kB 🟢 -3.06 kB
assets/CloudLoginView-BsabqiFQ.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.71 kB
assets/CloudLoginView-PbYEPlFI.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.09 kB 🔴 +2.71 kB
assets/UserCheckView-BfyTGzgP.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.44 kB 🟢 -2.13 kB
assets/UserCheckView-DzWBHkd_.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.45 kB 🔴 +2.13 kB
assets/CloudLayoutView-DWAYZBrd.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.25 kB 🟢 -1.96 kB
assets/CloudLayoutView-wBP67RnR.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.24 kB 🔴 +1.96 kB
assets/CloudSignupView-B-ypZv1z.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.02 kB
assets/CloudSignupView-bmnu0mMO.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.33 kB 🔴 +2.02 kB
assets/CloudForgotPasswordView-BBpkPAGp.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/CloudForgotPasswordView-CDYGRb5A.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/UserSelectView-BMyzGnj5.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/UserSelectView-W9IsZCPR.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.58 kB
assets/CloudSubscriptionRedirectView-DNLc13SE.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.55 kB
assets/CloudSubscriptionRedirectView-UH7NwZog.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-BemZDnr4.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/CloudAuthTimeoutView-DZ_IDVzU.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.71 kB 🟢 -1.49 kB
assets/CloudSorryContactSupportView-Ceb651-z.js (removed) 1.97 kB 🟢 -1.97 kB 🟢 -701 B 🟢 -626 B
assets/CloudSorryContactSupportView-CIWojqyX.js (new) 1.97 kB 🔴 +1.97 kB 🔴 +703 B 🔴 +624 B
assets/layout-C_nLy0hJ.js (removed) 500 B 🟢 -500 B 🟢 -308 B 🟢 -265 B
assets/layout-DQZzOBYR.js (new) 500 B 🔴 +500 B 🔴 +310 B 🔴 +265 B

Status: 11 added / 11 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/LegacyCreditsPanel-Cdbecvem.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.94 kB 🔴 +5.22 kB
assets/LegacyCreditsPanel-CmeSlXCM.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.95 kB 🟢 -5.22 kB
assets/SubscriptionPanel-CKNomoBM.js (removed) 20.9 kB 🟢 -20.9 kB 🟢 -5.01 kB 🟢 -4.41 kB
assets/SubscriptionPanel-CpyycY3F.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +5.01 kB 🔴 +4.42 kB
assets/KeybindingPanel-BpYt7D8O.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.73 kB 🟢 -3.31 kB
assets/KeybindingPanel-Cg822c3Y.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.73 kB 🔴 +3.31 kB
assets/AboutPanel-CCvzB9L4.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.43 kB
assets/AboutPanel-Ck6gvffy.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.43 kB
assets/ExtensionPanel-Cj6uP4do.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ExtensionPanel-D-qE92e2.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/WorkspacePanel-CuRNMUtS.js (removed) 8.17 kB 🟢 -8.17 kB 🟢 -2.31 kB 🟢 -2.08 kB
assets/WorkspacePanel-DhzB-WJ6.js (new) 8.17 kB 🔴 +8.17 kB 🔴 +2.31 kB 🔴 +2.08 kB
assets/ServerConfigPanel-B2ZIkiRS.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.17 kB 🔴 +1.94 kB
assets/ServerConfigPanel-DZWamyrN.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.16 kB 🟢 -1.94 kB
assets/UserPanel-CtkNwnR-.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.9 kB 🟢 -1.67 kB
assets/UserPanel-CWuwpNoP.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.9 kB 🔴 +1.68 kB
assets/cloudRemoteConfig-BuT0doWG.js (new) 1.82 kB 🔴 +1.82 kB 🔴 +774 B 🔴 +655 B
assets/cloudRemoteConfig-CsPnW9S3.js (removed) 1.82 kB 🟢 -1.82 kB 🟢 -772 B 🟢 -658 B
assets/config-CKLSWy23.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -610 B 🟢 -538 B
assets/config-CZtFCKbI.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +604 B 🔴 +533 B
assets/remoteConfig-CZVd5eda.js 188 B 188 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/remoteConfig-maWXk_kA.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-_w0F8Os2.js 30.4 kB 30.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BcyB3JCe.js 28.9 kB 28.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BhNjTsTR.js 29.6 kB 29.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bv3zi5bR.js 34.3 kB 34.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BXVr0R9W.js 38.3 kB 38.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Ca_EqdTH.js 31.2 kB 31.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Ccc7OH1N.js 28.6 kB 28.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CheSGCN4.js 32.1 kB 32.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CY-0EA4m.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dkz0uATE.js 29.5 kB 29.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DNMBWO2D.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-D0G9RPFD.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.06 kB
assets/auth-DB4uYXOi.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.06 kB
assets/firebaseAuthStore-CruQhXf8.js (new) 217 B 🔴 +217 B 🔴 +136 B 🔴 +117 B
assets/firebaseAuthStore-DjWI2bwa.js (removed) 217 B 🟢 -217 B 🟢 -136 B 🟢 -118 B
assets/auth-CvXve3jy.js (new) 178 B 🔴 +178 B 🔴 +142 B 🔴 +137 B
assets/auth-rn0Gy5Xm.js (removed) 178 B 🟢 -178 B 🟢 -142 B 🟢 -132 B

Status: 3 added / 3 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-BaEm_cmG.js (new) 2.65 kB 🔴 +2.65 kB 🔴 +1.25 kB 🔴 +1.1 kB
assets/useSubscriptionDialog-Cg5gMyqI.js (removed) 2.65 kB 🟢 -2.65 kB 🟢 -1.25 kB 🟢 -1.11 kB
assets/useSubscriptionDialog-BXLwkdDk.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -99 B
assets/useSubscriptionDialog-JABibKC4.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +97 B

Status: 2 added / 2 removed

UI Components — 33.7 kB (baseline 33.7 kB) • 🔴 +15 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-Ct26iEte.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.69 kB 🟢 -2.41 kB
assets/ComfyQueueButton-DBNP2dAg.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.41 kB
assets/TopbarBadge-C08Q8m1G.js (removed) 8.36 kB 🟢 -8.36 kB 🟢 -1.97 kB 🟢 -1.76 kB
assets/TopbarBadge-CIuqyTWW.js (new) 8.36 kB 🔴 +8.36 kB 🔴 +1.97 kB 🔴 +1.76 kB
assets/SubscribeButton-CQxWylSO.js (new) 4.63 kB 🔴 +4.63 kB 🔴 +1.57 kB 🔴 +1.38 kB
assets/SubscribeButton-DtSrGncK.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.57 kB 🟢 -1.39 kB
assets/Button-CBiuMrWI.js (new) 3.77 kB 🔴 +3.77 kB 🔴 +1.37 kB 🔴 +1.22 kB
assets/Button-BMxaXlJk.js (removed) 3.76 kB 🟢 -3.76 kB 🟢 -1.36 kB 🟢 -1.2 kB
assets/WidgetButton-B5EfWWKo.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -980 B 🟢 -862 B
assets/WidgetButton-DzXs11SA.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +980 B 🔴 +870 B
assets/CloudBadge-5PcEIqQx.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -724 B 🟢 -649 B
assets/CloudBadge-CDeUqH45.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +724 B 🔴 +642 B
assets/cloudFeedbackTopbarButton-CBXiv2oU.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +676 B 🔴 +577 B
assets/cloudFeedbackTopbarButton-DejoOXZw.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -678 B 🟢 -577 B
assets/ComfyQueueButton-2e1nmpxN.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -112 B
assets/ComfyQueueButton-am93-QUG.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +122 B
assets/UserAvatar-BvUzYvJd.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

Data & Services — 3.17 MB (baseline 3.16 MB) • 🔴 +5.15 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-C9zEOw9X.js (new) 1.99 MB 🔴 +1.99 MB 🔴 +420 kB 🔴 +320 kB
assets/dialogService-D_NKLs0G.js (removed) 1.98 MB 🟢 -1.98 MB 🟢 -419 kB 🟢 -320 kB
assets/api-Bj7B2Mwc.js (new) 1.16 MB 🔴 +1.16 MB 🔴 +241 kB 🔴 +187 kB
assets/api-jWiZCNqp.js (removed) 1.16 MB 🟢 -1.16 MB 🟢 -241 kB 🟢 -187 kB
assets/releaseStore-Bxy5a4ZV.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.41 kB 🟢 -2.12 kB
assets/releaseStore-DUWsozw3.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.4 kB 🔴 +2.12 kB
assets/keybindingService-huLt2zhI.js (removed) 6.78 kB 🟢 -6.78 kB 🟢 -1.74 kB 🟢 -1.51 kB
assets/keybindingService-RVomqF2n.js (new) 6.78 kB 🔴 +6.78 kB 🔴 +1.74 kB 🔴 +1.52 kB
assets/userStore-DJ9GYkNu.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +812 B 🔴 +725 B
assets/userStore-tSv-eovO.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -811 B 🟢 -723 B
assets/audioService-B0cqvOpJ.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +932 B 🔴 +821 B
assets/audioService-B9mMnNjp.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -929 B 🟢 -822 B
assets/teamWorkspaceStore-Bg-1iqEp.js (new) 165 B 🔴 +165 B 🔴 +123 B 🔴 +113 B
assets/teamWorkspaceStore-CeNMAbOz.js (removed) 165 B 🟢 -165 B 🟢 -123 B 🟢 -107 B
assets/releaseStore-BtVE5hJk.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +102 B
assets/releaseStore-xbHVwGQd.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -108 B
assets/serverConfigStore-D6BZBqR8.js 2.64 kB 2.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/colorUtil-CWN_VD-w.js (new) 7.2 kB 🔴 +7.2 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/colorUtil-Xqu3msyF.js (removed) 7.2 kB 🟢 -7.2 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/useErrorHandling-Dc4dTItX.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.5 kB 🔴 +1.31 kB
assets/useErrorHandling-V14F4rp3.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.5 kB 🟢 -1.31 kB
assets/useWorkspaceUI-DSSSdC6T.js (removed) 2.25 kB 🟢 -2.25 kB 🟢 -758 B 🟢 -660 B
assets/useWorkspaceUI-mlmGkPAg.js (new) 2.25 kB 🔴 +2.25 kB 🔴 +757 B 🔴 +659 B
assets/useSubscriptionActions-BWPWlMh9.js (new) 2.22 kB 🔴 +2.22 kB 🔴 +869 B 🔴 +763 B
assets/useSubscriptionActions-CMZqOGnL.js (removed) 2.22 kB 🟢 -2.22 kB 🟢 -869 B 🟢 -760 B
assets/subscriptionCheckoutUtil-B883ftTa.js (new) 1.98 kB 🔴 +1.98 kB 🔴 +861 B 🔴 +746 B
assets/subscriptionCheckoutUtil-BGh7uUKA.js (removed) 1.98 kB 🟢 -1.98 kB 🟢 -864 B 🟢 -749 B
assets/markdownRendererUtil-BH-xeUTY.js (new) 1.78 kB 🔴 +1.78 kB 🔴 +885 B 🔴 +774 B
assets/markdownRendererUtil-D1kHc_L9.js (removed) 1.78 kB 🟢 -1.78 kB 🟢 -885 B 🟢 -773 B
assets/useSubscriptionCredits-aFDG0KLt.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -597 B 🟢 -524 B
assets/useSubscriptionCredits-DW7NYTig.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +599 B 🔴 +528 B
assets/audioUtils-Be3zN2_D.js (new) 970 B 🔴 +970 B 🔴 +549 B 🔴 +459 B
assets/audioUtils-D4agdTAs.js (removed) 970 B 🟢 -970 B 🟢 -547 B 🟢 -488 B
assets/tailwindUtil-aK5ScNeo.js (removed) 488 B 🟢 -488 B 🟢 -294 B 🟢 -270 B
assets/tailwindUtil-CuQ_kVBG.js (new) 488 B 🔴 +488 B 🔴 +295 B 🔴 +268 B
assets/useCurrentUser-BkuWSs9C.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +107 B
assets/useCurrentUser-Ds-c5huR.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -101 B
assets/_plugin-vue_export-helper-Dt9-hEHc.js 467 B 467 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

Vendor & Third-Party — 10.7 MB (baseline 10.7 MB) • 🔴 +42 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-CCO1nq9Q.js (new) 4.1 MB 🔴 +4.1 MB 🔴 +867 kB 🔴 +673 kB
assets/vendor-other-_15fVcZx.js (removed) 4.1 MB 🟢 -4.1 MB 🟢 -867 kB 🟢 -673 kB
assets/vendor-chart-CzCG8jcG.js 408 kB 408 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-D9jS_6ky.js 3.04 MB 3.04 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-C7fVHAth.js 256 kB 256 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-BKj_AHFn.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-CLU9nzy5.js 650 kB 650 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-DhS5MB4h.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-AIoMGdmt.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

Other — 6.36 MB (baseline 6.36 MB) • 🟢 -192 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-fhxk--OI.js (removed) 178 kB 🟢 -178 kB 🟢 -43 kB 🟢 -35.9 kB
assets/core-CksX4-QC.js (new) 178 kB 🔴 +178 kB 🔴 +42.9 kB 🔴 +35.9 kB
assets/Load3D-Bgbvkgmw.js (new) 55.7 kB 🔴 +55.7 kB 🔴 +9.18 kB 🔴 +7.92 kB
assets/Load3D-DsumeT0u.js (removed) 55.7 kB 🟢 -55.7 kB 🟢 -9.18 kB 🟢 -7.92 kB
assets/WidgetSelect-BW2NQ5pi.js (removed) 50.5 kB 🟢 -50.5 kB 🟢 -11.1 kB 🟢 -9.7 kB
assets/WidgetSelect-BWX6o-0f.js (new) 50.5 kB 🔴 +50.5 kB 🔴 +11.1 kB 🔴 +9.69 kB
assets/SubscriptionRequiredDialogContent--J_KtktZ.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.78 kB 🔴 +5.91 kB
assets/SubscriptionRequiredDialogContent-Ds2NZZQy.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.78 kB 🟢 -5.91 kB
assets/CurrentUserPopoverWorkspace-DGp8D2VF.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +4.84 kB 🔴 +4.3 kB
assets/CurrentUserPopoverWorkspace-DH_707bk.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -4.83 kB 🟢 -4.31 kB
assets/WidgetRecordAudio-_kFzIJo6.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.96 kB 🟢 -4.43 kB
assets/WidgetRecordAudio-Bvk9P8EU.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.96 kB 🔴 +4.43 kB
assets/WidgetInputNumber-5ySuK56m.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.49 kB 🟢 -4 kB
assets/WidgetInputNumber-CKOUJIw8.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.5 kB 🔴 +4.01 kB
assets/SubscriptionPanelContentWorkspace-ptmWf7Rm.js (new) 17.7 kB 🔴 +17.7 kB 🔴 +4.34 kB 🔴 +3.78 kB
assets/SubscriptionPanelContentWorkspace-ZwG7gHWz.js (removed) 17.7 kB 🟢 -17.7 kB 🟢 -4.34 kB 🟢 -3.78 kB
assets/WidgetImageCrop-CWRNQouR.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.14 kB 🔴 +3.63 kB
assets/WidgetImageCrop-DXOgoZlh.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.62 kB
assets/PanelTemplate-9450crIk.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.45 kB 🟢 -4.79 kB
assets/PanelTemplate-Bmd8PQmG.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.79 kB
assets/LazyImage-CNRJBOV5.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -4 kB 🟢 -3.54 kB
assets/LazyImage-D6PpiUVK.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +4 kB 🔴 +3.54 kB
assets/AudioPreviewPlayer-CwG1pYN-.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.97 kB 🔴 +2.65 kB
assets/AudioPreviewPlayer-CYl7bvJY.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.97 kB 🟢 -2.65 kB
assets/WidgetWithControl-B37joGyM.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.64 kB 🟢 -2.38 kB
assets/WidgetWithControl-DukGS5Vl.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.65 kB 🔴 +2.39 kB
assets/CreateWorkspaceDialogContent-B1OBZVHR.js (removed) 5.92 kB 🟢 -5.92 kB 🟢 -1.92 kB 🟢 -1.67 kB
assets/CreateWorkspaceDialogContent-BJ8MX0RH.js (new) 5.92 kB 🔴 +5.92 kB 🔴 +1.92 kB 🔴 +1.67 kB
assets/EditWorkspaceDialogContent-CUsOR8vz.js (removed) 5.69 kB 🟢 -5.69 kB 🟢 -1.87 kB 🟢 -1.63 kB
assets/EditWorkspaceDialogContent-EQrN0jkK.js (new) 5.69 kB 🔴 +5.69 kB 🔴 +1.87 kB 🔴 +1.64 kB
assets/ValueControlPopover-BtMhZKXM.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.55 kB 🔴 +1.37 kB
assets/ValueControlPopover-DXfupUDk.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.55 kB 🟢 -1.37 kB
assets/DeleteWorkspaceDialogContent-dHYgXjo2.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.56 kB 🟢 -1.35 kB
assets/DeleteWorkspaceDialogContent-PpPpbzQN.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.56 kB 🔴 +1.35 kB
assets/WidgetGalleria-CElwK2Fd.js (removed) 4.57 kB 🟢 -4.57 kB 🟢 -1.57 kB 🟢 -1.41 kB
assets/WidgetGalleria-CroZXP26.js (new) 4.57 kB 🔴 +4.57 kB 🔴 +1.57 kB 🔴 +1.42 kB
assets/LeaveWorkspaceDialogContent-Cx1-HNWK.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.5 kB 🔴 +1.3 kB
assets/LeaveWorkspaceDialogContent-DT91rOFG.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.5 kB 🟢 -1.3 kB
assets/Slider-BoORvfqb.js (new) 4.21 kB 🔴 +4.21 kB 🔴 +1.52 kB 🔴 +1.34 kB
assets/Slider-DiNe_y99.js (removed) 4.21 kB 🟢 -4.21 kB 🟢 -1.52 kB 🟢 -1.34 kB
assets/WidgetImageCompare-BWtVkybW.js (new) 3.79 kB 🔴 +3.79 kB 🔴 +1.28 kB 🔴 +1.12 kB
assets/WidgetImageCompare-XO9DXq0m.js (removed) 3.79 kB 🟢 -3.79 kB 🟢 -1.28 kB 🟢 -1.12 kB
assets/WidgetColorPicker-BaHD90N-.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.38 kB 🔴 +1.25 kB
assets/WidgetColorPicker-Dt0mJ6ZS.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.38 kB 🟢 -1.25 kB
assets/WidgetTextarea-DZBuNrhg.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.33 kB 🔴 +1.17 kB
assets/WidgetTextarea-rdTTBqY3.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.33 kB 🟢 -1.18 kB
assets/WidgetMarkdown-B3dZxgK8.js (new) 3.22 kB 🔴 +3.22 kB 🔴 +1.28 kB 🔴 +1.13 kB
assets/WidgetMarkdown-DqXY8DpD.js (removed) 3.22 kB 🟢 -3.22 kB 🟢 -1.28 kB 🟢 -1.14 kB
assets/WidgetToggleSwitch-CJnK-DG-.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.19 kB 🔴 +1.07 kB
assets/WidgetToggleSwitch-DMRUqzOA.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.19 kB 🟢 -1.06 kB
assets/GlobalToast--LZqAOKY.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -940 B
assets/GlobalToast-D_IlP1bL.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +941 B
assets/SubscribeToRun-BBQGskXP.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.15 kB 🟢 -1.01 kB
assets/SubscribeToRun-mZKF92Jc.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.16 kB 🔴 +1.01 kB
assets/cloudSessionCookie-4pgdY5r9.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +934 B 🔴 +801 B
assets/cloudSessionCookie-C8xIfmIA.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -937 B 🟢 -799 B
assets/WidgetLayoutField-B82nEQwY.js (new) 2.61 kB 🔴 +2.61 kB 🔴 +1.01 kB 🔴 +890 B
assets/WidgetLayoutField-l73cYE1W.js (removed) 2.61 kB 🟢 -2.61 kB 🟢 -1.01 kB 🟢 -890 B
assets/WidgetInputText-BEqVMoBy.js (new) 2.58 kB 🔴 +2.58 kB 🔴 +1.01 kB 🔴 +909 B
assets/WidgetInputText-rlzdk8hl.js (removed) 2.58 kB 🟢 -2.58 kB 🟢 -1.01 kB 🟢 -948 B
assets/BaseViewTemplate-CWJ8I1B6.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.05 kB 🔴 +942 B
assets/BaseViewTemplate-Ige-0QVN.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -942 B
assets/MediaImageTop-4jg0e3KT.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1 kB 🟢 -876 B
assets/MediaImageTop-BqI9AZuA.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1 kB 🔴 +881 B
assets/CloudRunButtonWrapper-CVSpeRFA.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +644 B 🔴 +562 B
assets/CloudRunButtonWrapper-Ztj0Da6X.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -641 B 🟢 -559 B
assets/cloudBadges-1xoH0v8A.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +538 B 🔴 +477 B
assets/cloudBadges-BIu_46Cm.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -538 B 🟢 -479 B
assets/graphHasMissingNodes-Dkk06fUl.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +459 B 🔴 +417 B
assets/graphHasMissingNodes-dvtoClNh.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -459 B 🟢 -434 B
assets/cloudSubscription-B-Qg4O7R.js (removed) 976 B 🟢 -976 B 🟢 -464 B 🟢 -402 B
assets/cloudSubscription-BQNFR9el.js (new) 976 B 🔴 +976 B 🔴 +462 B 🔴 +402 B
assets/nightlyBadges-7OeF32xr.js (removed) 594 B 🟢 -594 B 🟢 -358 B 🟢 -308 B
assets/nightlyBadges-Cw2jRIwj.js (new) 594 B 🔴 +594 B 🔴 +356 B 🔴 +311 B
assets/SubscriptionPanelContentWorkspace-Cit8LmNM.js (removed) 266 B 🟢 -266 B 🟢 -136 B 🟢 -114 B
assets/SubscriptionPanelContentWorkspace-CoAyO9G2.js (new) 266 B 🔴 +266 B 🔴 +136 B 🔴 +122 B
assets/WidgetInputNumber-DagNP5h6.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -120 B
assets/WidgetInputNumber-DEmLISHD.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +108 B
assets/WidgetLegacy-C6oLyWUw.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -107 B
assets/WidgetLegacy-CV1jU4--.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +123 B
assets/mixpanel.module-8zOLYqHx.js (removed) 143 B 🟢 -143 B 🟢 -125 B 🟢 -108 B
assets/mixpanel.module-DKpe8oFs.js (new) 143 B 🔴 +143 B 🔴 +125 B 🔴 +110 B
assets/Load3D-BVCmMlc7.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +107 B
assets/Load3D-Cie1jy-C.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -110 B
assets/auto-C-D16_U1.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-4PR1bHpF.js 18.5 kB 18.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B2EAJ50e.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B2K4kJ7I.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B8DPxzq3.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BeMMi6hO.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BFBrL4wa.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CDiUUOet.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CVY7Ty6w.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DFPZ6_-M.js 20.6 kB 20.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ds2wjN52.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ep6sQmXs.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BhEFmLQr.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BJmSXHk5.js 136 kB 136 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BwdWUSzx.js 119 kB 119 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C1TIlcBD.js 126 kB 126 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C8G9GjDN.js 123 kB 123 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cmx0L4BY.js 147 kB 147 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CNZb5sh8.js 107 kB 107 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cp7Xi9AK.js 106 kB 106 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-jf-B109s.js 121 kB 121 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-mcBLF1lP.js 119 kB 119 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-utjp9h7e.js 164 kB 164 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-CSW_ENx8.js 2.38 kB 2.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-DvEvCs7d.js 2 kB 2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-gfxHG4G4.js 2.84 kB 2.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-_yIUj67D.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BF6TtCbU.js 365 kB 365 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BlOB_fqn.js 355 kB 355 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BQZ8zPIN.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BrvlAvf6.js 437 kB 437 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CbhW6UrA.js 332 kB 332 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CK5btlaD.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D8jcNSNH.js 334 kB 334 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DdZJ1mp4.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DZm7fb-y.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-y33GjNKL.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/preservedQueryNamespaces-zCg1CMIu.js 3.23 kB 3.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DhQpJZe1.js 838 B 838 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-cVp-94Rc.js 1.96 kB 1.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-C_FImE7Q.js 518 B 518 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-DacGBD5y.js 4.71 kB 4.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-XFIqgKWC.js 186 B 186 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-JRS-Yy_C.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BmJCg-u2.js 1.31 kB 1.31 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 42 added / 42 removed

@DrJKL DrJKL added the preview label Jan 22, 2026
Comment on lines 494 to 502
const removeResult =
tagsToRemove.length > 0
? await assetService.removeAssetTags(asset.id, tagsToRemove)
: undefined

const addResult =
tagsToAdd.length > 0
? await assetService.addAssetTags(asset.id, tagsToAdd)
: undefined
Copy link
Contributor

Choose a reason for hiding this comment

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

these throw. Do we want to add protection?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yes. Yes we do.

@DrJKL DrJKL changed the title refactor: use add/remove endpoints for asset tags Updates: Model Management Jan 22, 2026
DrJKL and others added 3 commits January 22, 2026 14:59
- Add try/catch to updateAssetMetadata and updateAssetTags

- Roll back cache to original state on API failure

- Change updateAssetMetadata to accept full asset object

Amp-Thread-ID: https://ampcode.com/threads/T-019be7fe-630d-7478-ad0f-7568ab09afaa
Co-authored-by: Amp <amp@ampcode.com>
@DrJKL DrJKL marked this pull request as ready for review January 22, 2026 23:23
@DrJKL DrJKL requested review from a team as code owners January 22, 2026 23:23
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jan 22, 2026
const originalMetadata = asset.user_metadata
updateAssetInCache(asset.id, { user_metadata: userMetadata }, cacheKey)

try {
Copy link
Contributor

Choose a reason for hiding this comment

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

we dont really need the try here anymore but i guess it doesnt hurt

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Defense in depth? 🤷🏻

@github-actions
Copy link

🔧 Auto-fixes Applied

This PR has been automatically updated to fix linting and formatting issues.

⚠️ Important: Your local branch is now behind. Run git pull before making additional changes to avoid conflicts.

Changes made:

  • ESLint auto-fixes
  • Oxfmt formatting

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: 3

🤖 Fix all issues with AI agents
In `@src/platform/assets/components/modelInfo/ModelInfoPanel.vue`:
- Around line 337-344: The getter for selectedModelType contains a redundant "??
undefined"; update the computed getter in selectedModelType to return
pendingModelType.value ?? getAssetModelType(asset) (remove the trailing "??
undefined") so the expression naturally yields undefined when both operands are
nullish; ensure this change is made in the computed definition that references
pendingModelType, getAssetModelType, and asset.
- Around line 148-156: The icon-only Button rendering the copy-all action lacks
an aria-label, so screen readers may not announce its purpose; update the Button
(the component instance with variant="muted-textonly" size="icon-sm"
:title="t('g.copyAll')" and `@click`="copyToClipboard(triggerPhrases.join(', '))")
to include an aria-label attribute (e.g., :aria-label="t('g.copyAll')" or
aria-label="Copy all") so the accessible name is explicit and matches the
tooltip.
- Around line 22-30: The icon-only edit Button (component <Button> in
ModelInfoPanel.vue controlling isEditingDisplayName and gated by isImmutable) is
missing an accessible label; add an aria-label prop to the Button (e.g.,
aria-label="Edit display name") so screen readers can announce its purpose, or
bind a dynamic label (e.g., :aria-label="isEditingDisplayName ? 'Cancel editing
display name' : 'Edit display name'") if you want state-aware text; keep the
existing v-if and click handler unchanged and ensure the label matches the icon
class "icon-[lucide--square-pen]".
♻️ Duplicate comments (1)
src/platform/assets/components/modelInfo/ModelInfoPanel.vue (1)

84-89: Use i18n for the 'Unknown' fallback text.

The hardcoded 'Unknown' string at line 87 violates the coding guideline requiring vue-i18n for all user-facing strings. This was flagged in a previous review.

Proposed fix
         <div v-else class="p-2 text-sm text-muted-foreground">
           {{
             modelTypes.find((o) => o.value === selectedModelType)?.name ??
-            'Unknown'
+            t('g.unknown')
           }}
         </div>

Add to src/locales/en/main.json:

"unknown": "Unknown"

Comment on lines 337 to 344
const selectedModelType = computed({
get: () => getAssetModelType(asset) ?? undefined,
get: () => pendingModelType.value ?? getAssetModelType(asset) ?? undefined,
set: (value: string | undefined) => {
if (value) debouncedSaveModelType(value)
if (!value) return
pendingModelType.value = value
debouncedSaveModelType(value)
}
})
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Remove redundant ?? undefined.

The trailing ?? undefined on line 338 is redundant. If both pendingModelType.value and getAssetModelType(asset) are nullish, the expression already evaluates to undefined.

Proposed fix
 const selectedModelType = computed({
-  get: () => pendingModelType.value ?? getAssetModelType(asset) ?? undefined,
+  get: () => pendingModelType.value ?? getAssetModelType(asset),
   set: (value: string | undefined) => {
📝 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
const selectedModelType = computed({
get: () => getAssetModelType(asset) ?? undefined,
get: () => pendingModelType.value ?? getAssetModelType(asset) ?? undefined,
set: (value: string | undefined) => {
if (value) debouncedSaveModelType(value)
if (!value) return
pendingModelType.value = value
debouncedSaveModelType(value)
}
})
const selectedModelType = computed({
get: () => pendingModelType.value ?? getAssetModelType(asset),
set: (value: string | undefined) => {
if (!value) return
pendingModelType.value = value
debouncedSaveModelType(value)
}
})
🤖 Prompt for AI Agents
In `@src/platform/assets/components/modelInfo/ModelInfoPanel.vue` around lines 337
- 344, The getter for selectedModelType contains a redundant "?? undefined";
update the computed getter in selectedModelType to return pendingModelType.value
?? getAssetModelType(asset) (remove the trailing "?? undefined") so the
expression naturally yields undefined when both operands are nullish; ensure
this change is made in the computed definition that references pendingModelType,
getAssetModelType, and asset.

Myestery
Myestery previously approved these changes Jan 23, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/platform/assets/components/modelInfo/ModelInfoPanel.test.ts`:
- Around line 10-14: Replace the inline mock in ModelInfoPanel.test.ts with a
hoisted mock so tests can assert clipboard calls: use vi.hoisted to create and
expose a shared mock function (e.g., mockCopyToClipboard) while still returning
useCopyToClipboard -> { copyToClipboard: mockCopyToClipboard }, then in your
tests import/reference that exposed mockCopyToClipboard, call
mockCopyToClipboard.mockClear() in beforeEach and assert expectations like
expect(mockCopyToClipboard).toHaveBeenCalledWith('trigger1') for single-phrase
clicks and expect(mockCopyToClipboard).toHaveBeenCalledWith('trigger1 trigger2')
for the copy-all button; target the useCopyToClipboard and copyToClipboard
symbols when making these changes.

Comment on lines +10 to +14
vi.mock('@/composables/useCopyToClipboard', () => ({
useCopyToClipboard: () => ({
copyToClipboard: vi.fn()
})
}))
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Consider using vi.hoisted() to enable assertions on clipboard calls.

The current mock prevents runtime errors but doesn't expose copyToClipboard for test assertions. Since the PR adds click-to-copy functionality, tests should verify the behavior works correctly.

♻️ Proposed refactor to enable per-test assertions
+const mockCopyToClipboard = vi.hoisted(() => vi.fn())
+
-vi.mock('@/composables/useCopyToClipboard', () => ({
-  useCopyToClipboard: () => ({
-    copyToClipboard: vi.fn()
-  })
-}))
+vi.mock('@/composables/useCopyToClipboard', () => ({
+  useCopyToClipboard: () => ({
+    copyToClipboard: mockCopyToClipboard
+  })
+}))

Then add tests for the copy functionality:

describe('Trigger Phrases Copy', () => {
  beforeEach(() => {
    mockCopyToClipboard.mockClear()
  })

  it('copies individual trigger phrase when clicked', async () => {
    const asset = createMockAsset({
      user_metadata: { trained_words: ['trigger1', 'trigger2'] }
    })
    const wrapper = mountPanel(asset)
    // Find and click the copy button for a phrase
    // Assert: expect(mockCopyToClipboard).toHaveBeenCalledWith('trigger1')
  })

  it('copies all trigger phrases when copy-all button clicked', async () => {
    const asset = createMockAsset({
      user_metadata: { trained_words: ['trigger1', 'trigger2'] }
    })
    const wrapper = mountPanel(asset)
    // Find and click the copy-all button
    // Assert: expect(mockCopyToClipboard).toHaveBeenCalledWith('trigger1 trigger2')
  })
})

Based on learnings, using vi.hoisted() allows per-test manipulation of mock state, which is essential for verifying clipboard interactions.

Would you like me to generate complete test cases for the new copy-to-clipboard functionality?

📝 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
vi.mock('@/composables/useCopyToClipboard', () => ({
useCopyToClipboard: () => ({
copyToClipboard: vi.fn()
})
}))
const mockCopyToClipboard = vi.hoisted(() => vi.fn())
vi.mock('@/composables/useCopyToClipboard', () => ({
useCopyToClipboard: () => ({
copyToClipboard: mockCopyToClipboard
})
}))
🤖 Prompt for AI Agents
In `@src/platform/assets/components/modelInfo/ModelInfoPanel.test.ts` around lines
10 - 14, Replace the inline mock in ModelInfoPanel.test.ts with a hoisted mock
so tests can assert clipboard calls: use vi.hoisted to create and expose a
shared mock function (e.g., mockCopyToClipboard) while still returning
useCopyToClipboard -> { copyToClipboard: mockCopyToClipboard }, then in your
tests import/reference that exposed mockCopyToClipboard, call
mockCopyToClipboard.mockClear() in beforeEach and assert expectations like
expect(mockCopyToClipboard).toHaveBeenCalledWith('trigger1') for single-phrase
clicks and expect(mockCopyToClipboard).toHaveBeenCalledWith('trigger1 trigger2')
for the copy-all button; target the useCopyToClipboard and copyToClipboard
symbols when making these changes.

@DrJKL DrJKL enabled auto-merge (squash) January 23, 2026 00:09
@DrJKL DrJKL added cloud/1.37 Backport PRs for cloud 1.37 needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch labels Jan 23, 2026
@DrJKL DrJKL merged commit 4b1a30e into main Jan 23, 2026
37 checks passed
@DrJKL DrJKL deleted the drjkl/mm-1 branch January 23, 2026 00:10
github-actions bot pushed a commit that referenced this pull request Jan 23, 2026
## Summary

Model management improvements: refactored tag API, enhanced UX for
trigger phrases and editing.

## Changes

### API Refactor
- Add `addAssetTags` (POST) and `removeAssetTags` (DELETE) endpoints in
assetService
- `updateAssetTags` now computes diff and calls remove/add serially
- Add `TagsOperationResult` schema; cache syncs with server response

### UX Improvements
- **Trigger phrases**: click to copy individual phrases, copy-all button
in header
- **Display name**: show edit icon on hover instead of relying on
double-click
- **Model type**: show plain text when immutable instead of disabled
select
- **Tags input**: only show edit icon on hover
- **Field labels**: updated styling to use muted foreground color
- **Optimistic update** for model type selection

---------

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
@comfy-pr-bot
Copy link
Member

@DrJKL Successfully backported to #8255

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Jan 23, 2026
DrJKL added a commit that referenced this pull request Jan 23, 2026
Backport of #8248 to `cloud/1.37`

Automatically created by backport workflow.

Co-authored-by: Alexander Brown <drjkl@comfy.org>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
Myestery pushed a commit that referenced this pull request Jan 23, 2026
## Summary

Model management improvements: refactored tag API, enhanced UX for
trigger phrases and editing.

## Changes

### API Refactor
- Add `addAssetTags` (POST) and `removeAssetTags` (DELETE) endpoints in
assetService
- `updateAssetTags` now computes diff and calls remove/add serially
- Add `TagsOperationResult` schema; cache syncs with server response

### UX Improvements
- **Trigger phrases**: click to copy individual phrases, copy-all button
in header
- **Display name**: show edit icon on hover instead of relying on
double-click
- **Model type**: show plain text when immutable instead of disabled
select
- **Tags input**: only show edit icon on hover
- **Field labels**: updated styling to use muted foreground color
- **Optimistic update** for model type selection

---------

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud/1.37 Backport PRs for cloud 1.37 preview size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants