Skip to content

Conversation

@luke-mino-altherr
Copy link
Contributor

@luke-mino-altherr luke-mino-altherr commented Nov 14, 2025

Summary

Adds a complete model upload workflow that allows users to import models from Civitai URLs directly into their library.

Changes

  • Multi-step wizard: URL input → metadata confirmation → upload progress
  • Components: UploadModelDialog, UploadModelUrlInput, UploadModelConfirmation, UploadModelProgress, UploadModelDialogHeader
  • API integration: New assetService methods for metadata retrieval and URL-based uploads
  • Model type management: useModelTypes composable for fetching and formatting available model types
  • UX improvements: Optional validation bypass for UrlInput component
  • Localization: 26 new i18n strings for the upload workflow

Review Focus

  • Error handling for failed uploads and metadata retrieval
  • Model type detection and selection logic
  • Dialog state management across multi-step workflow

┆Issue is synchronized with this Notion page by Unito

@luke-mino-altherr luke-mino-altherr added enhancement New feature or request area:models labels Nov 14, 2025
@dosubot dosubot bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Nov 14, 2025
@github-actions
Copy link

github-actions bot commented Nov 14, 2025

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 11/20/2025, 04:26:33 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Nov 14, 2025

🎭 Playwright Test Results

⚠️ Tests passed with flaky tests

⏰ Completed at: 11/20/2025, 04:38:07 AM UTC

📈 Summary

  • Total Tests: 496
  • Passed: 484 ✅
  • Failed: 0
  • Flaky: 3 ⚠️
  • Skipped: 9 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 475 / ❌ 0 / ⚠️ 3 / ⏭️ 9
  • chromium-2x: View Report • ✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • chromium-0.5x: View Report • ✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • mobile-chrome: View Report • ✅ 6 / ❌ 0 / ⚠️ 0 / ⏭️ 0

🎉 Click on the links above to view detailed test results for each browser configuration.

@luke-mino-altherr luke-mino-altherr marked this pull request as draft November 14, 2025 02:49
@github-actions
Copy link

github-actions bot commented Nov 14, 2025

Bundle Size Report

Summary

  • Raw size: 13.7 MB baseline 13.7 MB — 🔴 +24.3 kB
  • Gzip: 2.76 MB baseline 2.75 MB — 🔴 +5.14 kB
  • Brotli: 2.16 MB baseline 2.16 MB — 🔴 +3.76 kB
  • Bundles: 92 current • 92 baseline • 38 added / 38 removed

Category Glance
Graph Workspace 🔴 +19.6 kB (945 kB) · App Entry Points 🔴 +4.64 kB (3.13 MB) · Vendor & Third-Party ⚪ 0 B (5.32 MB) · Other ⚪ 0 B (3.87 MB) · Panels & Settings ⚪ 0 B (306 kB) · UI Components ⚪ 0 B (141 kB) · + 3 more

Per-category breakdown
App Entry Points — 3.13 MB (baseline 3.12 MB) • 🔴 +4.64 kB

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BnZ0q2wN.js (new) 2.76 MB 🔴 +2.76 MB 🔴 +577 kB 🔴 +439 kB
assets/index-6CGwPO2U.js (removed) 2.76 MB 🟢 -2.76 MB 🟢 -576 kB 🟢 -437 kB
assets/index-B2xVpUKt.js (new) 364 kB 🔴 +364 kB 🔴 +75.2 kB 🔴 +61.3 kB
assets/index-CcB-UBV1.js (removed) 364 kB 🟢 -364 kB 🟢 -75.2 kB 🟢 -61.3 kB
assets/index-BvPsQv-I.js (removed) 345 B 🟢 -345 B 🟢 -247 B 🟢 -234 B
assets/index-DUy5vXpv.js (new) 345 B 🔴 +345 B 🔴 +247 B 🔴 +202 B

Status: 3 added / 3 removed

Graph Workspace — 945 kB (baseline 925 kB) • 🔴 +19.6 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-B6hNsI_A.js (new) 945 kB 🔴 +945 kB 🔴 +183 kB 🔴 +140 kB
assets/GraphView-DqMO-2g-.js (removed) 925 kB 🟢 -925 kB 🟢 -179 kB 🟢 -137 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/UserSelectView-D-Qe06CC.js (removed) 7.97 kB 🟢 -7.97 kB 🟢 -2.43 kB 🟢 -2.13 kB
assets/UserSelectView-D7Knpvjg.js (new) 7.97 kB 🔴 +7.97 kB 🔴 +2.43 kB 🔴 +2.13 kB

Status: 1 added / 1 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CreditsPanel-C2JUHrSs.js (removed) 22.9 kB 🟢 -22.9 kB 🟢 -5.46 kB 🟢 -4.78 kB
assets/CreditsPanel-Cz-WLC8i.js (new) 22.9 kB 🔴 +22.9 kB 🔴 +5.46 kB 🔴 +4.78 kB
assets/KeybindingPanel-CRhBS8Kw.js (removed) 15.1 kB 🟢 -15.1 kB 🟢 -3.73 kB 🟢 -3.3 kB
assets/KeybindingPanel-DZePhxI8.js (new) 15.1 kB 🔴 +15.1 kB 🔴 +3.73 kB 🔴 +3.28 kB
assets/ExtensionPanel-GjiDF2u6.js (new) 11.9 kB 🔴 +11.9 kB 🔴 +2.79 kB 🔴 +2.45 kB
assets/ExtensionPanel-lSODbfJo.js (removed) 11.9 kB 🟢 -11.9 kB 🟢 -2.79 kB 🟢 -2.45 kB
assets/AboutPanel-C3ZXtkOF.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.62 kB 🟢 -2.31 kB
assets/AboutPanel-kePdBnKz.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.62 kB 🔴 +2.31 kB
assets/ServerConfigPanel-Cchgz8RB.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.12 kB 🔴 +1.87 kB
assets/ServerConfigPanel-oBmgWc6K.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.12 kB 🟢 -1.88 kB
assets/UserPanel-Bdt2FQJK.js (new) 7.74 kB 🔴 +7.74 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/UserPanel-BhLkQTEB.js (removed) 7.74 kB 🟢 -7.74 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/settings-BXTtSH4O.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C9Pzn-NG.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCy2fA_h.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CQpqEFfl.js 26.6 kB 26.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DHcnxypw.js 21.7 kB 21.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DhFTK9fY.js 25.1 kB 25.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DlT4t_ui.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRgSrIdD.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-tjkeqiZq.js 21.1 kB 21.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Load3D.vue_vue_type_script_setup_true_lang-84PKL2Xh.js (removed) 53.9 kB 🟢 -53.9 kB 🟢 -8.43 kB 🟢 -7.24 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-aXMdRyU0.js (new) 53.9 kB 🔴 +53.9 kB 🔴 +8.43 kB 🔴 +7.24 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-D_KGytZs.js (new) 48.1 kB 🔴 +48.1 kB 🔴 +10.3 kB 🔴 +8.92 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-SeoM_ddm.js (removed) 48.1 kB 🟢 -48.1 kB 🟢 -10.3 kB 🟢 -8.94 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-CUYVmdFY.js (removed) 12.7 kB 🟢 -12.7 kB 🟢 -3.31 kB 🟢 -2.92 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-me_JVLpd.js (new) 12.7 kB 🔴 +12.7 kB 🔴 +3.3 kB 🔴 +2.92 kB
assets/ComfyQueueButton-_opNMSf5.js (new) 9.27 kB 🔴 +9.27 kB 🔴 +2.52 kB 🔴 +2.21 kB
assets/ComfyQueueButton-C1epNoFX.js (removed) 9.27 kB 🟢 -9.27 kB 🟢 -2.51 kB 🟢 -2.21 kB
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-CyewhD2I.js (new) 2.14 kB 🔴 +2.14 kB 🔴 +794 B 🔴 +689 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-OHYXm4SX.js (removed) 2.14 kB 🟢 -2.14 kB 🟢 -796 B 🟢 -687 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-COSIAlke.js (removed) 848 B 🟢 -848 B 🟢 -477 B 🟢 -416 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-PN9JOgb2.js (new) 848 B 🔴 +848 B 🔴 +476 B 🔴 +414 B
assets/LazyImage.vue_vue_type_script_setup_true_lang-Wi-CcgaU.js 10.7 kB 10.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-D2s8tnS2.js 1.26 kB 1.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-ByrPd5jr.js 1.62 kB 1.62 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

Data & Services — 12.5 kB (baseline 12.5 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/keybindingService-CQFabhg6.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +1.84 kB 🔴 +1.58 kB
assets/keybindingService-YFFBeCvf.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -1.84 kB 🟢 -1.58 kB
assets/audioService-BusurfD6.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -961 B 🟢 -819 B
assets/audioService-CPj0MlhE.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +960 B 🔴 +821 B
assets/serverConfigStore-BoHtzifw.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 2 added / 2 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioUtils-Dh0N6sbc.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -649 B 🟢 -542 B
assets/audioUtils-pIx16AIA.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +650 B 🔴 +550 B
assets/mathUtil-CTARWQ-l.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-CXKCRJ-m.js 460 B 460 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-z0ajCJVX.js 3.22 MB 3.22 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-PESgPnbc.js 517 B 517 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-aR6ntw5X.js 1.37 MB 1.37 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-D2zb6Fg1.js 232 kB 232 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-aBQ_uOio.js 92.6 kB 92.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 3.87 MB (baseline 3.87 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WidgetRecordAudio-DREZKKZW.js (removed) 21.9 kB 🟢 -21.9 kB 🟢 -5.52 kB 🟢 -4.88 kB
assets/WidgetRecordAudio-ZGqBBpz7.js (new) 21.9 kB 🔴 +21.9 kB 🔴 +5.52 kB 🔴 +4.88 kB
assets/AudioPreviewPlayer-BXGWWmMj.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +3.69 kB 🔴 +3.29 kB
assets/AudioPreviewPlayer-DbwNROiX.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -3.69 kB 🟢 -3.3 kB
assets/WidgetGalleria-Bo4zjspw.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.74 kB 🟢 -1.54 kB
assets/WidgetGalleria-CgJyvWov.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.74 kB 🔴 +1.54 kB
assets/WidgetColorPicker-C0d2lVVK.js (removed) 4.87 kB 🟢 -4.87 kB 🟢 -1.69 kB 🟢 -1.48 kB
assets/WidgetColorPicker-DmDSF6_o.js (new) 4.87 kB 🔴 +4.87 kB 🔴 +1.68 kB 🔴 +1.48 kB
assets/WidgetMarkdown-CEVwh0WV.js (new) 4.6 kB 🔴 +4.6 kB 🔴 +1.6 kB 🔴 +1.39 kB
assets/WidgetMarkdown-DiE46aMl.js (removed) 4.6 kB 🟢 -4.6 kB 🟢 -1.6 kB 🟢 -1.4 kB
assets/WidgetAudioUI-bwnXmWqq.js (new) 4.33 kB 🔴 +4.33 kB 🔴 +1.44 kB 🔴 +1.29 kB
assets/WidgetAudioUI-CbPXfJD9.js (removed) 4.33 kB 🟢 -4.33 kB 🟢 -1.44 kB 🟢 -1.29 kB
assets/WidgetTextarea-B_ae4eAP.js (new) 3.6 kB 🔴 +3.6 kB 🔴 +1.26 kB 🔴 +1.11 kB
assets/WidgetTextarea-BSvr9HrW.js (removed) 3.6 kB 🟢 -3.6 kB 🟢 -1.26 kB 🟢 -1.13 kB
assets/WidgetInputText-b6QXCgQ7.js (new) 3.45 kB 🔴 +3.45 kB 🔴 +1.24 kB 🔴 +1.09 kB
assets/WidgetInputText-BlV89lUJ.js (removed) 3.45 kB 🟢 -3.45 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/WidgetToggleSwitch-CKQEpFi2.js (new) 3.23 kB 🔴 +3.23 kB 🔴 +1.14 kB 🔴 +1.02 kB
assets/WidgetToggleSwitch-mCWHO8RA.js (removed) 3.23 kB 🟢 -3.23 kB 🟢 -1.14 kB 🟢 -1.01 kB
assets/MediaImageBottom-B8mCJuI5.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.05 kB 🟢 -917 B
assets/MediaImageBottom-UAPvuQzP.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.05 kB 🔴 +932 B
assets/MediaAudioBottom-BbQ2DI6e.js (new) 3 kB 🔴 +3 kB 🔴 +1.05 kB 🔴 +930 B
assets/MediaAudioBottom-BN0-B0hr.js (removed) 3 kB 🟢 -3 kB 🟢 -1.05 kB 🟢 -925 B
assets/Media3DTop-Bry5Xfar.js (new) 3 kB 🔴 +3 kB 🔴 +1.08 kB 🔴 +925 B
assets/Media3DTop-C_IAjL5F.js (removed) 3 kB 🟢 -3 kB 🟢 -1.08 kB 🟢 -913 B
assets/MediaVideoBottom-DVJ47y1V.js (new) 3 kB 🔴 +3 kB 🔴 +1.05 kB 🔴 +929 B
assets/MediaVideoBottom-NR1e8WF_.js (removed) 3 kB 🟢 -3 kB 🟢 -1.05 kB 🟢 -929 B
assets/Media3DBottom-BDGYyMvc.js (new) 2.98 kB 🔴 +2.98 kB 🔴 +1.04 kB 🔴 +926 B
assets/Media3DBottom-DPF24MsZ.js (removed) 2.98 kB 🟢 -2.98 kB 🟢 -1.04 kB 🟢 -911 B
assets/WidgetSelect-BMWs2HWM.js (new) 2.17 kB 🔴 +2.17 kB 🔴 +673 B 🔴 +574 B
assets/WidgetSelect-D10YLtkh.js (removed) 2.17 kB 🟢 -2.17 kB 🟢 -674 B 🟢 -577 B
assets/WidgetInputNumber-DXmvqbP8.js (new) 2.12 kB 🔴 +2.12 kB 🔴 +660 B 🔴 +556 B
assets/WidgetInputNumber-M5yOd37k.js (removed) 2.12 kB 🟢 -2.12 kB 🟢 -665 B 🟢 -559 B
assets/Load3D-BWY2D0FA.js (removed) 1.94 kB 🟢 -1.94 kB 🟢 -601 B 🟢 -539 B
assets/Load3D-CIXoRyQF.js (new) 1.94 kB 🔴 +1.94 kB 🔴 +596 B 🔴 +501 B
assets/WidgetLegacy-BbvmOMRg.js (new) 1.88 kB 🔴 +1.88 kB 🔴 +559 B 🔴 +502 B
assets/WidgetLegacy-BMWbJ48z.js (removed) 1.88 kB 🟢 -1.88 kB 🟢 -563 B 🟢 -507 B
assets/commands-_s-RvhJR.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BuUILW6P.js 13 kB 13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BV4R6fLx.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CLwPdnT6.js 14.2 kB 14.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CWMchBmd.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DazTQhtc.js 12.9 kB 12.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DmWrOe93.js 13.7 kB 13.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwiH7Kr6.js 13.8 kB 13.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-mS3LCNPn.js 14.5 kB 14.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-5lOBdqcC.js 84.5 kB 84.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BOCuaVpE.js 73.4 kB 73.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-ClrEFGUz.js 72.4 kB 72.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CyNU0iQX.js 99.3 kB 99.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D7gwLxft.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DC8o4BCt.js 86.8 kB 86.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DKiesCV4.js 94.3 kB 94.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Hq2q-OtB.js 83.6 kB 83.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-USAlAlnj.js 82 kB 82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-RTI8pWy9.js 1.42 kB 1.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-Cxl4dc80.js 1.68 kB 1.68 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-BB0lT7C5.js 2.7 kB 2.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-_Px5dSNW.js 306 kB 306 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-7z21KPoS.js 285 kB 285 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BWKZzBPK.js 346 kB 346 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CGbgH4Yl.js 320 kB 320 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CjjjdWkV.js 313 kB 313 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CVrNtxvj.js 288 kB 288 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DLRSA0IK.js 309 kB 309 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DQV2gnwA.js 372 kB 372 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ofqLG5vz.js 310 kB 310 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-rDmYEWg5.js 2.39 kB 2.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-Ds3K3ULR.js 2.15 kB 2.15 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 18 added / 18 removed

Copy link
Contributor Author

@luke-mino-altherr luke-mino-altherr left a comment

Choose a reason for hiding this comment

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

Comprehensive PR Review

This review is generated by Claude. It may not always be accurate, as with human reviewers. If you believe that any of the comments are invalid or incorrect, please state why for each. For others, please implement the changes in one way or another.

Review Summary

PR: [feat] Add Civitai model upload wizard (#6694)
Impact: 648 additions, 2 deletions across 10 files

Issue Distribution

  • Critical: 1
  • High: 3
  • Medium: 4
  • Low: 1

Category Breakdown

  • Architecture: 2 issues
  • Security: 1 issue
  • Performance: 0 issues
  • Code Quality: 6 issues

Key Findings

Architecture & Design

The PR implements a clean multi-step wizard pattern with good separation of concerns. However, there are some architectural concerns:

  1. Hard-coded defaults - The default model type 'loras' is set without validation that it exists in the available types
  2. Interface duplication - ModelMetadata interface is duplicated across 3 components, violating DRY principles
  3. Missing state cleanup - No reset logic when dialog closes, could lead to stale state if reopened

The composable pattern for useModelTypes is well-designed with singleton state and promise deduplication, following Vue 3 best practices.

Security Considerations

Critical Issue: No URL validation to enforce Civitai-only domains. The UI promises "Only links from https://civitai.com are supported" but there's no enforcement. Users could submit arbitrary URLs which could:

  • Lead to SSRF vulnerabilities on the backend
  • Allow malicious content downloads
  • Bypass intended security boundaries

This should be addressed before merge by adding client-side URL validation.

Performance Impact

No significant performance concerns identified. The PR follows good practices:

  • Lazy component loading via conditional rendering
  • Singleton pattern in useModelTypes prevents duplicate API calls
  • Minimal bundle size impact (~650 LOC across focused components)

Code Quality

Several quality issues need attention:

  1. Incomplete error handling - TODO comment indicates unfinished user feedback implementation
  2. Console.error usage - Production code shouldn't rely on console logging for user-facing errors
  3. Project guidelines violations:
    • Hardcoded emoji (🎉) in template violates no-emoji guideline
    • Hardcoded color text-red-500 instead of semantic theme tokens
  4. Missing loading states - UploadModelConfirmation doesn't handle async model type loading

Integration Points

The PR integrates well with existing systems:

  • Uses established dialogStore pattern
  • Follows i18n conventions with 26 new translation strings
  • Properly extends assetService with new API methods
  • Emits events for parent component coordination (upload-success)

Potential concerns:

  • No backward compatibility issues (feature addition only)
  • Extension compatibility not affected
  • Assumes backend API endpoints exist (/assets/metadata, /experiment/models)

Positive Observations

  1. Excellent component organization - Clear separation between URL input, confirmation, and progress steps
  2. Type safety - Strong TypeScript usage throughout with well-defined interfaces
  3. User experience - Multi-step wizard with clear progression and loading indicators
  4. Internationalization - All user-facing text properly externalized
  5. Service pattern - Clean API abstraction in assetService with proper error handling
  6. Composable design - useModelTypes follows Vue 3 composition API best practices
  7. Accessibility - Proper use of semantic HTML and ARIA-friendly components

References

Next Steps

Must Address (Before Merge)

  1. Fix critical security issue: Add Civitai URL validation
  2. Remove TODO comment: Implement proper error toast notification
  3. Fix hard-coded default: Make selectedModelType dynamic based on available types

Should Address (Before Merge)

  1. Extract ModelMetadata to shared types file
  2. Replace hardcoded emoji with i18n-based solution
  3. Use semantic color tokens instead of text-red-500
  4. Add loading state handling in UploadModelConfirmation

Consider for Future

  1. Add component tests for the wizard workflow
  2. Add error state retry functionality
  3. Consider responsive sizing instead of fixed dimensions
  4. Add state reset on dialog close for better UX

This is a comprehensive automated review. The architectural design is sound and follows established patterns well. The critical security issue with URL validation must be addressed, along with completing the error handling implementation. Overall, this is a well-structured feature addition that integrates cleanly with the existing codebase.

@qudix
Copy link

qudix commented Nov 14, 2025

The word upload implies you are uploading it to civitai, not from. Would calling it import or download make more sense?

@luke-mino-altherr luke-mino-altherr force-pushed the luke-mino-altherr/model-upload-modal branch from e916eb3 to d5f6d96 Compare November 19, 2025 22:36
@luke-mino-altherr luke-mino-altherr marked this pull request as ready for review November 19, 2025 23:49
Copy link
Contributor

@christian-byrne christian-byrne left a comment

Choose a reason for hiding this comment

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

LGTM with nits

Comment on lines 64 to 67
onBack: () => void
onFetchMetadata: () => void
onUpload: () => void
onClose: () => void
Copy link
Contributor

Choose a reason for hiding this comment

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

nit: the Vue-idiomatic way to do child->parent signals is via emit

<UploadFooter
  :current-step="step"
  ...
  @back="goBack"
  @fetch-metadata="fetchMetadata"
  @upload="uploadModel"
  @close="closeDialog"
/>

and in the component:

const emit = defineEmits<{
  (e: 'back'): void
  (e: 'fetch-metadata'): void
  (e: 'upload'): void
  (e: 'close'): void
}>()

Source: https://vuejs.org/guide/essentials/component-basics#listening-to-events

</div>

<div
class="flex flex-row items-start p-8 bg-node-component-surface rounded-lg"
Copy link
Contributor

Choose a reason for hiding this comment

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

nit: node-component-surface seems like it might be the wrong token to use here.

Comment on lines +8 to +10
<i
class="icon-[lucide--loader-circle] animate-spin text-6xl text-primary"
/>
Copy link
Contributor

Choose a reason for hiding this comment

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

nit: we do have shared loading spinner component

isLoading.value = true
error.value = null

fetchPromise = (async () => {
Copy link
Contributor

Choose a reason for hiding this comment

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

nit: can simplify/improve with https://vueuse.org/core/useAsyncState/

pathIndex: z.number()
})

// Asset metadata from download URL
Copy link
Contributor

Choose a reason for hiding this comment

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

question: What does this mean exactly?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Can remove this comment since its not helpful. But the AssetMetadata provides information and backend validation around the given civitai URL so we can know if the URL is valid before attempting to download

@christian-byrne christian-byrne added the claude-review Add to trigger a PR code review from Claude Code label Nov 20, 2025
luke-mino-altherr and others added 6 commits November 19, 2025 20:13
Wrap composable with createSharedComposable from VueUse to:
- Fix HMR compatibility (state no longer lost on hot reload)
- Remove import side effects from module-scoped variables
- Create state lazily on first use while maintaining shared singleton behavior

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
…ssages

Extract navigation footer from UploadModelDialog into UploadModelFooter component.
Add localized error messages for CivitAI validation error codes.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@luke-mino-altherr luke-mino-altherr force-pushed the luke-mino-altherr/model-upload-modal branch 2 times, most recently from c610d96 to 3f34c9e Compare November 20, 2025 04:18
@luke-mino-altherr luke-mino-altherr force-pushed the luke-mino-altherr/model-upload-modal branch from 3f34c9e to 803beb2 Compare November 20, 2025 04:24
Copy link
Contributor

@christian-byrne christian-byrne left a comment

Choose a reason for hiding this comment

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

LGTM

@luke-mino-altherr luke-mino-altherr merged commit acd8556 into main Nov 20, 2025
26 checks passed
@luke-mino-altherr luke-mino-altherr deleted the luke-mino-altherr/model-upload-modal branch November 20, 2025 04:37
github-actions bot pushed a commit that referenced this pull request Nov 20, 2025
## Summary
Adds a complete model upload workflow that allows users to import models
from Civitai URLs directly into their library.

## Changes
- **Multi-step wizard**: URL input → metadata confirmation → upload
progress
- **Components**: UploadModelDialog, UploadModelUrlInput,
UploadModelConfirmation, UploadModelProgress, UploadModelDialogHeader
- **API integration**: New assetService methods for metadata retrieval
and URL-based uploads
- **Model type management**: useModelTypes composable for fetching and
formatting available model types
- **UX improvements**: Optional validation bypass for UrlInput component
- **Localization**: 26 new i18n strings for the upload workflow

## Review Focus
- Error handling for failed uploads and metadata retrieval
- Model type detection and selection logic
- Dialog state management across multi-step workflow

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6694-feat-Add-Civitai-model-upload-wizard-2ab6d73d36508193b3b1dd67c7cc5a09)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Claude <[email protected]>
@comfy-pr-bot
Copy link
Member

@luke-mino-altherr Successfully backported to #6770

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Nov 20, 2025
@christian-byrne christian-byrne added cloud/1.32 needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch and removed preview 1.32 cloud/1.32 labels Nov 20, 2025
github-actions bot pushed a commit that referenced this pull request Nov 20, 2025
## Summary
Adds a complete model upload workflow that allows users to import models
from Civitai URLs directly into their library.

## Changes
- **Multi-step wizard**: URL input → metadata confirmation → upload
progress
- **Components**: UploadModelDialog, UploadModelUrlInput,
UploadModelConfirmation, UploadModelProgress, UploadModelDialogHeader
- **API integration**: New assetService methods for metadata retrieval
and URL-based uploads
- **Model type management**: useModelTypes composable for fetching and
formatting available model types
- **UX improvements**: Optional validation bypass for UrlInput component
- **Localization**: 26 new i18n strings for the upload workflow

## Review Focus
- Error handling for failed uploads and metadata retrieval
- Model type detection and selection logic
- Dialog state management across multi-step workflow

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6694-feat-Add-Civitai-model-upload-wizard-2ab6d73d36508193b3b1dd67c7cc5a09)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Claude <[email protected]>
@comfy-pr-bot
Copy link
Member

@luke-mino-altherr Successfully backported to #6772

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Nov 20, 2025
christian-byrne pushed a commit that referenced this pull request Nov 20, 2025
Backport of #6694 to `cloud/1.32`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6772-backport-cloud-1-32-feat-Add-Civitai-model-upload-wizard-2b16d73d3650814dbeccc12c11427050)
by [Unito](https://www.unito.io)

Co-authored-by: Luke Mino-Altherr <[email protected]>
Co-authored-by: Claude <[email protected]>
christian-byrne pushed a commit that referenced this pull request Nov 20, 2025
Backport of #6694 to `core/1.32`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6770-backport-core-1-32-feat-Add-Civitai-model-upload-wizard-2b16d73d365081f8a732f69713f95b61)
by [Unito](https://www.unito.io)

Co-authored-by: Luke Mino-Altherr <[email protected]>
Co-authored-by: Claude <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:models cloud/1.32 enhancement New feature or request size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants