Skip to content

feat: deploy frontend preview to Cloudflare Pages with ConnectionPanel#11118

Open
snomiao wants to merge 51 commits into
mainfrom
sno-frontend-preview
Open

feat: deploy frontend preview to Cloudflare Pages with ConnectionPanel#11118
snomiao wants to merge 51 commits into
mainfrom
sno-frontend-preview

Conversation

@snomiao

@snomiao snomiao commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Summary

Deploy the ComfyUI frontend to `comfy-ui.pages.dev` via Cloudflare Pages. A ConnectionPanel at `/connect` auto-opens when no local backend is detected, guiding users through installing and launching ComfyUI.

Live preview: https://sno-frontend-preview.comfy-ui.pages.dev
(URL is the sanitized git branch name — stable across redeploys)

Screenshots

Connection Panel (no backend detected, auto-redirected from `/`):

Connection Panel

GraphView (after connecting to local backend):

Graph View with missing model panel

Changes

  • CI pipeline (`ci-deploy-preview.yaml`): builds and deploys to Cloudflare Pages on every push. Branch alias is the sanitized git branch name so the preview URL stays stable across redeploys. Uses `pnpm dlx wrangler` (no npm/npx).
  • ConnectionPanelView (`/connect`): uv-based quick-start guide with copy buttons on every command block, HTTP/WS connection tester, "Connect & Go" button, backend cloud-API base detection (reads `system.comfy_api_base` directly when available, falls back to argv parsing), ComfyUI-Manager section, local-network `--listen` guidance, build metadata footer.
  • PR preview topbar badge: when `CI_PR_NUMBER` is set, a `PR` warning badge appears in the topbar showing `#XXXX`. Hovering/clicking shows author, commit hash, and backend URL. The About panel (Settings → About) is extended with clickable badges linking to the GitHub PR, author profile, and commit.
  • Auto-redirect (`src/router.ts`): `beforeEnter` guard on `/` detects unreachable backend and redirects to `/connect`.
  • Remote backend support (`src/scripts/api.ts`): `ComfyApi` reads `localStorage['comfyui-preview-backend-url']` and routes all `apiURL`/`fileURL`/`internalURL` + WebSocket calls through the configured remote origin.
  • Router base path fix (`src/router.ts`): only treat `window.location.pathname` as a router base when it ends with `/`.
  • BaseViewTemplate (`src/views/templates/BaseViewTemplate.vue`): `grid place-items-center` instead of `flex items-center` so the Connection Panel is scrollable on short viewports.
  • defaultGraph download metadata (`src/scripts/defaultGraph.ts`): `properties.models[]` added to `CheckpointLoaderSimple` so the missing-model panel can offer a Download button.
  • `comfy_api_base` schema: `zSystemStats` accepts the new optional `system.comfy_api_base` field added in companion backend PR Comfy-Org/ComfyUI#13571.

ConnectionPanel UX flow

  1. Visit `https://sno-frontend-preview.comfy-ui.pages.dev/\` → no backend → router redirects to `/connect`.
  2. Copy-paste the pre-filled launch command (CORS origin pre-populated from `window.location.origin`):
    ```sh
    comfy launch -- --enable-cors-header="https://sno-frontend-preview.comfy-ui.pages.dev"
    ```
  3. Enter backend URL → Test → shows HTTP ✓/✗ and WS ✓/✗. Surfaces the backend's cloud API target and warns if it disagrees with the frontend build.
  4. Connect & Open ComfyUI → reloads to `/`, now routed to the remote backend.

Companion backend PR

Comfy-Org/ComfyUI#13571 — adds `system.comfy_api_base` to `/api/system_stats` so the frontend can read the cloud API target directly instead of parsing argv. One-line change; fully backwards-compatible.

Review Focus

  • CI workflow correctness and secret usage
  • `api.ts` remote origin handling — any callsite constructing URLs outside `apiURL`/`fileURL`/`internalURL` that would bypass the remote origin prefix?
  • BaseViewTemplate change affects UserSelectView and CloudTemplate — smoke check those still center correctly
  • Cloud-base-mismatch detection: is reading `comfy_api_base` from `system_stats` (with argv fallback) an acceptable approach while the backend PR is pending?

Testing

  • Unit tests passing (`src/views/ConnectionPanelView.test.ts`, `src/platform/connectionPanel/backendReachable.test.ts`)
  • `pnpm typecheck` ✅ `pnpm lint` ✅ `pnpm knip` ✅
  • Manual E2E: ConnectionPanel → Test → Connect & Go → GraphView loads → missing-model panel shows Download button

@snomiao snomiao requested review from a team and Copilot April 10, 2026 16:01
@dosubot dosubot Bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Apr 10, 2026
@coderabbitai

coderabbitai Bot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

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

Adds a GitHub Actions preview/deploy workflow and deploy script for Cloudflare Pages, injects CI build-time constants, introduces a Connection Panel view with router and tests, and updates ComfyApi to honor a localStorage backend override.

Changes

Cohort / File(s) Summary
CI Workflow & Deploy Script
​.github/workflows/ci-deploy-preview.yaml, scripts/cicd/pr-preview-deploy-and-comment.sh
New workflow for PR previews and main deploy; script deploys dist/ to Cloudflare Pages (with retries) and posts/updates PR comments with preview metadata.
Build-time CI Metadata
global.d.ts, vite.config.mts, eslint.config.ts
Added CI build-time globals: __CI_BRANCH__, __CI_PR_NUMBER__, __CI_RUN_ID__, __CI_JOB_ID__ (TypeScript declarations, Vite defines, and readonly ESLint globals).
Connection Panel UI, Router & API
src/views/ConnectionPanelView.vue, src/router.ts, src/scripts/api.ts
New Connection Panel component with URL normalization, HTTP/WS tests, status indicators, localStorage persistence and "Connect & Go"; added /connect route and GraphView preflight redirect; ComfyApi uses comfyui-preview-backend-url override for HTTP/ws URLs.
Tests
src/views/ConnectionPanelView.test.ts
Vitest suite for Connection Panel: default value, localStorage persistence, UI elements, and test-triggered save behavior with mocks.
i18n & Docs
src/locales/en/main.json, TODO.md
Added connectionPanel translation keys and documented preview deployment/verification plan and CI constants in TODO.md.

Sequence Diagram(s)

sequenceDiagram
    participant User as User
    participant Frontend as Frontend App
    participant ConnView as ConnectionPanelView
    participant HTTP as HTTP Endpoint
    participant WS as WebSocket Endpoint
    participant Storage as localStorage

    User->>Frontend: Navigate to /connect
    Frontend->>ConnView: Mount
    ConnView->>Storage: Read comfyui-preview-backend-url
    ConnView->>ConnView: Initialize URL
    User->>ConnView: Enter URL and click Test
    ConnView->>Storage: Save normalized URL
    par HTTP Test
        ConnView->>HTTP: GET /api/system_stats (5s)
        HTTP-->>ConnView: Response / Timeout
    and WS Test
        ConnView->>WS: Open ws(s)://.../ws (5s)
        WS-->>ConnView: Open / Error
    end
    ConnView->>User: Show httpStatus & wsStatus indicators
    ConnView->>Frontend: If both ok -> Connect & Go (reload to /)
Loading
sequenceDiagram
    participant GitHub as GitHub
    participant GHA as GitHub Actions
    participant BuildJob as Build
    participant Script as Deploy Script
    participant Wrangler as Wrangler CLI
    participant Cloudflare as Cloudflare Pages
    participant GHApi as GitHub API

    GitHub->>GHA: PR opened / push to main
    GHA->>GHA: comment-on-pr-start job (PRs)
    GHA->>Script: run status="starting"
    Script->>GHApi: post "building" comment
    GHA->>BuildJob: run pnpm build
    BuildJob-->>GHA: upload dist artifact
    GHA->>Script: run status="completed" (PRs)
    Script->>Wrangler: deploy dist/ to Pages (retries)
    Wrangler-->>Cloudflare: create preview
    Cloudflare-->>Script: return preview URL
    Script->>GHApi: update PR comment with preview link
    GHA->>Cloudflare: on main push -> deploy-production job uses Wrangler to deploy main branch
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Poem

🐰 I nibbled on branches and hopped through CI lights,
I checked the sockets under moonlit nights,
Dist rolled its bundle and Pages took flight,
A tiny preview hummed—what a lovely sight! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: deploying a frontend preview to Cloudflare Pages and introducing a ConnectionPanel component, which aligns with the primary objectives of this PR.
End-To-End Regression Coverage For Fixes ✅ Passed PR title uses 'feat:' prefix indicating feature addition, and commit subject contains no bug-fix language. E2E regression test requirement does not apply.
Adr Compliance For Entity/Litegraph Changes ✅ Passed PR changes do not modify files under src/lib/litegraph/, src/ecs/, or graph entity-related files; changes focus on CI/CD, UI components, and configuration.
Description check ✅ Passed The PR description comprehensively addresses all template sections with detailed Summary, Changes, Review Focus, Screenshots, Testing notes, and clear context for reviewers.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sno-frontend-preview

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 and usage tips.

@github-actions

github-actions Bot commented Apr 10, 2026

Copy link
Copy Markdown

🌐 Frontend Preview: ✅ Built — 🌐 Open Preview

Details

⏰ Completed at: 04/30/2026, 04:42:12 AM UTC

Links

@github-actions

github-actions Bot commented Apr 10, 2026

Copy link
Copy Markdown

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

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

@github-actions

github-actions Bot commented Apr 10, 2026

Copy link
Copy Markdown

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 04/30/2026, 04:41:09 AM UTC

Links

@socket-security

socket-security Bot commented Apr 10, 2026

Copy link
Copy Markdown

No dependency changes detected. Learn more about Socket for GitHub.

👍 No dependency changes detected in pull request

@github-actions

github-actions Bot commented Apr 10, 2026

Copy link
Copy Markdown

📦 Bundle: 5.25 MB gzip 🔴 +12.6 kB

Details

Summary

  • Raw size: 24.2 MB baseline 24.1 MB — 🔴 +43.8 kB
  • Gzip: 5.25 MB baseline 5.23 MB — 🔴 +12.6 kB
  • Brotli: 4.06 MB baseline 4.05 MB — 🔴 +10.7 kB
  • Bundles: 260 current • 257 baseline • 246 added / 243 removed

Category Glance
Views & Navigation 🔴 +26.3 kB (104 kB) · Other 🔴 +8.04 kB (8.84 MB) · UI Components 🔴 +3.05 kB (64.1 kB) · Data & Services 🔴 +2.93 kB (3.04 MB) · App Entry Points 🔴 +1.82 kB (24.4 kB) · Panels & Settings 🔴 +1.76 kB (490 kB) · + 5 more

App Entry Points — 24.4 kB (baseline 22.5 kB) • 🔴 +1.82 kB

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-yyNylXT4.js (new) 24.4 kB 🔴 +24.4 kB 🔴 +8.62 kB 🔴 +7.39 kB
assets/index-CEi03jVc.js (removed) 22.5 kB 🟢 -22.5 kB 🟢 -7.98 kB 🟢 -6.83 kB

Status: 1 added / 1 removed

Graph Workspace — 1.24 MB (baseline 1.24 MB) • 🔴 +160 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BXRFMiOp.js (new) 1.24 MB 🔴 +1.24 MB 🔴 +265 kB 🔴 +199 kB
assets/GraphView-CxVUr2DY.js (removed) 1.24 MB 🟢 -1.24 MB 🟢 -265 kB 🟢 -199 kB

Status: 1 added / 1 removed

Views & Navigation — 104 kB (baseline 77.7 kB) • 🔴 +26.3 kB

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ConnectionPanelView-n8CWo6PR.js (new) 25.8 kB 🔴 +25.8 kB 🔴 +6 kB 🔴 +5.19 kB
assets/CloudSurveyView-oEVabPwI.js (new) 15.7 kB 🔴 +15.7 kB 🔴 +3.43 kB 🔴 +2.93 kB
assets/CloudSurveyView-FpYqBTmE.js (removed) 15.7 kB 🟢 -15.7 kB 🟢 -3.41 kB 🟢 -2.91 kB
assets/CloudLoginView-B_eEVabt.js (new) 12.2 kB 🔴 +12.2 kB 🔴 +3.46 kB 🔴 +3.07 kB
assets/CloudLoginView-CalSoFcw.js (removed) 12.2 kB 🟢 -12.2 kB 🟢 -3.43 kB 🟢 -3.04 kB
assets/CloudSignupView-BAjYlJwf.js (new) 10 kB 🔴 +10 kB 🔴 +2.96 kB 🔴 +2.6 kB
assets/CloudSignupView-20tPfu1K.js (removed) 9.94 kB 🟢 -9.94 kB 🟢 -2.93 kB 🟢 -2.57 kB
assets/UserCheckView-BUTLrD4W.js (new) 9.11 kB 🔴 +9.11 kB 🔴 +2.36 kB 🔴 +2.06 kB
assets/UserCheckView-DbGHXEuI.js (removed) 9.07 kB 🟢 -9.07 kB 🟢 -2.34 kB 🟢 -2.05 kB
assets/CloudLayoutView-CTxH5_dx.js (new) 7.77 kB 🔴 +7.77 kB 🔴 +2.46 kB 🔴 +2.15 kB
assets/CloudLayoutView-CZORVx3v.js (removed) 7.7 kB 🟢 -7.7 kB 🟢 -2.43 kB 🟢 -2.1 kB
assets/CloudForgotPasswordView-BYiRETsi.js (new) 6.18 kB 🔴 +6.18 kB 🔴 +2.2 kB 🔴 +1.96 kB
assets/CloudForgotPasswordView-C4eDMMXw.js (removed) 6.11 kB 🟢 -6.11 kB 🟢 -2.17 kB 🟢 -1.92 kB
assets/CloudAuthTimeoutView-CM9SacTx.js (new) 5.54 kB 🔴 +5.54 kB 🔴 +2.03 kB 🔴 +1.79 kB
assets/CloudAuthTimeoutView-I1lo2GH_.js (removed) 5.47 kB 🟢 -5.47 kB 🟢 -2 kB 🟢 -1.76 kB
assets/CloudSubscriptionRedirectView-Ouan4mS3.js (new) 5.32 kB 🔴 +5.32 kB 🔴 +2.01 kB 🔴 +1.8 kB
assets/CloudSubscriptionRedirectView-CvVpoqkC.js (removed) 5.25 kB 🟢 -5.25 kB 🟢 -1.98 kB 🟢 -1.75 kB
assets/UserSelectView-BPJ4ZUZo.js (new) 4.73 kB 🔴 +4.73 kB 🔴 +1.76 kB 🔴 +1.55 kB
assets/UserSelectView-DcV8j4qG.js (removed) 4.73 kB 🟢 -4.73 kB 🟢 -1.76 kB 🟢 -1.55 kB
assets/CloudSorryContactSupportView-DNyTXR6b.js (new) 1.21 kB 🔴 +1.21 kB 🔴 +605 B 🔴 +525 B
assets/CloudSorryContactSupportView-imo7GE0D.js (removed) 1.21 kB 🟢 -1.21 kB 🟢 -604 B 🟢 -526 B
assets/layout-ccMP7Y0A.js (removed) 385 B 🟢 -385 B 🟢 -270 B 🟢 -223 B
assets/layout-nCLJIhcd.js (new) 385 B 🔴 +385 B 🔴 +266 B 🔴 +217 B

Status: 12 added / 11 removed

Panels & Settings — 490 kB (baseline 488 kB) • 🔴 +1.76 kB

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-B2LBq6Hf.js (new) 46.7 kB 🔴 +46.7 kB 🔴 +9.64 kB 🔴 +8.56 kB
assets/KeybindingPanel-CJUojzZN.js (removed) 46.7 kB 🟢 -46.7 kB 🟢 -9.61 kB 🟢 -8.53 kB
assets/settings-C3gGnZL3.js (removed) 39.8 kB 🟢 -39.8 kB 🟢 -9.73 kB 🟢 -7.99 kB
assets/settings-D1PzL9qS.js (new) 39.8 kB 🔴 +39.8 kB 🔴 +9.73 kB 🔴 +7.99 kB
assets/settings-CcINMAU_.js (new) 35.5 kB 🔴 +35.5 kB 🔴 +8.66 kB 🔴 +7.31 kB
assets/settings-DPHQFGPU.js (removed) 35.5 kB 🟢 -35.5 kB 🟢 -8.66 kB 🟢 -7.31 kB
assets/settings-C-HHuGmx.js (removed) 33.6 kB 🟢 -33.6 kB 🟢 -8.49 kB 🟢 -6.92 kB
assets/settings-DASQtlYL.js (new) 33.6 kB 🔴 +33.6 kB 🔴 +8.49 kB 🔴 +6.92 kB
assets/settings-D1gnOuBj.js (new) 31.6 kB 🔴 +31.6 kB 🔴 +8.78 kB 🔴 +7.38 kB
assets/settings-DIxgwR-E.js (removed) 31.6 kB 🟢 -31.6 kB 🟢 -8.78 kB 🟢 -7.37 kB
assets/settings-D-nS0Ieo.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -8.42 kB 🟢 -7.35 kB
assets/settings-Pg6EzjO9.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +8.42 kB 🔴 +7.35 kB
assets/settings-Ce-lERvb.js (removed) 29.7 kB 🟢 -29.7 kB 🟢 -8.08 kB 🟢 -6.93 kB
assets/settings-H8onDzol.js (new) 29.7 kB 🔴 +29.7 kB 🔴 +8.08 kB 🔴 +6.93 kB
assets/settings-CsLMW49C.js (new) 29.7 kB 🔴 +29.7 kB 🔴 +8.31 kB 🔴 +7.28 kB
assets/settings-CWDyOuBp.js (removed) 29.7 kB 🟢 -29.7 kB 🟢 -8.31 kB 🟢 -7.28 kB
assets/settings-Bb80vjFF.js (new) 28.8 kB 🔴 +28.8 kB 🔴 +8 kB 🔴 +6.95 kB
assets/settings-D4YV7o8a.js (removed) 28.8 kB 🟢 -28.8 kB 🟢 -8 kB 🟢 -6.95 kB
assets/settings-CqoGFyXF.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -8.45 kB 🟢 -7.03 kB
assets/settings-DJyglVSi.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +8.45 kB 🔴 +7.04 kB
assets/settings-BeZzjjC2.js (removed) 25.2 kB 🟢 -25.2 kB 🟢 -8.2 kB 🟢 -6.63 kB
assets/settings-JgH9QW8M.js (new) 25.2 kB 🔴 +25.2 kB 🔴 +8.21 kB 🔴 +6.63 kB
assets/settings-BA2q9HFW.js (new) 24.6 kB 🔴 +24.6 kB 🔴 +7.98 kB 🔴 +6.25 kB
assets/settings-DeMW_Sfw.js (removed) 24.6 kB 🟢 -24.6 kB 🟢 -7.98 kB 🟢 -6.24 kB
assets/SecretsPanel-CDGv2DWE.js (new) 22.9 kB 🔴 +22.9 kB 🔴 +5.54 kB 🔴 +4.87 kB
assets/SecretsPanel-I-_BDrec.js (removed) 22.9 kB 🟢 -22.9 kB 🟢 -5.54 kB 🟢 -4.88 kB
assets/LegacyCreditsPanel-B-gODEtw.js (new) 21.8 kB 🔴 +21.8 kB 🔴 +5.92 kB 🔴 +5.22 kB
assets/LegacyCreditsPanel-KGtEsQtw.js (removed) 21.7 kB 🟢 -21.7 kB 🟢 -5.89 kB 🟢 -5.19 kB
assets/SubscriptionPanel-BHK2-BBw.js (new) 20 kB 🔴 +20 kB 🔴 +5.11 kB 🔴 +4.5 kB
assets/SubscriptionPanel-BaH_M1um.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -5.06 kB 🟢 -4.47 kB
assets/AboutPanel-C9MU9r7e.js (removed) 12 kB 🟢 -12 kB 🟢 -3.33 kB 🟢 -2.98 kB
assets/AboutPanel-DKjjGz7r.js (new) 12 kB 🔴 +12 kB 🔴 +3.32 kB 🔴 +2.98 kB
assets/ExtensionPanel-BO_dgEiT.js (new) 10 kB 🔴 +10 kB 🔴 +2.93 kB 🔴 +2.61 kB
assets/ExtensionPanel-CHKcfdFM.js (removed) 9.94 kB 🟢 -9.94 kB 🟢 -2.9 kB 🟢 -2.56 kB
assets/ServerConfigPanel-Yxfo_osr.js (new) 7.09 kB 🔴 +7.09 kB 🔴 +2.38 kB 🔴 +2.11 kB
assets/ServerConfigPanel-BmFxBqlJ.js (removed) 7.02 kB 🟢 -7.02 kB 🟢 -2.34 kB 🟢 -2.1 kB
assets/UserPanel-CzsOmn0D.js (new) 6.8 kB 🔴 +6.8 kB 🔴 +2.25 kB 🔴 +1.99 kB
assets/UserPanel-CW70iTjh.js (removed) 6.73 kB 🟢 -6.73 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/cloudRemoteConfig-Bxi4X_Kx.js (new) 2.09 kB 🔴 +2.09 kB 🔴 +1 kB 🔴 +866 B
assets/cloudRemoteConfig-BshujyLJ.js (removed) 2.02 kB 🟢 -2.02 kB 🟢 -972 B 🟢 -835 B
assets/refreshRemoteConfig-B20fgwml.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -647 B 🟢 -551 B
assets/refreshRemoteConfig-DbueJevV.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +639 B 🔴 +545 B
assets/remoteConfig-D7Yz-3dj.js (new) 1.21 kB 🔴 +1.21 kB 🔴 +630 B 🔴 +512 B

Status: 22 added / 21 removed

User & Accounts — 17.6 kB (baseline 17.5 kB) • 🔴 +140 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/PasswordFields-C6oIY0T1.js (new) 4.68 kB 🔴 +4.68 kB 🔴 +1.42 kB 🔴 +1.25 kB
assets/PasswordFields-PXjlW2EN.js (removed) 4.68 kB 🟢 -4.68 kB 🟢 -1.42 kB 🟢 -1.25 kB
assets/auth-CGvnsUdB.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/auth-DEPfbm1_.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/SignUpForm-CcPDdb5y.js (new) 3.2 kB 🔴 +3.2 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/SignUpForm-DsIyhpJT.js (removed) 3.2 kB 🟢 -3.2 kB 🟢 -1.29 kB 🟢 -1.15 kB
assets/UpdatePasswordContent-CGmAalQ_.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +1.32 kB 🔴 +1.16 kB
assets/UpdatePasswordContent-DNjQa_HA.js (removed) 2.87 kB 🟢 -2.87 kB 🟢 -1.28 kB 🟢 -1.14 kB
assets/WorkspaceProfilePic-CCjxVtJw.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +860 B 🔴 +776 B
assets/WorkspaceProfilePic-Dg9UwtNw.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -859 B 🟢 -776 B
assets/authStore-eimX_e5l.js (new) 1.23 kB 🔴 +1.23 kB 🔴 +585 B 🔴 +524 B
assets/authStore-CxUFg4wl.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -551 B 🟢 -493 B
assets/auth-C3du8Dv7.js (removed) 348 B 🟢 -348 B 🟢 -219 B 🟢 -193 B
assets/auth-DosuhgtA.js (new) 348 B 🔴 +348 B 🔴 +217 B 🔴 +193 B

Status: 7 added / 7 removed

Editors & Dialogs — 113 kB (baseline 113 kB) • 🔴 +210 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-BCZi-aEv.js (new) 86.9 kB 🔴 +86.9 kB 🔴 +18.8 kB 🔴 +16.1 kB
assets/ComfyHubPublishDialog-If3vFNVq.js (removed) 86.9 kB 🟢 -86.9 kB 🟢 -18.8 kB 🟢 -16 kB
assets/useShareDialog-REn2TqEj.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.8 kB 🔴 +5.14 kB
assets/useShareDialog-1b6tfVdX.js (removed) 23.7 kB 🟢 -23.7 kB 🟢 -5.77 kB 🟢 -5.11 kB
assets/ComfyHubPublishDialog-DNdsoBDm.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +643 B 🔴 +582 B
assets/ComfyHubPublishDialog-BuSyfvJX.js (removed) 1.32 kB 🟢 -1.32 kB 🟢 -611 B 🟢 -542 B
assets/useSubscriptionDialog-Dv5Z_HbH.js (new) 1.21 kB 🔴 +1.21 kB 🔴 +574 B 🔴 +505 B
assets/useSubscriptionDialog-D7ZLPrJu.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -542 B 🟢 -478 B

Status: 4 added / 4 removed

UI Components — 64.1 kB (baseline 61 kB) • 🔴 +3.05 kB

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-DMphlCKY.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.79 kB 🟢 -3.39 kB
assets/ComfyQueueButton-Jq2wKlXo.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.79 kB 🔴 +3.38 kB
assets/useTerminalTabs-CkODmwtj.js (new) 11.1 kB 🔴 +11.1 kB 🔴 +3.75 kB 🔴 +3.3 kB
assets/useTerminalTabs-COz1By6q.js (removed) 11 kB 🟢 -11 kB 🟢 -3.71 kB 🟢 -3.27 kB
assets/TopbarBadge-Bs-QUoEE.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.25 kB 🔴 +1.97 kB
assets/TopbarBadge-CtQ1xNot.js (removed) 7.62 kB 🟢 -7.62 kB 🟢 -1.87 kB 🟢 -1.64 kB
assets/ScrubableNumberInput-C4aitpZP.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -2.13 kB 🟢 -1.9 kB
assets/ScrubableNumberInput-DkAJfH5y.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +2.13 kB 🔴 +1.9 kB
assets/FormSearchInput-Bub-tcC2.js (new) 5.11 kB 🔴 +5.11 kB 🔴 +2.12 kB 🔴 +1.83 kB
assets/FormSearchInput-DHMKkOwQ.js (removed) 5.11 kB 🟢 -5.11 kB 🟢 -2.12 kB 🟢 -1.83 kB
assets/toggle-group-BadHGmHB.js (removed) 4.03 kB 🟢 -4.03 kB 🟢 -1.42 kB 🟢 -1.25 kB
assets/toggle-group-Q-Z4hhXY.js (new) 4.03 kB 🔴 +4.03 kB 🔴 +1.42 kB 🔴 +1.25 kB
assets/Button-CGU9phxS.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.36 kB 🔴 +1.2 kB
assets/Button-CYYh6qPI.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.36 kB 🟢 -1.2 kB
assets/SubscribeButton-CKkOGwbZ.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.05 kB 🔴 +941 B
assets/SubscribeButton-DQqnSWwu.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.05 kB 🟢 -943 B
assets/WidgetButton-BDD8dK6Z.js (removed) 2.07 kB 🟢 -2.07 kB 🟢 -962 B 🟢 -876 B
assets/WidgetButton-Bt0KdqU4.js (new) 2.07 kB 🔴 +2.07 kB 🔴 +962 B 🔴 +875 B
assets/cloudFeedbackTopbarButton-Cvd2RNqC.js (new) 1.87 kB 🔴 +1.87 kB 🔴 +962 B 🔴 +842 B
assets/cloudFeedbackTopbarButton-DqBoqrAj.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -927 B 🟢 -813 B
assets/ComfyQueueButton-R1JXV941.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +612 B 🔴 +544 B
assets/UserAvatar-BVVvzkxt.js (new) 1.28 kB 🔴 +1.28 kB 🔴 +674 B 🔴 +579 B
assets/UserAvatar-iMzaDLTw.js (removed) 1.28 kB 🟢 -1.28 kB 🟢 -674 B 🟢 -580 B
assets/ComfyQueueButton-R-qCynTS.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -577 B 🟢 -515 B
assets/CloudBadge-CoCR5Qgy.js (removed) 1.17 kB 🟢 -1.17 kB 🟢 -590 B 🟢 -519 B
assets/CloudBadge-DuEedbVj.js (new) 1.17 kB 🔴 +1.17 kB 🔴 +590 B 🔴 +520 B

Status: 13 added / 13 removed

Data & Services — 3.04 MB (baseline 3.04 MB) • 🔴 +2.93 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-D_LeGSpk.js (removed) 1.97 MB 🟢 -1.97 MB 🟢 -454 kB 🟢 -344 kB
assets/dialogService-BoZr9u1Y.js (new) 1.97 MB 🔴 +1.97 MB 🔴 +454 kB 🔴 +344 kB
assets/api-DR_rtsRU.js (new) 895 kB 🔴 +895 kB 🔴 +214 kB 🔴 +169 kB
assets/api-BPHYffOP.js (removed) 894 kB 🟢 -894 kB 🟢 -214 kB 🟢 -168 kB
assets/load3dService-cYw4Kzqr.js (new) 114 kB 🔴 +114 kB 🔴 +24.8 kB 🔴 +21.1 kB
assets/load3dService-DT0xkBFr.js (removed) 114 kB 🟢 -114 kB 🟢 -24.8 kB 🟢 -21 kB
assets/workflowShareService-BPzlYVMg.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.89 kB 🟢 -4.33 kB
assets/workflowShareService-BQE7q6iN.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.89 kB 🔴 +4.33 kB
assets/keybindingService-Bq6BuHuq.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.67 kB 🔴 +3.22 kB
assets/keybindingService-Dct4Paqn.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.67 kB 🟢 -3.22 kB
assets/releaseStore-BUzSO5_V.js (new) 8.16 kB 🔴 +8.16 kB 🔴 +2.29 kB 🔴 +2.01 kB
assets/releaseStore-J73-22fs.js (removed) 8.12 kB 🟢 -8.12 kB 🟢 -2.28 kB 🟢 -2 kB
assets/dialogStore-BwoNh9nk.js (new) 4.83 kB 🔴 +4.83 kB 🔴 +1.59 kB 🔴 +1.36 kB
assets/dialogStore-DKs16Zai.js (removed) 4.83 kB 🟢 -4.83 kB 🟢 -1.59 kB 🟢 -1.35 kB
assets/serverConfigStore-C6-1e19r.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +810 B 🔴 +704 B
assets/serverConfigStore-DpM_xTBB.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -811 B 🟢 -705 B
assets/userStore-CZOuCCaT.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -870 B 🟢 -762 B
assets/userStore-Tfv4JxHZ.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +870 B 🔴 +760 B
assets/electronDownloadStore-BX0ANTTq.js (new) 1.83 kB 🔴 +1.83 kB 🔴 +736 B 🔴 +652 B
assets/electronDownloadStore-CDYfYjkc.js (removed) 1.83 kB 🟢 -1.83 kB 🟢 -734 B 🟢 -650 B
assets/audioService-Cp6bPNhk.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -879 B 🟢 -758 B
assets/audioService-YlieCSGi.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +877 B 🔴 +761 B
assets/comfyApi-Df7et73D.js (new) 1.59 kB 🔴 +1.59 kB 🔴 +649 B 🔴 +574 B
assets/releaseStore-Dy276ZE6.js (new) 1.23 kB 🔴 +1.23 kB 🔴 +579 B 🔴 +514 B
assets/workflowDraftStore-BJMz3UWG.js (new) 1.21 kB 🔴 +1.21 kB 🔴 +574 B 🔴 +511 B
assets/dialogService-MgiVLK-w.js (new) 1.2 kB 🔴 +1.2 kB 🔴 +567 B 🔴 +507 B
assets/settingStore-dmogLmaK.js (new) 1.19 kB 🔴 +1.19 kB 🔴 +569 B 🔴 +507 B
assets/assetsStore-DxRRNVsH.js (new) 1.19 kB 🔴 +1.19 kB 🔴 +569 B 🔴 +506 B
assets/releaseStore-BNlkCzHb.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -545 B 🟢 -486 B
assets/workflowDraftStore-C7JQ9gXh.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -540 B 🟢 -483 B
assets/dialogService-fG8lteqB.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -533 B 🟢 -475 B
assets/settingStore-Bg9PumXH.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -536 B 🟢 -475 B
assets/assetsStore-Bum8b0Or.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -536 B 🟢 -477 B

Status: 17 added / 16 removed / 1 unchanged

Utilities & Hooks — 364 kB (baseline 364 kB) • 🟢 -659 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-CMlFl8W-.js (removed) 233 kB 🟢 -233 kB 🟢 -51.8 kB 🟢 -42.2 kB
assets/useConflictDetection-M-XGWA-7.js (new) 233 kB 🔴 +233 kB 🔴 +51.8 kB 🔴 +42.2 kB
assets/useLoad3d-Bs4FJxau.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.09 kB 🟢 -4.49 kB
assets/useLoad3d-CBmJqoPB.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.09 kB 🔴 +4.49 kB
assets/useLoad3dViewer-CLD9T8f2.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -4.91 kB 🟢 -4.3 kB
assets/useLoad3dViewer-CUWvXa0m.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +4.91 kB 🔴 +4.31 kB
assets/formatUtil-Dq8QCKoY.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -5.38 kB 🟢 -4.72 kB
assets/formatUtil-sqiwgPb2.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +5.38 kB 🔴 +4.72 kB
assets/colorUtil-ABPIVFwk.js (new) 9.01 kB 🔴 +9.01 kB 🔴 +2.68 kB 🔴 +2.37 kB
assets/colorUtil-D9rMyhC0.js (removed) 9.01 kB 🟢 -9.01 kB 🟢 -2.68 kB 🟢 -2.36 kB
assets/assetMetadataUtils-Bio50UU4.js (removed) 6.25 kB 🟢 -6.25 kB 🟢 -1.88 kB 🟢 -1.63 kB
assets/assetMetadataUtils-D3CPho-R.js (new) 6.25 kB 🔴 +6.25 kB 🔴 +1.88 kB 🔴 +1.64 kB
assets/useFeatureFlags-BIn1dsWn.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -1.79 kB 🟢 -1.52 kB
assets/useTypeformEmbed-BAeTnpyN.js (new) 5.91 kB 🔴 +5.91 kB 🔴 +2.28 kB 🔴 +1.89 kB
assets/useTypeformEmbed-CfzvSYpp.js (removed) 5.91 kB 🟢 -5.91 kB 🟢 -2.28 kB 🟢 -1.89 kB
assets/useCopyToClipboard-IUv28KrS.js (removed) 5.29 kB 🟢 -5.29 kB 🟢 -1.86 kB 🟢 -1.58 kB
assets/useCopyToClipboard-l-6NWvgh.js (new) 5.29 kB 🔴 +5.29 kB 🔴 +1.86 kB 🔴 +1.57 kB
assets/useFeatureFlags-DQyDC72x.js (new) 5.04 kB 🔴 +5.04 kB 🔴 +1.45 kB 🔴 +1.24 kB
assets/downloadUtil-Cak4rvvq.js (new) 4.68 kB 🔴 +4.68 kB 🔴 +1.85 kB 🔴 +1.54 kB
assets/downloadUtil-DUwoIE9K.js (removed) 4.68 kB 🟢 -4.68 kB 🟢 -1.85 kB 🟢 -1.54 kB
assets/curveUtils-CcwYrFaW.js (removed) 3.83 kB 🟢 -3.83 kB 🟢 -1.29 kB 🟢 -1.14 kB
assets/curveUtils-COoTmzqe.js (new) 3.83 kB 🔴 +3.83 kB 🔴 +1.29 kB 🔴 +1.14 kB
assets/subscriptionCheckoutUtil-BAoToTY9.js (new) 3.35 kB 🔴 +3.35 kB 🔴 +1.38 kB 🔴 +1.2 kB
assets/useWorkspaceUI-CqKaNKR4.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +983 B 🔴 +812 B
assets/useWorkspaceUI-DOBXdNum.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -980 B 🟢 -811 B
assets/subscriptionCheckoutUtil-C3p4I_42.js (removed) 3.31 kB 🟢 -3.31 kB 🟢 -1.36 kB 🟢 -1.19 kB
assets/useExternalLink-D1rjxyF6.js (removed) 3.03 kB 🟢 -3.03 kB 🟢 -1.16 kB 🟢 -1.02 kB
assets/useExternalLink-DWW2zyom.js (new) 3.03 kB 🔴 +3.03 kB 🔴 +1.16 kB 🔴 +1.02 kB
assets/dateTimeUtil-CpgTjzzD.js (removed) 2.85 kB 🟢 -2.85 kB 🟢 -1.12 kB 🟢 -1.01 kB
assets/dateTimeUtil-DMmuhqI7.js (new) 2.85 kB 🔴 +2.85 kB 🔴 +1.12 kB 🔴 +1.01 kB
assets/assetPreviewUtil-DIH1wkIJ.js (new) 2.27 kB 🔴 +2.27 kB 🔴 +958 B 🔴 +838 B
assets/assetPreviewUtil-skW1naJR.js (removed) 2.27 kB 🟢 -2.27 kB 🟢 -958 B 🟢 -838 B
assets/useUpstreamValue-DFblIvtj.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +804 B 🔴 +706 B
assets/useUpstreamValue-mwn0808A.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -805 B 🟢 -711 B
assets/useFeatureUsageTracker-CBemci3C.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +906 B 🔴 +777 B
assets/useFeatureUsageTracker-CbfVSSN8.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -907 B 🟢 -774 B
assets/markdownRendererUtil-CGDxI7Yd.js (removed) 1.59 kB 🟢 -1.59 kB 🟢 -831 B 🟢 -717 B
assets/markdownRendererUtil-LxWzVLH_.js (new) 1.59 kB 🔴 +1.59 kB 🔴 +831 B 🔴 +717 B
assets/useErrorHandling-Dua9qzXI.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -648 B 🟢 -550 B
assets/useErrorHandling-SfcFk0Ee.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +645 B 🔴 +548 B
assets/useLoad3d-FJJfzX4R.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +638 B 🔴 +591 B
assets/useWorkspaceTierLabel-BhulPak3.js (removed) 1.35 kB 🟢 -1.35 kB 🟢 -666 B 🟢 -557 B
assets/useWorkspaceTierLabel-lHxB7ENu.js (new) 1.35 kB 🔴 +1.35 kB 🔴 +667 B 🔴 +556 B
assets/useLoad3dViewer-CxzeJ9DY.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +602 B 🔴 +542 B
assets/useLoad3d-B3yYO3B7.js (removed) 1.3 kB 🟢 -1.3 kB 🟢 -603 B 🟢 -547 B
assets/useLoad3dViewer-DJw7O_71.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -569 B 🟢 -512 B
assets/useCurrentUser-Ce2uM4Zf.js (new) 1.19 kB 🔴 +1.19 kB 🔴 +570 B 🔴 +503 B
assets/useCurrentUser-3zNhPfaK.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -537 B 🟢 -476 B
assets/useSurveyFeatureTracking-DPmZFf-e.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +506 B 🔴 +433 B
assets/useSurveyFeatureTracking-DtGo7xvd.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -509 B 🟢 -450 B
assets/histogramUtil-BOzAeBGn.js (new) 972 B 🔴 +972 B 🔴 +573 B 🔴 +493 B
assets/histogramUtil-CkwPE-Mq.js (removed) 972 B 🟢 -972 B 🟢 -573 B 🟢 -489 B
assets/useClickDragGuard-BtKsfr66.js (removed) 828 B 🟢 -828 B 🟢 -411 B 🟢 -361 B
assets/useClickDragGuard-C6HYioA3.js (new) 828 B 🔴 +828 B 🔴 +413 B 🔴 +361 B
assets/useWorkspaceSwitch-D9Z6aLcQ.js (new) 747 B 🔴 +747 B 🔴 +381 B 🔴 +330 B
assets/useWorkspaceSwitch-e_DV3GbR.js (removed) 747 B 🟢 -747 B 🟢 -383 B 🟢 -335 B
assets/envUtil-6mT1UWkb.js (removed) 489 B 🟢 -489 B 🟢 -309 B 🟢 -244 B
assets/envUtil-Bu429PPE.js (new) 489 B 🔴 +489 B 🔴 +311 B 🔴 +275 B
assets/_plugin-vue_export-helper-DhKZ6h9r.js (removed) 365 B 🟢 -365 B 🟢 -257 B 🟢 -216 B
assets/_plugin-vue_export-helper-DlXR7LQv.js (new) 365 B 🔴 +365 B 🔴 +257 B 🔴 +216 B
assets/SkeletonUtils-CGOfYpu-.js (new) 133 B 🔴 +133 B 🔴 +114 B 🔴 +102 B
assets/SkeletonUtils-Dg-g3-5_.js (removed) 133 B 🟢 -133 B 🟢 -114 B 🟢 -102 B

Status: 31 added / 31 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-three-Bjip2mjh.js (new) 1.94 MB 🔴 +1.94 MB 🔴 +415 kB 🔴 +305 kB
assets/vendor-three-CSRPfekZ.js (removed) 1.94 MB 🟢 -1.94 MB 🟢 -415 kB 🟢 -305 kB
assets/vendor-primevue-BI0EWdU5.js (removed) 1.75 MB 🟢 -1.75 MB 🟢 -315 kB 🟢 -191 kB
assets/vendor-primevue-EMNJut1i.js (new) 1.75 MB 🔴 +1.75 MB 🔴 +315 kB 🔴 +191 kB
assets/vendor-other-BmtpazlK.js (removed) 1.73 MB 🟢 -1.73 MB 🟢 -355 kB 🟢 -282 kB
assets/vendor-other-Cq17GWue.js (new) 1.73 MB 🔴 +1.73 MB 🔴 +355 kB 🔴 +282 kB
assets/vendor-tiptap-Dk5jn8en.js (removed) 737 kB 🟢 -737 kB 🟢 -182 kB 🟢 -146 kB
assets/vendor-tiptap-DSDCaB8l.js (new) 737 kB 🔴 +737 kB 🔴 +182 kB 🔴 +146 kB
assets/vendor-reka-ui-DGzhCuof.js (new) 482 kB 🔴 +482 kB 🔴 +88.2 kB 🔴 +68.2 kB
assets/vendor-reka-ui-fSH2wgmi.js (removed) 482 kB 🟢 -482 kB 🟢 -88.2 kB 🟢 -68.2 kB
assets/vendor-chart-BGuGCHIv.js (new) 411 kB 🔴 +411 kB 🔴 +99.9 kB 🔴 +82.8 kB
assets/vendor-chart-CXil3K2i.js (removed) 411 kB 🟢 -411 kB 🟢 -99.9 kB 🟢 -82.7 kB
assets/vendor-xterm-7TEkuqo_.js (new) 374 kB 🔴 +374 kB 🔴 +75.6 kB 🔴 +61 kB
assets/vendor-xterm-D9POYBXv.js (removed) 374 kB 🟢 -374 kB 🟢 -75.6 kB 🟢 -61.1 kB

Status: 7 added / 7 removed / 9 unchanged

Other — 8.84 MB (baseline 8.83 MB) • 🔴 +8.04 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-Br1lS8B1.js (new) 595 kB 🔴 +595 kB 🔴 +117 kB 🔴 +91.7 kB
assets/i18n-Bg4qQHVu.js (removed) 590 kB 🟢 -590 kB 🟢 -115 kB 🟢 -90.1 kB
assets/nodeDefs-D0rwA_6n.js (removed) 543 kB 🟢 -543 kB 🟢 -83.1 kB 🟢 -56.8 kB
assets/nodeDefs-Dt-9HLfO.js (new) 543 kB 🔴 +543 kB 🔴 +83.1 kB 🔴 +56.8 kB
assets/nodeDefs-DTDO-oyt.js (new) 498 kB 🔴 +498 kB 🔴 +77.5 kB 🔴 +54.5 kB
assets/nodeDefs-DWokYvz6.js (removed) 498 kB 🟢 -498 kB 🟢 -77.5 kB 🟢 -54.5 kB
assets/nodeDefs-BUrpG12h.js (new) 497 kB 🔴 +497 kB 🔴 +75 kB 🔴 +52.4 kB
assets/nodeDefs-DHoT16Kn.js (removed) 497 kB 🟢 -497 kB 🟢 -75 kB 🟢 -52.4 kB
assets/nodeDefs-Be0W0XRc.js (removed) 458 kB 🟢 -458 kB 🟢 -75.3 kB 🟢 -52.3 kB
assets/nodeDefs-C6AIQL8O.js (new) 458 kB 🔴 +458 kB 🔴 +75.3 kB 🔴 +52.3 kB
assets/nodeDefs-Cy7b7fbo.js (removed) 444 kB 🟢 -444 kB 🟢 -73.3 kB 🟢 -51.8 kB
assets/nodeDefs-DVVu3JBX.js (new) 444 kB 🔴 +444 kB 🔴 +73.3 kB 🔴 +51.8 kB
assets/nodeDefs-BdBmlNgv.js (removed) 440 kB 🟢 -440 kB 🟢 -72.1 kB 🟢 -52.5 kB
assets/nodeDefs-DVEH_YaD.js (new) 440 kB 🔴 +440 kB 🔴 +72.1 kB 🔴 +52.5 kB
assets/nodeDefs-BloKd1_R.js (removed) 439 kB 🟢 -439 kB 🟢 -73.3 kB 🟢 -53.2 kB
assets/nodeDefs-Cn6-aAle.js (new) 439 kB 🔴 +439 kB 🔴 +73.3 kB 🔴 +53.2 kB
assets/nodeDefs-CaSZo9k9.js (new) 436 kB 🔴 +436 kB 🔴 +70.4 kB 🔴 +51.2 kB
assets/nodeDefs-fblkBuWD.js (removed) 436 kB 🟢 -436 kB 🟢 -70.4 kB 🟢 -51.2 kB
assets/nodeDefs-B4NpxVaU.js (new) 430 kB 🔴 +430 kB 🔴 +69.4 kB 🔴 +50.5 kB
assets/nodeDefs-DMCLyyTs.js (removed) 430 kB 🟢 -430 kB 🟢 -69.4 kB 🟢 -50.6 kB
assets/nodeDefs-BvuEz2ye.js (new) 403 kB 🔴 +403 kB 🔴 +72 kB 🔴 +50.4 kB
assets/nodeDefs-CyFjRMGl.js (removed) 403 kB 🟢 -403 kB 🟢 -72 kB 🟢 -50.4 kB
assets/nodeDefs-B4pCA5EX.js (new) 399 kB 🔴 +399 kB 🔴 +70.9 kB 🔴 +49.2 kB
assets/nodeDefs-BqUDNe_s.js (removed) 399 kB 🟢 -399 kB 🟢 -70.9 kB 🟢 -49.2 kB
assets/main-CjZMmi-m.js (new) 240 kB 🔴 +240 kB 🔴 +62.1 kB 🔴 +48.7 kB
assets/main-D2Ew9yOq.js (removed) 240 kB 🟢 -240 kB 🟢 -62.1 kB 🟢 -48.7 kB
assets/main-BbSSBWAb.js (removed) 215 kB 🟢 -215 kB 🟢 -56 kB 🟢 -45.1 kB
assets/main-CRzIjWru.js (new) 215 kB 🔴 +215 kB 🔴 +56 kB 🔴 +45.1 kB
assets/main-BL6SpFYJ.js (new) 206 kB 🔴 +206 kB 🔴 +55.8 kB 🔴 +44.4 kB
assets/main-DuBfbK5t.js (removed) 206 kB 🟢 -206 kB 🟢 -55.8 kB 🟢 -44.4 kB
assets/main-CDDEcbmP.js (removed) 197 kB 🟢 -197 kB 🟢 -55.3 kB 🟢 -44 kB
assets/main-CdqAubYq.js (new) 197 kB 🔴 +197 kB 🔴 +55.3 kB 🔴 +44 kB
assets/main-BAfEChKX.js (new) 180 kB 🔴 +180 kB 🔴 +53.9 kB 🔴 +44.9 kB
assets/main-BwIs_uVZ.js (removed) 180 kB 🟢 -180 kB 🟢 -53.9 kB 🟢 -44.9 kB
assets/main-BHT1V9ZB.js (removed) 177 kB 🟢 -177 kB 🟢 -53.2 kB 🟢 -42.8 kB
assets/main-BTi2voU1.js (new) 177 kB 🔴 +177 kB 🔴 +53.2 kB 🔴 +42.8 kB
assets/main-BCLNZ7zN.js (new) 174 kB 🔴 +174 kB 🔴 +52.7 kB 🔴 +43.6 kB
assets/main-CbclVPVM.js (removed) 174 kB 🟢 -174 kB 🟢 -52.7 kB 🟢 -43.6 kB
assets/main-BDM4GgXS.js (removed) 172 kB 🟢 -172 kB 🟢 -52.9 kB 🟢 -44.2 kB
assets/main-CYoMm2CU.js (new) 172 kB 🔴 +172 kB 🔴 +52.9 kB 🔴 +44.2 kB
assets/main-CmjSaKcK.js (removed) 170 kB 🟢 -170 kB 🟢 -52.1 kB 🟢 -43.8 kB
assets/main-DG1KFS_C.js (new) 170 kB 🔴 +170 kB 🔴 +52.1 kB 🔴 +43.8 kB
assets/main-BhgCwUfe.js (removed) 152 kB 🟢 -152 kB 🟢 -51.9 kB 🟢 -41.5 kB
assets/main-Ew-WUafu.js (new) 152 kB 🔴 +152 kB 🔴 +51.9 kB 🔴 +41.5 kB
assets/main-BtdNbDIj.js (new) 150 kB 🔴 +150 kB 🔴 +51.9 kB 🔴 +41.2 kB
assets/main-CCja-vbk.js (removed) 150 kB 🟢 -150 kB 🟢 -51.9 kB 🟢 -41.2 kB
assets/core-BylxYqqH.js (new) 76.7 kB 🔴 +76.7 kB 🔴 +19.9 kB 🔴 +16.9 kB
assets/core-D2lz5RBa.js (removed) 76.6 kB 🟢 -76.6 kB 🟢 -19.8 kB 🟢 -16.9 kB
assets/groupNode-BMElpry4.js (removed) 74.9 kB 🟢 -74.9 kB 🟢 -18.7 kB 🟢 -16.5 kB
assets/groupNode-CBs_dlY0.js (new) 74.9 kB 🔴 +74.9 kB 🔴 +18.7 kB 🔴 +16.5 kB
assets/WidgetSelect-Bix0UXQO.js (new) 67.3 kB 🔴 +67.3 kB 🔴 +14.6 kB 🔴 +12.7 kB
assets/WidgetSelect-bXoNN2jh.js (removed) 67.2 kB 🟢 -67.2 kB 🟢 -14.6 kB 🟢 -12.6 kB
assets/SubscriptionRequiredDialogContentWorkspace-BUdvtPBa.js (new) 49.3 kB 🔴 +49.3 kB 🔴 +9.45 kB 🔴 +8.06 kB
assets/SubscriptionRequiredDialogContentWorkspace-BxsGVa3l.js (removed) 49.3 kB 🟢 -49.3 kB 🟢 -9.41 kB 🟢 -8.04 kB
assets/Load3DControls-B_XPJdIt.js (removed) 46.1 kB 🟢 -46.1 kB 🟢 -7.51 kB 🟢 -6.54 kB
assets/Load3DControls-DPfusScj.js (new) 46.1 kB 🔴 +46.1 kB 🔴 +7.51 kB 🔴 +6.55 kB
assets/WidgetPainter-CyTaWTXK.js (new) 34 kB 🔴 +34 kB 🔴 +8.32 kB 🔴 +7.38 kB
assets/WidgetPainter-CM06VatS.js (removed) 34 kB 🟢 -34 kB 🟢 -8.28 kB 🟢 -7.34 kB
assets/WorkspacePanelContent-BGi6fZNb.js (new) 32.8 kB 🔴 +32.8 kB 🔴 +7.03 kB 🔴 +6.21 kB
assets/WorkspacePanelContent-CFzld7Hc.js (removed) 32.8 kB 🟢 -32.8 kB 🟢 -6.99 kB 🟢 -6.17 kB
assets/Load3dViewerContent-BFFOrjGV.js (removed) 28 kB 🟢 -28 kB 🟢 -5.85 kB 🟢 -5.07 kB
assets/Load3dViewerContent-BtXoANCe.js (new) 28 kB 🔴 +28 kB 🔴 +5.84 kB 🔴 +5.07 kB
assets/SubscriptionRequiredDialogContent-BgmiQRIB.js (new) 27.6 kB 🔴 +27.6 kB 🔴 +7 kB 🔴 +6.19 kB
assets/SubscriptionRequiredDialogContent-BfPJKJJg.js (removed) 27.5 kB 🟢 -27.5 kB 🟢 -6.96 kB 🟢 -6.14 kB
assets/WidgetImageCrop-BjbpYsVF.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +6.22 kB 🔴 +5.47 kB
assets/WidgetImageCrop-BRcsVc_S.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -6.18 kB 🟢 -5.46 kB
assets/SubscriptionPanelContentWorkspace-BXyHZPkE.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.18 kB 🔴 +4.55 kB
assets/SubscriptionPanelContentWorkspace-CjH5xAoo.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.17 kB 🟢 -4.57 kB
assets/SignInContent-Cx9YTCpA.js (new) 20.7 kB 🔴 +20.7 kB 🔴 +5.37 kB 🔴 +4.7 kB
assets/CurrentUserPopoverWorkspace-BuzH1Rdf.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +4.93 kB 🔴 +4.42 kB
assets/SignInContent-nglmmthl.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.35 kB 🟢 -4.67 kB
assets/CurrentUserPopoverWorkspace-D_tEt6XT.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -4.89 kB 🟢 -4.39 kB
assets/WidgetInputNumber-DcFyQDxB.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.29 kB
assets/WidgetInputNumber-DObAeArN.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.29 kB
assets/commands-DgivoXmk.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.1 kB 🟢 -3.19 kB
assets/commands-rbVXezaj.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.1 kB 🔴 +3.2 kB
assets/Load3D-C4egD6Oz.js (new) 18.5 kB 🔴 +18.5 kB 🔴 +4.39 kB 🔴 +3.83 kB
assets/Load3D-Cb7WxXhb.js (removed) 18.5 kB 🟢 -18.5 kB 🟢 -4.4 kB 🟢 -3.83 kB
assets/commands-DB--Sncy.js (removed) 17.8 kB 🟢 -17.8 kB 🟢 -3.78 kB 🟢 -2.93 kB
assets/commands-Dj-pt5_q.js (new) 17.8 kB 🔴 +17.8 kB 🔴 +3.79 kB 🔴 +2.93 kB
assets/commands-CoRsgpad.js (new) 17.8 kB 🔴 +17.8 kB 🔴 +3.85 kB 🔴 +3.03 kB
assets/commands-DVQOtt6M.js (removed) 17.8 kB 🟢 -17.8 kB 🟢 -3.85 kB 🟢 -3.04 kB
assets/WidgetRecordAudio-CTQxqP74.js (new) 17.5 kB 🔴 +17.5 kB 🔴 +5.03 kB 🔴 +4.5 kB
assets/WidgetRecordAudio-DgL4p7Rw.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -5 kB 🟢 -4.47 kB
assets/commands-BiTkSYOh.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +3.88 kB 🔴 +3.05 kB
assets/commands-RxCpVdY3.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -3.88 kB 🟢 -3.06 kB
assets/WidgetRange-ClLX8-4n.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.63 kB 🔴 +4.14 kB
assets/WidgetRange-DarF5iGG.js (removed) 17 kB 🟢 -17 kB 🟢 -4.59 kB 🟢 -4.11 kB
assets/commands-CdIujRHE.js (new) 16.9 kB 🔴 +16.9 kB 🔴 +3.61 kB 🔴 +3 kB
assets/commands-XorwoZY0.js (removed) 16.9 kB 🟢 -16.9 kB 🟢 -3.62 kB 🟢 -3.01 kB
assets/commands-BC8cwXIE.js (removed) 16.3 kB 🟢 -16.3 kB 🟢 -3.6 kB 🟢 -2.96 kB
assets/commands-XHPu8Viz.js (new) 16.3 kB 🔴 +16.3 kB 🔴 +3.6 kB 🔴 +2.97 kB
assets/commands-BCA_UBk0.js (new) 16.3 kB 🔴 +16.3 kB 🔴 +3.5 kB 🔴 +2.86 kB
assets/commands-DXiuj70J.js (removed) 16.3 kB 🟢 -16.3 kB 🟢 -3.51 kB 🟢 -2.86 kB
assets/commands-B7I5lLZ6.js (removed) 16.3 kB 🟢 -16.3 kB 🟢 -3.47 kB 🟢 -2.88 kB
assets/commands-Cae4aDio.js (new) 16.3 kB 🔴 +16.3 kB 🔴 +3.47 kB 🔴 +2.88 kB
assets/WidgetColorPicker-DgCJJ2PV.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +3.99 kB 🔴 +3.55 kB
assets/WidgetColorPicker-Ubb9ONrY.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -3.99 kB 🟢 -3.56 kB
assets/commands-C7b6VTNE.js (new) 16.1 kB 🔴 +16.1 kB 🔴 +3.74 kB 🔴 +2.92 kB
assets/commands-DwHEe1jH.js (removed) 16.1 kB 🟢 -16.1 kB 🟢 -3.74 kB 🟢 -2.92 kB
assets/load3d-CSImHVtf.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.59 kB 🔴 +3.98 kB
assets/load3d-i7D6cHy4.js (removed) 15.7 kB 🟢 -15.7 kB 🟢 -4.56 kB 🟢 -3.94 kB
assets/commands-BG3uNH64.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +3.67 kB 🔴 +2.77 kB
assets/commands-Ci1mhQG0.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -3.67 kB 🟢 -2.77 kB
assets/commands-3QpCY_Fa.js (removed) 15.3 kB 🟢 -15.3 kB 🟢 -3.63 kB 🟢 -2.71 kB
assets/commands-BAu7oFoF.js (new) 15.3 kB 🔴 +15.3 kB 🔴 +3.63 kB 🔴 +2.69 kB
assets/WaveAudioPlayer-Bp2YhJr7.js (new) 13.4 kB 🔴 +13.4 kB 🔴 +3.69 kB 🔴 +3.23 kB
assets/WaveAudioPlayer-DmDFIZei.js (removed) 13.4 kB 🟢 -13.4 kB 🟢 -3.69 kB 🟢 -3.23 kB
assets/WidgetCurve-f0BtcSb3.js (new) 12.2 kB 🔴 +12.2 kB 🔴 +3.95 kB 🔴 +3.57 kB
assets/WidgetCurve-Jfz9x72M.js (removed) 12.1 kB 🟢 -12.1 kB 🟢 -3.91 kB 🟢 -3.55 kB
assets/TeamWorkspacesDialogContent-DBdHTKMp.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.44 kB 🔴 +3.07 kB
assets/TeamWorkspacesDialogContent-QpN4YVDK.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.4 kB 🟢 -3.03 kB
assets/AudioPreviewPlayer-B7iEYCIL.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +3.13 kB 🔴 +2.81 kB
assets/AudioPreviewPlayer-u4BsZDTd.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -3.13 kB 🟢 -2.81 kB
assets/nodeTemplates-DrY3Dyu8.js (new) 9.88 kB 🔴 +9.88 kB 🔴 +3.5 kB 🔴 +3.08 kB
assets/nodeTemplates-Ch-IQkY-.js (removed) 9.81 kB 🟢 -9.81 kB 🟢 -3.46 kB 🟢 -3.06 kB
assets/SelectValue-B4d590OJ.js (new) 9.8 kB 🔴 +9.8 kB 🔴 +2.45 kB 🔴 +2.16 kB
assets/SelectValue-ofvssXiy.js (removed) 9.8 kB 🟢 -9.8 kB 🟢 -2.45 kB 🟢 -2.16 kB
assets/NightlySurveyController-YOwlKff0.js (new) 9.06 kB 🔴 +9.06 kB 🔴 +3.17 kB 🔴 +2.8 kB
assets/NightlySurveyController-BXN0HESK.js (removed) 8.99 kB 🟢 -8.99 kB 🟢 -3.14 kB 🟢 -2.78 kB
assets/InviteMemberDialogContent-B0K2kf-9.js (new) 7.98 kB 🔴 +7.98 kB 🔴 +2.54 kB 🔴 +2.23 kB
assets/InviteMemberDialogContent-CUL4H-eP.js (removed) 7.91 kB 🟢 -7.91 kB 🟢 -2.51 kB 🟢 -2.21 kB
assets/WidgetImageCompare-BZvXvaCn.js (new) 7.9 kB 🔴 +7.9 kB 🔴 +2.3 kB 🔴 +2.01 kB
assets/WidgetImageCompare-DmWxVag1.js (removed) 7.9 kB 🟢 -7.9 kB 🟢 -2.3 kB 🟢 -2.01 kB
assets/Load3DConfiguration-BHhFYMrq.js (new) 7.82 kB 🔴 +7.82 kB 🔴 +2.31 kB 🔴 +2.02 kB
assets/Load3DConfiguration-XV80_nm-.js (removed) 7.82 kB 🟢 -7.82 kB 🟢 -2.31 kB 🟢 -2.02 kB
assets/onboardingCloudRoutes-CGz5uPJX.js (new) 6.69 kB 🔴 +6.69 kB 🔴 +2.08 kB 🔴 +1.8 kB
assets/onboardingCloudRoutes-wIt8aTSp.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -2.05 kB 🟢 -1.77 kB
assets/CreateWorkspaceDialogContent-Clv6JPjj.js (new) 6.19 kB 🔴 +6.19 kB 🔴 +2.25 kB 🔴 +1.96 kB
assets/CreateWorkspaceDialogContent-DrP6KDjZ.js (removed) 6.12 kB 🟢 -6.12 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/WidgetWithControl-Dyj1hhE6.js (new) 6.08 kB 🔴 +6.08 kB 🔴 +2.44 kB 🔴 +2.16 kB
assets/FreeTierDialogContent-BQuwCKFu.js (new) 6.05 kB 🔴 +6.05 kB 🔴 +2.15 kB 🔴 +1.91 kB
assets/WidgetWithControl-DaJAQ7lN.js (removed) 6.02 kB 🟢 -6.02 kB 🟢 -2.4 kB 🟢 -2.14 kB
assets/EditWorkspaceDialogContent-mBMg3HhU.js (new) 5.99 kB 🔴 +5.99 kB 🔴 +2.21 kB 🔴 +1.94 kB
assets/FreeTierDialogContent-YJsV61uB.js (removed) 5.99 kB 🟢 -5.99 kB 🟢 -2.12 kB 🟢 -1.86 kB
assets/EditWorkspaceDialogContent-BvEcIUfD.js (removed) 5.92 kB 🟢 -5.92 kB 🟢 -2.18 kB 🟢 -1.92 kB
assets/WidgetTextarea-BsLbKE6p.js (new) 5.8 kB 🔴 +5.8 kB 🔴 +2.29 kB 🔴 +2.02 kB
assets/Preview3d-DR3lgREg.js (new) 5.77 kB 🔴 +5.77 kB 🔴 +1.94 kB 🔴 +1.69 kB
assets/WidgetTextarea-o6nvAgBe.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -2.25 kB 🟢 -1.99 kB
assets/Preview3d-0zt3x7ar.js (removed) 5.7 kB 🟢 -5.7 kB 🟢 -1.9 kB 🟢 -1.67 kB
assets/ValueControlPopover-dB1kERnJ.js (new) 5.57 kB 🔴 +5.57 kB 🔴 +2.03 kB 🔴 +1.81 kB
assets/CancelSubscriptionDialogContent-CfDa3bfh.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +2.07 kB 🔴 +1.83 kB
assets/ValueControlPopover-CjLZtDdY.js (removed) 5.5 kB 🟢 -5.5 kB 🟢 -2 kB 🟢 -1.79 kB
assets/CancelSubscriptionDialogContent-CXN66AYf.js (removed) 5.46 kB 🟢 -5.46 kB 🟢 -2.04 kB 🟢 -1.79 kB
assets/CloudNotificationContent-D9s-VnmA.js (removed) 5.04 kB 🟢 -5.04 kB 🟢 -1.8 kB 🟢 -1.56 kB
assets/CloudNotificationContent-DWww4qvu.js (new) 5.04 kB 🔴 +5.04 kB 🔴 +1.8 kB 🔴 +1.56 kB
assets/DeleteWorkspaceDialogContent-BBjUln2y.js (new) 4.89 kB 🔴 +4.89 kB 🔴 +1.89 kB 🔴 +1.65 kB
assets/DeleteWorkspaceDialogContent-D-2NwFTp.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.86 kB 🟢 -1.62 kB
assets/AnimationControls-C7S2eO77.js (removed) 4.78 kB 🟢 -4.78 kB 🟢 -1.67 kB 🟢 -1.46 kB
assets/AnimationControls-Dwb2ApPb.js (new) 4.78 kB 🔴 +4.78 kB 🔴 +1.66 kB 🔴 +1.46 kB
assets/LeaveWorkspaceDialogContent-CrnkQS5B.js (new) 4.72 kB 🔴 +4.72 kB 🔴 +1.84 kB 🔴 +1.6 kB
assets/RemoveMemberDialogContent-AboJxltw.js (new) 4.7 kB 🔴 +4.7 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/LeaveWorkspaceDialogContent-BvB1lmbZ.js (removed) 4.65 kB 🟢 -4.65 kB 🟢 -1.8 kB 🟢 -1.58 kB
assets/RemoveMemberDialogContent-CIF_Ds3y.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.75 kB 🟢 -1.54 kB
assets/RevokeInviteDialogContent-W3XknGKa.js (new) 4.61 kB 🔴 +4.61 kB 🔴 +1.8 kB 🔴 +1.59 kB
assets/RevokeInviteDialogContent-C5v8POsd.js (removed) 4.54 kB 🟢 -4.54 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/missingModelDownload-DCQCnSjB.js (removed) 4.52 kB 🟢 -4.52 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/missingModelDownload-tQ3uBgJG.js (new) 4.52 kB 🔴 +4.52 kB 🔴 +1.76 kB 🔴 +1.55 kB
assets/InviteMemberUpsellDialogContent-6GqDsfSP.js (new) 4.51 kB 🔴 +4.51 kB 🔴 +1.67 kB 🔴 +1.47 kB
assets/tierBenefits-BDsTEuEo.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.57 kB 🔴 +1.36 kB
assets/tierBenefits-rBvt9ZXo.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.57 kB 🟢 -1.36 kB
assets/InviteMemberUpsellDialogContent-BgFlh--I.js (removed) 4.44 kB 🟢 -4.44 kB 🟢 -1.63 kB 🟢 -1.43 kB
assets/cloudSessionCookie-zXyob7RF.js (new) 4.35 kB 🔴 +4.35 kB 🔴 +1.59 kB 🔴 +1.39 kB
assets/cloudSessionCookie-DJPCAl5N.js (removed) 4.28 kB 🟢 -4.28 kB 🟢 -1.56 kB 🟢 -1.36 kB
assets/ApiNodesSignInContent-_NZ1RfgW.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.4 kB 🟢 -1.23 kB
assets/ApiNodesSignInContent-K5G-GPbW.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.4 kB 🔴 +1.23 kB
assets/Media3DTop-DGjU_Bkz.js (new) 4.08 kB 🔴 +4.08 kB 🔴 +1.73 kB 🔴 +1.52 kB
assets/saveMesh-BFRhkF4B.js (new) 4.05 kB 🔴 +4.05 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/Media3DTop-DknqiTo0.js (removed) 4.01 kB 🟢 -4.01 kB 🟢 -1.69 kB 🟢 -1.5 kB
assets/saveMesh-DTpngqBt.js (removed) 3.98 kB 🟢 -3.98 kB 🟢 -1.73 kB 🟢 -1.53 kB
assets/WidgetGalleria-CIvoBgyV.js (removed) 3.8 kB 🟢 -3.8 kB 🟢 -1.48 kB 🟢 -1.32 kB
assets/WidgetGalleria-d-qqrQQb.js (new) 3.8 kB 🔴 +3.8 kB 🔴 +1.48 kB 🔴 +1.32 kB
assets/WidgetBoundingBox-BJUtx9EZ.js (new) 3.78 kB 🔴 +3.78 kB 🔴 +1.05 kB 🔴 +907 B
assets/WidgetBoundingBox-DzJYku7_.js (removed) 3.78 kB 🟢 -3.78 kB 🟢 -1.05 kB 🟢 -912 B
assets/Popover-_cqKWxhc.js (removed) 3.77 kB 🟢 -3.77 kB 🟢 -1.49 kB 🟢 -1.32 kB
assets/Popover-C8TcwJpk.js (new) 3.77 kB 🔴 +3.77 kB 🔴 +1.49 kB 🔴 +1.32 kB
assets/WidgetToggleSwitch-2nuMoGEz.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.43 kB 🟢 -1.26 kB
assets/WidgetToggleSwitch-BVcvWrcL.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.43 kB 🔴 +1.26 kB
assets/Slider-Dh0AV453.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.39 kB 🟢 -1.21 kB
assets/Slider-DWpYoc1V.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.39 kB 🔴 +1.21 kB
assets/WidgetMarkdown-BTqNZwkf.js (removed) 3.13 kB 🟢 -3.13 kB 🟢 -1.3 kB 🟢 -1.14 kB
assets/WidgetMarkdown-C542elZx.js (new) 3.13 kB 🔴 +3.13 kB 🔴 +1.3 kB 🔴 +1.15 kB
assets/WidgetInputText-364io1mn.js (new) 3.09 kB 🔴 +3.09 kB 🔴 +1.31 kB 🔴 +1.17 kB
assets/WidgetInputText-CXFj6V_v.js (removed) 3.09 kB 🟢 -3.09 kB 🟢 -1.31 kB 🟢 -1.18 kB
assets/GlobalToast--3IQBBI3.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/GlobalToast--VPttqnW.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/MediaVideoTop-CQCDVwTW.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.21 kB 🔴 +1.07 kB
assets/MediaVideoTop-DaX8a9I6.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.21 kB 🟢 -1.06 kB
assets/ErrorPanelSurveyCta-Byy08bNL.js (new) 2.74 kB 🔴 +2.74 kB 🔴 +1.21 kB 🔴 +1.07 kB
assets/ErrorPanelSurveyCta-CUt2LWzU.js (removed) 2.74 kB 🟢 -2.74 kB 🟢 -1.21 kB 🟢 -1.07 kB
assets/WidgetLayoutField-Cc5VUyzj.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.06 kB 🟢 -931 B
assets/WidgetLayoutField-DV42oAso.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.06 kB 🔴 +933 B
assets/WidgetChart-B1jXEtHA.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1.03 kB 🔴 +884 B
assets/WidgetChart-K0BQs5Ds.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1.03 kB 🟢 -889 B
assets/CloudRunButtonWrapper-BhFeqj36.js (new) 2.27 kB 🔴 +2.27 kB 🔴 +1.04 kB 🔴 +919 B
assets/CloudRunButtonWrapper-BX05l2a9.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1 kB 🟢 -885 B
assets/SubscribeToRun-BeGkP_is.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +981 B 🔴 +875 B
assets/SubscribeToRun-BESc4p4Y.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -982 B 🟢 -887 B
assets/MediaAudioTop-DAGKynVB.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +1 kB 🔴 +862 B
assets/MediaAudioTop-DTAw-g4u.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -1 kB 🟢 -861 B
assets/SubscriptionBenefits-CLB9drTH.js (removed) 2.07 kB 🟢 -2.07 kB 🟢 -709 B 🟢 -602 B
assets/SubscriptionBenefits-CoL1f8Qo.js (new) 2.07 kB 🔴 +2.07 kB 🔴 +706 B 🔴 +599 B
assets/MediaImageTop-8G3E0ER0.js (removed) 2.05 kB 🟢 -2.05 kB 🟢 -994 B 🟢 -864 B
assets/MediaImageTop-DGnhZZwp.js (new) 2.05 kB 🔴 +2.05 kB 🔴 +994 B 🔴 +860 B
assets/cloudBadges-B7hLPGUq.js (new) 2 kB 🔴 +2 kB 🔴 +987 B 🔴 +863 B
assets/cloudBadges-CT7L22WK.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -958 B 🟢 -829 B
assets/BaseViewTemplate-DiLgpem_.js (removed) 1.92 kB 🟢 -1.92 kB 🟢 -979 B 🟢 -874 B
assets/cloudSubscription-RMy0oIWl.js (new) 1.92 kB 🔴 +1.92 kB 🔴 +915 B 🔴 +796 B
assets/BaseViewTemplate-CjTv_xQ5.js (new) 1.91 kB 🔴 +1.91 kB 🔴 +979 B 🔴 +871 B
assets/cloudSubscription-B3o7J6g1.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -881 B 🟢 -760 B
assets/graphHasMissingNodes-BOicfEhP.js (new) 1.84 kB 🔴 +1.84 kB 🔴 +858 B 🔴 +751 B
assets/graphHasMissingNodes-T_ddKSR8.js (removed) 1.84 kB 🟢 -1.84 kB 🟢 -863 B 🟢 -776 B
assets/auto-BrP9CfM9.js (new) 1.7 kB 🔴 +1.7 kB 🔴 +619 B 🔴 +545 B
assets/auto-DyRH5Ajf.js (removed) 1.7 kB 🟢 -1.7 kB 🟢 -621 B 🟢 -569 B
assets/Loader-BvnoJzQH.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +808 B 🔴 +717 B
assets/Loader-D91dTyYv.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -810 B 🟢 -718 B
assets/Load3D-BnXalIXm.js (new) 1.62 kB 🔴 +1.62 kB 🔴 +729 B 🔴 +644 B
assets/signInSchema-BLnhc-De.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -584 B 🟢 -509 B
assets/signInSchema-DhWQltLK.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +584 B 🔴 +516 B
assets/Load3D-DL5ggBFU.js (removed) 1.55 kB 🟢 -1.55 kB 🟢 -691 B 🟢 -621 B
assets/previousFullPath-bG2p8fQ0.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -693 B 🟢 -597 B
assets/nightlyBadges-BKosqHt9.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +762 B 🔴 +676 B
assets/previousFullPath-x6Ck68_v.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +689 B 🔴 +594 B
assets/widgetPropFilter-CLUGlGy2.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +704 B 🔴 +576 B
assets/widgetPropFilter-xrfvdJbq.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -704 B 🟢 -603 B
assets/VideoPlayOverlay-BNQ23HY_.js (removed) 1.51 kB 🟢 -1.51 kB 🟢 -762 B 🟢 -672 B
assets/VideoPlayOverlay-BRl3ZKCV.js (new) 1.51 kB 🔴 +1.51 kB 🔴 +760 B 🔴 +673 B
assets/Load3dViewerContent-DnDlOyhY.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +680 B 🔴 +602 B
assets/nightlyBadges-Ba9m1O6w.js (removed) 1.46 kB 🟢 -1.46 kB 🟢 -728 B 🟢 -663 B
assets/Load3dViewerContent-u4sXn1Ga.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -645 B 🟢 -589 B
assets/Textarea-CMjExNOJ.js (removed) 1.42 kB 🟢 -1.42 kB 🟢 -746 B 🟢 -651 B
assets/Textarea-DRXUfO3o.js (new) 1.42 kB 🔴 +1.42 kB 🔴 +744 B 🔴 +651 B
assets/SubscriptionPanelContentWorkspace-CfuKeFjE.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +635 B 🔴 +555 B
assets/SubscriptionPanelContentWorkspace-JY00tx0o.js (removed) 1.32 kB 🟢 -1.32 kB 🟢 -599 B 🟢 -522 B
assets/WidgetLegacy-CNQIb7gQ.js (new) 1.22 kB 🔴 +1.22 kB 🔴 +581 B 🔴 +513 B
assets/changeTracker-BRYUfyNw.js (new) 1.19 kB 🔴 +1.19 kB 🔴 +570 B 🔴 +498 B
assets/constants-Cd-uDuMj.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +422 B 🔴 +358 B
assets/constants-yLDjwbN7.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -426 B 🟢 -360 B
assets/WidgetLegacy-Bor4oFVy.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -548 B 🟢 -486 B
assets/changeTracker-DQF6Y3l8.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -536 B 🟢 -468 B
assets/MediaOtherTop-BPaT0Ndp.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +600 B 🔴 +502 B
assets/MediaOtherTop-CPS1sSsZ.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -601 B 🟢 -488 B
assets/MediaTextTop-Bdq2yLxY.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -597 B 🟢 -497 B
assets/MediaTextTop-uaUl5Tje.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +595 B 🔴 +498 B
assets/ComfyOrgHeader-BJKwjiQu.js (new) 960 B 🔴 +960 B 🔴 +528 B 🔴 +463 B
assets/ComfyOrgHeader-Bsn4i3iD.js (removed) 960 B 🟢 -960 B 🟢 -527 B 🟢 -461 B
assets/telemetry-BglHASuB.js (removed) 443 B 🟢 -443 B 🟢 -310 B 🟢 -246 B
assets/telemetry-BVyGwGCL.js (new) 443 B 🔴 +443 B 🔴 +311 B 🔴 +250 B
assets/widgetTypes-DOOT9kfg.js (new) 416 B 🔴 +416 B 🔴 +274 B 🔴 +228 B
assets/widgetTypes-kzdungfF.js (removed) 416 B 🟢 -416 B 🟢 -273 B 🟢 -235 B
assets/src-DH_Wgctu.js (new) 410 B 🔴 +410 B 🔴 +302 B 🔴 +245 B
assets/src-DzPkrX7F.js (removed) 410 B 🟢 -410 B 🟢 -301 B 🟢 -245 B
assets/WidgetBoundingBox-CWp9w1pb.js (new) 311 B 🔴 +311 B 🔴 +195 B 🔴 +195 B
assets/WidgetBoundingBox-DWMwEwO2.js (removed) 311 B 🟢 -311 B 🟢 -196 B 🟢 -192 B
assets/cloud-subscription-5xXMG26-.js (new) 279 B 🔴 +279 B 🔴 +185 B 🔴 +147 B
assets/cloud-subscription-lTeW5xh2.js (removed) 279 B 🟢 -279 B 🟢 -184 B 🟢 -151 B
assets/comfy-logo-single-BAH1G-cZ.js (new) 272 B 🔴 +272 B 🔴 +187 B 🔴 +148 B
assets/comfy-logo-single-DxUCBOk0.js (removed) 272 B 🟢 -272 B 🟢 -185 B 🟢 -148 B
assets/missingModelDownload-BCHngHO5.js (new) 267 B 🔴 +267 B 🔴 +185 B 🔴 +170 B
assets/missingModelDownload-CVCyt2g7.js (removed) 267 B 🟢 -267 B 🟢 -180 B 🟢 -169 B
assets/i18n-Bv7fW_i1.js (new) 137 B 🔴 +137 B 🔴 +122 B 🔴 +106 B
assets/i18n-CSZcC5UC.js (removed) 137 B 🟢 -137 B 🟢 -122 B 🟢 -109 B

Status: 131 added / 131 removed / 4 unchanged

⚡ Performance

⏳ Performance tests in progress…

Copilot AI 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.

Pull request overview

Adds a Cloudflare Pages deployment pipeline for a ComfyUI frontend preview site and introduces a /connect ConnectionPanel page that helps users configure/test connectivity to a ComfyUI backend, including displaying CI build metadata.

Changes:

  • Add GitHub Actions workflow to build and deploy Cloudflare Pages previews (with auto PR comment updates) and deploy main to the production Pages branch.
  • Add ConnectionPanelView at /connect with backend URL persistence, HTTP+WS connectivity tests, and build info footer.
  • Inject CI metadata into the Vite build (__CI_*__) and register the corresponding TS/ESLint globals and i18n strings.

Reviewed changes

Copilot reviewed 9 out of 10 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
.github/workflows/ci-deploy-preview.yaml New workflow to build and deploy preview/production to Cloudflare Pages and comment on PRs.
scripts/cicd/pr-preview-deploy-and-comment.sh New deployment + PR comment helper script for Cloudflare Pages previews.
src/views/ConnectionPanelView.vue New /connect view to configure/test backend connectivity and show build metadata.
src/views/ConnectionPanelView.test.ts Unit tests for the new ConnectionPanel view behaviors.
src/router.ts Adds the /connect route pointing to ConnectionPanelView.
src/locales/en/main.json Adds connectionPanel.* i18n strings used by the new view.
vite.config.mts Injects CI env vars as build-time globals for build metadata display.
global.d.ts Declares new __CI_*__ globals for TypeScript.
eslint.config.ts Registers new __CI_*__ globals for linting.
TODO.md Tracks the implementation plan and checklist for the preview deployment + connection panel.

Comment thread src/views/ConnectionPanelView.vue Outdated
Comment thread scripts/cicd/pr-preview-deploy-and-comment.sh Outdated
@codecov

codecov Bot commented Apr 10, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 72.82913% with 97 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/views/ConnectionPanelView.vue 85.13% 31 Missing and 2 partials ⚠️
src/extensions/core/prPreviewBadges.ts 0.00% 30 Missing ⚠️
src/components/topbar/TopbarBadge.vue 20.00% 14 Missing and 2 partials ⚠️
src/scripts/api.ts 65.38% 9 Missing ⚠️
src/router.ts 0.00% 6 Missing ⚠️
src/extensions/core/index.ts 0.00% 2 Missing ⚠️
src/config/comfyApi.ts 80.00% 1 Missing ⚠️
@@             Coverage Diff             @@
##             main   #11118       +/-   ##
===========================================
- Coverage   67.68%   54.62%   -13.06%     
===========================================
  Files        1477     1379       -98     
  Lines       83266    70661    -12605     
  Branches    22925    18781     -4144     
===========================================
- Hits        56355    38601    -17754     
- Misses      25970    31510     +5540     
+ Partials      941      550      -391     
Flag Coverage Δ
e2e ?
unit 54.62% <72.82%> (+5.99%) ⬆️

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

Files with missing lines Coverage Δ
src/components/connection/CopyCodeBlock.vue 100.00% <100.00%> (ø)
src/platform/connectionPanel/backendReachable.ts 100.00% <100.00%> (ø)
...latform/connectionPanel/resolveBackendCloudBase.ts 100.00% <100.00%> (ø)
src/schemas/apiSchema.ts 100.00% <ø> (ø)
src/scripts/defaultGraph.ts 100.00% <ø> (ø)
src/views/templates/BaseViewTemplate.vue 66.66% <100.00%> (+66.66%) ⬆️
src/config/comfyApi.ts 86.95% <80.00%> (+14.22%) ⬆️
src/extensions/core/index.ts 0.00% <0.00%> (-33.34%) ⬇️
src/router.ts 0.00% <0.00%> (-40.16%) ⬇️
src/scripts/api.ts 31.81% <65.38%> (-27.05%) ⬇️
... and 3 more

... and 1043 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.

@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: 9

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci-deploy-preview.yaml:
- Around line 15-17: The deploy-and-comment job can race with
comment-on-pr-start and overwrite its marker; add a dependency so
deploy-and-comment waits for comment-on-pr-start (e.g., add needs: [build,
comment-on-pr-start] to the deploy-and-comment job) and apply the same change to
the other deploy/comment block referenced (lines 77-80) so any job that updates
the shared marker includes the comment-on-pr-* job in its needs list.
- Around line 18-22: The job "comment-on-pr-start" currently sets job-level
permissions to only pull-requests: write which causes checkout to fail because
unspecified permissions default to none; update the permissions block for the
comment-on-pr-start job to include contents: read alongside pull-requests: write
so actions/checkout@v6 can access the repository (i.e., add contents: read to
the permissions mapping for that job).

In `@scripts/cicd/pr-preview-deploy-and-comment.sh`:
- Around line 129-139: The current branch-normalization logic that sets
cloudflare_branch from BRANCH_NAME can collapse distinct branches and cause
preview collisions; instead generate and use a PR-scoped alias (e.g.,
"pr-$PR_NUMBER") for preview deployments and pass that alias into deploy_preview
rather than cloudflare_branch. Update the code that defines cloudflare_branch to
create preview_alias="pr-$PR_NUMBER" (or similar), replace usages of
cloudflare_branch when calling deploy_preview and any related deploy metadata,
and ensure deploy_preview (the call site) receives this PR-scoped alias so
previews are unique per PR.
- Around line 48-56: The wrangler install block runs unconditionally and uses a
top-level return (invalid); move the installation logic so it only runs in the
deployment path (i.e., when STATUS="completed" before calling deploy_preview()),
replace the top-level return with exit 1 (or wrap the logic inside a function)
so failures terminate correctly, and ensure deploy_preview() is the only caller
that triggers npm install -g wrangler@^4.0.0 to avoid attempting installation
for non-deploy status values.

In `@src/router.ts`:
- Around line 86-89: The router base is being derived from
window.location.pathname causing a hard refresh on /connect to set base to
'/connect' and make the /connect route resolve as root; update getBasePath()
(used when creating the router in src/router.ts) so it only returns a deployment
subpath determined from build-time configuration or a known static prefix (e.g.,
process.env.BASE_URL or a hardcoded '/ComfyUI/') and never the full current
pathname—alternatively sanitize the pathname by stripping any recognized route
segments before returning the base; ensure createRouter (or wherever
getBasePath() is consumed) uses this corrected base so direct loads to
'/connect' resolve correctly.

In `@src/views/ConnectionPanelView.test.ts`:
- Around line 54-57: Tests are leaving a global stubbed via vi.stubGlobal (e.g.,
fetch stub at vi.stubGlobal in ConnectionPanelView.test), but the existing
beforeEach uses vi.restoreAllMocks() which does not remove stubbed globals; add
vi.unstubAllGlobals() (or call it in the same beforeEach/afterEach alongside
vi.restoreAllMocks()) to ensure any vi.stubGlobal() stubs (like the rejected
fetch at line ~104) are removed between tests so subsequent tests don't inherit
them.

In `@src/views/ConnectionPanelView.vue`:
- Around line 97-104: Replace the hardcoded CORS value "*" in the code block
with the current preview origin: add a computed property (e.g., previewOrigin =
window.location.origin and corsCommand or getCorsCommand) that returns `python
main.py --enable-cors-header="${previewOrigin}"`, then bind that computed value
into the template's code block instead of the literal string; ensure the
computed name you create (e.g., corsCommand) is referenced where the template
currently renders the static command so the shown command is origin-scoped and
not a global wildcard.
- Around line 40-88: Make the status block a screen-reader live region so async
test results are announced: add aria-live="polite" and aria-atomic="true" (and
optionally role="status") to the <section> that renders the
httpStatus/wsStatus/connectionError messages (the container controlled by
v-if="httpStatus !== null || wsStatus !== null"), so updates to connectionError,
httpStatus, or wsStatus are announced to assistive tech.
- Around line 240-252: Replace hardcoded English strings in the computed
properties buildLabel and buildTooltip with vue-i18n calls: import/use the i18n
translator (t) inside these computed functions, map the cases to localized keys
(e.g., connectionPanel.build.pr with { prNumber },
connectionPanel.build.versionShort with { version }, and for tooltip entries
connectionPanel.build.version, .commit, .branch, .runId, .jobId), and pass the
sliced commit or other values as params; keep the existing branching logic
(prNumber -> branch -> version) and the parts.join('\n') behavior but substitute
t(...) for each literal label/prefix so all user-facing strings are localized.
🪄 Autofix (Beta)

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

Plan: Pro

Run ID: b4921688-56d8-412c-8733-c83526d48268

📥 Commits

Reviewing files that changed from the base of the PR and between 6d4fc1b and 0d5ced4.

📒 Files selected for processing (10)
  • .github/workflows/ci-deploy-preview.yaml
  • TODO.md
  • eslint.config.ts
  • global.d.ts
  • scripts/cicd/pr-preview-deploy-and-comment.sh
  • src/locales/en/main.json
  • src/router.ts
  • src/views/ConnectionPanelView.test.ts
  • src/views/ConnectionPanelView.vue
  • vite.config.mts

Comment thread .github/workflows/ci-deploy-preview.yaml
Comment thread .github/workflows/ci-deploy-preview.yaml
Comment thread scripts/cicd/pr-preview-deploy-and-comment.sh Outdated
Comment thread scripts/cicd/pr-preview-deploy-and-comment.sh
Comment thread src/router.ts
Comment thread src/views/ConnectionPanelView.test.ts
Comment thread src/views/ConnectionPanelView.vue
Comment thread src/views/ConnectionPanelView.vue Outdated
Comment thread src/views/ConnectionPanelView.vue

@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: 2

♻️ Duplicate comments (4)
src/views/ConnectionPanelView.vue (3)

42-45: ⚠️ Potential issue | 🟡 Minor

Announce async connection results to assistive tech.

This status block appears after the user clicks Test, but it is not a live region, so screen-reader users won't hear when the HTTP/WS result arrives. Add role="status", aria-live="polite", and aria-atomic="true" on the section container.

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

In `@src/views/ConnectionPanelView.vue` around lines 42 - 45, The status container
that shows test results (the <section> rendered when httpStatus or wsStatus
changes) is not announced to assistive tech; update that section element in
ConnectionPanelView.vue (the block using v-if="httpStatus !== null || wsStatus
!== null") to include role="status", aria-live="polite", and aria-atomic="true"
so screen readers will politely announce the async HTTP/WS results when
httpStatus or wsStatus updates.

311-323: ⚠️ Potential issue | 🟡 Minor

Localize the build metadata labels.

PR #, v, Version:, Commit:, Branch:, Run ID:, and Job ID: are still hardcoded English strings inside buildLabel and buildTooltip. These should go through connectionPanel.* keys like the rest of this view. As per coding guidelines, "Use vue-i18n for ALL user-facing strings, configured in src/locales/en/main.json".

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

In `@src/views/ConnectionPanelView.vue` around lines 311 - 323, The buildLabel and
buildTooltip computed properties currently use hardcoded English strings; update
buildLabel and buildTooltip to use vue-i18n keys under connectionPanel (e.g.,
connectionPanel.prLabel, connectionPanel.versionPrefix,
connectionPanel.versionTooltip, connectionPanel.commitLabel,
connectionPanel.branchLabel, connectionPanel.runIdLabel,
connectionPanel.jobIdLabel) instead of literals; obtain the translation function
(e.g., via useI18n or this.$t) in this component and replace `PR #${prNumber}`,
`v${version}`, and the tooltip parts (`Version:`, `Commit:`, `Branch:`, `Run
ID:`, `Job ID:`) with t('connectionPanel.xxx') calls, formatting/interpolating
the variables (prNumber, version, commit.slice(0,8), branch, runId, jobId) into
the translated strings so all user-facing text uses vue-i18n keys.

139-143: ⚠️ Potential issue | 🟠 Major

Scope the CORS command to this preview origin.

Both snippets still tell users to run --enable-cors-header="*". That opens their local ComfyUI instance to every origin, even though this page already knows the exact origin it needs. Render window.location.origin here, or clearly mark * as disposable local-only debugging guidance.

Also applies to: 163-167

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

In `@src/views/ConnectionPanelView.vue` around lines 139 - 143, The displayed CORS
command currently uses a wildcard (*) which opens ComfyUI to all origins; update
the ConnectionPanelView.vue template to render the actual preview origin instead
of "*" by injecting window.location.origin into the command string (e.g.,
compute a template property like previewOrigin = window.location.origin and use
it in the <code> block) or, if you must keep "*", add an explicit local-only
warning next to the command; modify the code block that renders the launch
command (the <code> element in ConnectionPanelView.vue) to use that
previewOrigin value (and apply the same change to the other snippet later in the
file).
src/views/ConnectionPanelView.test.ts (1)

43-43: ⚠️ Potential issue | 🟡 Minor

Unstub globals between test cases.

vi.restoreAllMocks() does not remove globals installed via vi.stubGlobal(), so the rejected fetch from Line 115 can leak into later cases and fail them for the wrong reason.

Suggested fix
-import { beforeEach, describe, expect, it, vi } from 'vitest'
+import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
@@
-vi.stubGlobal('localStorage', mockLocalStorage)
-
 const i18n = createI18n({
@@
 describe('ConnectionPanelView', () => {
   beforeEach(() => {
     mockLocalStorage.clear()
     vi.restoreAllMocks()
+    vi.stubGlobal('localStorage', mockLocalStorage)
   })
+
+  afterEach(() => {
+    vi.unstubAllGlobals()
+  })
In Vitest, does vi.restoreAllMocks() revert globals installed with vi.stubGlobal(), or should tests call vi.unstubAllGlobals() between cases?

Also applies to: 60-63, 115-115

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

In `@src/views/ConnectionPanelView.test.ts` at line 43, Tests use
vi.stubGlobal('localStorage', mockLocalStorage) (and other globals) but only
call vi.restoreAllMocks(), which does not remove globals; add
vi.unstubAllGlobals() in the test teardown (e.g., an afterEach hook) so globals
stubbed with vi.stubGlobal are removed between cases to prevent the rejected
fetch stub (and other global stubs) from leaking into subsequent tests; keep
existing vi.restoreAllMocks()/vi.resetAllMocks() calls as well to clear
spies/mocks.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/scripts/api.ts`:
- Around line 374-378: The code is storing an absolute URL into
ComfyApi.api_base which breaks how createSocket constructs websocket URLs;
instead, when parsing the saved remote backend URL, split and store origin and
path separately: keep this.api_host (or add this.api_origin) set to url.origin
(scheme+host+port) and set this.api_base to only the trimmed path
(url.pathname.replace(/\/+$/, '')), and then update createSocket to build the WS
URL from the same origin + path (or switch scheme to ws/wss based on origin) so
host, path, and ws/wss stay aligned.
- Around line 374-378: The code currently lets a user-configured preview backend
(set via remoteBackend and applied to this.api_host / this.api_base) receive
Cloud credentials; update the logic so that when a preview backend is configured
you do NOT forward Cloud auth by default—either disable forwarding entirely or
only allow it when the preview origin is explicitly trusted. Concretely, add a
check around the auth-forwarding paths (createSocket() and fetchApi()) that
returns false if a preview backend is active (remoteBackend present /
this.api_base differs from the built-in origin) unless the origin appears in an
allowlist of trusted origins, and use that check before appending the Cloud
token or setting Cloud auth headers.

---

Duplicate comments:
In `@src/views/ConnectionPanelView.test.ts`:
- Line 43: Tests use vi.stubGlobal('localStorage', mockLocalStorage) (and other
globals) but only call vi.restoreAllMocks(), which does not remove globals; add
vi.unstubAllGlobals() in the test teardown (e.g., an afterEach hook) so globals
stubbed with vi.stubGlobal are removed between cases to prevent the rejected
fetch stub (and other global stubs) from leaking into subsequent tests; keep
existing vi.restoreAllMocks()/vi.resetAllMocks() calls as well to clear
spies/mocks.

In `@src/views/ConnectionPanelView.vue`:
- Around line 42-45: The status container that shows test results (the <section>
rendered when httpStatus or wsStatus changes) is not announced to assistive
tech; update that section element in ConnectionPanelView.vue (the block using
v-if="httpStatus !== null || wsStatus !== null") to include role="status",
aria-live="polite", and aria-atomic="true" so screen readers will politely
announce the async HTTP/WS results when httpStatus or wsStatus updates.
- Around line 311-323: The buildLabel and buildTooltip computed properties
currently use hardcoded English strings; update buildLabel and buildTooltip to
use vue-i18n keys under connectionPanel (e.g., connectionPanel.prLabel,
connectionPanel.versionPrefix, connectionPanel.versionTooltip,
connectionPanel.commitLabel, connectionPanel.branchLabel,
connectionPanel.runIdLabel, connectionPanel.jobIdLabel) instead of literals;
obtain the translation function (e.g., via useI18n or this.$t) in this component
and replace `PR #${prNumber}`, `v${version}`, and the tooltip parts (`Version:`,
`Commit:`, `Branch:`, `Run ID:`, `Job ID:`) with t('connectionPanel.xxx') calls,
formatting/interpolating the variables (prNumber, version, commit.slice(0,8),
branch, runId, jobId) into the translated strings so all user-facing text uses
vue-i18n keys.
- Around line 139-143: The displayed CORS command currently uses a wildcard (*)
which opens ComfyUI to all origins; update the ConnectionPanelView.vue template
to render the actual preview origin instead of "*" by injecting
window.location.origin into the command string (e.g., compute a template
property like previewOrigin = window.location.origin and use it in the <code>
block) or, if you must keep "*", add an explicit local-only warning next to the
command; modify the code block that renders the launch command (the <code>
element in ConnectionPanelView.vue) to use that previewOrigin value (and apply
the same change to the other snippet later in the file).
🪄 Autofix (Beta)

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

Plan: Pro

Run ID: b51c0f34-1670-4e93-b47f-b322f41f1e49

📥 Commits

Reviewing files that changed from the base of the PR and between 0d5ced4 and b4f8605.

📒 Files selected for processing (5)
  • src/locales/en/main.json
  • src/router.ts
  • src/scripts/api.ts
  • src/views/ConnectionPanelView.test.ts
  • src/views/ConnectionPanelView.vue
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/router.ts
  • src/locales/en/main.json

Comment thread src/scripts/api.ts Outdated

@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.

♻️ Duplicate comments (1)
src/views/ConnectionPanelView.test.ts (1)

44-45: ⚠️ Potential issue | 🟡 Minor

Unstubbed globals can leak across tests.

Line 44 and Line 111 use vi.stubGlobal(...), but Line 61–64 only calls vi.restoreAllMocks(), which won’t remove stubbed globals. Please unstub globals after each test and restub localStorage in beforeEach.

Suggested fix
-import { beforeEach, describe, expect, it, vi } from 'vitest'
+import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
@@
-vi.stubGlobal('localStorage', mockLocalStorage)
-
 const i18n = createI18n({
@@
 describe('ConnectionPanelView', () => {
   beforeEach(() => {
+    vi.stubGlobal('localStorage', mockLocalStorage)
     mockLocalStorage.clear()
     vi.restoreAllMocks()
   })
+
+  afterEach(() => {
+    vi.unstubAllGlobals()
+  })
As per coding guidelines, “Keep module mocks contained; do not use global mutable state within the test file; use `vi.hoisted()` if necessary for per-test mock manipulation.”

Also applies to: 61-64, 111-112

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

In `@src/views/ConnectionPanelView.test.ts` around lines 44 - 45, Tests currently
stub global localStorage with vi.stubGlobal('localStorage', mockLocalStorage)
but only call vi.restoreAllMocks(), which doesn't remove global stubs; update
the test setup to stub localStorage in beforeEach and call vi.unstubAllGlobals()
in afterEach (or call vi.unstubAllGlobals() alongside vi.restoreAllMocks()) so
globals are cleaned between tests; ensure references to vi.stubGlobal,
vi.unstubAllGlobals, vi.restoreAllMocks, beforeEach and afterEach are used to
restub and unstub localStorage per test to avoid leaking global state.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@src/views/ConnectionPanelView.test.ts`:
- Around line 44-45: Tests currently stub global localStorage with
vi.stubGlobal('localStorage', mockLocalStorage) but only call
vi.restoreAllMocks(), which doesn't remove global stubs; update the test setup
to stub localStorage in beforeEach and call vi.unstubAllGlobals() in afterEach
(or call vi.unstubAllGlobals() alongside vi.restoreAllMocks()) so globals are
cleaned between tests; ensure references to vi.stubGlobal, vi.unstubAllGlobals,
vi.restoreAllMocks, beforeEach and afterEach are used to restub and unstub
localStorage per test to avoid leaking global state.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 9f7b2fe0-662a-4ac9-8fae-e0d6150699a4

📥 Commits

Reviewing files that changed from the base of the PR and between 24b9f17 and 0415a10.

📒 Files selected for processing (3)
  • eslint.config.ts
  • src/views/ConnectionPanelView.test.ts
  • vite.config.mts
✅ Files skipped from review due to trivial changes (2)
  • vite.config.mts
  • eslint.config.ts

@dosubot dosubot Bot added size:XXL This PR changes 1000+ lines, ignoring generated files. size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. size:XXL This PR changes 1000+ lines, ignoring generated files. labels Apr 11, 2026
@snomiao snomiao added the claude-review Add to trigger a PR code review from Claude Code label Apr 12, 2026
Comment thread scripts/cicd/pr-preview-deploy-and-comment.sh Outdated
Comment thread src/views/ConnectionPanelView.vue Outdated
Comment thread src/scripts/api.ts
Comment thread src/scripts/api.ts
Comment thread src/router.ts
Comment thread src/router.ts
Comment thread TODO.md Outdated
Comment thread src/views/ConnectionPanelView.vue
Comment thread scripts/cicd/pr-preview-deploy-and-comment.sh Outdated
Comment thread scripts/cicd/pr-preview-deploy-and-comment.sh
snomiao and others added 14 commits April 27, 2026 09:07
comfy install bundles ComfyUI-Manager by default. Surface that in
the quick start, plus an explanatory aside on why Manager smooths
the UX (one-click missing-model/custom-node install). For the
manual python alt path, add the git clone step explicitly.
The @/utils/tailwindUtil shim was removed from main in #11453; CI
merge-commit builds fail for this branch. Switch the import to the
package that replaced it. Both paths resolve locally today, so the
change is a drop-in.
The deploy script uses `pnpm dlx wrangler` when wrangler isn't on
PATH, but the deploy-and-comment job runs on a bare ubuntu image
with no pnpm — all three retry attempts fail with `pnpm: command
not found`. Set up pnpm + Node via the same actions setup-frontend
uses.
…ll into one step

uv pip install puts comfy on PATH immediately, so both commands
chain with && in the same shell. Collapses 4 quick-start steps to 3
and keeps the shell flow linear for copy-paste.
Aligns frontend preview with storybook/playwright deploy scripts which
already key the cloudflare branch alias on the sanitized git branch name.
Falls back to pr-$PR_NUMBER when BRANCH_NAME is unset.
…ts argv

Parse `--comfy-api-base` out of `/system_stats` `system.argv` and surface the
backend's Comfy Cloud target in the connection panel. When it disagrees with
the frontend's build-time `getComfyApiBaseUrl()`, show an amber warning so
users can spot the mismatch before sign-in tokens get rejected.

Records the cleaner long-term path (add `comfy_api_base` to the backend's
`/features` endpoint) in docs/backend-cloud-api-base-feature-flag.md.
…target

When the backend reports a known Comfy Cloud API base (prod or staging via
`--comfy-api-base`), surface a link to the matching platform's API-keys page
(platform.comfy.org or stagingplatform.comfy.org). Custom/unknown bases hide
the link rather than guess a URL.
Adds a prominent amber aside under the panel title showing:
- This is an in-flight PR build, UI may change rapidly, not for production
- Build provenance: PR number, commit hash, author (all linked to GitHub)
- Trust warning: do not connect a backend you care about unless you trust
  the PR author, since a malicious frontend can read or modify any
  workflow / model / output on the connected backend.

Wires `CI_PR_AUTHOR` from `github.event.pull_request.user.login` through
the build env into a new `__CI_PR_AUTHOR__` define.
… local-network guidance

- Add CopyCodeBlock component with copy-to-clipboard and 2s "copied" checkmark feedback
- Replace all static <code> blocks in ConnectionPanelView with CopyCodeBlock
- Pre-compute launch command strings in script to avoid HTML entity escaping in template
- Expand localAccess section with --listen command for multi-device LAN testing
- Add corsOriginNote explaining why the exact origin matters (not *)
- Add i18n keys: corsOriginNote, localAccessListenDescription, localAccessListenNote

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ctly

When the backend exposes `system.comfy_api_base` (added in companion
backend PR), use it directly instead of parsing it out of `argv`.
Falls back to argv parsing for older backends that don't yet include
the field.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add prPreviewBadges extension (active only when CI_PR_NUMBER is set):
  - Topbar warning badge showing "PR #XXXX", tooltip with author/commit/backend URL
  - About panel badges: clickable PR#, author (@handle), commit hash links
- Declare __CI_PR_NUMBER__, __CI_PR_AUTHOR__, __CI_BRANCH__, __CI_RUN_ID__,
  __CI_JOB_ID__, __COMFYUI_FRONTEND_COMMIT__ as global TS constants in vite-env.d.ts
- Extract resolveBackendCloudBase() to shared util at
  src/platform/connectionPanel/resolveBackendCloudBase.ts
- Add comfy_api_base as optional field in zSystemStats schema (companion to
  backend PR Comfy-Org/ComfyUI#13571)
- Add prPreview i18n keys

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Copilot AI 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.

Pull request overview

Copilot reviewed 21 out of 24 changed files in this pull request and generated 5 comments.

Comment on lines +1 to +6
# 案 B: バックエンドの `/features` に `comfy_api_base` を追加する

## 背景

ComfyUI バックエンドは `--comfy-api-base` CLI フラグで Comfy Cloud の API ベース URL(prod / staging / カスタム)を選択する。
フロントエンドは `__USE_PROD_CONFIG__` ビルド時定数で同じ値を選ぶ。

Copilot AI Apr 27, 2026

Copy link

Choose a reason for hiding this comment

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

This doc is written entirely in Japanese, while the rest of the repo’s docs appear to be in English (e.g. docs/FEATURE_FLAGS.md). To keep documentation accessible/consistent, please translate this file to English (or move it to a locale-specific docs area if one exists).

Copilot uses AI. Check for mistakes.
Comment on lines +128 to +131
# Falls back to pr-$PR_NUMBER if BRANCH_NAME is unset
if [ -n "$BRANCH_NAME" ]; then
cloudflare_branch=$(echo "$BRANCH_NAME" | tr '[:upper:]' '[:lower:]' | \
sed 's/[^a-z0-9-]/-/g' | sed 's/--*/-/g' | sed 's/^-\|-$//g')

Copilot AI Apr 27, 2026

Copy link

Choose a reason for hiding this comment

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

cloudflare_branch can become an empty string after sanitization (e.g. branch name contains only characters removed/replaced by the sed pipeline). That would produce an invalid Pages branch/URL like https://.comfy-ui.pages.dev and likely fail deployment. Add a post-sanitization fallback (e.g. if empty, set to pr-$PR_NUMBER or a fixed placeholder).

Suggested change
# Falls back to pr-$PR_NUMBER if BRANCH_NAME is unset
if [ -n "$BRANCH_NAME" ]; then
cloudflare_branch=$(echo "$BRANCH_NAME" | tr '[:upper:]' '[:lower:]' | \
sed 's/[^a-z0-9-]/-/g' | sed 's/--*/-/g' | sed 's/^-\|-$//g')
# Falls back to pr-$PR_NUMBER if BRANCH_NAME is unset or sanitization produces an empty value
if [ -n "$BRANCH_NAME" ]; then
cloudflare_branch=$(echo "$BRANCH_NAME" | tr '[:upper:]' '[:lower:]' | \
sed 's/[^a-z0-9-]/-/g' | sed 's/--*/-/g' | sed 's/^-\|-$//g')
if [ -z "$cloudflare_branch" ]; then
cloudflare_branch="pr-$PR_NUMBER"
fi

Copilot uses AI. Check for mistakes.
resolve(true)
})
ws.addEventListener('error', () => {
clearTimeout(timeout)

Copilot AI Apr 27, 2026

Copy link

Choose a reason for hiding this comment

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

testWs() resolves false on the error event but doesn’t close the WebSocket. Closing it in the error handler avoids leaving a failed socket around (and matches the timeout/open paths that explicitly close).

Suggested change
clearTimeout(timeout)
clearTimeout(timeout)
ws.close()

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +14
<button
:title="copied ? t('clipboard.successMessage') : t('g.copyToClipboard')"
:aria-label="
copied ? t('clipboard.successMessage') : t('g.copyToClipboard')
"
class="absolute top-2 right-2 rounded-sm p-1 text-neutral-500 transition-colors hover:text-neutral-100"
@click="copy(text)"
>

Copilot AI Apr 27, 2026

Copy link

Choose a reason for hiding this comment

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

This <button> is missing an explicit type="button". If this component is ever rendered inside a <form>, the default type="submit" can cause unintended form submissions. Set type="button" to make the behavior explicit (consistent with other components like src/components/chip/Tag.vue).

Copilot uses AI. Check for mistakes.
Comment on lines +116 to +118
{{ t('connectionPanel.http') }}
{{ httpStatus === true ? '✓' : httpStatus === false ? '✗' : '—' }}
</span>

Copilot AI Apr 27, 2026

Copy link

Choose a reason for hiding this comment

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

The connection status line uses hardcoded glyphs ('✓', '✗', '—'). If these are intended to be user-facing, consider replacing them with an icon (with appropriate aria-label) or moving them into i18n so they’re consistent with the rest of the localized UI.

Copilot uses AI. Check for mistakes.
…links

Extends TopbarBadge with a popoverLinks field that renders as <a> tags
in the popover. The PR preview badge now shows clickable links to the
GitHub PR page, author profile, commit, and a "Configure backend →"
link that re-opens /connect to change the backend URL at any time.

Also fixes prPreviewBadges backendUrl to read from localStorage directly
(shows '—' when no remote backend configured, instead of the CF Pages
domain itself).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@snomiao snomiao requested a review from pythongosssss as a code owner April 28, 2026 18:59
snomiao and others added 8 commits April 29, 2026 04:03
Badge now shows "PR #11118 · abc12345" so reviewers can see the exact
commit at a glance without opening the popover.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… set

Full mode only had v-tooltip (plain text on hover). When popoverLinks is
present, the badge now shows a clickable Popover with links, matching the
behavior of icon-only and compact modes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The tooltip string (with HTML-escaped URLs and dot-separated fields) was
showing inside the popover alongside the cleaner popoverLinks section.
Remove it — the links already convey all the same info without the HTML
entity artifacts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Preview builds were using stagingapi.comfy.org (USE_PROD_CONFIG=false
default), causing a constant cloud environment mismatch warning for
every user who followed the quick-start guide — their local ComfyUI
backend defaults to api.comfy.org (production).

Setting USE_PROD_CONFIG=true aligns the preview with the default backend
behavior so the mismatch warning only fires when the user deliberately
passes --comfy-api-base=staging.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Users can now enter their Comfy API key on /connect before clicking
"Connect & Open ComfyUI". The key is saved to localStorage (comfy_api_key)
so it's picked up automatically after connecting — no need to re-enter it
in Settings → API Key.

Existing key is pre-filled from localStorage if already set.
Empty field on connect leaves any existing stored key unchanged.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add Test button for Comfy API Key input (validates against /customers endpoint)
- Show ✓/✗ status after test
- Update hint text: "Only needed for cloud-API nodes"
- Hide API key section when backend reports --disable-api-nodes in argv
- Show notice when API nodes are disabled

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Contextually show the API key field only after backend is tested and
cloud API is detected, co-located with the cloud API info and the
"Generate an API key" link.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ML escaping

escapeParameter: true in i18n.ts caused slashes in URLs to render as
&#x2F; in the popover tooltip. Concatenate the label and URL directly
instead of passing the URL through t() interpolation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants