Skip to content

feat: add local asset file actions - #14831

Open
adobex wants to merge 4 commits into
Comfy-Org:mainfrom
adobex:agent/local-asset-file-actions
Open

feat: add local asset file actions#14831
adobex wants to merge 4 commits into
Comfy-Org:mainfrom
adobex:agent/local-asset-file-actions

Conversation

@adobex

@adobex adobex commented Aug 6, 2026

Copy link
Copy Markdown

Summary

Add clear local asset actions for removing gallery entries, deleting source files, and opening generated files in the host file manager.

Changes

  • What: Places Open file location, Delete, and Delete source file directly below Download for local generated assets.
  • What: Delete removes a generated entry without confirmation and keeps the file; Delete source file requires confirmation and removes both.
  • What: Local imported assets get an individual Delete action without confirmation when the server advertises asset support, resolving the exact loader path before deleting the managed file and record.
  • What: Refreshes the correct persistent-output, history, or input store and only clears workflow references when the underlying file is deleted.
  • Dependencies: Generated persistent records are surfaced by feat: add persistent generated asset media tabs #14830. Physical deletion and file reveal use Add safe local asset file actions ComfyUI#15340.

Review Focus

  • Menu order and confirmation semantics for local Generated and Imported assets.
  • Asset-capability gating for local file operations.
  • Exact local input path resolution and ambiguous-match rejection.
  • Soft-delete behavior keeping generated source files and workflow references intact.
  • Loopback-only visibility of Open file location.

Tests

  • 345 targeted Vitest tests
  • pnpm typecheck
  • pnpm lint
  • pnpm format:check
  • pnpm knip
  • pnpm build

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

🎨 Storybook: 🚧 Building...

🎭 Playwright: ❌ 1788 passed, 5 failed · 4 flaky

❌ Failed Tests

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

📦 Bundle: 8.69 MB gzip 🟢 -159 kB

Details

Summary

  • Raw size: 36.7 MB baseline 37.3 MB — 🟢 -675 kB
  • Gzip: 8.69 MB baseline 8.85 MB — 🟢 -159 kB
  • Brotli: 6.06 MB baseline 6.19 MB — 🟢 -124 kB
  • Bundles: 437 current • 438 baseline • 258 added / 259 removed

Category Glance
Vendor & Third-Party 🟢 -525 kB (16.3 MB) · Other 🟢 -128 kB (14 MB) · Data & Services 🟢 -11.9 kB (3.51 MB) · Graph Workspace 🟢 -10.1 kB (1.36 MB) · User & Accounts 🟢 -705 B (27 kB) · Views & Navigation 🟢 -399 B (124 kB) · + 5 more

App Entry Points — 3.67 kB (baseline 3.71 kB) • 🟢 -32 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-DWYjYA6s.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.86 kB 🟢 -1.6 kB
assets/index-saRfzI6D.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.84 kB 🔴 +1.6 kB

Status: 1 added / 1 removed

Graph Workspace — 1.36 MB (baseline 1.37 MB) • 🟢 -10.1 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Dk90j_Pm.js (removed) 1.36 MB 🟢 -1.36 MB 🟢 -297 kB 🟢 -223 kB
assets/GraphView-BfdXd7L3.js (new) 1.35 MB 🔴 +1.35 MB 🔴 +294 kB 🔴 +221 kB
assets/WidgetCompositor-BTk7zmde.js (new) 8.17 kB 🔴 +8.17 kB 🔴 +2.75 kB 🔴 +2.46 kB
assets/WidgetCompositor-DtZIV_RM.js (removed) 8.17 kB 🟢 -8.17 kB 🟢 -2.76 kB 🟢 -2.46 kB

Status: 2 added / 2 removed / 1 unchanged

Views & Navigation — 124 kB (baseline 124 kB) • 🟢 -399 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-19kizGEH.js (removed) 25 kB 🟢 -25 kB 🟢 -6.25 kB 🟢 -5.52 kB
assets/CloudSurveyView-udniYxim.js (new) 25 kB 🔴 +25 kB 🔴 +6.24 kB 🔴 +5.52 kB
assets/CloudLayoutView-BndXqAqx.js (removed) 21.8 kB 🟢 -21.8 kB 🟢 -6.57 kB 🟢 -5.74 kB
assets/CloudLayoutView-BQJVtt1W.js (new) 21.8 kB 🔴 +21.8 kB 🔴 +6.56 kB 🔴 +5.74 kB
assets/OAuthConsentView-B6YA0kwR.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -4.26 kB 🟢 -3.71 kB
assets/OAuthConsentView-Bi7WnOex.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +4.25 kB 🔴 +3.71 kB
assets/UserCheckView-CEXRWQve.js (removed) 8.75 kB 🟢 -8.75 kB 🟢 -2.19 kB 🟢 -1.9 kB
assets/UserCheckView-S-qAZMnH.js (new) 8.75 kB 🔴 +8.75 kB 🔴 +2.19 kB 🔴 +1.89 kB
assets/CloudLoginView-C-MlDIPj.js (removed) 8.74 kB 🟢 -8.74 kB 🟢 -2.55 kB 🟢 -2.26 kB
assets/CloudLoginView-DbZYWp2i.js (new) 8.74 kB 🔴 +8.74 kB 🔴 +2.55 kB 🔴 +2.26 kB
assets/useCloudAuthPage-7QT6k449.js (new) 7.08 kB 🔴 +7.08 kB 🔴 +2.51 kB 🔴 +2.21 kB
assets/useCloudAuthPage-C3asy2YV.js (removed) 7.08 kB 🟢 -7.08 kB 🟢 -2.51 kB 🟢 -2.21 kB
assets/CloudSignupView-DzBp3G9o.js (removed) 6.96 kB 🟢 -6.96 kB 🟢 -2.28 kB 🟢 -2 kB
assets/CloudSignupView-CV9d0Uuo.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +2.17 kB 🔴 +1.91 kB
assets/WidgetTextPreview-Cy2OS5_X.js (removed) 6.07 kB 🟢 -6.07 kB 🟢 -2.13 kB 🟢 -1.89 kB
assets/WidgetTextPreview-D7G8kzwe.js (new) 6.07 kB 🔴 +6.07 kB 🔴 +2.13 kB 🔴 +1.88 kB
assets/CloudSubscriptionRedirectView-1SXJEQUd.js (removed) 6.05 kB 🟢 -6.05 kB 🟢 -2.25 kB 🟢 -1.96 kB
assets/CloudSubscriptionRedirectView-CF1VcFCK.js (new) 6.05 kB 🔴 +6.05 kB 🔴 +2.25 kB 🔴 +1.95 kB
assets/UserSelectView-Cm2ZcPhT.js (removed) 5.49 kB 🟢 -5.49 kB 🟢 -1.96 kB 🟢 -1.72 kB
assets/UserSelectView-CMfKm3iq.js (new) 5.49 kB 🔴 +5.49 kB 🔴 +1.95 kB 🔴 +1.71 kB
assets/CloudForgotPasswordView-LoawtIoM.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.72 kB 🔴 +1.5 kB
assets/CloudForgotPasswordView-uAnRpE04.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.73 kB 🟢 -1.49 kB
assets/CloudAuthTimeoutView-DLsq_bfY.js (new) 4.43 kB 🔴 +4.43 kB 🔴 +1.54 kB 🔴 +1.33 kB
assets/CloudAuthTimeoutView-DZys7aGG.js (removed) 4.43 kB 🟢 -4.43 kB 🟢 -1.54 kB 🟢 -1.34 kB
assets/OAuthLayoutView-BGSLgVS_.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -700 B 🟢 -587 B
assets/OAuthLayoutView-eiNDk7cV.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +698 B 🔴 +598 B
assets/CloudSorryContactSupportView-BeHeiYOs.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +578 B 🔴 +502 B
assets/CloudSorryContactSupportView-kNDO55x3.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -579 B 🟢 -504 B
assets/layout-CSmyoW6_.js (removed) 403 B 🟢 -403 B 🟢 -252 B 🟢 -207 B
assets/layout-JbjMjTKo.js (new) 403 B 🔴 +403 B 🔴 +252 B 🔴 +207 B
assets/WidgetTextPreview-BpHEULkz.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -89 B
assets/WidgetTextPreview-BuxV0j5U.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +88 B

Status: 16 added / 16 removed / 1 unchanged

Panels & Settings — 565 kB (baseline 565 kB) • 🔴 +3 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-C1rn93ur.js (removed) 49.4 kB 🟢 -49.4 kB 🟢 -9.95 kB 🟢 -8.8 kB
assets/KeybindingPanel-CLE2iHAQ.js (new) 49.4 kB 🔴 +49.4 kB 🔴 +9.94 kB 🔴 +8.8 kB
assets/SecretsPanel-BekpftlY.js (removed) 33.7 kB 🟢 -33.7 kB 🟢 -7.88 kB 🟢 -6.92 kB
assets/SecretsPanel-DCuTflEi.js (new) 33.7 kB 🔴 +33.7 kB 🔴 +7.86 kB 🔴 +6.9 kB
assets/CreditsPanel-B4N34ymq.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.19 kB 🔴 +2.81 kB
assets/CreditsPanel-Ci-sl8Xz.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.21 kB 🟢 -2.81 kB
assets/AboutPanel-BY78MV-Z.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.02 kB 🔴 +2.72 kB
assets/AboutPanel-JMUxTiLj.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.03 kB 🟢 -2.72 kB
assets/ExtensionPanel-C1kgK-Jq.js (new) 9.19 kB 🔴 +9.19 kB 🔴 +2.51 kB 🔴 +2.23 kB
assets/ExtensionPanel-Dt1RrflE.js (removed) 9.19 kB 🟢 -9.19 kB 🟢 -2.52 kB 🟢 -2.23 kB
assets/ServerConfigPanel-Bug2O-Rf.js (removed) 6.09 kB 🟢 -6.09 kB 🟢 -1.94 kB 🟢 -1.72 kB
assets/ServerConfigPanel-C5jgfAPQ.js (new) 6.09 kB 🔴 +6.09 kB 🔴 +1.93 kB 🔴 +1.72 kB
assets/UserPanel-BaCjhku4.js (new) 5.73 kB 🔴 +5.73 kB 🔴 +1.78 kB 🔴 +1.54 kB
assets/UserPanel-WO8DiXE-.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/refreshRemoteConfig-DedhtxrH.js (new) 3.44 kB 🔴 +3.44 kB 🔴 +1.33 kB 🔴 +1.17 kB
assets/refreshRemoteConfig-CkmDzLvL.js (removed) 3.44 kB 🟢 -3.44 kB 🟢 -1.33 kB 🟢 -1.18 kB
assets/remoteConfig-B0RmgQ9h.js (removed) 1.42 kB 🟢 -1.42 kB 🟢 -675 B 🟢 -561 B
assets/remoteConfig-DTfxsKZF.js (new) 1.42 kB 🔴 +1.42 kB 🔴 +673 B 🔴 +562 B
assets/cloudRemoteConfig-BMaE5mvq.js (removed) 951 B 🟢 -951 B 🟢 -514 B 🟢 -423 B
assets/cloudRemoteConfig-BUGyHGH9.js (new) 951 B 🔴 +951 B 🔴 +513 B 🔴 +422 B
assets/refreshRemoteConfig-DWp0ndSM.js (new) 110 B 🔴 +110 B 🔴 +89 B 🔴 +84 B
assets/refreshRemoteConfig-UjK_g64i.js (removed) 110 B 🟢 -110 B 🟢 -89 B 🟢 -90 B

Status: 11 added / 11 removed / 15 unchanged

User & Accounts — 27 kB (baseline 27.7 kB) • 🟢 -705 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SignUpForm-B0rVjHnr.js (removed) 13.3 kB 🟢 -13.3 kB 🟢 -4.53 kB 🟢 -3.94 kB
assets/SignUpForm-D8gq0RNU.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +4.31 kB 🔴 +3.76 kB
assets/PasswordFields-Bdxsk26Y.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.46 kB 🔴 +1.3 kB
assets/PasswordFields-DxW_fGtd.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.46 kB 🟢 -1.29 kB
assets/auth-BfxjfItY.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.28 kB 🔴 +1.1 kB
assets/auth-C8Ew0VMV.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.29 kB 🟢 -1.1 kB
assets/UpdatePasswordContent-B9MAJet7.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +840 B 🔴 +730 B
assets/UpdatePasswordContent-QHcBfDPg.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -842 B 🟢 -737 B
assets/WorkspaceProfilePic-Czj-1OGy.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +828 B 🔴 +750 B
assets/WorkspaceProfilePic-fQ5PxnHG.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -829 B 🟢 -721 B
assets/profiler-DTaQ-5S5.js (removed) 178 B 🟢 -178 B 🟢 -141 B 🟢 -128 B
assets/authStore-CHwAuORs.js (removed) 128 B 🟢 -128 B 🟢 -104 B 🟢 -105 B
assets/authStore-CimZHbHz.js (new) 128 B 🔴 +128 B 🔴 +107 B 🔴 +102 B
assets/workspaceAuthStore-CsjxLK04.js (removed) 108 B 🟢 -108 B 🟢 -99 B 🟢 -110 B
assets/workspaceAuthStore-GOTbCNAP.js (new) 108 B 🔴 +108 B 🔴 +99 B 🔴 +108 B
assets/auth-CFFLGazz.js (removed) 105 B 🟢 -105 B 🟢 -96 B 🟢 -80 B
assets/auth-CLIkeKyA.js (new) 105 B 🔴 +105 B 🔴 +96 B 🔴 +86 B

Status: 8 added / 9 removed / 2 unchanged

Editors & Dialogs — 125 kB (baseline 125 kB) • 🟢 -2 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-B83eYy83.js (removed) 90.1 kB 🟢 -90.1 kB 🟢 -19.3 kB 🟢 -16.5 kB
assets/ComfyHubPublishDialog-DeMK7NTj.js (new) 90.1 kB 🔴 +90.1 kB 🔴 +19.3 kB 🔴 +16.5 kB
assets/useShareDialog-B6STsQcc.js (removed) 23.9 kB 🟢 -23.9 kB 🟢 -5.7 kB 🟢 -5.05 kB
assets/useShareDialog-BWZFnNqi.js (new) 23.9 kB 🔴 +23.9 kB 🔴 +5.69 kB 🔴 +5.04 kB
assets/feedbackDialog-Bum0F2Tf.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.87 kB 🔴 +1.59 kB
assets/feedbackDialog-CXdiDTir.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.87 kB 🟢 -1.59 kB
assets/useRangeEditor-Bh8w-hLH.js (new) 3.29 kB 🔴 +3.29 kB 🔴 +1.14 kB 🔴 +1.04 kB
assets/useRangeEditor-DNBxFzGp.js (removed) 3.29 kB 🟢 -3.29 kB 🟢 -1.14 kB 🟢 -1.03 kB
assets/SubscriptionInactiveMemberDialog-3T36lwRq.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -998 B 🟢 -851 B
assets/SubscriptionInactiveMemberDialog-Dkyt0X_b.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +999 B 🔴 +853 B
assets/useLayerEditor-DWMrMBow.js (new) 1.01 kB 🔴 +1.01 kB 🔴 +491 B 🔴 +407 B
assets/useLayerEditor-QoB5nPFo.js (removed) 1.01 kB 🟢 -1.01 kB 🟢 -492 B 🟢 -405 B
assets/ComfyHubPublishDialog-D710_Ris.js (removed) 143 B 🟢 -143 B 🟢 -105 B 🟢 -95 B
assets/ComfyHubPublishDialog-qv9_z71J.js (new) 143 B 🔴 +143 B 🔴 +105 B 🔴 +96 B
assets/useSubscriptionDialog-AR_H09U7.js (new) 108 B 🔴 +108 B 🔴 +102 B 🔴 +91 B
assets/useSubscriptionDialog-CjQcLtox.js (removed) 108 B 🟢 -108 B 🟢 -102 B 🟢 -90 B

Status: 8 added / 8 removed

UI Components — 67.1 kB (baseline 67.1 kB) • 🟢 -18 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-kGvzmQvB.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.96 kB 🔴 +3.51 kB
assets/ComfyQueueButton-TaMy0ebX.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.97 kB 🟢 -3.53 kB
assets/useTerminalTabs-0ybMvB-r.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.69 kB 🔴 +3.27 kB
assets/useTerminalTabs-Cyf35-y1.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.69 kB 🟢 -3.28 kB
assets/InviteMembersForm-Cw_9Koh6.js (removed) 8.23 kB 🟢 -8.23 kB 🟢 -2.74 kB 🟢 -2.43 kB
assets/InviteMembersForm-CA_90z8n.js (new) 8.2 kB 🔴 +8.2 kB 🔴 +2.72 kB 🔴 +2.42 kB
assets/TopbarBadge-Dq577MyX.js (removed) 7.65 kB 🟢 -7.65 kB 🟢 -1.83 kB 🟢 -1.62 kB
assets/TopbarBadge-Fcns33U-.js (new) 7.65 kB 🔴 +7.65 kB 🔴 +1.83 kB 🔴 +1.62 kB
assets/ScrubableNumberInput-CuEIyVtY.js (new) 6.49 kB 🔴 +6.49 kB 🔴 +2.16 kB 🔴 +1.91 kB
assets/ScrubableNumberInput-D4JgRtH8.js (removed) 6.49 kB 🟢 -6.49 kB 🟢 -2.17 kB 🟢 -1.92 kB
assets/WidgetInputNumberInput-CrLta6cY.js (removed) 5.83 kB 🟢 -5.83 kB 🟢 -2.07 kB 🟢 -1.85 kB
assets/WidgetInputNumberInput-DiJqlqXU.js (new) 5.83 kB 🔴 +5.83 kB 🔴 +2.07 kB 🔴 +1.85 kB
assets/Button-Bqrwj1vb.js (new) 4.66 kB 🔴 +4.66 kB 🔴 +1.63 kB 🔴 +1.43 kB
assets/Button-D8rCMK2y.js (removed) 4.64 kB 🟢 -4.64 kB 🟢 -1.62 kB 🟢 -1.42 kB
assets/SubscribeButton-6dXKvfBG.js (removed) 2.15 kB 🟢 -2.15 kB 🟢 -970 B 🟢 -851 B
assets/SubscribeButton-9DhCNvcx.js (new) 2.15 kB 🔴 +2.15 kB 🔴 +965 B 🔴 +848 B
assets/WidgetButton-10hAQpix.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -887 B 🟢 -774 B
assets/WidgetButton-BHpomUDI.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +888 B 🔴 +777 B
assets/Input-Dry_O4bD.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -872 B 🟢 -765 B
assets/Input-hJdQNyFo.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +872 B 🔴 +769 B
assets/UserAvatar-Be3pfDFa.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -641 B 🟢 -554 B
assets/UserAvatar-p-TFA9pt.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +641 B 🔴 +551 B
assets/cloudFeedbackTopbarButton-BW5ESAi4.js (new) 705 B 🔴 +705 B 🔴 +421 B 🔴 +358 B
assets/cloudFeedbackTopbarButton-DLra8ND9.js (removed) 705 B 🟢 -705 B 🟢 -418 B 🟢 -360 B
assets/ComfyQueueButton-B4wr1zSA.js (removed) 128 B 🟢 -128 B 🟢 -99 B 🟢 -93 B
assets/ComfyQueueButton-DohepcpU.js (new) 128 B 🔴 +128 B 🔴 +99 B 🔴 +91 B
assets/toggle-group-BxYEJQJI.js (new) 40 B 🔴 +40 B 🔴 +60 B 🔴 +44 B
assets/toggle-group-DVXGGL47.js (removed) 40 B 🟢 -40 B 🟢 -60 B 🟢 -44 B

Status: 14 added / 14 removed

Data & Services — 3.51 MB (baseline 3.52 MB) • 🟢 -11.9 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settingStore-BbpCRF8G.js (removed) 3.24 MB 🟢 -3.24 MB 🟢 -753 kB 🟢 -566 kB
assets/settingStore-Bbf6L-zP.js (new) 3.23 MB 🔴 +3.23 MB 🔴 +749 kB 🔴 +564 kB
assets/load3dService-D9QVkV_O.js (removed) 132 kB 🟢 -132 kB 🟢 -29.3 kB 🟢 -24.6 kB
assets/load3dService-BJLe0eOH.js (new) 132 kB 🔴 +132 kB 🔴 +29.3 kB 🔴 +24.6 kB
assets/api-CUXfyXm6.js (removed) 98.4 kB 🟢 -98.4 kB 🟢 -27.3 kB 🟢 -23.4 kB
assets/api-BoLCqnHS.js (new) 97.7 kB 🔴 +97.7 kB 🔴 +26.9 kB 🔴 +23.1 kB
assets/workflowShareService-00LXzHN2.js (new) 16.5 kB 🔴 +16.5 kB 🔴 +4.91 kB 🔴 +4.34 kB
assets/workflowShareService-Eo3nMu7P.js (removed) 16.5 kB 🟢 -16.5 kB 🟢 -4.92 kB 🟢 -4.35 kB
assets/keybindingService-DUlmVGi_.js (new) 6.89 kB 🔴 +6.89 kB 🔴 +1.73 kB 🔴 +1.5 kB
assets/keybindingService-OmnEr_on.js (removed) 6.89 kB 🟢 -6.89 kB 🟢 -1.73 kB 🟢 -1.5 kB
assets/releaseStore-DFcZnl7r.js (new) 6.72 kB 🔴 +6.72 kB 🔴 +2.03 kB 🔴 +1.78 kB
assets/releaseStore-x86QaAjW.js (removed) 6.72 kB 🟢 -6.72 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/dialogStore-DiVVDHx7.js (new) 5.35 kB 🔴 +5.35 kB 🔴 +1.64 kB 🔴 +1.41 kB
assets/dialogStore-mTb5976f.js (removed) 5.35 kB 🟢 -5.35 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/systemStatsStore-IA02Psbj.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.74 kB 🔴 +1.47 kB
assets/systemStatsStore-Umj0KIxZ.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.74 kB 🟢 -1.47 kB
assets/userStore-DF6ZCpjU.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -899 B 🟢 -795 B
assets/userStore-tkVNxxsF.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +897 B 🔴 +791 B
assets/serverConfigStore-B_zwQQFs.js (removed) 2.3 kB 🟢 -2.3 kB 🟢 -775 B 🟢 -687 B
assets/serverConfigStore-CT0ay6Hl.js (new) 2.3 kB 🔴 +2.3 kB 🔴 +776 B 🔴 +686 B
assets/audioService-BmJtwla9.js (removed) 1.71 kB 🟢 -1.71 kB 🟢 -831 B 🟢 -732 B
assets/audioService-Dll8W1oQ.js (new) 1.71 kB 🔴 +1.71 kB 🔴 +829 B 🔴 +721 B
assets/toastStore-B_waOwkM.js (removed) 841 B 🟢 -841 B 🟢 -395 B 🟢 -343 B
assets/toastStore-Cf-OtQmn.js (new) 841 B 🔴 +841 B 🔴 +394 B 🔴 +348 B
assets/dialogService-CKxfXkH9.js (new) 98 B 🔴 +98 B 🔴 +97 B 🔴 +85 B
assets/dialogService-pOSv8I-G.js (removed) 98 B 🟢 -98 B 🟢 -97 B 🟢 -82 B
assets/releaseStore-DT-0R3AO.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -91 B
assets/releaseStore-DUzHGrgC.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +85 B
assets/settingStore-BY63hkAK.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -84 B
assets/settingStore-DcFZ5Zwt.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +86 B
assets/assetsStore-BI2wI7dD.js (removed) 94 B 🟢 -94 B 🟢 -92 B 🟢 -85 B
assets/assetsStore-BwQ2Zas4.js (new) 94 B 🔴 +94 B 🔴 +92 B 🔴 +84 B
assets/api-W-R8vwTU.js (removed) 62 B 🟢 -62 B 🟢 -74 B 🟢 -63 B
assets/api-z0__WVzW.js (new) 62 B 🔴 +62 B 🔴 +74 B 🔴 +66 B

Status: 17 added / 17 removed

Utilities & Hooks — 550 kB (baseline 550 kB) • 🔴 +36 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-BtHCJ4tQ.js (removed) 236 kB 🟢 -236 kB 🟢 -53 kB 🟢 -43.1 kB
assets/useConflictDetection-BTynPySz.js (new) 236 kB 🔴 +236 kB 🔴 +53 kB 🔴 +43.1 kB
assets/useLayerEditorSession-BhOexqxf.js (new) 158 kB 🔴 +158 kB 🔴 +40.8 kB 🔴 +34.3 kB
assets/useLayerEditorSession-CmdZDrcc.js (removed) 158 kB 🟢 -158 kB 🟢 -40.8 kB 🟢 -34.3 kB
assets/useLoad3d-CHXyATbt.js (new) 25.8 kB 🔴 +25.8 kB 🔴 +5.8 kB 🔴 +5.14 kB
assets/useLoad3d-B3VI7Sdl.js (removed) 25.8 kB 🟢 -25.8 kB 🟢 -5.81 kB 🟢 -5.14 kB
assets/useLoad3dViewer-1gWSUnbG.js (removed) 21.2 kB 🟢 -21.2 kB 🟢 -4.98 kB 🟢 -4.35 kB
assets/useLoad3dViewer-Bdlug6HJ.js (new) 21.2 kB 🔴 +21.2 kB 🔴 +4.98 kB 🔴 +4.37 kB
assets/useImageQuiet-CCi5RAGD.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +6.14 kB 🔴 +5.29 kB
assets/useImageQuiet-Cm_jUHJ-.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -6.12 kB 🟢 -5.27 kB
assets/formatUtil-xIfJM6E5.js (new) 16.4 kB 🔴 +16.4 kB 🔴 +5.6 kB 🔴 +4.93 kB
assets/formatUtil-CNG-Br4i.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.46 kB 🟢 -4.81 kB
assets/useImageCrop-C5HUBQ7o.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +3.42 kB 🔴 +2.98 kB
assets/useImageCrop-CbSQZgyZ.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -3.42 kB 🟢 -2.98 kB
assets/useDowngradeToPersonal-DkNJEt9N.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +2.75 kB 🔴 +2.36 kB
assets/useDowngradeToPersonal-B3sAJWRu.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -2.73 kB 🟢 -2.35 kB
assets/useFeatureFlags-CTqO9Jjc.js (removed) 6.98 kB 🟢 -6.98 kB 🟢 -2 kB 🟢 -1.71 kB
assets/useFeatureFlags-DniefTk4.js (new) 6.73 kB 🔴 +6.73 kB 🔴 +1.96 kB 🔴 +1.68 kB
assets/useTransformState-kcVecowX.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.55 kB 🟢 -1.29 kB
assets/useTransformState-oUoxB39V.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.55 kB 🔴 +1.29 kB
assets/useCompositorLayers-anU0WY3U.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +898 B 🔴 +805 B
assets/useCompositorLayers-C7fz0S9J.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -898 B 🟢 -812 B
assets/useSurveyEligibility-g1bxnz-H.js (removed) 2.89 kB 🟢 -2.89 kB 🟢 -1.11 kB 🟢 -919 B
assets/useSurveyEligibility-mgKCwAjQ.js (new) 2.89 kB 🔴 +2.89 kB 🔴 +1.1 kB 🔴 +920 B
assets/useExternalLink-CExSt5a0.js (new) 2.85 kB 🔴 +2.85 kB 🔴 +1.07 kB 🔴 +923 B
assets/useExternalLink-CWTXb2Ka.js (removed) 2.85 kB 🟢 -2.85 kB 🟢 -1.07 kB 🟢 -923 B
assets/assetPreviewUtil-CnHBwiNn.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +967 B 🔴 +843 B
assets/assetPreviewUtil-CoG7Z4Z3.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -969 B 🟢 -847 B
assets/useFeatureUsageTracker-BjysIfrk.js (new) 2.07 kB 🔴 +2.07 kB 🔴 +910 B 🔴 +772 B
assets/useFeatureUsageTracker-DOEWwNcv.js (removed) 2.07 kB 🟢 -2.07 kB 🟢 -911 B 🟢 -772 B
assets/downloadUtil-D1cXCR3Y.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -907 B 🟢 -727 B
assets/downloadUtil-DlQSP07O.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +907 B 🔴 +727 B
assets/useTypeformEmbed-CTn2SiMa.js (new) 2.02 kB 🔴 +2.02 kB 🔴 +1.03 kB 🔴 +846 B
assets/useTypeformEmbed-DgS6lnhj.js (removed) 2.02 kB 🟢 -2.02 kB 🟢 -1.03 kB 🟢 -853 B
assets/useUpstreamValue-CDmSaIBm.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +759 B 🔴 +684 B
assets/useUpstreamValue-D2HZKgn9.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -759 B 🟢 -685 B
assets/useWorkspaceTierLabel-DwK4qNYl.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -816 B 🟢 -696 B
assets/useWorkspaceTierLabel-DykNSXNj.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +814 B 🔴 +696 B
assets/useErrorHandling-D6EsddVw.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -614 B 🟢 -533 B
assets/useErrorHandling-DH1mKc5r.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +613 B 🔴 +528 B
assets/useModalLiftedZIndex-BP7MgP4N.js (new) 908 B 🔴 +908 B 🔴 +552 B 🔴 +465 B
assets/useModalLiftedZIndex-cRwoPvNn.js (removed) 908 B 🟢 -908 B 🟢 -553 B 🟢 -511 B
assets/subscriptionCheckoutUtil-B2d1FKZ1.js (new) 877 B 🔴 +877 B 🔴 +521 B 🔴 +436 B
assets/subscriptionCheckoutUtil-CmPMxIgG.js (removed) 877 B 🟢 -877 B 🟢 -520 B 🟢 -448 B
assets/useTextFileContent-Bm-ixZo5.js (removed) 841 B 🟢 -841 B 🟢 -427 B 🟢 -376 B
assets/useTextFileContent-CqeaSSmQ.js (new) 841 B 🔴 +841 B 🔴 +426 B 🔴 +396 B
assets/useSessionCookie-B5qXz3az.js (new) 652 B 🔴 +652 B 🔴 +337 B 🔴 +292 B
assets/useSessionCookie-TJ_TO3Qn.js (removed) 652 B 🟢 -652 B 🟢 -338 B 🟢 -293 B
assets/useLoad3d-CSS-mB0m.js (new) 311 B 🔴 +311 B 🔴 +164 B 🔴 +149 B
assets/useLoad3d-Dsk6jjTH.js (removed) 311 B 🟢 -311 B 🟢 -165 B 🟢 -147 B
assets/useSessionCookie-BWOXF_ug.js (new) 101 B 🔴 +101 B 🔴 +86 B 🔴 +79 B
assets/useSessionCookie-Ctxnfuer.js (removed) 101 B 🟢 -101 B 🟢 -86 B 🟢 -85 B
assets/useFeatureFlags-ArL5vzM6.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -85 B
assets/useFeatureFlags-DyjIEKYz.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +80 B
assets/useLoad3dViewer-CEwDOPW7.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -87 B
assets/useLoad3dViewer-CV5j1btp.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +85 B
assets/useCurrentUser-C1RfdveI.js (new) 94 B 🔴 +94 B 🔴 +95 B 🔴 +84 B
assets/useCurrentUser-vREVGkfJ.js (removed) 94 B 🟢 -94 B 🟢 -95 B 🟢 -85 B

Status: 29 added / 29 removed / 9 unchanged

Vendor & Third-Party — 16.3 MB (baseline 16.8 MB) • 🟢 -525 kB

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-DM6QvB0c.js (removed) 2.23 MB 🟢 -2.23 MB 🟢 -483 kB 🟢 -380 kB
assets/vendor-other-DFhyGpUj.js (new) 2.23 MB 🔴 +2.23 MB 🔴 +483 kB 🔴 +380 kB
assets/vendor-primevue-D-xd9bIA.js (new) 1.69 MB 🔴 +1.69 MB 🔴 +307 kB 🔴 +185 kB
assets/vendor-primevue-CTrQSWXs.js (removed) 1.69 MB 🟢 -1.69 MB 🟢 -306 kB 🟢 -184 kB
assets/vendor-firebase-CNFqGy-2.js (new) 1.15 MB 🔴 +1.15 MB 🔴 +233 kB 🔴 +186 kB
assets/vendor-firebase-DZ9gHliD.js (removed) 1.15 MB 🟢 -1.15 MB 🟢 -233 kB 🟢 -186 kB
assets/vendor-reka-ui-D1e1IYG7.js (removed) 563 kB 🟢 -563 kB 🟢 -102 kB 🟢 -77.3 kB
assets/vendor-reka-ui-C_7i3Aez.js (new) 561 kB 🔴 +561 kB 🔴 +101 kB 🔴 +77 kB
assets/vendor-datadog-CR3rU1mS.js (removed) 528 kB 🟢 -528 kB 🟢 -126 kB 🟢 -102 kB
assets/vendor-vue-core-yudC0Byk.js (removed) 349 kB 🟢 -349 kB 🟢 -87.4 kB 🟢 -73.6 kB
assets/vendor-vue-core-CuDhPytp.js (new) 349 kB 🔴 +349 kB 🔴 +87.4 kB 🔴 +73.5 kB
assets/vendor-vueuse-DiUV6fCb.js (new) 153 kB 🔴 +153 kB 🔴 +38.3 kB 🔴 +32.8 kB
assets/vendor-vueuse-BAJp6gzS.js (removed) 150 kB 🟢 -150 kB 🟢 -37.7 kB 🟢 -32.3 kB
assets/vendor-i18n-BNoYHpCR.js (removed) 128 kB 🟢 -128 kB 🟢 -29 kB 🟢 -24.8 kB
assets/vendor-i18n-iC0IPUYP.js (new) 128 kB 🔴 +128 kB 🔴 +29 kB 🔴 +24.8 kB

Status: 7 added / 8 removed / 10 unchanged

Other — 14 MB (baseline 14.2 MB) • 🟢 -128 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/nodeDefs-DJncJqM3.js (removed) 761 kB 🟢 -761 kB 🟢 -127 kB 🟢 -86.3 kB
assets/nodeDefs-BQ-gIN6H.js (new) 753 kB 🔴 +753 kB 🔴 +125 kB 🔴 +85.4 kB
assets/nodeDefs-CpkVJBoz.js (removed) 700 kB 🟢 -700 kB 🟢 -115 kB 🟢 -80.1 kB
assets/nodeDefs-B6RvNLh0.js (removed) 693 kB 🟢 -693 kB 🟢 -118 kB 🟢 -82.5 kB
assets/nodeDefs-QouDpgWa.js (new) 692 kB 🔴 +692 kB 🔴 +114 kB 🔴 +79.2 kB
assets/nodeDefs-dO1KZ3Mg.js (new) 685 kB 🔴 +685 kB 🔴 +117 kB 🔴 +81.6 kB
assets/nodeDefs-BTcb6VPF.js (removed) 636 kB 🟢 -636 kB 🟢 -114 kB 🟢 -79.4 kB
assets/nodeDefs-Cqvlii7j.js (removed) 633 kB 🟢 -633 kB 🟢 -109 kB 🟢 -77.3 kB
assets/nodeDefs-D5FwHZSx.js (new) 629 kB 🔴 +629 kB 🔴 +113 kB 🔴 +78.5 kB
assets/nodeDefs-B9ZMGU5s.js (new) 626 kB 🔴 +626 kB 🔴 +108 kB 🔴 +76.5 kB
assets/nodeDefs-ctNGELIv.js (removed) 612 kB 🟢 -612 kB 🟢 -112 kB 🟢 -78.9 kB
assets/nodeDefs-COuQXeRc.js (removed) 609 kB 🟢 -609 kB 🟢 -111 kB 🟢 -80.1 kB
assets/nodeDefs-B_-Z2KXV.js (new) 605 kB 🔴 +605 kB 🔴 +111 kB 🔴 +78 kB
assets/nodeDefs-cJbQgzfa.js (removed) 602 kB 🟢 -602 kB 🟢 -110 kB 🟢 -80.5 kB
assets/nodeDefs-DXZeZiL9.js (new) 602 kB 🔴 +602 kB 🔴 +109 kB 🔴 +79.2 kB
assets/nodeDefs-COqBgFtH.js (removed) 600 kB 🟢 -600 kB 🟢 -108 kB 🟢 -78 kB
assets/nodeDefs-CyZzIjqk.js (removed) 596 kB 🟢 -596 kB 🟢 -106 kB 🟢 -77.7 kB
assets/nodeDefs-o8v7x34d.js (new) 596 kB 🔴 +596 kB 🔴 +109 kB 🔴 +79.7 kB
assets/nodeDefs-Tq4P7Ef1.js (new) 593 kB 🔴 +593 kB 🔴 +106 kB 🔴 +77.1 kB
assets/nodeDefs-CqlxyYBJ.js (removed) 593 kB 🟢 -593 kB 🟢 -106 kB 🟢 -76.9 kB
assets/nodeDefs-CI3tbTIJ.js (new) 590 kB 🔴 +590 kB 🔴 +105 kB 🔴 +76.9 kB
assets/nodeDefs-PpeQnIrN.js (new) 586 kB 🔴 +586 kB 🔴 +105 kB 🔴 +76.1 kB
assets/nodeDefs-CsUuOUpp.js (removed) 567 kB 🟢 -567 kB 🟢 -98.8 kB 🟢 -72.3 kB
assets/nodeDefs-B2dw-vE7.js (new) 562 kB 🔴 +562 kB 🔴 +97.8 kB 🔴 +71.7 kB
assets/nodeDefs-CyuI0uEL.js (removed) 550 kB 🟢 -550 kB 🟢 -110 kB 🟢 -76.8 kB
assets/nodeDefs-CU3YafMu.js (removed) 545 kB 🟢 -545 kB 🟢 -108 kB 🟢 -75.3 kB
assets/nodeDefs-BDqZ9hvR.js (new) 544 kB 🔴 +544 kB 🔴 +108 kB 🔴 +75.9 kB
assets/nodeDefs-Cf6zHhRO.js (new) 539 kB 🔴 +539 kB 🔴 +107 kB 🔴 +74.5 kB
assets/main-Ub70wlYB.js (removed) 323 kB 🟢 -323 kB 🟢 -79.8 kB 🟢 -61.9 kB
assets/main-_mnjSO4o.js (new) 319 kB 🔴 +319 kB 🔴 +79 kB 🔴 +61.3 kB
assets/main-DrCz2UPc.js (removed) 289 kB 🟢 -289 kB 🟢 -72.3 kB 🟢 -57.5 kB
assets/main-DIRsaeew.js (new) 288 kB 🔴 +288 kB 🔴 +71.9 kB 🔴 +57.2 kB
assets/main-DjXGc5-u.js (removed) 274 kB 🟢 -274 kB 🟢 -71.6 kB 🟢 -56.6 kB
assets/main-DZC_zCO7.js (new) 271 kB 🔴 +271 kB 🔴 +70.9 kB 🔴 +56 kB
assets/main-D2VI9Zum.js (removed) 265 kB 🟢 -265 kB 🟢 -70.9 kB 🟢 -55.7 kB
assets/main-DwRrxYIM.js (new) 262 kB 🔴 +262 kB 🔴 +70.2 kB 🔴 +55.2 kB
assets/main-D0DYIY6J.js (removed) 256 kB 🟢 -256 kB 🟢 -68.6 kB 🟢 -54.9 kB
assets/main-BDYyXEAD.js (new) 254 kB 🔴 +254 kB 🔴 +68.3 kB 🔴 +54.7 kB
assets/main-C4mQZFtQ.js (removed) 241 kB 🟢 -241 kB 🟢 -69.5 kB 🟢 -57.4 kB
assets/main-DCNYc_Q8.js (removed) 239 kB 🟢 -239 kB 🟢 -68.4 kB 🟢 -54.6 kB
assets/main-Q4Wv27wl.js (new) 239 kB 🔴 +239 kB 🔴 +68.9 kB 🔴 +56.9 kB
assets/main-DXxqMSdE.js (new) 237 kB 🔴 +237 kB 🔴 +67.8 kB 🔴 +54.2 kB
assets/main-EfuGA8is.js (removed) 233 kB 🟢 -233 kB 🟢 -67.7 kB 🟢 -55.8 kB
assets/main-CGeS2K8p.js (new) 231 kB 🔴 +231 kB 🔴 +67.1 kB 🔴 +55.3 kB
assets/main-QXmcpGfd.js (removed) 230 kB 🟢 -230 kB 🟢 -67.9 kB 🟢 -56.3 kB
assets/main-Tk5K4Z28.js (new) 228 kB 🔴 +228 kB 🔴 +67.2 kB 🔴 +55.8 kB
assets/main-jwnbHe2t.js (removed) 228 kB 🟢 -228 kB 🟢 -66.8 kB 🟢 -55.6 kB
assets/main-BHJNIAgZ.js (new) 227 kB 🔴 +227 kB 🔴 +66.5 kB 🔴 +55.4 kB
assets/main-BClbBnzH.js (removed) 225 kB 🟢 -225 kB 🟢 -65.7 kB 🟢 -55.1 kB
assets/main-ClQg8xs6.js (new) 223 kB 🔴 +223 kB 🔴 +65.4 kB 🔴 +54.8 kB
assets/main-GPtYHykK.js (new) 207 kB 🔴 +207 kB 🔴 +60.1 kB 🔴 +50.4 kB
assets/main-BV9nZeZp.js (removed) 207 kB 🟢 -207 kB 🟢 -60.1 kB 🟢 -50.4 kB
assets/main-B3N4wc59.js (removed) 203 kB 🟢 -203 kB 🟢 -66.7 kB 🟢 -52.7 kB
assets/main-CIOfiwYo.js (new) 201 kB 🔴 +201 kB 🔴 +66 kB 🔴 +52.4 kB
assets/main-pHRK9r-1.js (removed) 200 kB 🟢 -200 kB 🟢 -66.3 kB 🟢 -52.4 kB
assets/main-BS-o2VwD.js (new) 199 kB 🔴 +199 kB 🔴 +66 kB 🔴 +52.1 kB
assets/core-CXHSHlSv.js (removed) 115 kB 🟢 -115 kB 🟢 -29.7 kB 🟢 -25.1 kB
assets/core-B4tjq1e2.js (new) 115 kB 🔴 +115 kB 🔴 +29.7 kB 🔴 +25.1 kB
assets/WidgetSelect-Dj2upnE5.js (new) 88.8 kB 🔴 +88.8 kB 🔴 +20.1 kB 🔴 +17.2 kB
assets/WidgetSelect-DtXpSwHc.js (removed) 88.8 kB 🟢 -88.8 kB 🟢 -20.1 kB 🟢 -17.2 kB
assets/SubscriptionPanelContentWorkspace-EhuSw0I8.js (removed) 80.9 kB 🟢 -80.9 kB 🟢 -15.9 kB 🟢 -13.7 kB
assets/SubscriptionPanelContentWorkspace-c8cDYgwz.js (new) 80 kB 🔴 +80 kB 🔴 +15.8 kB 🔴 +13.6 kB
assets/Load3D-CBFbTT-N.js (new) 71.3 kB 🔴 +71.3 kB 🔴 +11.7 kB 🔴 +9.99 kB
assets/Load3D-CyVHAzbL.js (removed) 71.3 kB 🟢 -71.3 kB 🟢 -11.7 kB 🟢 -9.97 kB
assets/WidgetVideoEdit-_UumSAsJ.js (removed) 67.5 kB 🟢 -67.5 kB 🟢 -15.7 kB 🟢 -13.9 kB
assets/SubscriptionTransitionPreviewWorkspace-B2I_aqja.js (removed) 66.5 kB 🟢 -66.5 kB 🟢 -13.4 kB 🟢 -11.7 kB
assets/SubscriptionTransitionPreviewWorkspace-DkzY5APV.js (new) 66.4 kB 🔴 +66.4 kB 🔴 +13.4 kB 🔴 +11.7 kB
assets/WidgetVideoEdit-CuXv-BCk.js (new) 63.4 kB 🔴 +63.4 kB 🔴 +14.6 kB 🔴 +12.8 kB
assets/WorkspaceSettingsPanelContent-DrRoJiSk.js (new) 61.7 kB 🔴 +61.7 kB 🔴 +13.2 kB 🔴 +11.5 kB
assets/WorkspaceSettingsPanelContent-CPT_QoH-.js (removed) 58.2 kB 🟢 -58.2 kB 🟢 -12.4 kB 🟢 -10.8 kB
assets/Preview3d-B5NELXpx.js (new) 50.9 kB 🔴 +50.9 kB 🔴 +8.3 kB 🔴 +7.24 kB
assets/Preview3d-MSeKVV8Y.js (removed) 50.9 kB 🟢 -50.9 kB 🟢 -8.32 kB 🟢 -7.25 kB
assets/main-DtjRsZJ1.js (removed) 45.3 kB 🟢 -45.3 kB 🟢 -13.2 kB 🟢 -11.4 kB
assets/main-DGKVIMwV.js (new) 45.1 kB 🔴 +45.1 kB 🔴 +13.1 kB 🔴 +11.4 kB
assets/SubscriptionRequiredDialogContentUnified-Ct-sQWws.js (removed) 42.7 kB 🟢 -42.7 kB 🟢 -9.39 kB 🟢 -8.19 kB
assets/SubscriptionRequiredDialogContentUnified-BymEz6NH.js (new) 42.6 kB 🔴 +42.6 kB 🔴 +9.35 kB 🔴 +8.16 kB
assets/LayerEditorContent-FshkzdLH.js (removed) 42.5 kB 🟢 -42.5 kB 🟢 -9.62 kB 🟢 -8.43 kB
assets/LayerEditorContent-BYGh0Yd-.js (new) 42.5 kB 🔴 +42.5 kB 🔴 +9.61 kB 🔴 +8.45 kB
assets/nodeDefs-C1w7DDtA.js (removed) 39.2 kB 🟢 -39.2 kB 🟢 -10.1 kB 🟢 -8.75 kB
assets/nodeDefs-B4VOVj-W.js (new) 38.8 kB 🔴 +38.8 kB 🔴 +9.94 kB 🔴 +8.66 kB
assets/WidgetBoundingBoxes-JfPI_SdR.js (removed) 33.7 kB 🟢 -33.7 kB 🟢 -9.16 kB 🟢 -8.13 kB
assets/WidgetBoundingBoxes-16XvDQeK.js (new) 33.7 kB 🔴 +33.7 kB 🔴 +9.15 kB 🔴 +8.12 kB
assets/WidgetPainter-DrOFyJ1u.js (new) 32.6 kB 🔴 +32.6 kB 🔴 +7.86 kB 🔴 +6.96 kB
assets/WidgetPainter-siK7a9Kj.js (removed) 32.6 kB 🟢 -32.6 kB 🟢 -7.88 kB 🟢 -6.97 kB
assets/Load3dViewerContent-ej76ONP5.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -6.28 kB 🟢 -5.45 kB
assets/Load3dViewerContent-kkGawTUx.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +6.28 kB 🔴 +5.45 kB
assets/HdrViewerContent-C-iCVYft.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -8.25 kB 🟢 -7.28 kB
assets/HdrViewerContent-CS6AzThk.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +8.24 kB 🔴 +7.27 kB
assets/ColorPicker-1Sbv-uCw.js (new) 29.2 kB 🔴 +29.2 kB 🔴 +7.58 kB 🔴 +6.66 kB
assets/ColorPicker-DVuyaO-B.js (removed) 29.2 kB 🟢 -29.2 kB 🟢 -7.58 kB 🟢 -6.67 kB
assets/SubscriptionRequiredDialogContent-gaOGeM6X.js (new) 27 kB 🔴 +27 kB 🔴 +6.37 kB 🔴 +5.61 kB
assets/SubscriptionRequiredDialogContent-B_YkX0P7.js (removed) 26.9 kB 🟢 -26.9 kB 🟢 -6.36 kB 🟢 -5.6 kB
assets/SubscriptionRequiredDialogContentWorkspace-BO-caMmw.js (removed) 25.1 kB 🟢 -25.1 kB 🟢 -5.81 kB 🟢 -5.12 kB
assets/SubscriptionRequiredDialogContentWorkspace-DRwYN7yr.js (new) 25.1 kB 🔴 +25.1 kB 🔴 +5.8 kB 🔴 +5.09 kB
assets/CreditsTile-DLIfN7GA.js (new) 24.9 kB 🔴 +24.9 kB 🔴 +6.64 kB 🔴 +5.83 kB
assets/CreditsTile-CKI718ib.js (removed) 24.9 kB 🟢 -24.9 kB 🟢 -6.65 kB 🟢 -5.83 kB
assets/initHostTelemetry-DUmxyEAz.js (new) 24.6 kB 🔴 +24.6 kB 🔴 +5.83 kB 🔴 +4.84 kB
assets/initHostTelemetry-CZ-_vLgs.js (removed) 24.5 kB 🟢 -24.5 kB 🟢 -5.82 kB 🟢 -4.83 kB
assets/load3d-BgkTViWV.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.41 kB 🟢 -4.68 kB
assets/load3d-DiPfoiQX.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.4 kB 🔴 +4.67 kB
assets/CurrentUserPopoverWorkspace-B1F9UDwU.js (removed) 21.8 kB 🟢 -21.8 kB 🟢 -4.94 kB 🟢 -4.39 kB
assets/CurrentUserPopoverWorkspace-COKacw01.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +4.84 kB 🔴 +4.32 kB
assets/SignInContent-BS5V6hZ1.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.18 kB 🟢 -4.53 kB
assets/SignInContent-B3gMUJg9.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.21 kB 🔴 +3.69 kB
assets/DialogHeader-Dk6Kmvng.js (removed) 17.5 kB 🟢 -17.5 kB 🟢 -5.28 kB 🟢 -4.61 kB
assets/DialogHeader-Be_F2CyP.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +5.24 kB 🔴 +4.57 kB
assets/WidgetRecordAudio-De6qzGkb.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.6 kB 🟢 -4.1 kB
assets/WidgetRecordAudio-DWhGb7Ui.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.59 kB 🔴 +4.1 kB
assets/i18n-C2QrWgTG.js (new) 15.9 kB 🔴 +15.9 kB 🔴 +4.31 kB 🔴 +3.63 kB
assets/i18n-CTWJmgSG.js (removed) 15.9 kB 🟢 -15.9 kB 🟢 -4.3 kB 🟢 -3.61 kB
assets/WidgetInputNumber-CM18K2PH.js (new) 13.9 kB 🔴 +13.9 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/WidgetInputNumber-pDCnQwZW.js (removed) 13.9 kB 🟢 -13.9 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/WidgetRange-8BVwvyAy.js (removed) 13.7 kB 🟢 -13.7 kB 🟢 -3.55 kB 🟢 -3.13 kB
assets/WidgetRange-DKA5V1hS.js (new) 13.7 kB 🔴 +13.7 kB 🔴 +3.55 kB 🔴 +3.12 kB
assets/WaveAudioPlayer-B830cAlo.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.46 kB 🔴 +3.06 kB
assets/WaveAudioPlayer-DWFNcQs9.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.47 kB 🟢 -3.05 kB
assets/WidgetCurve-7hanUgi6.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.47 kB 🔴 +3.15 kB
assets/WidgetCurve-CaWdJTmn.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.48 kB 🟢 -3.14 kB
assets/AudioPreviewPlayer-CatEWm9H.js (removed) 10.6 kB 🟢 -10.6 kB 🟢 -3.05 kB 🟢 -2.74 kB
assets/AudioPreviewPlayer-DPYuopId.js (new) 10.6 kB 🔴 +10.6 kB 🔴 +3.05 kB 🔴 +2.72 kB
assets/TeamWorkspacesDialogContent-BTh2eOSL.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -2.97 kB 🟢 -2.62 kB
assets/TeamWorkspacesDialogContent-DPvINv2i.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +2.96 kB 🔴 +2.62 kB
assets/SelectValue-a1Tqx-7a.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.48 kB 🟢 -2.2 kB
assets/SelectValue-CIPLUGFv.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.46 kB 🔴 +2.18 kB
assets/onboardingCloudRoutes-DPK8RELf.js (removed) 9.39 kB 🟢 -9.39 kB 🟢 -2.83 kB 🟢 -2.42 kB
assets/onboardingCloudRoutes-BtsCwYua.js (new) 9.22 kB 🔴 +9.22 kB 🔴 +2.82 kB 🔴 +2.41 kB
assets/Load3DConfiguration-BkDgakuD.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.61 kB 🔴 +2.29 kB
assets/Load3DConfiguration-CNnlUME0.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.61 kB 🟢 -2.3 kB
assets/WidgetImageCrop-Dpv902WJ.js (removed) 8.49 kB 🟢 -8.49 kB 🟢 -2.66 kB 🟢 -2.34 kB
assets/WidgetImageCrop-F3otnu8h.js (new) 8.49 kB 🔴 +8.49 kB 🔴 +2.65 kB 🔴 +2.33 kB
assets/SetMemberCreditLimitDialogContent-Cd-fLvOZ.js (removed) 8.47 kB 🟢 -8.47 kB 🟢 -2.34 kB 🟢 -2.06 kB
assets/SetMemberCreditLimitDialogContent-Dnsyhmyy.js (new) 8.47 kB 🔴 +8.47 kB 🔴 +2.34 kB 🔴 +2.06 kB
assets/nodeTemplates-B9hT6diI.js (new) 8.32 kB 🔴 +8.32 kB 🔴 +2.85 kB 🔴 +2.5 kB
assets/nodeTemplates-hNlvHSq1.js (removed) 8.32 kB 🟢 -8.32 kB 🟢 -2.86 kB 🟢 -2.5 kB
assets/WidgetImageCompare-CAb5LKpw.js (new) 8.13 kB 🔴 +8.13 kB 🔴 +2.3 kB 🔴 +2.01 kB
assets/WidgetImageCompare-CuxMACcG.js (removed) 8.13 kB 🟢 -8.13 kB 🟢 -2.3 kB 🟢 -2.02 kB
assets/NightlySurveyController-BKppaHe8.js (removed) 7.5 kB 🟢 -7.5 kB 🟢 -2.55 kB 🟢 -2.25 kB
assets/NightlySurveyController-CZ12U0kN.js (new) 7.5 kB 🔴 +7.5 kB 🔴 +2.55 kB 🔴 +2.24 kB
assets/Popover-CBCBUnWm.js (removed) 7.48 kB 🟢 -7.48 kB 🟢 -2.68 kB 🟢 -2.36 kB
assets/Popover-CIldDoHH.js (new) 7.48 kB 🔴 +7.48 kB 🔴 +2.68 kB 🔴 +2.36 kB
assets/CloudRunButtonWrapper-BIuQ5Yay.js (new) 6.84 kB 🔴 +6.84 kB 🔴 +2.18 kB 🔴 +1.91 kB
assets/CloudRunButtonWrapper-D0Y5cAQU.js (removed) 6.84 kB 🟢 -6.84 kB 🟢 -2.18 kB 🟢 -1.92 kB
assets/missingModelMetadata-DSU5FQQc.js (removed) 6.45 kB 🟢 -6.45 kB 🟢 -2.2 kB 🟢 -1.93 kB
assets/WidgetWithControl-DNrJHlP3.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.63 kB 🟢 -2.33 kB
assets/WidgetWithControl-CM7dpSm_.js (new) 6.41 kB 🔴 +6.41 kB 🔴 +2.61 kB 🔴 +2.32 kB
assets/missingModelMetadata-Cy8AHOMX.js (new) 6.17 kB 🔴 +6.17 kB 🔴 +2.13 kB 🔴 +1.86 kB
assets/AnimationControls-CtllWymA.js (removed) 6.1 kB 🟢 -6.1 kB 🟢 -1.85 kB 🟢 -1.63 kB
assets/AnimationControls-CVuk1Djb.js (new) 6.1 kB 🔴 +6.1 kB 🔴 +1.85 kB 🔴 +1.64 kB
assets/CancelSubscriptionDialogContent-CxyKoWU9.js (removed) 5.97 kB 🟢 -5.97 kB 🟢 -1.98 kB 🟢 -1.75 kB
assets/CancelSubscriptionDialogContent-GmZK8BaA.js (new) 5.97 kB 🔴 +5.97 kB 🔴 +1.98 kB 🔴 +1.75 kB
assets/main-B_oQQ9lg.js (removed) 5.92 kB 🟢 -5.92 kB 🟢 -1.9 kB 🟢 -1.59 kB
assets/main-B814jXQj.js (new) 5.92 kB 🔴 +5.92 kB 🔴 +1.91 kB 🔴 +1.6 kB
assets/load3dPreviewExtensions-Bjnd5d6S.js (removed) 5.88 kB 🟢 -5.88 kB 🟢 -1.81 kB 🟢 -1.6 kB
assets/load3dPreviewExtensions-CKYW_vA5.js (new) 5.88 kB 🔴 +5.88 kB 🔴 +1.81 kB 🔴 +1.6 kB
assets/DowngradeRemoveMembersDialogContent-BPA7i-Hd.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -1.89 kB 🟢 -1.64 kB
assets/DowngradeRemoveMembersDialogContent-jwkFK81a.js (new) 5.58 kB 🔴 +5.58 kB 🔴 +1.88 kB 🔴 +1.64 kB
assets/launchCancellationFlow-Cc4jibwo.js (new) 5.18 kB 🔴 +5.18 kB 🔴 +1.78 kB 🔴 +1.57 kB
assets/launchCancellationFlow-s0AzhAKL.js (removed) 5.18 kB 🟢 -5.18 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/CreateWorkspaceDialogContent-BdQyNHFa.js (new) 5.12 kB 🔴 +5.12 kB 🔴 +1.79 kB 🔴 +1.55 kB
assets/CreateWorkspaceDialogContent-D4CBmdMc.js (removed) 5.12 kB 🟢 -5.12 kB 🟢 -1.79 kB 🟢 -1.55 kB
assets/CloudNotificationContent-BGfuH_hS.js (new) 5.05 kB 🔴 +5.05 kB 🔴 +1.76 kB 🔴 +1.51 kB
assets/CloudNotificationContent-CoOPRA17.js (removed) 5.05 kB 🟢 -5.05 kB 🟢 -1.76 kB 🟢 -1.51 kB
assets/ChangeMemberRoleDialogContent-CVGeWHAw.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/ChangeMemberRoleDialogContent-uMcH0u4O.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.63 kB 🔴 +1.43 kB
assets/InviteMemberDialogContent-CuKHNik6.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.64 kB 🟢 -1.44 kB
assets/InviteMemberDialogContent-OU6M02Tz.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/EditWorkspaceDialogContent-B45UXR_y.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.76 kB 🔴 +1.52 kB
assets/EditWorkspaceDialogContent-Dy6Su-_p.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.76 kB 🟢 -1.52 kB
assets/PaletteSwatchRow-B-Ru-mfe.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.87 kB 🟢 -1.66 kB
assets/PaletteSwatchRow-C8ERNye0.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.86 kB 🔴 +1.66 kB
assets/WidgetTextarea-CUgce3d5.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.87 kB 🟢 -1.64 kB
assets/WidgetTextarea-Du3AkLOz.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.87 kB 🔴 +1.63 kB
assets/saveMesh-RgebEW-G.js (removed) 4.76 kB 🟢 -4.76 kB 🟢 -1.52 kB 🟢 -1.35 kB
assets/saveMesh-CGOD6A8P.js (new) 4.76 kB 🔴 +4.76 kB 🔴 +1.52 kB 🔴 +1.35 kB
assets/WorkspacePanelContent-BYfGfvxg.js (new) 4.74 kB 🔴 +4.74 kB 🔴 +1.62 kB 🔴 +1.43 kB
assets/WorkspacePanelContent-C-W6g66X.js (removed) 4.74 kB 🟢 -4.74 kB 🟢 -1.63 kB 🟢 -1.44 kB
assets/ValueControlPopover-cqtmBjkj.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.55 kB 🔴 +1.38 kB
assets/ValueControlPopover-ZlCDjVfm.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.55 kB 🟢 -1.38 kB
assets/ToggleGroupItem-CedKLrAZ.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.41 kB 🟢 -1.25 kB
assets/ToggleGroupItem-Xh56XluV.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.41 kB 🔴 +1.24 kB
assets/ApiNodesSignInContent-DSYJnHFc.js (removed) 4.08 kB 🟢 -4.08 kB 🟢 -1.31 kB 🟢 -1.15 kB
assets/ApiNodesSignInContent-WLrgH-sN.js (new) 4.08 kB 🔴 +4.08 kB 🔴 +1.31 kB 🔴 +1.16 kB
assets/Slider-Dx1K1AoJ.js (new) 3.91 kB 🔴 +3.91 kB 🔴 +1.43 kB 🔴 +1.25 kB
assets/Slider-gYmu-6Xc.js (removed) 3.91 kB 🟢 -3.91 kB 🟢 -1.43 kB 🟢 -1.25 kB
assets/DeleteWorkspaceDialogContent-Bwq4CMRW.js (new) 3.84 kB 🔴 +3.84 kB 🔴 +1.44 kB 🔴 +1.24 kB
assets/DeleteWorkspaceDialogContent-CFekWQMi.js (removed) 3.84 kB 🟢 -3.84 kB 🟢 -1.44 kB 🟢 -1.24 kB
assets/WidgetBoundingBox-Cxgt9rH-.js (new) 3.76 kB 🔴 +3.76 kB 🔴 +1.03 kB 🔴 +898 B
assets/WidgetBoundingBox-DHE_RJSX.js (removed) 3.76 kB 🟢 -3.76 kB 🟢 -1.03 kB 🟢 -900 B
assets/RemoveMemberDialogContent-BMGHkhP2.js (new) 3.76 kB 🔴 +3.76 kB 🔴 +1.38 kB 🔴 +1.2 kB
assets/RemoveMemberDialogContent-xhp69aXL.js (removed) 3.76 kB 🟢 -3.76 kB 🟢 -1.39 kB 🟢 -1.22 kB
assets/WidgetGalleria-BCG27W3j.js (removed) 3.75 kB 🟢 -3.75 kB 🟢 -1.45 kB 🟢 -1.29 kB
assets/WidgetGalleria-CUo1BxIO.js (new) 3.75 kB 🔴 +3.75 kB 🔴 +1.45 kB 🔴 +1.3 kB
assets/RevokeInviteDialogContent-0PWFEBmI.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.39 kB 🔴 +1.21 kB
assets/RevokeInviteDialogContent-DHevTJnu.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.39 kB 🟢 -1.22 kB
assets/LeaveWorkspaceDialogContent-B8BctsS_.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.38 kB 🔴 +1.19 kB
assets/LeaveWorkspaceDialogContent-DsdcFdZT.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.39 kB 🟢 -1.19 kB
assets/WidgetToggleSwitch-IbZX_epq.js (removed) 3.56 kB 🟢 -3.56 kB 🟢 -1.3 kB 🟢 -1.14 kB
assets/WidgetToggleSwitch-CQQbOGD6.js (new) 3.56 kB 🔴 +3.56 kB 🔴 +1.3 kB 🔴 +1.14 kB
assets/InviteMemberUpsellDialogContent-Bq1yfeTa.js (removed) 3.47 kB 🟢 -3.47 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/InviteMemberUpsellDialogContent-D59zyIyw.js (new) 3.47 kB 🔴 +3.47 kB 🔴 +1.24 kB 🔴 +1.07 kB
assets/workspaceCheckoutTelemetry-Dk6VBPGd.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.52 kB 🔴 +1.33 kB
assets/workspaceCheckoutTelemetry-DQ6YGP5o.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.52 kB 🟢 -1.32 kB
assets/GlobalToast-C9j_p-uD.js (removed) 3.25 kB 🟢 -3.25 kB 🟢 -1.3 kB 🟢 -1.11 kB
assets/GlobalToast-C8Kb8aVE.js (new) 3.25 kB 🔴 +3.25 kB 🔴 +1.3 kB 🔴 +1.11 kB
assets/Media3DTop-CnpLPq1e.js (removed) 3.21 kB 🟢 -3.21 kB 🟢 -1.27 kB 🟢 -1.11 kB
assets/Media3DTop-D4QMbmjp.js (new) 3.21 kB 🔴 +3.21 kB 🔴 +1.26 kB 🔴 +1.1 kB
assets/WidgetMarkdown-DfbocEb7.js (removed) 3.07 kB 🟢 -3.07 kB 🟢 -1.26 kB 🟢 -1.1 kB
assets/WidgetMarkdown-xoCCA7Av.js (new) 3.07 kB 🔴 +3.07 kB 🔴 +1.25 kB 🔴 +1.11 kB
assets/WidgetInputText-B7ew3nfx.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.26 kB 🔴 +1.14 kB
assets/WidgetInputText-BWZwWTwX.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.26 kB 🟢 -1.14 kB
assets/MediaVideoTop-tpKsgZUQ.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.19 kB 🟢 -1.04 kB
assets/MediaVideoTop-DRJEsTSX.js (new) 2.86 kB 🔴 +2.86 kB 🔴 +1.14 kB 🔴 +1.01 kB
assets/load3dAdvanced-D5pey-yX.js (removed) 2.82 kB 🟢 -2.82 kB 🟢 -1.09 kB 🟢 -957 B
assets/load3dAdvanced-B1zduuEi.js (new) 2.82 kB 🔴 +2.82 kB 🔴 +1.1 kB 🔴 +956 B
assets/ErrorPanelSurveyCta-BNW2MGcy.js (new) 2.64 kB 🔴 +2.64 kB 🔴 +1.14 kB 🔴 +1.01 kB
assets/ErrorPanelSurveyCta-CBy5P8bC.js (removed) 2.64 kB 🟢 -2.64 kB 🟢 -1.14 kB 🟢 -1.01 kB
assets/Switch-C237YTfd.js (new) 2.49 kB 🔴 +2.49 kB 🔴 +1.09 kB 🔴 +973 B
assets/Switch-DxGEzj-o.js (removed) 2.49 kB 🟢 -2.49 kB 🟢 -1.09 kB 🟢 -969 B
assets/SubscribeToRun-BCcXYMRy.js (new) 2.39 kB 🔴 +2.39 kB 🔴 +1.03 kB 🔴 +923 B
assets/SubscribeToRun-BeMitiXI.js (removed) 2.39 kB 🟢 -2.39 kB 🟢 -1.03 kB 🟢 -909 B
assets/WidgetLayoutField-D2lG1_RW.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +1.02 kB 🔴 +900 B
assets/WidgetLayoutField-gqC5HiqE.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -1.03 kB 🟢 -903 B
assets/WidgetChart-Brx-nhJ7.js (new) 2.36 kB 🔴 +2.36 kB 🔴 +998 B 🔴 +863 B
assets/WidgetChart-DhIozH2z.js (removed) 2.36 kB 🟢 -2.36 kB 🟢 -1 kB 🟢 -864 B
assets/TopBarHeader-CcgaLSyK.js (new) 2.01 kB 🔴 +2.01 kB 🔴 +842 B 🔴 +737 B
assets/TopBarHeader-DrGsbvUy.js (removed) 2.01 kB 🟢 -2.01 kB 🟢 -843 B 🟢 -730 B
assets/MediaImageTop-DVdFkMJE.js (removed) 1.95 kB 🟢 -1.95 kB 🟢 -927 B 🟢 -795 B
assets/MediaImageTop-G5PJWqsF.js (new) 1.95 kB 🔴 +1.95 kB 🔴 +928 B 🔴 +802 B
assets/TypeformEmbed-DaGPjMO9.js (removed) 1.83 kB 🟢 -1.83 kB 🟢 -810 B 🟢 -713 B
assets/TypeformEmbed-DByklKBW.js (new) 1.83 kB 🔴 +1.83 kB 🔴 +810 B 🔴 +709 B
assets/MediaTextTop-DJyhV4a3.js (removed) 1.77 kB 🟢 -1.77 kB 🟢 -853 B 🟢 -727 B
assets/MediaTextTop-Qkpmavcl.js (new) 1.77 kB 🔴 +1.77 kB 🔴 +854 B 🔴 +729 B
assets/WidgetColorPicker-BKw7fh7J.js (removed) 1.69 kB 🟢 -1.69 kB 🟢 -756 B 🟢 -671 B
assets/WidgetColorPicker-BztNcpGh.js (new) 1.69 kB 🔴 +1.69 kB 🔴 +755 B 🔴 +670 B
assets/Loader-BKEeKywz.js (new) 1.64 kB 🔴 +1.64 kB 🔴 +781 B 🔴 +704 B
assets/Loader-DUmcO9m4.js (removed) 1.64 kB 🟢 -1.64 kB 🟢 -782 B 🟢 -712 B
assets/WidgetColors-492fhvji.js (new) 1.63 kB 🔴 +1.63 kB 🔴 +805 B 🔴 +710 B
assets/WidgetColors-JukJ-xzC.js (removed) 1.63 kB 🟢 -1.63 kB 🟢 -805 B 🟢 -708 B
assets/MediaAudioTop-hzo6E7JN.js (new) 1.62 kB 🔴 +1.62 kB 🔴 +805 B 🔴 +670 B
assets/MediaAudioTop-Lx_FtHtQ.js (removed) 1.62 kB 🟢 -1.62 kB 🟢 -808 B 🟢 -669 B
assets/Textarea-Cu_WHPvZ.js (new) 1.56 kB 🔴 +1.56 kB 🔴 +813 B 🔴 +708 B
assets/Textarea-DGRWK7cp.js (removed) 1.56 kB 🟢 -1.56 kB 🟢 -812 B 🟢 -714 B
assets/signInSchema-COChp5Pr.js (removed) 1.55 kB 🟢 -1.55 kB 🟢 -555 B 🟢 -486 B
assets/signInSchema-svYxlwv-.js (new) 1.55 kB 🔴 +1.55 kB 🔴 +555 B 🔴 +514 B
assets/VideoPlayOverlay-CirO1lkW.js (new) 1.46 kB 🔴 +1.46 kB 🔴 +726 B 🔴 +646 B
assets/VideoPlayOverlay-D2wYJwv2.js (removed) 1.46 kB 🟢 -1.46 kB 🟢 -730 B 🟢 -645 B
assets/ButtonGroup-D1QIwxch.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -645 B 🟢 -562 B
assets/ButtonGroup-WpmcAVbI.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +644 B 🔴 +566 B
assets/DialogClose-DDX5Hg9R.js (new) 1.18 kB 🔴 +1.18 kB 🔴 +608 B 🔴 +551 B
assets/DialogClose-gJ1XljK8.js (removed) 1.18 kB 🟢 -1.18 kB 🟢 -611 B 🟢 -548 B
assets/MediaOtherTop-Bih2juu_.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -574 B 🟢 -464 B
assets/MediaOtherTop-Dkx_4EVa.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +573 B 🔴 +475 B
assets/cloudSessionCookie-CtcTtpW_.js (removed) 933 B 🟢 -933 B 🟢 -435 B 🟢 -379 B
assets/cloudSessionCookie-CWE8zFWG.js (new) 933 B 🔴 +933 B 🔴 +434 B 🔴 +378 B
assets/cloudBadges-CsszAP_W.js (new) 922 B 🔴 +922 B 🔴 +515 B 🔴 +440 B
assets/cloudBadges-D9ML33Lp.js (removed) 922 B 🟢 -922 B 🟢 -513 B 🟢 -442 B
assets/ComfyOrgHeader-2k_Dj0eX.js (new) 906 B 🔴 +906 B 🔴 +495 B 🔴 +460 B
assets/ComfyOrgHeader-DHnXyu2w.js (removed) 906 B 🟢 -906 B 🟢 -496 B 🟢 -432 B
assets/credits-rxDHmus9.js (new) 821 B 🔴 +821 B 🔴 +358 B 🔴 +302 B
assets/Load3DAdvanced-Dv7mxRsv.js (removed) 761 B 🟢 -761 B 🟢 -424 B 🟢 -359 B
assets/Load3DAdvanced-HK1pH7wn.js (new) 761 B 🔴 +761 B 🔴 +423 B 🔴 +359 B
assets/widgetTypes-BTjqpzLS.js (new) 514 B 🔴 +514 B 🔴 +280 B 🔴 +271 B
assets/widgetTypes-Cf58xZw1.js (removed) 514 B 🟢 -514 B 🟢 -280 B 🟢 -272 B
assets/vRekaZIndex-CEzhu9sj.js (new) 505 B 🔴 +505 B 🔴 +330 B 🔴 +278 B
assets/vRekaZIndex-DE5prqA2.js (removed) 505 B 🟢 -505 B 🟢 -331 B 🟢 -273 B
assets/nightlyBadges-CRFeXEbM.js (new) 411 B 🔴 +411 B 🔴 +273 B 🔴 +271 B
assets/nightlyBadges-DeoToDZk.js (removed) 411 B 🟢 -411 B 🟢 -271 B 🟢 -227 B
assets/src-CZvY4J5n.js (removed) 407 B 🟢 -407 B 🟢 -290 B 🟢 -245 B
assets/src-hgxVSJpP.js (new) 407 B 🔴 +407 B 🔴 +287 B 🔴 +245 B
assets/Load3dViewerContent-B5Ny33v0.js (removed) 137 B 🟢 -137 B 🟢 -103 B 🟢 -96 B
assets/Load3dViewerContent-COzuvhCF.js (new) 137 B 🔴 +137 B 🔴 +103 B 🔴 +99 B
assets/WidgetToggleSwitch-DUFXu89q.js (new) 134 B 🔴 +134 B 🔴 +101 B 🔴 +96 B
assets/WidgetBoundingBox-CiK7tzJz.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +91 B
assets/WidgetBoundingBox-CkSvQALG.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -107 B
assets/missingModelMetadata-3Rraqvwn.js (new) 125 B 🔴 +125 B 🔴 +103 B 🔴 +100 B
assets/missingModelMetadata-4mq1VVnZ.js (removed) 125 B 🟢 -125 B 🟢 -103 B 🟢 -123 B
assets/Load3DAdvanced-CQu94K_5.js (new) 122 B 🔴 +122 B 🔴 +97 B 🔴 +89 B
assets/Load3DAdvanced-CS8_Th1I.js (removed) 122 B 🟢 -122 B 🟢 -97 B 🟢 -95 B
assets/WidgetLegacy-BFNAR5T0.js (removed) 117 B 🟢 -117 B 🟢 -106 B 🟢 -102 B
assets/WidgetLegacy-C40k-04Q.js (new) 117 B 🔴 +117 B 🔴 +106 B 🔴 +103 B
assets/workflowDraftStoreV2-CWkLhVzV.js (new) 112 B 🔴 +112 B 🔴 +101 B 🔴 +113 B
assets/workflowDraftStoreV2-U5XvCG0_.js (removed) 112 B 🟢 -112 B 🟢 -101 B 🟢 -108 B
assets/Load3D-C4-eE6yO.js (new) 98 B 🔴 +98 B 🔴 +89 B 🔴 +85 B
assets/Load3D-DqBQcX6b.js (removed) 98 B 🟢 -98 B 🟢 -89 B 🟢 -81 B
assets/i18n-ChPltmRa.js (removed) 97 B 🟢 -97 B 🟢 -92 B 🟢 -86 B
assets/i18n-DBz_b3l1.js (new) 97 B 🔴 +97 B 🔴 +92 B 🔴 +85 B
assets/startRecording-BOV6MsgY.js (removed) 95 B 🟢 -95 B 🟢 -96 B 🟢 -92 B
assets/changeTracker-BPo12B6b.js (removed) 91 B 🟢 -91 B 🟢 -93 B 🟢 -86 B
assets/changeTracker-C6if3wJz.js (new) 91 B 🔴 +91 B 🔴 +93 B 🔴 +85 B

Status: 145 added / 144 removed / 141 unchanged

⚡ Performance

⏳ Performance tests in progress…

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR adds local asset location and deletion actions. It extends asset-service APIs, updates deletion orchestration, adds context-menu controls, refines loopback detection and loader-path handling, and expands localization and test coverage.

Changes

Asset actions

Layer / File(s) Summary
Asset service and path handling
src/platform/assets/services/assetService.ts, src/platform/assets/services/assetService.test.ts
Loader paths are normalized and validated. Asset deletion can remove source content. Local input assets can be resolved by path. Asset locations can be opened.
Deletion and location orchestration
src/platform/assets/composables/useMediaAssetActions.ts, src/platform/assets/composables/useMediaAssetActions.test.ts
Deletion supports confirmation controls and source-content removal. Per-asset cleanup updates stores, widget references, and notifications. Location opening and provenance copying are supported.
Context-menu actions and visibility
src/platform/assets/components/MediaAssetContextMenu.vue, src/platform/assets/components/MediaAssetContextMenu.test.ts, src/components/sidebar/tabs/AssetsSidebarTab.vue, src/locales/en/main.json
Context menus show file-location, asset deletion, and source-file deletion actions based on asset type, feature availability, and loopback-host checks. Sidebar selection visibility is separate from context-menu deletion visibility.
Asset metadata and host support
src/platform/assets/schemas/assetSchema.ts, src/platform/assets/utils/assetMetadataUtils.ts, src/platform/assets/utils/assetMetadataUtils.test.ts, src/utils/hostWhitelist.ts, src/utils/hostWhitelist.test.ts
Asset metadata includes loader paths and optional provenance fields. Loopback detection is exported and tested for localhost and loopback addresses.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant AssetContextMenu
  participant MediaAssetActions
  participant assetService
  participant AssetBackend
  AssetContextMenu->>MediaAssetActions: Request deletion or file-location opening
  MediaAssetActions->>assetService: Execute the selected asset action
  assetService->>AssetBackend: Send deletion or location request
  AssetBackend-->>assetService: Return operation result
  assetService-->>MediaAssetActions: Return success or error
  MediaAssetActions-->>AssetContextMenu: Show notification and emit asset-deleted
Loading

Suggested labels: size:L

Suggested reviewers: dante01yoon


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
End-To-End Regression Coverage For Fixes ❓ Inconclusive The review context lists changed files and the description, but it does not provide the PR title or commit subjects required to verify the bug-fix signal. Provide the PR title and commit subjects, then assess whether the bug-fix signal, browser_tests/ change, and concrete E2E-test rationale are present.
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding local asset file actions.
Description check ✅ Passed The description covers the required summary, changes, review focus, dependencies, and validation details; screenshots are not necessary for this change.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Adr Compliance For Entity/Litegraph Changes ✅ Passed The changed-file list contains no files under src/lib/litegraph/, src/ecs/, or graph-entity-related paths, so this check does not apply.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 11

Caution

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

⚠️ Outside diff range comments (1)
src/platform/assets/components/MediaAssetContextMenu.test.ts (1)

107-135: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add negative coverage for show-delete-button=false.

mountComponent now sets :show-delete-button="true" for every case in this test file, while the component hides delete-related menu items when showDeleteButton is false. Add a test mounting the component with :show-delete-button="false" and asserting that the delete actions do not appear.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/platform/assets/components/MediaAssetContextMenu.test.ts` around lines
107 - 135, Add a negative test using the existing mountComponent helper
configured with show-delete-button set to false, then assert that all
delete-related menu actions are absent from the rendered output. Keep the
existing default true behavior and verify the component’s hidden-delete path.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/components/sidebar/tabs/AssetsSidebarTab.vue`:
- Line 166: Review the unconfirmed delete behavior controlled by
show-delete-button and align it with the current Figma slip-prevention guidance
for destructive actions. Preserve confirmation or add an undo affordance through
the success toast as required, ensuring deleteAssets and its skipConfirmation
path remain safe. Also verify whether shouldShowSelectionDeleteButton
intentionally keeps bulk deletion hidden for the OSS input tab, and adjust the
two paths consistently if not.

In `@src/locales/en/main.json`:
- Line 3703: Remove the unused deletingImportedFilesCloudOnly localization key
from the locale files, confirming no remaining cloud-only deletion path requires
it; do not change deleteAssetApi or assetService.deleteLocalInputAsset.
- Around line 3699-3701: Replace the hardcoded “asset(s)” text in
removeSelectedGeneratedAssetsDescription and
selectedGeneratedAssetsRemovedSuccessfully with vue-i18n singular/plural pipe
forms using the count parameter. Update the
selectedGeneratedAssetsRemovedSuccessfully call in useMediaAssetActions.ts to
pass the count as the third translation argument, matching the existing
exportStarted usage.

In `@src/platform/assets/components/MediaAssetContextMenu.test.ts`:
- Around line 283-299: Update the test around “orders local generated file
actions after download” to stub the imported isLoopbackHost function and
explicitly return true before mounting the component, rather than relying on the
Vitest hostname. Reuse the resulting mock so loopback-dependent menu behavior is
deterministic and ready for the companion non-loopback case.

In `@src/platform/assets/components/MediaAssetContextMenu.vue`:
- Around line 244-258: Move the skip-confirmation policy out of the context
menu’s delete command and into useMediaAssetActions.ts: export or reuse a
predicate based on the existing isPersistentLocalOutputAsset logic, including
local inputs, and have deleteAssets derive the value itself. Remove the
duplicated isCloud/assetType/loader_path condition from the component while
preserving confirmation behavior for all other assets.

In `@src/platform/assets/composables/useMediaAssetActions.test.ts`:
- Around line 1248-1264: Add a Vitest case in the copyJobId persistent-output
tests for an asset with loader_path set but neither job_id nor prompt_id. Assert
that the warning toast is shown and mockCopyToClipboard is not called, while
preserving the existing provenance-success coverage.

In `@src/platform/assets/composables/useMediaAssetActions.ts`:
- Around line 742-744: Separate the store refresh calls from the delete
operation’s error handling in the surrounding action flow. Ensure failures from
assetsStore.updateFlatOutputs, updateHistory, or updateInputs are caught and
reported as refresh failures, while the existing delete catch only handles
delete failures and accurately preserves the successful delete result.
- Around line 842-845: Update performDeleteAssets to return true only when no
deletions fail and false from its catch path, then have the skipConfirmation
branch in useMediaAssetActions forward that returned outcome instead of always
returning true.
- Around line 51-53: Update isPersistentLocalOutputAsset to require the asset’s
generated/output type as well as loader_path, then export a companion predicate
for skipConfirmation that uses the same type-aware logic. In
MediaAssetContextMenu.vue lines 244-258, use that exported predicate for
confirmation handling, and update deleteAssets in useMediaAssetActions.ts to use
the same predicate so UI confirmation and deletion dispatch consistently
distinguish local outputs from local inputs.

In `@src/platform/assets/services/assetService.test.ts`:
- Around line 477-484: Update the deleteLocalInputAsset tests to separately
cover missing, ambiguous, and empty-path inputs: retain the zero-record
missing-path assertion, add two private input assets sharing the same normalized
loader_path and assert rejection with no DELETE request, and add an assertion
that an empty path is rejected. Use the existing asset fixtures and fetchApiMock
setup while verifying the ambiguous case does not issue a DELETE request.

In `@src/platform/assets/services/assetService.ts`:
- Around line 229-234: Update the local asset path validation in
deleteLocalInputAsset to reject every drive-qualified path by applying a
/^[A-Za-z]:/ check after slash normalization, covering C:/file, C:file, and C:.
Preserve the existing rejection rules and add regression coverage for the
slashless drive-relative forms.

---

Outside diff comments:
In `@src/platform/assets/components/MediaAssetContextMenu.test.ts`:
- Around line 107-135: Add a negative test using the existing mountComponent
helper configured with show-delete-button set to false, then assert that all
delete-related menu actions are absent from the rendered output. Keep the
existing default true behavior and verify the component’s hidden-delete path.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 8b71eeba-a519-4f02-a6d2-77da080ceb85

📥 Commits

Reviewing files that changed from the base of the PR and between db147c0 and 99f7720.

📒 Files selected for processing (13)
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/locales/en/main.json
  • src/platform/assets/components/MediaAssetContextMenu.test.ts
  • src/platform/assets/components/MediaAssetContextMenu.vue
  • src/platform/assets/composables/useMediaAssetActions.test.ts
  • src/platform/assets/composables/useMediaAssetActions.ts
  • src/platform/assets/schemas/assetSchema.ts
  • src/platform/assets/services/assetService.test.ts
  • src/platform/assets/services/assetService.ts
  • src/platform/assets/utils/assetMetadataUtils.test.ts
  • src/platform/assets/utils/assetMetadataUtils.ts
  • src/utils/hostWhitelist.test.ts
  • src/utils/hostWhitelist.ts

Comment thread src/components/sidebar/tabs/AssetsSidebarTab.vue Outdated
Comment thread src/locales/en/main.json Outdated
Comment thread src/locales/en/main.json Outdated
Comment thread src/platform/assets/components/MediaAssetContextMenu.test.ts
Comment thread src/platform/assets/components/MediaAssetContextMenu.vue
Comment thread src/platform/assets/composables/useMediaAssetActions.ts
Comment thread src/platform/assets/composables/useMediaAssetActions.ts Outdated
Comment thread src/platform/assets/composables/useMediaAssetActions.ts
Comment thread src/platform/assets/services/assetService.test.ts Outdated
Comment thread src/platform/assets/services/assetService.ts Outdated
@adobex
adobex force-pushed the agent/local-asset-file-actions branch from 99f7720 to 3072a4d Compare August 6, 2026 06:04
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (7)
src/platform/assets/composables/useMediaAssetActions.test.ts (1)

1248-1264: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add the missing-provenance case for a persistent output.

This describe block covers only the job_id path. The new branch at useMediaAssetActions.ts lines 332-334 suppresses the asset-id fallback when loader_path is set. Add a case where a persistent output has neither job_id nor prompt_id, and assert the warn toast plus no clipboard write.

As per path instructions, cover "critical success, failure, confirmation, feature-gating, path, empty/null, and deletion-order edge cases".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/platform/assets/composables/useMediaAssetActions.test.ts` around lines
1248 - 1264, Add a test in the “copyJobId - persistent output provenance”
describe block using an output asset with loader_path set but neither job_id nor
prompt_id; verify the warning toast is shown and mockCopyToClipboard is not
called, covering the missing-provenance branch in
useMediaAssetActions.copyJobId.

Source: Path instructions

src/platform/assets/composables/useMediaAssetActions.ts (3)

742-744: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Isolate the store refreshes from the delete error path.

The three refresh calls still run inside the same try as the deletions. If updateFlatOutputs, updateHistory, or updateInputs rejects, control jumps to the catch at line 816 and the user sees "Failed to delete asset" although every delete succeeded. Wrap the refreshes in their own try/catch and log the refresh failure separately.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/platform/assets/composables/useMediaAssetActions.ts` around lines 742 -
744, Separate the refresh calls after deletion from the deletion error path by
wrapping updateFlatOutputs, updateHistory, and updateInputs in their own
try/catch block. Log refresh failures with a distinct refresh-specific error
message, while ensuring refresh rejections do not reach the deletion catch or
report “Failed to delete asset” after successful deletions.

842-845: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Return the real deletion outcome.

performDeleteAssets catches every failure and returns nothing. Line 844 therefore returns true even when every delete rejects, and the confirm path at line 891 resolves true for the same reason. MediaAssetContextMenu.vue then emits asset-deleted and AssetsSidebarTab.vue clears the selection while the error toast is visible. Return failed.length === 0 from performDeleteAssets, false from its catch, and forward that value from both branches of deleteAssets.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/platform/assets/composables/useMediaAssetActions.ts` around lines 842 -
845, Update performDeleteAssets to return whether deletion fully succeeded by
returning failed.length === 0 after processing and false from its catch handler;
then have both skipConfirmation and confirmation branches in deleteAssets
return/forward that result instead of unconditionally returning true, so callers
only receive true when all assets are deleted.

51-53: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

One local-delete policy is expressed twice and the two copies disagree. The composable predicate checks only loader_path, while the component recomputes a wider condition that also includes input assets. Local input assets carry loader_path too, as getAssetStoredFilename shows, so the two definitions classify the same asset differently. The result is a confirmation dialog and a success toast that state the file on disk is kept, while deleteAssetApi calls deleteLocalInputAsset and removes the file. Define one type-aware predicate and use it at both sites.

  • src/platform/assets/composables/useMediaAssetActions.ts#L51-L53: add the asset-type check to isPersistentLocalOutputAsset so it matches only local output assets, and export a companion predicate that decides skipConfirmation for local input and local generated assets.
  • src/platform/assets/components/MediaAssetContextMenu.vue#L250-L264: replace the inline !isCloud && (assetType === 'input' || (assetType === 'output' && Boolean(asset.loader_path))) expression in the delete command with a call to that exported predicate.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/platform/assets/composables/useMediaAssetActions.ts` around lines 51 -
53, Unify the local-delete policy with type-aware predicates: in
src/platform/assets/composables/useMediaAssetActions.ts lines 51-53, update
isPersistentLocalOutputAsset to require a local output asset with loader_path
and export a companion predicate for local input or generated assets used to
skip confirmation; in src/platform/assets/components/MediaAssetContextMenu.vue
lines 250-264, replace the inline skipConfirmation condition with that exported
predicate.
src/platform/assets/components/MediaAssetContextMenu.test.ts (1)

300-316: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Stub isLoopbackHost so the precondition is explicit.

shouldShowOpenLocationButton requires isLoopbackHost(window.location.hostname). This test asserts mediaAsset.actions.openFileLocation is present, so it depends on the Vitest environment URL resolving to a loopback hostname. If that environment URL changes, the test fails for a reason unrelated to the component. Mock @/utils/hostWhitelist with a hoisted spy, and add a companion case that returns false and asserts the item is absent.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/platform/assets/components/MediaAssetContextMenu.test.ts` around lines
300 - 316, Update the tests around “orders local generated file actions after
download” to mock `@/utils/hostWhitelist` with a hoisted isLoopbackHost spy,
explicitly returning true for the existing ordering case. Add a companion test
with the spy returning false and assert mediaAsset.actions.openFileLocation is
absent from the captured menu.

Source: Path instructions

src/locales/en/main.json (1)

3693-3701: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use vue-i18n pluralization for the count-bearing messages.

Lines 3693, 3695, 3699, and 3701 hardcode the plural, either as a fixed plural noun ({count} files) or as asset(s). The coding guidelines require vue-i18n pluralization. Line 3742 in this same file already uses the correct pipe form.

Each call site must also pass the count as the third t argument, as exportStarted does. The affected calls in useMediaAssetActions.ts are lines 786, 873, 879, and 884.

As per coding guidelines, "use pluralization rather than hardcoded template pluralization".

♻️ Proposed fix
-    "deleteSelectedGeneratedSourceFilesDescription": "{count} files will be permanently deleted from disk and removed from Generated. This action cannot be undone.",
+    "deleteSelectedGeneratedSourceFilesDescription": "{count} file will be permanently deleted from disk and removed from Generated. This action cannot be undone. | {count} files will be permanently deleted from disk and removed from Generated. This action cannot be undone.",
     "deleteSelectedTitle": "Delete selected assets?",
-    "deleteSelectedDescription": "{count} asset(s) will be permanently removed.",
+    "deleteSelectedDescription": "{count} asset will be permanently removed. | {count} assets will be permanently removed.",
     "removeGeneratedAssetTitle": "Remove this asset from Generated?",
     "removeGeneratedAssetDescription": "This asset will be removed from Generated. The file on disk will be kept.",
     "removeSelectedGeneratedAssetsTitle": "Remove selected assets from Generated?",
-    "removeSelectedGeneratedAssetsDescription": "{count} asset(s) will be removed from Generated. The files on disk will be kept.",
+    "removeSelectedGeneratedAssetsDescription": "{count} asset will be removed from Generated. The file on disk will be kept. | {count} assets will be removed from Generated. The files on disk will be kept.",
     "generatedAssetRemovedSuccessfully": "Removed from Generated; file kept on disk",
-    "selectedGeneratedAssetsRemovedSuccessfully": "{count} asset(s) removed from Generated; files kept on disk",
+    "selectedGeneratedAssetsRemovedSuccessfully": "{count} asset removed from Generated; file kept on disk | {count} assets removed from Generated; files kept on disk",

In src/platform/assets/composables/useMediaAssetActions.ts, pass the count as the third argument at each affected call, for example:

-                : t('mediaAsset.selectedGeneratedAssetsRemovedSuccessfully', {
-                    count: succeeded
-                  })
+                : t(
+                    'mediaAsset.selectedGeneratedAssetsRemovedSuccessfully',
+                    { count: succeeded },
+                    succeeded
+                  )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/en/main.json` around lines 3693 - 3701, Update the count-bearing
locale messages deleteSelectedGeneratedSourceFilesDescription,
deleteSelectedDescription, removeSelectedGeneratedAssetsDescription, and
selectedGeneratedAssetsRemovedSuccessfully to use vue-i18n pipe pluralization
instead of fixed plurals or “asset(s)”. Update the corresponding calls in
useMediaAssetActions.ts to pass the count as the third t argument, matching the
existing exportStarted pattern.

Source: Coding guidelines

src/components/sidebar/tabs/AssetsSidebarTab.vue (1)

166-166: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Confirm the single-versus-bulk delete asymmetry for OSS input assets.

This line now always enables the context-menu delete item. shouldShowSelectionDeleteButton at line 271 still hides bulk delete for the OSS input tab. A user can therefore delete imported files one at a time, without confirmation, but cannot delete them in bulk. Confirm that this split is intended and align the two paths if it is not.

The literal true also duplicates the component default, because MediaAssetContextMenu.vue line 125 already applies showDeleteButton ?? true.

As per path instructions, consult the Figma standards for "destructive-action confirmation" before finalizing the unconfirmed delete.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/sidebar/tabs/AssetsSidebarTab.vue` at line 166, Review the
delete behavior in AssetsSidebarTab, specifically the show-delete-button binding
and shouldShowSelectionDeleteButton, and align single-item and bulk deletion for
OSS input assets so both follow the intended confirmation policy. Consult the
Figma destructive-action confirmation standards and add or preserve confirmation
consistently; remove the redundant explicit enablement where
MediaAssetContextMenu’s default already provides it.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/platform/assets/services/assetService.ts`:
- Around line 905-908: Update the candidate matching logic around
normalizeLoaderPath in the asset deletion flow to catch normalization failures
for individual asset.loader_path values and skip those malformed records, while
retaining strict validation for the requested path. Ensure a malformed candidate
does not prevent a valid matching asset from being selected, and add coverage
containing both records.

---

Duplicate comments:
In `@src/components/sidebar/tabs/AssetsSidebarTab.vue`:
- Line 166: Review the delete behavior in AssetsSidebarTab, specifically the
show-delete-button binding and shouldShowSelectionDeleteButton, and align
single-item and bulk deletion for OSS input assets so both follow the intended
confirmation policy. Consult the Figma destructive-action confirmation standards
and add or preserve confirmation consistently; remove the redundant explicit
enablement where MediaAssetContextMenu’s default already provides it.

In `@src/locales/en/main.json`:
- Around line 3693-3701: Update the count-bearing locale messages
deleteSelectedGeneratedSourceFilesDescription, deleteSelectedDescription,
removeSelectedGeneratedAssetsDescription, and
selectedGeneratedAssetsRemovedSuccessfully to use vue-i18n pipe pluralization
instead of fixed plurals or “asset(s)”. Update the corresponding calls in
useMediaAssetActions.ts to pass the count as the third t argument, matching the
existing exportStarted pattern.

In `@src/platform/assets/components/MediaAssetContextMenu.test.ts`:
- Around line 300-316: Update the tests around “orders local generated file
actions after download” to mock `@/utils/hostWhitelist` with a hoisted
isLoopbackHost spy, explicitly returning true for the existing ordering case.
Add a companion test with the spy returning false and assert
mediaAsset.actions.openFileLocation is absent from the captured menu.

In `@src/platform/assets/composables/useMediaAssetActions.test.ts`:
- Around line 1248-1264: Add a test in the “copyJobId - persistent output
provenance” describe block using an output asset with loader_path set but
neither job_id nor prompt_id; verify the warning toast is shown and
mockCopyToClipboard is not called, covering the missing-provenance branch in
useMediaAssetActions.copyJobId.

In `@src/platform/assets/composables/useMediaAssetActions.ts`:
- Around line 742-744: Separate the refresh calls after deletion from the
deletion error path by wrapping updateFlatOutputs, updateHistory, and
updateInputs in their own try/catch block. Log refresh failures with a distinct
refresh-specific error message, while ensuring refresh rejections do not reach
the deletion catch or report “Failed to delete asset” after successful
deletions.
- Around line 842-845: Update performDeleteAssets to return whether deletion
fully succeeded by returning failed.length === 0 after processing and false from
its catch handler; then have both skipConfirmation and confirmation branches in
deleteAssets return/forward that result instead of unconditionally returning
true, so callers only receive true when all assets are deleted.
- Around line 51-53: Unify the local-delete policy with type-aware predicates:
in src/platform/assets/composables/useMediaAssetActions.ts lines 51-53, update
isPersistentLocalOutputAsset to require a local output asset with loader_path
and export a companion predicate for local input or generated assets used to
skip confirmation; in src/platform/assets/components/MediaAssetContextMenu.vue
lines 250-264, replace the inline skipConfirmation condition with that exported
predicate.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 246f5636-1025-4310-bff1-3467f70ebfa0

📥 Commits

Reviewing files that changed from the base of the PR and between db147c0 and 3072a4d.

📒 Files selected for processing (13)
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/locales/en/main.json
  • src/platform/assets/components/MediaAssetContextMenu.test.ts
  • src/platform/assets/components/MediaAssetContextMenu.vue
  • src/platform/assets/composables/useMediaAssetActions.test.ts
  • src/platform/assets/composables/useMediaAssetActions.ts
  • src/platform/assets/schemas/assetSchema.ts
  • src/platform/assets/services/assetService.test.ts
  • src/platform/assets/services/assetService.ts
  • src/platform/assets/utils/assetMetadataUtils.test.ts
  • src/platform/assets/utils/assetMetadataUtils.ts
  • src/utils/hostWhitelist.test.ts
  • src/utils/hostWhitelist.ts

Comment thread src/platform/assets/services/assetService.ts Outdated
@adobex
adobex force-pushed the agent/local-asset-file-actions branch from 3072a4d to c3ae2f1 Compare August 10, 2026 02:35
@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@adobex

adobex commented Aug 10, 2026

Copy link
Copy Markdown
Author

Updated onto current main in c3ae2f1 and addressed the current review. I also added the requested outside-diff negative coverage: when show-delete-button is false, neither Delete nor Delete Source File is exposed. Validation: 143 targeted Vitest tests passed; format check, typecheck, changed-file type-aware oxlint/ESLint, and git diff --check passed. The full lint command exceeded the local 124-second tool limit after its only relevant finding (it.each -> it.for) had been fixed; all changed files pass their lint gates. Local validation used Node 24.14 while the repository currently declares Node 25.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/platform/assets/components/MediaAssetContextMenu.test.ts`:
- Around line 327-385: Split the test around persistentOutput into four
independent cases covering menu ordering, open-location execution, delete
arguments, and delete-source arguments, sharing a fixture setup. Remove the
redundant mockIsLoopbackHost.mockReturnValue(true) from these cases because
beforeEach already establishes it, and keep each case focused with only the
mocks and command invocation it needs.

In `@src/platform/assets/components/MediaAssetContextMenu.vue`:
- Line 125: Make hasLocalAssetApi a computed value so it reactively re-evaluates
api.getServerFeature('assets', false) after serverFeatureFlags.value is
populated. Update the delete and open-location computed checks to read
hasLocalAssetApi.value, preserving the existing isCloud condition.

In `@src/platform/assets/composables/useMediaAssetActions.ts`:
- Around line 866-907: Extract the title and message translation-key selection
from the confirmation dialog in the asset deletion flow into a small helper or
lookup structure. Derive a shared copy variant from deletingGeneratedSourceFiles
and allPersistentLocalOutputs, then select single versus plural keys using
isSingle; use the selected description key with the existing count interpolation
and pluralization arguments.

In `@src/platform/assets/services/assetService.test.ts`:
- Around line 451-454: Replace vi.clearAllMocks() with vi.resetAllMocks() in the
beforeEach hooks for both test suites:
src/platform/assets/services/assetService.test.ts lines 451-454 and 1538-1541.
Ensure each test configures any required mock responses independently.

In `@src/platform/assets/services/assetService.ts`:
- Around line 226-235: Replace the raw error messages in normalizeLoaderPath and
the related open-location and unresolved-record error paths with existing
localization-helper usage, adding the required English keys to main.json. Ensure
all three user-facing errors resolve through vue-i18n while preserving their
current contextual details and behavior.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e8b9cfe7-f6e6-4916-a06f-8c7d76b652d3

📥 Commits

Reviewing files that changed from the base of the PR and between b0637ed and c3ae2f1.

📒 Files selected for processing (13)
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/locales/en/main.json
  • src/platform/assets/components/MediaAssetContextMenu.test.ts
  • src/platform/assets/components/MediaAssetContextMenu.vue
  • src/platform/assets/composables/useMediaAssetActions.test.ts
  • src/platform/assets/composables/useMediaAssetActions.ts
  • src/platform/assets/schemas/assetSchema.ts
  • src/platform/assets/services/assetService.test.ts
  • src/platform/assets/services/assetService.ts
  • src/platform/assets/utils/assetMetadataUtils.test.ts
  • src/platform/assets/utils/assetMetadataUtils.ts
  • src/utils/hostWhitelist.test.ts
  • src/utils/hostWhitelist.ts

Comment thread src/platform/assets/components/MediaAssetContextMenu.test.ts
Comment thread src/platform/assets/components/MediaAssetContextMenu.vue Outdated
Comment thread src/platform/assets/composables/useMediaAssetActions.ts Outdated
Comment thread src/platform/assets/services/assetService.test.ts Outdated
Comment thread src/platform/assets/services/assetService.ts Outdated
@adobex
adobex force-pushed the agent/local-asset-file-actions branch from c3ae2f1 to 68f6171 Compare August 11, 2026 08:35
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@adobex

adobex commented Aug 11, 2026

Copy link
Copy Markdown
Author

Updated once onto current main in 68f6171 and addressed the five follow-up findings. The asset API lookup is now reactive and has a real late-feature-flag regression test; the persistent-output menu test is split into focused cases; confirmation-copy selection is centralized; and the three new service errors use localized, interpolated messages. For the mock-cleanup finding, current main now enables automatic Vitest mock reset/restore in #14836, so the correct current-baseline fix is to remove the two redundant local cleanup hooks rather than replace them with resetAllMocks. Validation: 147 targeted tests passed, including 15/15 menu tests after switching to real reactive server flags; typecheck, changed-file oxlint/ESLint, full format check (4,622 files), knip, and git diff --check passed. Local validation used Node 24.14 while the repository declares Node 25.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/platform/assets/components/MediaAssetContextMenu.test.ts`:
- Around line 382-420: Update the MediaAssetContextMenu test helper
mountComponent to expose an asset-deleted listener, then assert onAssetDeleted
is called exactly once after each delete command invocation in the local
generated asset tests. Keep the existing deleteAssets argument assertions and
apply the emit assertion to both the local-only and source-file deletion cases.

In `@src/platform/assets/components/MediaAssetContextMenu.vue`:
- Around line 247-279: Insert a menu separator before the destructive action
group beginning with the openFileLocation item in the context-menu construction,
keeping Download separate from openFileLocation, delete, and deleteSourceFile.
Update the ordering assertion in the context-menu test to expect the added
separator.

In `@src/platform/assets/composables/useMediaAssetActions.test.ts`:
- Around line 1338-1353: Add a test case in the copyJobId persistent output
provenance suite for an output asset with prompt_id set and job_id absent, then
assert copyJobId passes prompt_id to mockCopyToClipboard. Reuse the existing
mock setup and createMockAsset pattern.

In `@src/platform/assets/services/assetService.test.ts`:
- Around line 496-504: Add a traversal input such as a parent-directory path to
the parameterized cases for deleteLocalInputAsset, ensuring it reaches the
requested-path validation and rejects with “Invalid local input asset path.”
Keep the existing fetchApiMock-not-called assertion so the test verifies loading
is skipped.
- Around line 67-81: Update the i18n mock’s t function in the asset service
tests to return the translation key followed by the serialized interpolation
payload instead of duplicating English messages. Revise the affected assertions
around invalidLocalInputAssetPath, failedToOpenAssetLocation, and
failedToResolveLocalInputAsset to verify the exact key and payload values,
including path, id, status, and count.

In `@src/platform/assets/services/assetService.ts`:
- Around line 908-930: The local input deletion flow repeatedly lists all input
assets through deleteLocalInputAsset; update performDeleteAssets and
deleteLocalInputAsset to resolve selected loader paths from a single
getAllAssetsByTag(INPUT_TAG, false) result, then delete the resolved asset IDs
in the batch. Preserve the existing normalization, invalid-path handling, and
exact-match error behavior.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5255934c-df1f-4dd2-b977-a7aba14834ee

📥 Commits

Reviewing files that changed from the base of the PR and between 84d2b22 and 68f6171.

📒 Files selected for processing (13)
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/locales/en/main.json
  • src/platform/assets/components/MediaAssetContextMenu.test.ts
  • src/platform/assets/components/MediaAssetContextMenu.vue
  • src/platform/assets/composables/useMediaAssetActions.test.ts
  • src/platform/assets/composables/useMediaAssetActions.ts
  • src/platform/assets/schemas/assetSchema.ts
  • src/platform/assets/services/assetService.test.ts
  • src/platform/assets/services/assetService.ts
  • src/platform/assets/utils/assetMetadataUtils.test.ts
  • src/platform/assets/utils/assetMetadataUtils.ts
  • src/utils/hostWhitelist.test.ts
  • src/utils/hostWhitelist.ts

Comment thread src/platform/assets/components/MediaAssetContextMenu.test.ts
Comment thread src/platform/assets/components/MediaAssetContextMenu.vue
Comment thread src/platform/assets/composables/useMediaAssetActions.test.ts
Comment thread src/platform/assets/services/assetService.test.ts Outdated
Comment thread src/platform/assets/services/assetService.test.ts Outdated
Comment thread src/platform/assets/services/assetService.ts Outdated
@adobex

adobex commented Aug 11, 2026

Copy link
Copy Markdown
Author

Addressed all six current follow-up threads in ca59a4c with one update. Successful delete commands now assert the asset-deleted emit; destructive actions are separated from Download/Open Location; persistent-output provenance covers the prompt_id fallback; i18n tests assert translation keys and interpolation payloads; requested-path traversal/absolute cases are covered; and batch local deletions share a single private-input listing instead of repeating the full pagination walk per item. The shared-listing implementation preserves strict requested-path validation, malformed-candidate skipping, exact-match errors, and per-item Promise.allSettled accounting; a mixed-batch negative test verifies that a shared listing failure rejects each local item while another asset type still succeeds. Validation: 153 targeted tests passed; typecheck, changed-file type-aware oxlint/ESLint, full format check (4,622 files), knip, and git diff --check passed. Local validation used Node 24.14 while the repository declares Node 25.

@adobex
adobex marked this pull request as ready for review August 11, 2026 09:17
@adobex
adobex requested a review from a team August 11, 2026 09:17
@dosubot dosubot Bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Aug 11, 2026

@christian-byrne christian-byrne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks for the contribution. We are working on these features, can you watch for some recent / upcoming PRs to check if they align with your proposed changes here?

@codecov

codecov Bot commented Aug 16, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 94.88372% with 11 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...latform/assets/composables/useMediaAssetActions.ts 92.41% 10 Missing and 1 partial ⚠️
@@            Coverage Diff             @@
##             main   #14831      +/-   ##
==========================================
+ Coverage   80.90%   80.93%   +0.02%     
==========================================
  Files        1872     1872              
  Lines      122197   122302     +105     
  Branches    37896    37943      +47     
==========================================
+ Hits        98864    98980     +116     
+ Misses      22784    22765      -19     
- Partials      549      557       +8     
Flag Coverage Δ
unit 72.54% <94.88%> (+0.05%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/components/sidebar/tabs/AssetsSidebarTab.vue 82.22% <100.00%> (ø)
...atform/assets/components/MediaAssetContextMenu.vue 82.60% <100.00%> (+6.78%) ⬆️
src/platform/assets/schemas/assetSchema.ts 100.00% <ø> (ø)
src/platform/assets/services/assetService.ts 72.74% <100.00%> (+1.58%) ⬆️
src/platform/assets/utils/assetMetadataUtils.ts 93.33% <100.00%> (+0.03%) ⬆️
src/utils/hostWhitelist.ts 100.00% <100.00%> (ø)
...latform/assets/composables/useMediaAssetActions.ts 73.00% <92.41%> (+4.40%) ⬆️

... and 8 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

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

Labels

size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants