Skip to content

fix: use authenticated API for remote config polling#8266

Merged
DrJKL merged 1 commit intomainfrom
fix/remote-config-refresh-auth
Jan 23, 2026
Merged

fix: use authenticated API for remote config polling#8266
DrJKL merged 1 commit intomainfrom
fix/remote-config-refresh-auth

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Jan 23, 2026

Summary

  • Fixes remote config polling to use authenticated API
  • Consolidates loadRemoteConfig into refreshRemoteConfig with auth control
  • Adds unit tests for both auth modes

Problem

The cloud extension's polling interval was using unauthenticated fetch, causing it to receive only default feature flags instead of user-specific configurations.

Root cause:

  1. Bootstrap called loadRemoteConfig() (raw fetch, no auth) - correct, auth not initialized yet
  2. Extension watch called refreshRemoteConfig() (api.fetchApi, with auth) - correct
  3. Extension interval called loadRemoteConfig() (raw fetch, no auth) - bug

Solution

  • Consolidate into single refreshRemoteConfig() with optional useAuth parameter (defaults to true)
  • Bootstrap: refreshRemoteConfig({ useAuth: false })
  • Polling: refreshRemoteConfig() (authenticated by default)

Test Plan

  • Unit tests verify both auth modes
  • pnpm typecheck, pnpm lint, pnpm test:unit all pass

┆Issue is synchronized with this Notion page by Unito

Fixes an issue where the cloud extension's polling interval was using
unauthenticated fetch, causing it to receive only default feature flags
instead of user-specific configurations.

Changes:
- Consolidate loadRemoteConfig into refreshRemoteConfig with options
- Add useAuth option (defaults to true) to control auth usage
- Bootstrap uses useAuth: false (pre-auth initialization)
- Polling uses default authenticated API calls
- Add unit tests for both auth modes
@christian-byrne christian-byrne requested a review from a team as a code owner January 23, 2026 06:10
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jan 23, 2026
@github-actions
Copy link

github-actions bot commented Jan 23, 2026

🎭 Playwright Tests: ⚠️ Passed with flaky tests

Results: 505 passed, 0 failed, 1 flaky, 8 skipped (Total: 514)

❌ Failed Tests

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

@github-actions
Copy link

github-actions bot commented Jan 23, 2026

🎨 Storybook Build Status

Build completed successfully!

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

🔗 Links


🎉 Your Storybook is ready for review!

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 23, 2026

📝 Walkthrough

Walkthrough

This PR refactors the remote config loading mechanism by replacing loadRemoteConfig with a new refreshRemoteConfig function that accepts an optional useAuth parameter to control authentication behavior. Cloud polling and initialization flows are updated accordingly.

Changes

Cohort / File(s) Summary
Remote config refresh implementation
src/platform/remoteConfig/refreshRemoteConfig.ts
New function added with signature refreshRemoteConfig(options: RefreshRemoteConfigOptions = {}): Promise<void>. Supports authenticated requests via api.fetchApi (default) or unauthenticated requests via global.fetch based on useAuth option. Handles 401/403 responses and errors by clearing config state.
Remote config refactoring
src/platform/remoteConfig/remoteConfig.ts
Removed loadRemoteConfig() function; retained remoteConfig ref and configValueOrDefault exports. Documentation updated to remove references to initial load/polling behavior.
Initialization and polling updates
src/extensions/core/cloudRemoteConfig.ts, src/main.ts
Updated poller in cloudRemoteConfig to invoke refreshRemoteConfig instead of loadRemoteConfig. Updated main.ts initialization to call refreshRemoteConfig({ useAuth: false }) via dynamic import from refreshRemoteConfig module instead of loadRemoteConfig.
Test coverage
src/platform/remoteConfig/refreshRemoteConfig.test.ts
New test module added with 109 lines. Validates authenticated mode (default useAuth: true), unauthenticated mode (useAuth: false), default behavior, and error handling for 401/403 responses and fetch errors.

Possibly related PRs

Suggested reviewers

  • DrJKL
  • luke-mino-altherr
✨ Finishing touches
  • 📝 Generate docstrings

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
Copy link

Bundle Size Report

Summary

  • Raw size: 21.8 MB baseline 21.8 MB — 🟢 -175 B
  • Gzip: 4.53 MB baseline 4.53 MB — 🟢 -29 B
  • Brotli: 3.36 MB baseline 3.36 MB — 🟢 -629 B
  • Bundles: 167 current • 166 baseline • 165 added / 164 removed

Category Glance
Other 🟢 -153 B (6.36 MB) · Panels & Settings 🟢 -131 B (440 kB) · App Entry Points 🔴 +108 B (22.8 kB) · Data & Services 🔴 +1 B (3.17 MB) · Vendor & Third-Party ⚪ 0 B (10.7 MB) · Graph Workspace ⚪ 0 B (949 kB) · + 5 more

Per-category breakdown
App Entry Points — 22.8 kB (baseline 22.7 kB) • 🔴 +108 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-D7P5iHdK.js (new) 22.8 kB 🔴 +22.8 kB 🔴 +6.85 kB 🔴 +6.02 kB
assets/index-CN6JWYEr.js (removed) 22.7 kB 🟢 -22.7 kB 🟢 -6.83 kB 🟢 -5.99 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CqQiYZI4.js (removed) 949 kB 🟢 -949 kB 🟢 -192 kB 🟢 -145 kB
assets/GraphView-CXrUlXkC.js (new) 949 kB 🔴 +949 kB 🔴 +192 kB 🔴 +145 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CCU-tpgx.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.6 kB 🟢 -3.05 kB
assets/CloudSurveyView-DH_LX3iG.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.6 kB 🔴 +3.05 kB
assets/CloudLoginView-DhEp-iJP.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.09 kB 🔴 +2.71 kB
assets/CloudLoginView-oRjtLNoo.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.71 kB
assets/UserCheckView-BMD-CF8w.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.44 kB 🟢 -2.12 kB
assets/UserCheckView-kbKjK8LJ.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.45 kB 🔴 +2.13 kB
assets/CloudLayoutView-CH6ncjbJ.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.24 kB 🔴 +1.95 kB
assets/CloudLayoutView-CYLJLZTO.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.25 kB 🟢 -1.95 kB
assets/CloudSignupView-DGoRFzid.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.33 kB 🔴 +2.03 kB
assets/CloudSignupView-MuOl0YlQ.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.02 kB
assets/CloudForgotPasswordView-DLv_kDzo.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.92 kB 🔴 +1.69 kB
assets/CloudForgotPasswordView-EWSJ_alw.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.92 kB 🟢 -1.68 kB
assets/UserSelectView-Bqn_cK0Q.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/UserSelectView-CPlnfVNp.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-CCSYfpSn.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.55 kB
assets/CloudSubscriptionRedirectView-CLbrnkSk.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.55 kB
assets/CloudAuthTimeoutView-B1_z82p4.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/CloudAuthTimeoutView-D7CdtWYA.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.7 kB 🔴 +1.48 kB
assets/CloudSorryContactSupportView-CIWojqyX.js (removed) 1.97 kB 🟢 -1.97 kB 🟢 -703 B 🟢 -624 B
assets/CloudSorryContactSupportView-DCJFuYDt.js (new) 1.97 kB 🔴 +1.97 kB 🔴 +702 B 🔴 +629 B
assets/layout-D0XZF4Pt.js (new) 500 B 🔴 +500 B 🔴 +309 B 🔴 +265 B
assets/layout-DQZzOBYR.js (removed) 500 B 🟢 -500 B 🟢 -310 B 🟢 -265 B

Status: 11 added / 11 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settings-BXVr0R9W.js (removed) 38.3 kB 🟢 -38.3 kB 🟢 -9.22 kB 🟢 -7.31 kB
assets/settings-DJTea6Ev.js (new) 38.3 kB 🔴 +38.3 kB 🔴 +9.22 kB 🔴 +7.34 kB
assets/settings-Bv3zi5bR.js (removed) 34.3 kB 🟢 -34.3 kB 🟢 -7.93 kB 🟢 -6.6 kB
assets/settings-DhmTNLI9.js (new) 34.3 kB 🔴 +34.3 kB 🔴 +7.93 kB 🔴 +6.58 kB
assets/settings-B3VsXFLW.js (new) 32.1 kB 🔴 +32.1 kB 🔴 +7.68 kB 🔴 +6.22 kB
assets/settings-CheSGCN4.js (removed) 32.1 kB 🟢 -32.1 kB 🟢 -7.68 kB 🟢 -6.23 kB
assets/settings-B4_MooYG.js (new) 31.2 kB 🔴 +31.2 kB 🔴 +8.08 kB 🔴 +6.72 kB
assets/settings-Ca_EqdTH.js (removed) 31.2 kB 🟢 -31.2 kB 🟢 -8.08 kB 🟢 -6.72 kB
assets/settings-_w0F8Os2.js (removed) 30.4 kB 🟢 -30.4 kB 🟢 -7.76 kB 🟢 -6.72 kB
assets/settings-BhUxE7XO.js (new) 30.4 kB 🔴 +30.4 kB 🔴 +7.76 kB 🔴 +6.72 kB
assets/settings-2k-uW27U.js (new) 29.6 kB 🔴 +29.6 kB 🔴 +7.62 kB 🔴 +6.63 kB
assets/settings-BhNjTsTR.js (removed) 29.6 kB 🟢 -29.6 kB 🟢 -7.62 kB 🟢 -6.63 kB
assets/settings-C252B0j_.js (new) 29.5 kB 🔴 +29.5 kB 🔴 +7.5 kB 🔴 +6.34 kB
assets/settings-Dkz0uATE.js (removed) 29.5 kB 🟢 -29.5 kB 🟢 -7.49 kB 🟢 -6.35 kB
assets/settings-BcyB3JCe.js (removed) 28.9 kB 🟢 -28.9 kB 🟢 -7.36 kB 🟢 -6.33 kB
assets/settings-DIlohv1U.js (new) 28.9 kB 🔴 +28.9 kB 🔴 +7.36 kB 🔴 +6.32 kB
assets/settings-Ccc7OH1N.js (removed) 28.6 kB 🟢 -28.6 kB 🟢 -7.71 kB 🟢 -6.38 kB
assets/settings-DBhZ2LBE.js (new) 28.6 kB 🔴 +28.6 kB 🔴 +7.71 kB 🔴 +6.37 kB
assets/settings-DNMBWO2D.js (removed) 25.9 kB 🟢 -25.9 kB 🟢 -7.64 kB 🟢 -6.16 kB
assets/settings-DQsjqwD9.js (new) 25.9 kB 🔴 +25.9 kB 🔴 +7.64 kB 🔴 +6.16 kB
assets/settings-3W2Cy6cq.js (new) 25.2 kB 🔴 +25.2 kB 🔴 +7.41 kB 🔴 +5.76 kB
assets/settings-CY-0EA4m.js (removed) 25.2 kB 🟢 -25.2 kB 🟢 -7.41 kB 🟢 -5.76 kB
assets/LegacyCreditsPanel-BOxrvnQW.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.94 kB 🟢 -5.22 kB
assets/LegacyCreditsPanel-CHyDpAD-.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.94 kB 🔴 +5.23 kB
assets/SubscriptionPanel-CYHDO-_F.js (removed) 20.9 kB 🟢 -20.9 kB 🟢 -5.01 kB 🟢 -4.42 kB
assets/SubscriptionPanel-XAoBVohv.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +5.01 kB 🔴 +4.42 kB
assets/KeybindingPanel-BH40YnuC.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.73 kB 🟢 -3.31 kB
assets/KeybindingPanel-KTM0POAv.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.73 kB 🔴 +3.31 kB
assets/AboutPanel-CDZkaq_N.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.43 kB
assets/AboutPanel-D6TExJZf.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.45 kB
assets/ExtensionPanel-_C89DBV2.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ExtensionPanel-9KyQW4nf.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/WorkspacePanel-pAFO4rI6.js (new) 8.17 kB 🔴 +8.17 kB 🔴 +2.31 kB 🔴 +2.08 kB
assets/WorkspacePanel-XfKNGLxu.js (removed) 8.17 kB 🟢 -8.17 kB 🟢 -2.31 kB 🟢 -2.08 kB
assets/ServerConfigPanel-Bno8wisI.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.16 kB 🟢 -1.94 kB
assets/ServerConfigPanel-DwseAe2D.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.16 kB 🔴 +1.94 kB
assets/UserPanel-BXjiyBIG.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.9 kB 🟢 -1.68 kB
assets/UserPanel-DEJlXW8x.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.9 kB 🔴 +1.67 kB
assets/cloudRemoteConfig-CfyXZz6D.js (removed) 1.82 kB 🟢 -1.82 kB 🟢 -772 B 🟢 -655 B
assets/config-BD_KIysV.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -608 B 🟢 -530 B
assets/config-C0AeLX5_.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +604 B 🔴 +541 B
assets/refreshRemoteConfig-BdzLWJ58.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +524 B 🔴 +483 B
assets/cloudRemoteConfig-DZAs75cB.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +510 B 🔴 +440 B
assets/remoteConfig-maWXk_kA.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -520 B 🟢 -461 B
assets/remoteConfig-BufOGckh.js (new) 536 B 🔴 +536 B 🔴 +312 B 🔴 +279 B
assets/remoteConfig-CZVd5eda.js (removed) 188 B 🟢 -188 B 🟢 -132 B 🟢 -113 B
assets/refreshRemoteConfig-Cjr9Zk-u.js (new) 169 B 🔴 +169 B 🔴 +108 B 🔴 +105 B

Status: 24 added / 23 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BsoShyg5.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.06 kB
assets/auth-Btn3loo6.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.07 kB
assets/firebaseAuthStore-B2m7xRiQ.js (new) 217 B 🔴 +217 B 🔴 +136 B 🔴 +119 B
assets/firebaseAuthStore-D3XSv5xy.js (removed) 217 B 🟢 -217 B 🟢 -136 B 🟢 -117 B
assets/auth-BAnDC2fN.js (new) 178 B 🔴 +178 B 🔴 +141 B 🔴 +129 B
assets/auth-DsSBGH1K.js (removed) 178 B 🟢 -178 B 🟢 -141 B 🟢 -130 B

Status: 3 added / 3 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-Bpq5_ISU.js (removed) 2.65 kB 🟢 -2.65 kB 🟢 -1.25 kB 🟢 -1.1 kB
assets/useSubscriptionDialog-BQCtmaSU.js (new) 2.65 kB 🔴 +2.65 kB 🔴 +1.25 kB 🔴 +1.12 kB
assets/useSubscriptionDialog-78s_QnSz.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -96 B
assets/useSubscriptionDialog-CjcZ_Eyq.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +96 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-DEiFfuLY.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.41 kB
assets/ComfyQueueButton-V9APOZ0x.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.69 kB 🟢 -2.41 kB
assets/TopbarBadge-CIuqyTWW.js (removed) 8.36 kB 🟢 -8.36 kB 🟢 -1.97 kB 🟢 -1.76 kB
assets/TopbarBadge-CMiNrqEJ.js (new) 8.36 kB 🔴 +8.36 kB 🔴 +1.97 kB 🔴 +1.76 kB
assets/SubscribeButton-BquQYRrM.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.57 kB 🟢 -1.39 kB
assets/SubscribeButton-DYwL5GxH.js (new) 4.63 kB 🔴 +4.63 kB 🔴 +1.57 kB 🔴 +1.39 kB
assets/Button-CBiuMrWI.js (removed) 3.77 kB 🟢 -3.77 kB 🟢 -1.37 kB 🟢 -1.22 kB
assets/Button-CE60plIr.js (new) 3.77 kB 🔴 +3.77 kB 🔴 +1.37 kB 🔴 +1.22 kB
assets/WidgetButton-B-XItutF.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +979 B 🔴 +887 B
assets/WidgetButton-DzXs11SA.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -980 B 🟢 -870 B
assets/CloudBadge-BcVA0Ba8.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -722 B 🟢 -645 B
assets/CloudBadge-Gnid9JTR.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +722 B 🔴 +646 B
assets/UserAvatar-BvUzYvJd.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -726 B 🟢 -636 B
assets/UserAvatar-wKdSR6pn.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +726 B 🔴 +635 B
assets/cloudFeedbackTopbarButton-CuxysWrF.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -675 B 🟢 -577 B
assets/cloudFeedbackTopbarButton-kgih1Y8c.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +677 B 🔴 +578 B
assets/ComfyQueueButton-CAIR6vs7.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +108 B
assets/ComfyQueueButton-DtjWU-LU.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -114 B

Status: 9 added / 9 removed

Data & Services — 3.17 MB (baseline 3.17 MB) • 🔴 +1 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-C6dHnEMH.js (removed) 1.99 MB 🟢 -1.99 MB 🟢 -420 kB 🟢 -321 kB
assets/dialogService-Df6d8ZEB.js (new) 1.99 MB 🔴 +1.99 MB 🔴 +420 kB 🔴 +321 kB
assets/api-BUSDoY2p.js (new) 1.16 MB 🔴 +1.16 MB 🔴 +241 kB 🔴 +187 kB
assets/api-Dsi-tBgS.js (removed) 1.16 MB 🟢 -1.16 MB 🟢 -241 kB 🟢 -187 kB
assets/releaseStore-B37JrD62.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.4 kB 🟢 -2.12 kB
assets/releaseStore-D7eXt8Mf.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.4 kB 🔴 +2.12 kB
assets/keybindingService-182Pikos.js (removed) 6.78 kB 🟢 -6.78 kB 🟢 -1.74 kB 🟢 -1.52 kB
assets/keybindingService-RvJLfRK8.js (new) 6.78 kB 🔴 +6.78 kB 🔴 +1.75 kB 🔴 +1.52 kB
assets/serverConfigStore-D2Rof7C_.js (new) 2.64 kB 🔴 +2.64 kB 🔴 +876 B 🔴 +780 B
assets/serverConfigStore-D6BZBqR8.js (removed) 2.64 kB 🟢 -2.64 kB 🟢 -878 B 🟢 -775 B
assets/userStore-1W-UPTfC.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -812 B 🟢 -725 B
assets/userStore-CZbdLnKw.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +811 B 🔴 +725 B
assets/audioService-B6_USqeO.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +929 B 🔴 +822 B
assets/audioService-DS5dGkBu.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -930 B 🟢 -820 B
assets/teamWorkspaceStore-BgZErvND.js (removed) 165 B 🟢 -165 B 🟢 -123 B 🟢 -116 B
assets/teamWorkspaceStore-rnz0WLz3.js (new) 165 B 🔴 +165 B 🔴 +123 B 🔴 +116 B
assets/releaseStore-6kDJ6gxB.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -108 B
assets/releaseStore-CrpjGAwf.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +105 B

Status: 9 added / 9 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/colorUtil-BpknRFr6.js (new) 7.2 kB 🔴 +7.2 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/colorUtil-CWN_VD-w.js (removed) 7.2 kB 🟢 -7.2 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/useErrorHandling-C_d6-2Hs.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.5 kB 🟢 -1.31 kB
assets/useErrorHandling-DBC-WVcY.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.5 kB 🔴 +1.31 kB
assets/useWorkspaceUI-a0_Wz4P2.js (new) 2.25 kB 🔴 +2.25 kB 🔴 +757 B 🔴 +696 B
assets/useWorkspaceUI-D-DWyytI.js (removed) 2.25 kB 🟢 -2.25 kB 🟢 -757 B 🟢 -665 B
assets/useSubscriptionActions-DWk6NZrA.js (removed) 2.22 kB 🟢 -2.22 kB 🟢 -866 B 🟢 -759 B
assets/useSubscriptionActions-rDhc5DIc.js (new) 2.22 kB 🔴 +2.22 kB 🔴 +867 B 🔴 +761 B
assets/subscriptionCheckoutUtil-BHFumMlh.js (new) 1.98 kB 🔴 +1.98 kB 🔴 +863 B 🔴 +747 B
assets/subscriptionCheckoutUtil-DTcbobiM.js (removed) 1.98 kB 🟢 -1.98 kB 🟢 -858 B 🟢 -744 B
assets/markdownRendererUtil-BH-xeUTY.js (removed) 1.78 kB 🟢 -1.78 kB 🟢 -885 B 🟢 -774 B
assets/markdownRendererUtil-CUcd5gQV.js (new) 1.78 kB 🔴 +1.78 kB 🔴 +884 B 🔴 +771 B
assets/useSubscriptionCredits-B5Un3go3.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -597 B 🟢 -525 B
assets/useSubscriptionCredits-BElEPY8d.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +596 B 🔴 +529 B
assets/audioUtils-CGu-eWLh.js (removed) 970 B 🟢 -970 B 🟢 -547 B 🟢 -488 B
assets/audioUtils-DbzWdIIm.js (new) 970 B 🔴 +970 B 🔴 +549 B 🔴 +459 B
assets/tailwindUtil-C7XUgwmI.js (new) 488 B 🔴 +488 B 🔴 +296 B 🔴 +270 B
assets/tailwindUtil-CuQ_kVBG.js (removed) 488 B 🟢 -488 B 🟢 -295 B 🟢 -268 B
assets/_plugin-vue_export-helper-DLRTaeJK.js (new) 467 B 🔴 +467 B 🔴 +270 B 🔴 +243 B
assets/_plugin-vue_export-helper-Dt9-hEHc.js (removed) 467 B 🟢 -467 B 🟢 -270 B 🟢 -243 B
assets/useCurrentUser-D0ijQFqI.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -107 B
assets/useCurrentUser-N2FKHAIS.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +101 B

Status: 11 added / 11 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-CCO1nq9Q.js (removed) 4.1 MB 🟢 -4.1 MB 🟢 -867 kB 🟢 -673 kB
assets/vendor-other-DsN_QkAV.js (new) 4.1 MB 🔴 +4.1 MB 🔴 +867 kB 🔴 +673 kB
assets/vendor-primevue-D9jS_6ky.js (removed) 3.04 MB 🟢 -3.04 MB 🟢 -560 kB 🟢 -329 kB
assets/vendor-primevue-DfDkDSrj.js (new) 3.04 MB 🔴 +3.04 MB 🔴 +560 kB 🔴 +328 kB
assets/vendor-three-BKj_AHFn.js (removed) 1.83 MB 🟢 -1.83 MB 🟢 -391 kB 🟢 -283 kB
assets/vendor-three-BKpliY5_.js (new) 1.83 MB 🔴 +1.83 MB 🔴 +391 kB 🔴 +283 kB
assets/vendor-tiptap-BFRBT3RT.js (new) 650 kB 🔴 +650 kB 🔴 +152 kB 🔴 +122 kB
assets/vendor-tiptap-CLU9nzy5.js (removed) 650 kB 🟢 -650 kB 🟢 -152 kB 🟢 -122 kB
assets/vendor-chart-CzCG8jcG.js (removed) 408 kB 🟢 -408 kB 🟢 -98.6 kB 🟢 -80.5 kB
assets/vendor-chart-OCOwIMuw.js (new) 408 kB 🔴 +408 kB 🔴 +98.6 kB 🔴 +80.6 kB
assets/vendor-xterm-AIoMGdmt.js (removed) 398 kB 🟢 -398 kB 🟢 -79.3 kB 🟢 -63.5 kB
assets/vendor-xterm-PDw3y6Aq.js (new) 398 kB 🔴 +398 kB 🔴 +79.3 kB 🔴 +63.5 kB
assets/vendor-reka-ui-C7fVHAth.js (removed) 256 kB 🟢 -256 kB 🟢 -50.6 kB 🟢 -42.1 kB
assets/vendor-reka-ui-v0jgPg5n.js (new) 256 kB 🔴 +256 kB 🔴 +50.6 kB 🔴 +42.1 kB
assets/vendor-vue-CRvEKkVc.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +4.37 kB 🔴 +3.92 kB
assets/vendor-vue-DhS5MB4h.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -4.37 kB 🟢 -3.92 kB

Status: 8 added / 8 removed

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

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/nodeDefs-BrvlAvf6.js (removed) 437 kB 🟢 -437 kB 🟢 -67.8 kB 🟢 -43.6 kB
assets/nodeDefs-VFfD9vWD.js (new) 437 kB 🔴 +437 kB 🔴 +67.8 kB 🔴 +43.6 kB
assets/nodeDefs-D3C1fF0_.js (new) 403 kB 🔴 +403 kB 🔴 +61.6 kB 🔴 +40.5 kB
assets/nodeDefs-DdZJ1mp4.js (removed) 403 kB 🟢 -403 kB 🟢 -61.6 kB 🟢 -40.5 kB
assets/nodeDefs-Bx704Rz3.js (new) 403 kB 🔴 +403 kB 🔴 +63.6 kB 🔴 +41.9 kB
assets/nodeDefs-y33GjNKL.js (removed) 403 kB 🟢 -403 kB 🟢 -63.6 kB 🟢 -41.9 kB
assets/nodeDefs-_yIUj67D.js (removed) 374 kB 🟢 -374 kB 🟢 -61.9 kB 🟢 -40.4 kB
assets/nodeDefs-Ct00g4Pj.js (new) 374 kB 🔴 +374 kB 🔴 +61.9 kB 🔴 +40.4 kB
assets/nodeDefs-BF6TtCbU.js (removed) 365 kB 🟢 -365 kB 🟢 -60.5 kB 🟢 -40.2 kB
assets/nodeDefs-BpKLp6Gt.js (new) 365 kB 🔴 +365 kB 🔴 +60.5 kB 🔴 +40.2 kB
assets/nodeDefs-CK5btlaD.js (removed) 361 kB 🟢 -361 kB 🟢 -60.5 kB 🟢 -41.3 kB
assets/nodeDefs-CN6I_9U3.js (new) 361 kB 🔴 +361 kB 🔴 +60.5 kB 🔴 +41.3 kB
assets/nodeDefs-Bye49VRX.js (new) 361 kB 🔴 +361 kB 🔴 +59.2 kB 🔴 +40.6 kB
assets/nodeDefs-DZm7fb-y.js (removed) 361 kB 🟢 -361 kB 🟢 -59.2 kB 🟢 -40.6 kB
assets/nodeDefs-BQZ8zPIN.js (removed) 358 kB 🟢 -358 kB 🟢 -58 kB 🟢 -39.8 kB
assets/nodeDefs-Np2VYSmL.js (new) 358 kB 🔴 +358 kB 🔴 +58 kB 🔴 +39.8 kB
assets/nodeDefs-BlOB_fqn.js (removed) 355 kB 🟢 -355 kB 🟢 -57.3 kB 🟢 -39.2 kB
assets/nodeDefs-CVUFx4dD.js (new) 355 kB 🔴 +355 kB 🔴 +57.3 kB 🔴 +39.1 kB
assets/nodeDefs-BsXnuo4Q.js (new) 334 kB 🔴 +334 kB 🔴 +59.4 kB 🔴 +39 kB
assets/nodeDefs-D8jcNSNH.js (removed) 334 kB 🟢 -334 kB 🟢 -59.4 kB 🟢 -39 kB
assets/nodeDefs-BpC2Fixc.js (new) 332 kB 🔴 +332 kB 🔴 +58.2 kB 🔴 +37.7 kB
assets/nodeDefs-CbhW6UrA.js (removed) 332 kB 🟢 -332 kB 🟢 -58.2 kB 🟢 -37.7 kB
assets/core-BffCzoxr.js (removed) 178 kB 🟢 -178 kB 🟢 -43 kB 🟢 -35.9 kB
assets/core-DVAa3Qj-.js (new) 178 kB 🔴 +178 kB 🔴 +43 kB 🔴 +35.9 kB
assets/main-i-8NGoDn.js (new) 164 kB 🔴 +164 kB 🔴 +43.8 kB 🔴 +34.7 kB
assets/main-utjp9h7e.js (removed) 164 kB 🟢 -164 kB 🟢 -43.8 kB 🟢 -34.7 kB
assets/main-Cmx0L4BY.js (removed) 147 kB 🟢 -147 kB 🟢 -39.4 kB 🟢 -31.8 kB
assets/main-Cuv6CRMJ.js (new) 147 kB 🔴 +147 kB 🔴 +39.4 kB 🔴 +31.8 kB
assets/main-BhEFmLQr.js (removed) 143 kB 🟢 -143 kB 🟢 -39.6 kB 🟢 -31.6 kB
assets/main-CaYfYqwT.js (new) 143 kB 🔴 +143 kB 🔴 +39.6 kB 🔴 +31.6 kB
assets/main-BJmSXHk5.js (removed) 136 kB 🟢 -136 kB 🟢 -39.4 kB 🟢 -31.5 kB
assets/main-DTHAHiEo.js (new) 136 kB 🔴 +136 kB 🔴 +39.4 kB 🔴 +31.5 kB
assets/main-B7L733x4.js (new) 126 kB 🔴 +126 kB 🔴 +38.1 kB 🔴 +31.9 kB
assets/main-C1TIlcBD.js (removed) 126 kB 🟢 -126 kB 🟢 -38.1 kB 🟢 -31.9 kB
assets/main-C8G9GjDN.js (removed) 123 kB 🟢 -123 kB 🟢 -37.9 kB 🟢 -30.7 kB
assets/main-DG91ZSvA.js (new) 123 kB 🔴 +123 kB 🔴 +37.9 kB 🔴 +30.7 kB
assets/main-bAEjzru6.js (new) 121 kB 🔴 +121 kB 🔴 +37.2 kB 🔴 +31 kB
assets/main-jf-B109s.js (removed) 121 kB 🟢 -121 kB 🟢 -37.2 kB 🟢 -31 kB
assets/main-BmmOwg2u.js (new) 119 kB 🔴 +119 kB 🔴 +37.1 kB 🔴 +31 kB
assets/main-mcBLF1lP.js (removed) 119 kB 🟢 -119 kB 🟢 -37.1 kB 🟢 -31 kB
assets/main-BwdWUSzx.js (removed) 119 kB 🟢 -119 kB 🟢 -36.6 kB 🟢 -30.7 kB
assets/main-CptWQ-kK.js (new) 119 kB 🔴 +119 kB 🔴 +36.6 kB 🔴 +30.7 kB
assets/main-CNrV3AkU.js (new) 107 kB 🔴 +107 kB 🔴 +36.6 kB 🔴 +29.1 kB
assets/main-CNZb5sh8.js (removed) 107 kB 🟢 -107 kB 🟢 -36.6 kB 🟢 -29.1 kB
assets/main-CcRPXk1G.js (new) 106 kB 🔴 +106 kB 🔴 +36.7 kB 🔴 +28.9 kB
assets/main-Cp7Xi9AK.js (removed) 106 kB 🟢 -106 kB 🟢 -36.7 kB 🟢 -28.9 kB
assets/Load3D-BXRtyS5M.js (removed) 55.7 kB 🟢 -55.7 kB 🟢 -9.18 kB 🟢 -7.91 kB
assets/Load3D-DTav9-va.js (new) 55.7 kB 🔴 +55.7 kB 🔴 +9.18 kB 🔴 +7.91 kB
assets/WidgetSelect-CHY0ntHF.js (new) 50.5 kB 🔴 +50.5 kB 🔴 +11.1 kB 🔴 +9.7 kB
assets/WidgetSelect-JEVazb3E.js (removed) 50.5 kB 🟢 -50.5 kB 🟢 -11.1 kB 🟢 -9.7 kB
assets/SubscriptionRequiredDialogContent-BEhgLQ-4.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.78 kB 🔴 +5.92 kB
assets/SubscriptionRequiredDialogContent-DUb2hU3e.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.78 kB 🟢 -5.92 kB
assets/CurrentUserPopoverWorkspace-0WddWiA3.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +4.84 kB 🔴 +4.3 kB
assets/CurrentUserPopoverWorkspace-BxFf5RpR.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -4.84 kB 🟢 -4.3 kB
assets/commands-D7JSvcea.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +3.96 kB 🔴 +3.09 kB
assets/commands-DFPZ6_-M.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -3.96 kB 🟢 -3.08 kB
assets/commands-B8DPxzq3.js (removed) 19.3 kB 🟢 -19.3 kB 🟢 -3.68 kB 🟢 -2.83 kB
assets/commands-C0ihBqw2.js (new) 19.3 kB 🔴 +19.3 kB 🔴 +3.68 kB 🔴 +2.83 kB
assets/commands-CDiUUOet.js (removed) 19.3 kB 🟢 -19.3 kB 🟢 -3.69 kB 🟢 -2.9 kB
assets/commands-DUy-2VbT.js (new) 19.3 kB 🔴 +19.3 kB 🔴 +3.69 kB 🔴 +2.9 kB
assets/commands-Cge8p8D7.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +3.79 kB 🔴 +2.93 kB
assets/commands-CVY7Ty6w.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -3.79 kB 🟢 -2.93 kB
assets/commands-4PR1bHpF.js (removed) 18.5 kB 🟢 -18.5 kB 🟢 -3.52 kB 🟢 -2.91 kB
assets/commands-BJLS4KsL.js (new) 18.5 kB 🔴 +18.5 kB 🔴 +3.52 kB 🔴 +2.92 kB
assets/WidgetInputNumber-Btnzv77i.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.51 kB 🔴 +4.02 kB
assets/WidgetInputNumber-CJ4Qx6bH.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.51 kB 🟢 -4.02 kB
assets/WidgetRecordAudio-BYMBK9XF.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.96 kB 🟢 -4.44 kB
assets/WidgetRecordAudio-Chgkfacg.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.96 kB 🔴 +4.43 kB
assets/commands-CVbuwW7U.js (new) 18 kB 🔴 +18 kB 🔴 +3.51 kB 🔴 +2.9 kB
assets/commands-Ep6sQmXs.js (removed) 18 kB 🟢 -18 kB 🟢 -3.51 kB 🟢 -2.89 kB
assets/commands-BCMa3myQ.js (new) 18 kB 🔴 +18 kB 🔴 +3.39 kB 🔴 +2.78 kB
assets/commands-BeMMi6hO.js (removed) 18 kB 🟢 -18 kB 🟢 -3.4 kB 🟢 -2.78 kB
assets/commands-B2K4kJ7I.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -3.36 kB 🟢 -2.77 kB
assets/commands-DO2o9ZPA.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +3.36 kB 🔴 +2.77 kB
assets/commands-Bxi6-Pt0.js (new) 17.8 kB 🔴 +17.8 kB 🔴 +3.65 kB 🔴 +2.84 kB
assets/commands-Ds2wjN52.js (removed) 17.8 kB 🟢 -17.8 kB 🟢 -3.65 kB 🟢 -2.84 kB
assets/SubscriptionPanelContentWorkspace-BHQWVQDG.js (removed) 17.7 kB 🟢 -17.7 kB 🟢 -4.34 kB 🟢 -3.78 kB
assets/SubscriptionPanelContentWorkspace-BL81PUzC.js (new) 17.7 kB 🔴 +17.7 kB 🔴 +4.34 kB 🔴 +3.78 kB
assets/commands-B2EAJ50e.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -3.58 kB 🟢 -2.73 kB
assets/commands-CLzYTTQL.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +3.57 kB 🔴 +2.73 kB
assets/WidgetImageCrop-Cj6-BCDp.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.63 kB
assets/WidgetImageCrop-DTHI2Fh0.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.14 kB 🔴 +3.63 kB
assets/commands-BFBrL4wa.js (removed) 17 kB 🟢 -17 kB 🟢 -3.54 kB 🟢 -2.64 kB
assets/commands-wBNS4y4c.js (new) 17 kB 🔴 +17 kB 🔴 +3.54 kB 🔴 +2.64 kB
assets/PanelTemplate-BvqkSTzP.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.45 kB 🟢 -4.79 kB
assets/PanelTemplate-CWGvk4LU.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.79 kB
assets/LazyImage-6JyDrZCN.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +4 kB 🔴 +3.54 kB
assets/LazyImage-D6PpiUVK.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -4 kB 🟢 -3.54 kB
assets/AudioPreviewPlayer-CEs37Pgh.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.97 kB 🔴 +2.65 kB
assets/AudioPreviewPlayer-DcR4GVb4.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.97 kB 🟢 -2.65 kB
assets/WidgetWithControl-_bwsoe46.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.65 kB 🔴 +2.38 kB
assets/WidgetWithControl-Cr--Hd6G.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.64 kB 🟢 -2.38 kB
assets/CreateWorkspaceDialogContent-BhH9iSyA.js (removed) 5.92 kB 🟢 -5.92 kB 🟢 -1.92 kB 🟢 -1.67 kB
assets/CreateWorkspaceDialogContent-z8_mgtAN.js (new) 5.92 kB 🔴 +5.92 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/EditWorkspaceDialogContent-DiGyI5az.js (removed) 5.69 kB 🟢 -5.69 kB 🟢 -1.87 kB 🟢 -1.63 kB
assets/EditWorkspaceDialogContent-DJdjbzCA.js (new) 5.69 kB 🔴 +5.69 kB 🔴 +1.87 kB 🔴 +1.64 kB
assets/ValueControlPopover-ChcLwsOK.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.55 kB 🟢 -1.37 kB
assets/ValueControlPopover-Dz6HJ2uN.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.55 kB 🔴 +1.37 kB
assets/WidgetBoundingBox-DacGBD5y.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.13 kB 🟢 -1.01 kB
assets/WidgetBoundingBox-KpJ-3L5b.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.13 kB 🔴 +991 B
assets/DeleteWorkspaceDialogContent-CbNI7wFT.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.56 kB 🟢 -1.35 kB
assets/DeleteWorkspaceDialogContent-DLYCKywj.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.56 kB 🔴 +1.35 kB
assets/WidgetGalleria-Bew-zyV1.js (new) 4.57 kB 🔴 +4.57 kB 🔴 +1.57 kB 🔴 +1.42 kB
assets/WidgetGalleria-CroZXP26.js (removed) 4.57 kB 🟢 -4.57 kB 🟢 -1.57 kB 🟢 -1.42 kB
assets/LeaveWorkspaceDialogContent-Cd6uWl7x.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.5 kB 🟢 -1.3 kB
assets/LeaveWorkspaceDialogContent-CMGG0GIr.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.5 kB 🔴 +1.31 kB
assets/Slider-BBAXxQxS.js (new) 4.21 kB 🔴 +4.21 kB 🔴 +1.52 kB 🔴 +1.34 kB
assets/Slider-BoORvfqb.js (removed) 4.21 kB 🟢 -4.21 kB 🟢 -1.52 kB 🟢 -1.34 kB
assets/WidgetImageCompare-BFPf3oL1.js (new) 3.79 kB 🔴 +3.79 kB 🔴 +1.28 kB 🔴 +1.12 kB
assets/WidgetImageCompare-BWtVkybW.js (removed) 3.79 kB 🟢 -3.79 kB 🟢 -1.28 kB 🟢 -1.12 kB
assets/WidgetColorPicker-BaHD90N-.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.38 kB 🟢 -1.25 kB
assets/WidgetColorPicker-CCzJlMXt.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.37 kB 🔴 +1.25 kB
assets/WidgetTextarea-Bq8Pzo-G.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.33 kB 🔴 +1.2 kB
assets/WidgetTextarea-DZBuNrhg.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.33 kB 🟢 -1.17 kB
assets/preservedQueryNamespaces-D99dMmBP.js (new) 3.23 kB 🔴 +3.23 kB 🔴 +1.07 kB 🔴 +930 B
assets/preservedQueryNamespaces-zCg1CMIu.js (removed) 3.23 kB 🟢 -3.23 kB 🟢 -1.07 kB 🟢 -932 B
assets/WidgetMarkdown-B3dZxgK8.js (removed) 3.22 kB 🟢 -3.22 kB 🟢 -1.28 kB 🟢 -1.13 kB
assets/WidgetMarkdown-FwbCmt0k.js (new) 3.22 kB 🔴 +3.22 kB 🔴 +1.28 kB 🔴 +1.14 kB
assets/WidgetToggleSwitch-CA9YOACS.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.19 kB 🔴 +1.07 kB
assets/WidgetToggleSwitch-CJnK-DG-.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.19 kB 🟢 -1.07 kB
assets/GlobalToast-CyHC-izu.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -942 B
assets/GlobalToast-hTcNMDDp.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +939 B
assets/SubscribeToRun-CQwXwIlF.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.15 kB 🟢 -1.01 kB
assets/SubscribeToRun-Do63YfNb.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.15 kB 🔴 +1.01 kB
assets/cloudSessionCookie-B_AJnBCz.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -932 B 🟢 -805 B
assets/cloudSessionCookie-BzDK1XIL.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +937 B 🔴 +806 B
assets/MediaVideoTop-gfxHG4G4.js (removed) 2.84 kB 🟢 -2.84 kB 🟢 -1.06 kB 🟢 -915 B
assets/MediaVideoTop-To_wqfzI.js (new) 2.84 kB 🔴 +2.84 kB 🔴 +1.06 kB 🔴 +917 B
assets/WidgetChart-Dbj11DNq.js (new) 2.79 kB 🔴 +2.79 kB 🔴 +1.06 kB 🔴 +973 B
assets/WidgetChart-JRS-Yy_C.js (removed) 2.79 kB 🟢 -2.79 kB 🟢 -1.06 kB 🟢 -963 B
assets/WidgetLayoutField-B82nEQwY.js (removed) 2.61 kB 🟢 -2.61 kB 🟢 -1.01 kB 🟢 -890 B
assets/WidgetLayoutField-cnJOx9UO.js (new) 2.61 kB 🔴 +2.61 kB 🔴 +1.01 kB 🔴 +893 B
assets/WidgetInputText-BEqVMoBy.js (removed) 2.58 kB 🟢 -2.58 kB 🟢 -1.01 kB 🟢 -909 B
assets/WidgetInputText-CPjs6NcB.js (new) 2.58 kB 🔴 +2.58 kB 🔴 +1.01 kB 🔴 +910 B
assets/BaseViewTemplate-CzbV5oAn.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -940 B
assets/BaseViewTemplate-Ddc9dfsa.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +921 B
assets/Media3DTop-5zcsMbsP.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +1.02 kB 🔴 +902 B
assets/Media3DTop-CSW_ENx8.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -1.02 kB 🟢 -907 B
assets/MediaImageTop-BqI9AZuA.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1 kB 🟢 -881 B
assets/MediaImageTop-DyWg2Kcq.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1 kB 🔴 +872 B
assets/MediaAudioTop-DvEvCs7d.js (removed) 2 kB 🟢 -2 kB 🟢 -883 B 🟢 -760 B
assets/MediaAudioTop-yJJ6Isec.js (new) 2 kB 🔴 +2 kB 🔴 +882 B 🔴 +760 B
assets/CloudRunButtonWrapper-Bz0cuzcL.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -644 B 🟢 -576 B
assets/CloudRunButtonWrapper-C3-MVCeP.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +640 B 🔴 +593 B
assets/auto-C-D16_U1.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -637 B 🟢 -563 B
assets/auto-ShMUXBDI.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +636 B 🔴 +562 B
assets/widgetPropFilter-B2AM-H0O.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +569 B 🔴 +508 B
assets/widgetPropFilter-BmJCg-u2.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -569 B 🟢 -506 B
assets/cloudBadges-CevIi_G6.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +538 B 🔴 +484 B
assets/cloudBadges-G0MOWNJE.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -537 B 🟢 -478 B
assets/graphHasMissingNodes-B9wggY1g.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +459 B 🔴 +422 B
assets/graphHasMissingNodes-DgKayTHa.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -457 B 🟢 -434 B
assets/cloudSubscription-Cpaxx8at.js (new) 976 B 🔴 +976 B 🔴 +461 B 🔴 +399 B
assets/cloudSubscription-nwJC6aWh.js (removed) 976 B 🟢 -976 B 🟢 -460 B 🟢 -400 B
assets/previousFullPath-BFJQC27i.js (new) 838 B 🔴 +838 B 🔴 +415 B 🔴 +346 B
assets/previousFullPath-DhQpJZe1.js (removed) 838 B 🟢 -838 B 🟢 -414 B 🟢 -346 B
assets/nightlyBadges-BMvhMb7n.js (removed) 594 B 🟢 -594 B 🟢 -355 B 🟢 -312 B
assets/nightlyBadges-BzrnPtw7.js (new) 594 B 🔴 +594 B 🔴 +357 B 🔴 +312 B
assets/widget-C_FImE7Q.js (removed) 518 B 🟢 -518 B 🟢 -344 B 🟢 -290 B
assets/widget-CD3JnB1i.js (new) 518 B 🔴 +518 B 🔴 +343 B 🔴 +289 B
assets/SubscriptionPanelContentWorkspace-ChV7yVAX.js (new) 266 B 🔴 +266 B 🔴 +136 B 🔴 +113 B
assets/SubscriptionPanelContentWorkspace-D4Dz7hSG.js (removed) 266 B 🟢 -266 B 🟢 -136 B 🟢 -113 B
assets/WidgetBoundingBox-CTWd5ZRc.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +119 B
assets/WidgetBoundingBox-XFIqgKWC.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -115 B
assets/WidgetInputNumber-Be1uTqfj.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +108 B
assets/WidgetInputNumber-CYRpkpb9.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -112 B
assets/WidgetLegacy-19AEfFpe.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +123 B
assets/WidgetLegacy-DV5awv4m.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -126 B
assets/mixpanel.module-DKpe8oFs.js (removed) 143 B 🟢 -143 B 🟢 -125 B 🟢 -110 B
assets/mixpanel.module-rP3R9SUV.js (new) 143 B 🔴 +143 B 🔴 +125 B 🔴 +112 B
assets/Load3D-B2jMVJ7X.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -107 B
assets/Load3D-CiSkDwYd.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +115 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-cVp-94Rc.js 1.96 kB 1.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 86 added / 86 removed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (2)
src/platform/remoteConfig/refreshRemoteConfig.ts (1)

34-38: Consider clearing config for all non-ok responses, not just 401/403.

When the response is non-ok but not 401/403 (e.g., 500, 502), the existing remoteConfig.value remains stale. This could lead to the app operating with outdated feature flags until the next successful refresh.

If the intent is to preserve the last known good config on transient server errors, consider documenting this behavior. Otherwise, clearing on all failures may be more consistent with the catch block behavior.

♻️ Optional: Clear config on all non-ok responses
     console.warn('Failed to load remote config:', response.statusText)
-    if (response.status === 401 || response.status === 403) {
-      window.__CONFIG__ = {}
-      remoteConfig.value = {}
-    }
+    // Clear config on auth errors; consider if transient errors should also clear
+    if (response.status === 401 || response.status === 403) {
+      window.__CONFIG__ = {}
+      remoteConfig.value = {}
+    }
+    // Alternatively, clear on all failures for consistency:
+    // window.__CONFIG__ = {}
+    // remoteConfig.value = {}
src/extensions/core/cloudRemoteConfig.ts (1)

19-29: Consider storing the interval reference for potential cleanup.

The setInterval reference is discarded, making cleanup impossible if ever needed. While this cloud extension likely runs for the app's lifetime, storing the interval ID is a good defensive practice.

♻️ Optional: Store interval reference
     watchDebounced(
       [isLoggedIn, isActiveSubscription],
       () => {
         if (!isLoggedIn.value) return
         void refreshRemoteConfig()
       },
       { debounce: 256, immediate: true }
     )

     // Poll for config updates every 10 minutes (with auth)
-    setInterval(() => void refreshRemoteConfig(), 600_000)
+    const pollIntervalId = setInterval(() => void refreshRemoteConfig(), 600_000)
+    // Note: pollIntervalId could be cleared if extension lifecycle management is added
🤖 Fix all issues with AI agents
In `@src/platform/remoteConfig/refreshRemoteConfig.test.ts`:
- Around line 73-107: Add a test that verifies non-auth server errors do not
clear config: set remoteConfig.value and window.__CONFIG__ to a sample object,
mock api.fetchApi to resolve with a Response-like object where ok: false and
status: 500 (statusText 'Internal Server Error'), call refreshRemoteConfig(),
and assert that remoteConfig.value and window.__CONFIG__ remain equal to the
original object; reference refreshRemoteConfig, remoteConfig, window.__CONFIG__,
and api.fetchApi when locating where to add the test.

Comment on lines +73 to +107
describe('error handling', () => {
it('clears config on 401 response', async () => {
vi.mocked(api.fetchApi).mockResolvedValue({
ok: false,
status: 401,
statusText: 'Unauthorized'
} as Response)

await refreshRemoteConfig()

expect(remoteConfig.value).toEqual({})
expect(window.__CONFIG__).toEqual({})
})

it('clears config on 403 response', async () => {
vi.mocked(api.fetchApi).mockResolvedValue({
ok: false,
status: 403,
statusText: 'Forbidden'
} as Response)

await refreshRemoteConfig()

expect(remoteConfig.value).toEqual({})
expect(window.__CONFIG__).toEqual({})
})

it('clears config on fetch error', async () => {
vi.mocked(api.fetchApi).mockRejectedValue(new Error('Network error'))

await refreshRemoteConfig()

expect(remoteConfig.value).toEqual({})
expect(window.__CONFIG__).toEqual({})
})
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Consider adding a test for non-auth error statuses (e.g., 500).

The current tests cover 401 and 403 (which clear config) and fetch errors. However, the implementation preserves the existing config for other non-ok statuses like 500. Adding a test for this scenario would document the expected behavior and prevent regressions.

📝 Suggested additional test case
it('preserves config on 500 response', async () => {
  remoteConfig.value = { existingFeature: true }
  window.__CONFIG__ = { existingFeature: true }

  vi.mocked(api.fetchApi).mockResolvedValue({
    ok: false,
    status: 500,
    statusText: 'Internal Server Error'
  } as Response)

  await refreshRemoteConfig()

  // Config should NOT be cleared on transient server errors
  expect(remoteConfig.value).toEqual({ existingFeature: true })
  expect(window.__CONFIG__).toEqual({ existingFeature: true })
})
🤖 Prompt for AI Agents
In `@src/platform/remoteConfig/refreshRemoteConfig.test.ts` around lines 73 - 107,
Add a test that verifies non-auth server errors do not clear config: set
remoteConfig.value and window.__CONFIG__ to a sample object, mock api.fetchApi
to resolve with a Response-like object where ok: false and status: 500
(statusText 'Internal Server Error'), call refreshRemoteConfig(), and assert
that remoteConfig.value and window.__CONFIG__ remain equal to the original
object; reference refreshRemoteConfig, remoteConfig, window.__CONFIG__, and
api.fetchApi when locating where to add the test.

@christian-byrne christian-byrne added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch cloud/1.37 Backport PRs for cloud 1.37 labels Jan 23, 2026
@christian-byrne christian-byrne added the preview-cpu Creates a preview ephemeral environment for this PR (CPU only) label Jan 23, 2026
Copy link
Contributor

Choose a reason for hiding this comment

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

Nit: I know it's not coming from this PR, but this feels like it should be a part of the remoteConfig module, not in a separate file.

Comment on lines +26 to +30
it('uses api.fetchApi when useAuth is true', async () => {
vi.mocked(api.fetchApi).mockResolvedValue({
ok: true,
json: async () => mockConfig
} as Response)
Copy link
Contributor

Choose a reason for hiding this comment

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

Does this need the type assertion?
Could you get away with satisfies Partial<Response>?

}
}))

global.fetch = vi.fn()
Copy link
Contributor

Choose a reason for hiding this comment

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

Very nit: I usually like stubGlobal for consistency and control

Comment on lines +57 to +60
vi.mocked(global.fetch).mockResolvedValue({
ok: true,
json: async () => mockConfig
} as Response)
Copy link
Contributor

Choose a reason for hiding this comment

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

Nit: This pattern seems repeated enough times in here to be worth extracting.

@DrJKL DrJKL assigned christian-byrne and unassigned DrJKL Jan 23, 2026
@DrJKL DrJKL merged commit 2d0980c into main Jan 23, 2026
47 checks passed
@DrJKL DrJKL deleted the fix/remote-config-refresh-auth branch January 23, 2026 23:41
github-actions bot pushed a commit that referenced this pull request Jan 23, 2026
## Summary
- Fixes remote config polling to use authenticated API
- Consolidates `loadRemoteConfig` into `refreshRemoteConfig` with auth
control
- Adds unit tests for both auth modes

## Problem
The cloud extension's polling interval was using unauthenticated
`fetch`, causing it to receive only default feature flags instead of
user-specific configurations.

**Root cause:**
1. Bootstrap called `loadRemoteConfig()` (raw `fetch`, no auth) -
correct, auth not initialized yet
2. Extension watch called `refreshRemoteConfig()` (`api.fetchApi`, with
auth) - correct
3. Extension interval called `loadRemoteConfig()` (raw `fetch`, no auth)
- **bug**

## Solution
- Consolidate into single `refreshRemoteConfig()` with optional
`useAuth` parameter (defaults to `true`)
- Bootstrap: `refreshRemoteConfig({ useAuth: false })`
- Polling: `refreshRemoteConfig()` (authenticated by default)

## Test Plan
- Unit tests verify both auth modes
- `pnpm typecheck`, `pnpm lint`, `pnpm test:unit` all pass

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8266-fix-use-authenticated-API-for-remote-config-polling-2f16d73d3650817ea7b0e3a7e3ccf12a)
by [Unito](https://www.unito.io)
@comfy-pr-bot
Copy link
Member

@christian-byrne Successfully backported to #8284

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Jan 23, 2026
DrJKL pushed a commit that referenced this pull request Jan 24, 2026
…lling (#8284)

Backport of #8266 to `cloud/1.37`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8284-backport-cloud-1-37-fix-use-authenticated-API-for-remote-config-polling-2f16d73d365081d2898ff4fc1af441f0)
by [Unito](https://www.unito.io)

Co-authored-by: Christian Byrne <cbyrne@comfy.org>
christian-byrne added a commit that referenced this pull request Jan 28, 2026
Addresses review feedback from #8266:

- Use vi.stubGlobal for global fetch mock
- Extract mockSuccessResponse and mockErrorResponse helpers to reduce
duplication
- Add test verifying 500 responses preserve existing config (only
401/403 clear config)

Related: #8266

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8356-test-improve-refreshRemoteConfig-test-quality-2f66d73d365081f7b207c2fd2b8a8179)
by [Unito](https://www.unito.io)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud/1.37 Backport PRs for cloud 1.37 preview-cpu Creates a preview ephemeral environment for this PR (CPU only) size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants