Skip to content

Feat/workspaces 5 auth gate check#8350

Merged
simula-r merged 4 commits intomainfrom
feat/workspaces-5-auth-gate-check
Jan 28, 2026
Merged

Feat/workspaces 5 auth gate check#8350
simula-r merged 4 commits intomainfrom
feat/workspaces-5-auth-gate-check

Conversation

@simula-r
Copy link
Contributor

@simula-r simula-r commented Jan 28, 2026

Summary

  • Fix auth related race conditions with a new WorkspaceAuthGate in App.vue
  • De dup initialization calls
  • Add state machine to track state of refreshRemoteConfig
  • Fix websocket not using new workspace jwt
  • Misc improvments

Changes

  • What: Mainly WorkspaceAuthGate.vue
  • Breaking:
  • Dependencies:

┆Issue is synchronized with this Notion page by Unito

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 28, 2026

📝 Walkthrough

Walkthrough

Adds a WorkspaceAuthGate component at app root to coordinate Firebase auth startup, auth-aware remote config refresh, feature-flag checks, and conditional workspace store initialization; the gate shows a spinner until initialization completes and gracefully degrades on timeouts/errors.

Changes

Cohort / File(s) Summary
WorkspaceAuthGate Component
src/components/auth/WorkspaceAuthGate.vue, src/components/auth/WorkspaceAuthGate.test.ts
New component and comprehensive tests implementing auth-aware initialization flow, remote-config refresh with timeout, feature-flag check, and best-effort workspace store initialization; exposes readiness via internal isReady to gate app render.
App Root Integration
src/App.vue
Wraps main app UI (router-view, ProgressSpinner, GlobalDialog, BlockUI) inside WorkspaceAuthGate.
Remote Config State & Refresh
src/platform/remoteConfig/remoteConfig.ts, src/platform/remoteConfig/refreshRemoteConfig.ts
Adds remoteConfigState and isAuthenticatedConfigLoaded; refreshRemoteConfig now returns Promise<void> and updates state to 'anonymous'/'authenticated'/'error' based on outcome.
Cloud Remote Config Polling
src/extensions/core/cloudRemoteConfig.ts
Removed immediate: true from watchDebounced so initial refresh no longer runs there (initial auth-aware refresh occurs via WorkspaceAuthGate).
Feature Flag Guarding
src/composables/useFeatureFlags.ts
teamWorkspacesEnabled now returns false until isAuthenticatedConfigLoaded is true, preventing workspace usage before authenticated remote config loads.
Auth Token Handling
src/stores/firebaseAuthStore.ts, src/scripts/api.ts, src/scripts/app.ts
Adds getAuthToken() that prefers workspace token when available; switches callers to use getAuthToken() with try/catch fallbacks for token retrieval.
Workspace Init & UI Simplifications
src/views/GraphView.vue, src/components/graph/GraphCanvas.vue
Removes cloud-specific lazy workspace init from GraphView; GraphCanvas replaces watch-based invite URL loading with an immediate conditional load (WorkspaceAuthGate ensures flags resolved).

Sequence Diagram

sequenceDiagram
    participant App
    participant WorkspaceAuthGate
    participant FirebaseAuth
    participant RemoteConfig
    participant FeatureFlags
    participant WorkspaceStore

    App->>WorkspaceAuthGate: mount
    WorkspaceAuthGate->>FirebaseAuth: wait for auth init (<=16s)
    FirebaseAuth-->>WorkspaceAuthGate: auth ready / unauthenticated

    alt unauthenticated
        WorkspaceAuthGate->>App: mark ready -> render slot
    else authenticated
        WorkspaceAuthGate->>RemoteConfig: refresh with auth (race 10s)
        RemoteConfig-->>WorkspaceAuthGate: loaded / timeout / error

        WorkspaceAuthGate->>FeatureFlags: read teamWorkspacesEnabled
        FeatureFlags-->>WorkspaceAuthGate: flag value

        alt teamWorkspacesEnabled = false
            WorkspaceAuthGate->>App: mark ready -> render slot (Firebase auth)
        else teamWorkspacesEnabled = true
            WorkspaceAuthGate->>WorkspaceStore: initialize workspace mode
            WorkspaceStore-->>WorkspaceAuthGate: init success / error
            WorkspaceAuthGate->>App: mark ready -> render slot (workspace mode or fallback)
        end
    end
Loading

Possibly related PRs

Suggested reviewers

  • DrJKL
  • shinshin86
  • KarryCharon
  • christian-byrne
  • Myestery
✨ 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.

@simula-r simula-r added the preview-cpu Creates a preview ephemeral environment for this PR (CPU only) label Jan 28, 2026
@github-actions
Copy link

github-actions bot commented Jan 28, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/28/2026, 03:52:35 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 28, 2026

🎭 Playwright Tests: ✅ Passed

Results: 507 passed, 0 failed, 0 flaky, 8 skipped (Total: 515)

📊 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 (✅ 9 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@github-actions
Copy link

github-actions bot commented Jan 28, 2026

Bundle Size Report

Summary

  • Raw size: 22.1 MB baseline 22.1 MB — 🔴 +2.49 kB
  • Gzip: 4.59 MB baseline 4.59 MB — 🔴 +185 B
  • Brotli: 3.41 MB baseline 3.41 MB — 🔴 +661 B
  • Bundles: 172 current • 173 baseline • 165 added / 166 removed

Category Glance
App Entry Points 🔴 +2.96 kB (25.9 kB) · Graph Workspace 🟢 -1.04 kB (960 kB) · Panels & Settings 🔴 +385 B (471 kB) · Data & Services 🔴 +289 B (2.7 MB) · Other 🟢 -195 B (7.04 MB) · Utilities & Hooks 🔴 +91 B (25.3 kB) · + 5 more

Per-category breakdown
App Entry Points — 25.9 kB (baseline 22.9 kB) • 🔴 +2.96 kB

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-Qx2YOnCy.js (new) 25.9 kB 🔴 +25.9 kB 🔴 +7.46 kB 🔴 +6.56 kB
assets/index-aEE-Pn2U.js (removed) 22.9 kB 🟢 -22.9 kB 🟢 -6.9 kB 🟢 -6.06 kB

Status: 1 added / 1 removed

Graph Workspace — 960 kB (baseline 961 kB) • 🟢 -1.04 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-4cCwGr7S.js (removed) 961 kB 🟢 -961 kB 🟢 -194 kB 🟢 -147 kB
assets/GraphView-BgZeCl5N.js (new) 960 kB 🔴 +960 kB 🔴 +194 kB 🔴 +147 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-B8yM1go4.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.6 kB 🟢 -3.05 kB
assets/CloudSurveyView-BP6ZwD0A.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.6 kB 🔴 +3.05 kB
assets/CloudLoginView-CCGQeJlA.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.72 kB
assets/CloudLoginView-DHQXSRKT.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.09 kB 🔴 +2.72 kB
assets/UserCheckView-1IASiDmp.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.44 kB 🔴 +2.13 kB
assets/UserCheckView-fuAbXqEz.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.44 kB 🟢 -2.13 kB
assets/CloudLayoutView-C-D5pvJU.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.25 kB 🔴 +1.96 kB
assets/CloudLayoutView-O_MavfO4.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.24 kB 🟢 -1.95 kB
assets/CloudSignupView-Ctqibs6d.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.33 kB 🔴 +2.02 kB
assets/CloudSignupView-Dz2fqT58.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.02 kB
assets/CloudForgotPasswordView-BUZqXWsG.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/CloudForgotPasswordView-D5FTnDF9.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/UserSelectView-B_RACjjS.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/UserSelectView-Cx6OgzQc.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.58 kB
assets/CloudSubscriptionRedirectView-C3VkqXqm.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.54 kB
assets/CloudSubscriptionRedirectView-dRlAuWEl.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-B-JMwpDU.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.7 kB 🟢 -1.48 kB
assets/CloudAuthTimeoutView-BD07-Bhp.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/CloudSorryContactSupportView-BBzzzDkN.js (new) 1.97 kB 🔴 +1.97 kB 🔴 +703 B 🔴 +622 B
assets/CloudSorryContactSupportView-Db6AhoR8.js (removed) 1.97 kB 🟢 -1.97 kB 🟢 -701 B 🟢 -620 B
assets/layout-C3IYFApg.js (removed) 500 B 🟢 -500 B 🟢 -309 B 🟢 -266 B
assets/layout-Rbze1-VP.js (new) 500 B 🔴 +500 B 🔴 +308 B 🔴 +265 B

Status: 11 added / 11 removed

Panels & Settings — 471 kB (baseline 470 kB) • 🔴 +385 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settings-DaS3cSXp.js (removed) 39.4 kB 🟢 -39.4 kB 🟢 -9.43 kB 🟢 -7.5 kB
assets/settings-DjnBsCcX.js (new) 39.4 kB 🔴 +39.4 kB 🔴 +9.43 kB 🔴 +7.5 kB
assets/settings-BmGbe2N6.js (new) 35.2 kB 🔴 +35.2 kB 🔴 +8.11 kB 🔴 +6.78 kB
assets/settings-DaK-NByz.js (removed) 35.2 kB 🟢 -35.2 kB 🟢 -8.11 kB 🟢 -6.79 kB
assets/settings-2UNjEj6k.js (removed) 32.9 kB 🟢 -32.9 kB 🟢 -7.85 kB 🟢 -6.37 kB
assets/settings-DzHQYae7.js (new) 32.9 kB 🔴 +32.9 kB 🔴 +7.85 kB 🔴 +6.38 kB
assets/settings-B9wKvI1J.js (new) 32 kB 🔴 +32 kB 🔴 +8.25 kB 🔴 +6.86 kB
assets/settings-DWbMuaAa.js (removed) 32 kB 🟢 -32 kB 🟢 -8.25 kB 🟢 -6.86 kB
assets/settings-B2OMGvh7.js (removed) 31.2 kB 🟢 -31.2 kB 🟢 -7.94 kB 🟢 -6.93 kB
assets/settings-Y1z1vZwm.js (new) 31.2 kB 🔴 +31.2 kB 🔴 +7.94 kB 🔴 +6.91 kB
assets/settings-KHOuN10S.js (new) 30.4 kB 🔴 +30.4 kB 🔴 +7.79 kB 🔴 +6.8 kB
assets/settings-S7pA60Hj.js (removed) 30.4 kB 🟢 -30.4 kB 🟢 -7.79 kB 🟢 -6.79 kB
assets/settings-CfTcklGM.js (new) 30.2 kB 🔴 +30.2 kB 🔴 +7.67 kB 🔴 +6.5 kB
assets/settings-CZ62uO3e.js (removed) 30.2 kB 🟢 -30.2 kB 🟢 -7.67 kB 🟢 -6.5 kB
assets/WorkspacePanel-B7E5gLfi.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +5.89 kB 🔴 +5.15 kB
assets/WorkspacePanel-CmUQ51T7.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -5.89 kB 🟢 -5.14 kB
assets/settings-BcujOfpn.js (removed) 29.6 kB 🟢 -29.6 kB 🟢 -7.53 kB 🟢 -6.49 kB
assets/settings-Bvo_gE5u.js (new) 29.6 kB 🔴 +29.6 kB 🔴 +7.53 kB 🔴 +6.49 kB
assets/settings-BI09_t23.js (removed) 29.4 kB 🟢 -29.4 kB 🟢 -7.89 kB 🟢 -6.52 kB
assets/settings-DcSPTvwN.js (new) 29.4 kB 🔴 +29.4 kB 🔴 +7.89 kB 🔴 +6.52 kB
assets/settings-BlTun9tZ.js (removed) 26.4 kB 🟢 -26.4 kB 🟢 -7.78 kB 🟢 -6.27 kB
assets/settings-C352ZOFL.js (new) 26.4 kB 🔴 +26.4 kB 🔴 +7.78 kB 🔴 +6.27 kB
assets/settings-BKamuseh.js (removed) 25.8 kB 🟢 -25.8 kB 🟢 -7.56 kB 🟢 -5.91 kB
assets/settings-kAwy8UoQ.js (new) 25.8 kB 🔴 +25.8 kB 🔴 +7.56 kB 🔴 +5.92 kB
assets/LegacyCreditsPanel-CFuilpnR.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.94 kB 🟢 -5.22 kB
assets/LegacyCreditsPanel-D4lUWwaI.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.95 kB 🔴 +5.22 kB
assets/SubscriptionPanel-BgD9ifaY.js (removed) 21 kB 🟢 -21 kB 🟢 -5.02 kB 🟢 -4.44 kB
assets/SubscriptionPanel-DCLwEo0m.js (new) 21 kB 🔴 +21 kB 🔴 +5.02 kB 🔴 +4.44 kB
assets/KeybindingPanel-B1C4PVJH.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.74 kB 🔴 +3.31 kB
assets/KeybindingPanel-CW3Z28K3.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.74 kB 🟢 -3.31 kB
assets/AboutPanel-CVnAdUD2.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.42 kB
assets/AboutPanel-Du9-nLPk.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.43 kB
assets/ExtensionPanel-B7MaOXH0.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/ExtensionPanel-Cepbc71I.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ServerConfigPanel-CygMYdj5.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.17 kB 🟢 -1.94 kB
assets/ServerConfigPanel-Dwh9aQ8o.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.17 kB 🔴 +1.94 kB
assets/UserPanel-Ccyxwq82.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.9 kB 🟢 -1.67 kB
assets/UserPanel-OEUDhD7t.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/refreshRemoteConfig-MPaHBZft.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +571 B 🔴 +523 B
assets/config-ghbmY1AJ.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -610 B 🟢 -541 B
assets/config-C4TIGwq1.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +604 B 🔴 +532 B
assets/refreshRemoteConfig-DH379O-w.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -522 B 🟢 -452 B
assets/cloudRemoteConfig-BIhLkJvj.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -509 B 🟢 -441 B
assets/cloudRemoteConfig-DnuBKtWa.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +496 B 🔴 +428 B
assets/remoteConfig-BrsVXI_d.js (new) 788 B 🔴 +788 B 🔴 +390 B 🔴 +355 B
assets/remoteConfig-DlUK-xIk.js (removed) 536 B 🟢 -536 B 🟢 -313 B 🟢 -278 B
assets/refreshRemoteConfig-CCy4FPWE.js (new) 169 B 🔴 +169 B 🔴 +108 B 🔴 +109 B
assets/refreshRemoteConfig-uD1jKrwi.js (removed) 169 B 🟢 -169 B 🟢 -108 B 🟢 -111 B

Status: 24 added / 24 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-D_o5ioie.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.05 kB
assets/auth-iFQAAndl.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.05 kB
assets/firebaseAuthStore-BNBz0E0Q.js (removed) 217 B 🟢 -217 B 🟢 -136 B 🟢 -117 B
assets/firebaseAuthStore-DyE03TNl.js (new) 217 B 🔴 +217 B 🔴 +136 B 🔴 +116 B
assets/auth-Cm2qxuDw.js (new) 178 B 🔴 +178 B 🔴 +142 B 🔴 +146 B
assets/auth-Dq6BzZo1.js (removed) 178 B 🟢 -178 B 🟢 -140 B 🟢 -129 B

Status: 3 added / 3 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-89QsFpMg.js (removed) 2.68 kB 🟢 -2.68 kB 🟢 -1.26 kB 🟢 -1.13 kB
assets/useSubscriptionDialog-BVRBac5A.js (new) 2.68 kB 🔴 +2.68 kB 🔴 +1.26 kB 🔴 +1.12 kB
assets/useSubscriptionDialog-CcqqpLzM.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -103 B
assets/useSubscriptionDialog-D9PU56v3.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-Chjh2uTk.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.69 kB 🟢 -2.42 kB
assets/ComfyQueueButton-IyZENshF.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.42 kB
assets/TopbarBadge-BISB98D1.js (removed) 8.36 kB 🟢 -8.36 kB 🟢 -1.97 kB 🟢 -1.76 kB
assets/TopbarBadge-CGy2FpT1.js (new) 8.36 kB 🔴 +8.36 kB 🔴 +1.97 kB 🔴 +1.76 kB
assets/SubscribeButton-CuGy_JN-.js (new) 4.63 kB 🔴 +4.63 kB 🔴 +1.56 kB 🔴 +1.39 kB
assets/SubscribeButton-Vl1ApDHW.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.56 kB 🟢 -1.39 kB
assets/Button-hzNlXzDK.js (new) 3.82 kB 🔴 +3.82 kB 🔴 +1.39 kB 🔴 +1.23 kB
assets/Button-iHso5Wzi.js (removed) 3.82 kB 🟢 -3.82 kB 🟢 -1.38 kB 🟢 -1.23 kB
assets/WidgetButton-B6DswKC4.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -980 B 🟢 -894 B
assets/WidgetButton-DUixEvZU.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +979 B 🔴 +890 B
assets/CloudBadge-DHwvysLJ.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +720 B 🔴 +649 B
assets/CloudBadge-W_53dSio.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -719 B 🟢 -640 B
assets/UserAvatar-CndbQENT.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -725 B 🟢 -635 B
assets/UserAvatar-CWRrnxl9.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +725 B 🔴 +637 B
assets/cloudFeedbackTopbarButton-CDgatCi3.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -674 B 🟢 -574 B
assets/cloudFeedbackTopbarButton-DeykxCgz.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +677 B 🔴 +574 B
assets/ComfyQueueButton-BVYDXYho.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +106 B
assets/ComfyQueueButton-WjDiC3bi.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -112 B

Status: 9 added / 9 removed

Data & Services — 2.7 MB (baseline 2.7 MB) • 🔴 +289 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-6yJAy0Cd.js (new) 2.01 MB 🔴 +2.01 MB 🔴 +424 kB 🔴 +323 kB
assets/dialogService-CMKgHL2U.js (removed) 2 MB 🟢 -2 MB 🟢 -424 kB 🟢 -323 kB
assets/api-CUZar__o.js (new) 672 kB 🔴 +672 kB 🔴 +148 kB 🔴 +118 kB
assets/api-BxpyfNHD.js (removed) 672 kB 🟢 -672 kB 🟢 -148 kB 🟢 -118 kB
assets/releaseStore-BKG421Xd.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.4 kB 🟢 -2.12 kB
assets/releaseStore-BmIp_sbe.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.4 kB 🔴 +2.12 kB
assets/keybindingService-Bfz97_zO.js (new) 6.78 kB 🔴 +6.78 kB 🔴 +1.75 kB 🔴 +1.52 kB
assets/keybindingService-DR9LDfFf.js (removed) 6.78 kB 🟢 -6.78 kB 🟢 -1.74 kB 🟢 -1.52 kB
assets/bootstrapStore-Dlb4PsIR.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.03 kB 🔴 +949 B
assets/bootstrapStore-vaFLnteM.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.03 kB 🟢 -957 B
assets/serverConfigStore-rKMIA1W-.js (removed) 2.64 kB 🟢 -2.64 kB 🟢 -877 B 🟢 -778 B
assets/serverConfigStore-V1hr6NOk.js (new) 2.64 kB 🔴 +2.64 kB 🔴 +876 B 🔴 +773 B
assets/userStore-B1jA9N3L.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +810 B 🔴 +725 B
assets/userStore-haHGH15q.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -812 B 🟢 -723 B
assets/audioService-CDU4aVV3.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +930 B 🔴 +810 B
assets/audioService-CIws7PFa.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -930 B 🟢 -810 B
assets/teamWorkspaceStore-D16H_UXL.js (removed) 165 B 🟢 -165 B 🟢 -123 B 🟢 -108 B
assets/releaseStore-gxfxeS_I.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +105 B
assets/releaseStore-nD0YooGd.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -106 B

Status: 9 added / 10 removed

Utilities & Hooks — 25.3 kB (baseline 25.2 kB) • 🔴 +91 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/colorUtil-D9PHPF1v.js (removed) 7.2 kB 🟢 -7.2 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/colorUtil-DLyjcs70.js (new) 7.2 kB 🔴 +7.2 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/useErrorHandling-CytTtj6o.js (new) 5.21 kB 🔴 +5.21 kB 🔴 +1.53 kB 🔴 +1.34 kB
assets/useErrorHandling-ClsEFEk3.js (removed) 5.12 kB 🟢 -5.12 kB 🟢 -1.51 kB 🟢 -1.32 kB
assets/useWorkspaceUI-B8FH4m4M.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -974 B 🟢 -841 B
assets/useWorkspaceUI-D6jfsYlX.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +975 B 🔴 +844 B
assets/useSubscriptionActions-dCxwnUCv.js (removed) 2.22 kB 🟢 -2.22 kB 🟢 -867 B 🟢 -762 B
assets/useSubscriptionActions-F-PRKp2k.js (new) 2.22 kB 🔴 +2.22 kB 🔴 +868 B 🔴 +762 B
assets/subscriptionCheckoutUtil-BkMV_4qn.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +874 B 🔴 +770 B
assets/subscriptionCheckoutUtil-DYgNq7UG.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -874 B 🟢 -770 B
assets/markdownRendererUtil-BaRQfvQB.js (removed) 1.78 kB 🟢 -1.78 kB 🟢 -885 B 🟢 -774 B
assets/markdownRendererUtil-Bi2cfnIy.js (new) 1.78 kB 🔴 +1.78 kB 🔴 +884 B 🔴 +773 B
assets/useSubscriptionCredits-BFMCFTKq.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +599 B 🔴 +529 B
assets/useSubscriptionCredits-kgMTqosi.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -597 B 🟢 -528 B
assets/audioUtils-BRB0NCNE.js (removed) 970 B 🟢 -970 B 🟢 -547 B 🟢 -484 B
assets/audioUtils-CGXesUuj.js (new) 970 B 🔴 +970 B 🔴 +547 B 🔴 +491 B
assets/tailwindUtil-BZpXL7of.js (removed) 488 B 🟢 -488 B 🟢 -296 B 🟢 -269 B
assets/tailwindUtil-Dm8WXWty.js (new) 488 B 🔴 +488 B 🔴 +297 B 🔴 +269 B
assets/useCurrentUser-Bd2pwgeO.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -98 B
assets/useCurrentUser-DHvILGaW.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +99 B
assets/_plugin-vue_export-helper-DuK_Fly3.js 467 B 467 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-C6rCU2OI.js (new) 4.1 MB 🔴 +4.1 MB 🔴 +869 kB 🔴 +674 kB
assets/vendor-other-CqVFsPgr.js (removed) 4.1 MB 🟢 -4.1 MB 🟢 -869 kB 🟢 -674 kB
assets/vendor-primevue-bkmKwsUf.js (removed) 3.04 MB 🟢 -3.04 MB 🟢 -560 kB 🟢 -329 kB
assets/vendor-primevue-VBlLkufO.js (new) 3.04 MB 🔴 +3.04 MB 🔴 +560 kB 🔴 +329 kB
assets/vendor-chart-BD4LLnJB.js (removed) 408 kB 🟢 -408 kB 🟢 -98.6 kB 🟢 -80.6 kB
assets/vendor-chart-dHjzWL-2.js (new) 408 kB 🔴 +408 kB 🔴 +98.6 kB 🔴 +80.6 kB
assets/vendor-reka-ui-CR4RbTw1.js (new) 256 kB 🔴 +256 kB 🔴 +50.6 kB 🔴 +42.1 kB
assets/vendor-reka-ui-DCUHeuwM.js (removed) 256 kB 🟢 -256 kB 🟢 -50.6 kB 🟢 -42.1 kB
assets/vendor-vue-BiXzLAAm.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -4.38 kB 🟢 -3.92 kB
assets/vendor-vue-VB6jWz3M.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +4.37 kB 🔴 +3.91 kB
assets/vendor-three-BeIVXtul.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-DdP0ccEc.js 650 kB 650 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-Ce2gRtuj.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Other — 7.04 MB (baseline 7.04 MB) • 🟢 -195 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-DRm-ok3j.js (removed) 496 kB 🟢 -496 kB 🟢 -95.8 kB 🟢 -71.4 kB
assets/i18n-DyLIWZ1Y.js (new) 496 kB 🔴 +496 kB 🔴 +95.8 kB 🔴 +71.4 kB
assets/nodeDefs-Bg1UEeRw.js (removed) 448 kB 🟢 -448 kB 🟢 -69.9 kB 🟢 -45.2 kB
assets/nodeDefs-W4n6VSIV.js (new) 448 kB 🔴 +448 kB 🔴 +69.9 kB 🔴 +45.2 kB
assets/nodeDefs-B68z80AD.js (removed) 413 kB 🟢 -413 kB 🟢 -63.4 kB 🟢 -41.8 kB
assets/nodeDefs-B8DCf1mS.js (new) 413 kB 🔴 +413 kB 🔴 +63.4 kB 🔴 +41.8 kB
assets/nodeDefs-BlUt4zjH.js (new) 412 kB 🔴 +412 kB 🔴 +65.4 kB 🔴 +43.2 kB
assets/nodeDefs-qCfy7PeV.js (removed) 412 kB 🟢 -412 kB 🟢 -65.4 kB 🟢 -43.1 kB
assets/nodeDefs-DiynUDVW.js (new) 383 kB 🔴 +383 kB 🔴 +63.8 kB 🔴 +41.6 kB
assets/nodeDefs-DxR-7ogK.js (removed) 383 kB 🟢 -383 kB 🟢 -63.8 kB 🟢 -41.6 kB
assets/nodeDefs-CinCueZ7.js (removed) 373 kB 🟢 -373 kB 🟢 -62.5 kB 🟢 -41.2 kB
assets/nodeDefs-Dk1oqXg6.js (new) 373 kB 🔴 +373 kB 🔴 +62.5 kB 🔴 +41.3 kB
assets/nodeDefs-NvS3ne6s.js (new) 369 kB 🔴 +369 kB 🔴 +60.9 kB 🔴 +41.7 kB
assets/nodeDefs-xDY-sSQw.js (removed) 369 kB 🟢 -369 kB 🟢 -60.9 kB 🟢 -41.7 kB
assets/nodeDefs-DKHHBXVW.js (removed) 369 kB 🟢 -369 kB 🟢 -62.2 kB 🟢 -42.6 kB
assets/nodeDefs-SBfEQMMs.js (new) 369 kB 🔴 +369 kB 🔴 +62.2 kB 🔴 +42.4 kB
assets/nodeDefs-BAFHrj6M.js (new) 366 kB 🔴 +366 kB 🔴 +59.8 kB 🔴 +41 kB
assets/nodeDefs-DgzjkU5p.js (removed) 366 kB 🟢 -366 kB 🟢 -59.8 kB 🟢 -41 kB
assets/nodeDefs-B0UaQKt6.js (removed) 363 kB 🟢 -363 kB 🟢 -59 kB 🟢 -40.3 kB
assets/nodeDefs-cE9XzsAm.js (new) 363 kB 🔴 +363 kB 🔴 +59 kB 🔴 +40.3 kB
assets/nodeDefs-BuHiqTYg.js (new) 342 kB 🔴 +342 kB 🔴 +61.2 kB 🔴 +40.3 kB
assets/nodeDefs-Dn1Haq99.js (removed) 342 kB 🟢 -342 kB 🟢 -61.2 kB 🟢 -40.3 kB
assets/nodeDefs-CicFSATk.js (removed) 339 kB 🟢 -339 kB 🟢 -60.2 kB 🟢 -39 kB
assets/nodeDefs-DpRc9McY.js (new) 339 kB 🔴 +339 kB 🔴 +60.2 kB 🔴 +39 kB
assets/core-Byp-5_X-.js (removed) 180 kB 🟢 -180 kB 🟢 -43.3 kB 🟢 -36.2 kB
assets/core-DXG3F8pr.js (new) 180 kB 🔴 +180 kB 🔴 +43.3 kB 🔴 +36.2 kB
assets/main-BdcuOtW_.js (new) 172 kB 🔴 +172 kB 🔴 +45.5 kB 🔴 +36.1 kB
assets/main-DVGct6t3.js (removed) 172 kB 🟢 -172 kB 🟢 -45.5 kB 🟢 -36 kB
assets/main-C1_ALuzX.js (new) 154 kB 🔴 +154 kB 🔴 +41 kB 🔴 +33.1 kB
assets/main-mdvCJJpq.js (removed) 154 kB 🟢 -154 kB 🟢 -41 kB 🟢 -33.1 kB
assets/main-Do-oawDh.js (removed) 150 kB 🟢 -150 kB 🟢 -41.1 kB 🟢 -32.8 kB
assets/main-DrWtIub4.js (new) 150 kB 🔴 +150 kB 🔴 +41.1 kB 🔴 +32.8 kB
assets/main-Dgyoixz9.js (new) 143 kB 🔴 +143 kB 🔴 +40.9 kB 🔴 +32.8 kB
assets/main-DpM2tcEq.js (removed) 143 kB 🟢 -143 kB 🟢 -40.9 kB 🟢 -32.7 kB
assets/main-CuMAi0Yg.js (new) 132 kB 🔴 +132 kB 🔴 +39.6 kB 🔴 +33.2 kB
assets/main-DcPG2fUX.js (removed) 132 kB 🟢 -132 kB 🟢 -39.6 kB 🟢 -33.2 kB
assets/main-B-fN60cC.js (removed) 129 kB 🟢 -129 kB 🟢 -38.9 kB 🟢 -31.4 kB
assets/main-nzg6hhK8.js (new) 129 kB 🔴 +129 kB 🔴 +38.9 kB 🔴 +31.4 kB
assets/main-BAsVw_VR.js (new) 128 kB 🔴 +128 kB 🔴 +38.4 kB 🔴 +31.8 kB
assets/main-DQY0Poqn.js (removed) 128 kB 🟢 -128 kB 🟢 -38.4 kB 🟢 -31.8 kB
assets/main-DZ27z6-O.js (new) 125 kB 🔴 +125 kB 🔴 +38.6 kB 🔴 +32.3 kB
assets/main-Fbu5slCi.js (removed) 125 kB 🟢 -125 kB 🟢 -38.6 kB 🟢 -32.3 kB
assets/main-_Vi60AGa.js (removed) 125 kB 🟢 -125 kB 🟢 -38 kB 🟢 -31.9 kB
assets/main-CueKFh2S.js (new) 125 kB 🔴 +125 kB 🔴 +38 kB 🔴 +31.9 kB
assets/main-3xQXroMq.js (removed) 112 kB 🟢 -112 kB 🟢 -38.1 kB 🟢 -30.3 kB
assets/main-BjdhOMKP.js (new) 112 kB 🔴 +112 kB 🔴 +38.1 kB 🔴 +30.2 kB
assets/main-CawlsjrP.js (new) 111 kB 🔴 +111 kB 🔴 +38.1 kB 🔴 +30 kB
assets/main-DFa_s6l5.js (removed) 111 kB 🟢 -111 kB 🟢 -38.1 kB 🟢 -30.1 kB
assets/WidgetSelect-bbssv8rz.js (new) 51 kB 🔴 +51 kB 🔴 +11.2 kB 🔴 +9.85 kB
assets/WidgetSelect-DccDeIpU.js (removed) 51 kB 🟢 -51 kB 🟢 -11.2 kB 🟢 -9.8 kB
assets/Load3DControls-Bjgy4JNJ.js (removed) 35.9 kB 🟢 -35.9 kB 🟢 -5.87 kB 🟢 -5.08 kB
assets/Load3DControls-CmVB_A43.js (new) 35.9 kB 🔴 +35.9 kB 🔴 +5.87 kB 🔴 +5.08 kB
assets/SubscriptionRequiredDialogContent-DX2rClvJ.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.79 kB 🟢 -5.91 kB
assets/SubscriptionRequiredDialogContent-swsy5LaL.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.79 kB 🔴 +5.93 kB
assets/CurrentUserPopoverWorkspace-B3yY8v2q.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +4.99 kB 🔴 +4.43 kB
assets/CurrentUserPopoverWorkspace-Dy5N0t6V.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -4.99 kB 🟢 -4.43 kB
assets/Load3D-DfjCD0Zt.js (removed) 20.9 kB 🟢 -20.9 kB 🟢 -4.58 kB 🟢 -4.01 kB
assets/Load3D-YwaNgxdJ.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +4.58 kB 🔴 +4.01 kB
assets/commands-CSE42kAA.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +3.96 kB 🔴 +3.07 kB
assets/commands-DXauvccL.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -3.96 kB 🟢 -3.09 kB
assets/commands-C6piRza5.js (removed) 19.3 kB 🟢 -19.3 kB 🟢 -3.68 kB 🟢 -2.87 kB
assets/commands-DKwvlJiD.js (new) 19.3 kB 🔴 +19.3 kB 🔴 +3.68 kB 🔴 +2.83 kB
assets/commands-CX9qSh0Y.js (new) 19.3 kB 🔴 +19.3 kB 🔴 +3.7 kB 🔴 +2.91 kB
assets/commands-D1595tOr.js (removed) 19.3 kB 🟢 -19.3 kB 🟢 -3.69 kB 🟢 -2.9 kB
assets/commands-Cf8Zq1td.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -3.79 kB 🟢 -2.93 kB
assets/commands-DgvoXt0v.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +3.79 kB 🔴 +2.93 kB
assets/commands-BEw5ErI4.js (removed) 18.5 kB 🟢 -18.5 kB 🟢 -3.52 kB 🟢 -2.92 kB
assets/commands-CEbEylFJ.js (new) 18.5 kB 🔴 +18.5 kB 🔴 +3.52 kB 🔴 +2.92 kB
assets/WidgetRecordAudio-B6lYY8aB.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.97 kB 🟢 -4.44 kB
assets/WidgetRecordAudio-DyQFOe1R.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.97 kB 🔴 +4.43 kB
assets/WidgetInputNumber-BOBFtkxI.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.51 kB 🟢 -4.01 kB
assets/WidgetInputNumber-CCttpWcG.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.51 kB 🔴 +4.01 kB
assets/SubscriptionPanelContentWorkspace-B3kK4mBp.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.47 kB 🟢 -3.89 kB
assets/SubscriptionPanelContentWorkspace-DImdZ2RR.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.47 kB 🔴 +3.9 kB
assets/commands-KhEZ5Fo9.js (new) 18 kB 🔴 +18 kB 🔴 +3.51 kB 🔴 +2.9 kB
assets/commands-P5QCEfZc.js (removed) 18 kB 🟢 -18 kB 🟢 -3.51 kB 🟢 -2.88 kB
assets/commands-B5unjTgE.js (new) 18 kB 🔴 +18 kB 🔴 +3.4 kB 🔴 +2.76 kB
assets/commands-CiziP3Xs.js (removed) 18 kB 🟢 -18 kB 🟢 -3.39 kB 🟢 -2.78 kB
assets/commands-BGeHkplA.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -3.35 kB 🟢 -2.77 kB
assets/commands-BsP-x5ri.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +3.36 kB 🔴 +2.77 kB
assets/commands-C_Y3D6Cn.js (removed) 17.8 kB 🟢 -17.8 kB 🟢 -3.65 kB 🟢 -2.84 kB
assets/commands-DQuDUlM5.js (new) 17.8 kB 🔴 +17.8 kB 🔴 +3.65 kB 🔴 +2.84 kB
assets/commands-BV0l36Iz.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -3.57 kB 🟢 -2.73 kB
assets/commands-Dk-PWJsO.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +3.57 kB 🔴 +2.73 kB
assets/WidgetImageCrop-ByAbpMIH.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.14 kB 🔴 +3.63 kB
assets/WidgetImageCrop-DccWChT1.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.63 kB
assets/commands-BtcJfAd5.js (new) 17 kB 🔴 +17 kB 🔴 +3.54 kB 🔴 +2.64 kB
assets/commands-WbYP_D61.js (removed) 17 kB 🟢 -17 kB 🟢 -3.54 kB 🟢 -2.64 kB
assets/PanelTemplate-CwtxqMka.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.45 kB 🟢 -4.8 kB
assets/PanelTemplate-nUM5xxiY.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.8 kB
assets/LazyImage-D0QBx17q.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -4 kB 🟢 -3.54 kB
assets/LazyImage-D5HGD2sm.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +4 kB 🔴 +3.54 kB
assets/AudioPreviewPlayer-Bsi1pUOh.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.97 kB 🔴 +2.66 kB
assets/AudioPreviewPlayer-D4uPDL4H.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.97 kB 🟢 -2.66 kB
assets/InviteMemberDialogContent-Be9QwLZM.js (removed) 8.36 kB 🟢 -8.36 kB 🟢 -2.51 kB 🟢 -2.16 kB
assets/InviteMemberDialogContent-DjwmUBKK.js (new) 8.36 kB 🔴 +8.36 kB 🔴 +2.51 kB 🔴 +2.17 kB
assets/WidgetWithControl-DtSBvVSu.js (new) 8.04 kB 🔴 +8.04 kB 🔴 +2.65 kB 🔴 +2.39 kB
assets/WidgetWithControl-DU_5Zz4K.js (removed) 8.04 kB 🟢 -8.04 kB 🟢 -2.66 kB 🟢 -2.39 kB
assets/CreateWorkspaceDialogContent-CFHVNJqH.js (removed) 5.93 kB 🟢 -5.93 kB 🟢 -1.93 kB 🟢 -1.68 kB
assets/CreateWorkspaceDialogContent-Csv7KLm_.js (new) 5.93 kB 🔴 +5.93 kB 🔴 +1.93 kB 🔴 +1.68 kB
assets/EditWorkspaceDialogContent-B4lPM0i2.js (new) 5.7 kB 🔴 +5.7 kB 🔴 +1.88 kB 🔴 +1.65 kB
assets/EditWorkspaceDialogContent-U8zxfLM6.js (removed) 5.7 kB 🟢 -5.7 kB 🟢 -1.88 kB 🟢 -1.64 kB
assets/ValueControlPopover-BnKya4K3.js (new) 5.17 kB 🔴 +5.17 kB 🔴 +1.69 kB 🔴 +1.5 kB
assets/ValueControlPopover-CohIsDA5.js (removed) 5.17 kB 🟢 -5.17 kB 🟢 -1.69 kB 🟢 -1.5 kB
assets/WidgetBoundingBox-CdPxGIkA.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.13 kB 🔴 +992 B
assets/WidgetBoundingBox-DClY9LmH.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.13 kB 🟢 -1.01 kB
assets/DeleteWorkspaceDialogContent-Bht-E7gN.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.56 kB 🟢 -1.35 kB
assets/DeleteWorkspaceDialogContent-C-EOYT3h.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.57 kB 🔴 +1.35 kB
assets/WidgetGalleria-CYuetUyx.js (new) 4.57 kB 🔴 +4.57 kB 🔴 +1.56 kB 🔴 +1.42 kB
assets/WidgetGalleria-DmU86G89.js (removed) 4.57 kB 🟢 -4.57 kB 🟢 -1.57 kB 🟢 -1.42 kB
assets/LeaveWorkspaceDialogContent-Cp3KeAHg.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.5 kB 🔴 +1.3 kB
assets/LeaveWorkspaceDialogContent-D6TQgf27.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.51 kB 🟢 -1.3 kB
assets/RemoveMemberDialogContent-CY1nXNZJ.js (new) 4.38 kB 🔴 +4.38 kB 🔴 +1.46 kB 🔴 +1.27 kB
assets/RemoveMemberDialogContent-Dn7wWiZG.js (removed) 4.38 kB 🟢 -4.38 kB 🟢 -1.45 kB 🟢 -1.27 kB
assets/RevokeInviteDialogContent-D3XUG9j8.js (new) 4.29 kB 🔴 +4.29 kB 🔴 +1.47 kB 🔴 +1.29 kB
assets/RevokeInviteDialogContent-DLTYfCPD.js (removed) 4.29 kB 🟢 -4.29 kB 🟢 -1.47 kB 🟢 -1.29 kB
assets/Slider-C5sanYDO.js (new) 4.21 kB 🔴 +4.21 kB 🔴 +1.51 kB 🔴 +1.34 kB
assets/Slider-DOV35UxE.js (removed) 4.21 kB 🟢 -4.21 kB 🟢 -1.52 kB 🟢 -1.34 kB
assets/WidgetImageCompare-DG_IjzLF.js (new) 3.79 kB 🔴 +3.79 kB 🔴 +1.28 kB 🔴 +1.12 kB
assets/WidgetImageCompare-DsYV0YHu.js (removed) 3.79 kB 🟢 -3.79 kB 🟢 -1.28 kB 🟢 -1.12 kB
assets/WidgetColorPicker-BgT2fava.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.37 kB 🔴 +1.25 kB
assets/WidgetColorPicker-BS_tCS3h.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.38 kB 🟢 -1.25 kB
assets/WidgetTextarea-DwEtzm2X.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.33 kB 🟢 -1.17 kB
assets/WidgetTextarea-FfGbecfC.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.33 kB 🔴 +1.17 kB
assets/WidgetMarkdown-CeUTWczT.js (new) 3.22 kB 🔴 +3.22 kB 🔴 +1.28 kB 🔴 +1.13 kB
assets/WidgetMarkdown-reAHF2_w.js (removed) 3.22 kB 🟢 -3.22 kB 🟢 -1.28 kB 🟢 -1.14 kB
assets/WidgetToggleSwitch-ByONd5aY.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.19 kB 🟢 -1.06 kB
assets/WidgetToggleSwitch-Cu4DaH99.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.19 kB 🔴 +1.09 kB
assets/GlobalToast-DA9TJCwh.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -946 B
assets/GlobalToast-i_wj-KWq.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +939 B
assets/SubscribeToRun-b2HnldmM.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.15 kB 🟢 -1.04 kB
assets/SubscribeToRun-CwTrfSdd.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.15 kB 🔴 +1.01 kB
assets/cloudSessionCookie-BnS3lcHk.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +927 B 🔴 +803 B
assets/cloudSessionCookie-CBR3Lg6_.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -928 B 🟢 -805 B
assets/MediaVideoTop-ChOx-pbs.js (new) 2.82 kB 🔴 +2.82 kB 🔴 +1.05 kB 🔴 +911 B
assets/MediaVideoTop-WHbgZ4CI.js (removed) 2.82 kB 🟢 -2.82 kB 🟢 -1.05 kB 🟢 -910 B
assets/WidgetChart-BflopHUr.js (new) 2.79 kB 🔴 +2.79 kB 🔴 +1.05 kB 🔴 +959 B
assets/WidgetChart-c8c4iM6B.js (removed) 2.79 kB 🟢 -2.79 kB 🟢 -1.06 kB 🟢 -971 B
assets/WidgetLayoutField-B6sR-d_3.js (new) 2.61 kB 🔴 +2.61 kB 🔴 +1 kB 🔴 +888 B
assets/WidgetLayoutField-CZ7gBw6n.js (removed) 2.61 kB 🟢 -2.61 kB 🟢 -1 kB 🟢 -893 B
assets/WidgetInputText-BLB-l7ow.js (new) 2.58 kB 🔴 +2.58 kB 🔴 +1.01 kB 🔴 +908 B
assets/WidgetInputText-DXduTo3L.js (removed) 2.58 kB 🟢 -2.58 kB 🟢 -1.01 kB 🟢 -910 B
assets/BaseViewTemplate-BE4Pp4cc.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -938 B
assets/BaseViewTemplate-DtitMaCB.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +939 B
assets/Media3DTop-B5p5daPP.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +1.02 kB 🔴 +879 B
assets/Media3DTop-CUbzOuTJ.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -1.02 kB 🟢 -873 B
assets/MediaImageTop-C7M85A9X.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.01 kB 🔴 +873 B
assets/MediaImageTop-sHKcENPZ.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1 kB 🟢 -876 B
assets/MediaAudioTop-BYIydMOt.js (removed) 2 kB 🟢 -2 kB 🟢 -882 B 🟢 -760 B
assets/MediaAudioTop-LOmU6GXe.js (new) 2 kB 🔴 +2 kB 🔴 +883 B 🔴 +761 B
assets/CloudRunButtonWrapper-BnFL5Gk3.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +645 B 🔴 +564 B
assets/CloudRunButtonWrapper-DQjqgVcB.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -642 B 🟢 -560 B
assets/auto-IxU1eXFy.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +637 B 🔴 +565 B
assets/auto-RHVQpwL9.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -637 B 🟢 -565 B
assets/widgetPropFilter-BtBp3h_n.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +568 B 🔴 +507 B
assets/widgetPropFilter-ERx8czR8.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -569 B 🟢 -506 B
assets/cloudBadges-IDqLaJFv.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -537 B 🟢 -499 B
assets/cloudBadges-qFYdvgSe.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +538 B 🔴 +480 B
assets/graphHasMissingNodes-C8aYgTOz.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +461 B 🔴 +415 B
assets/graphHasMissingNodes-CMIewLI5.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -461 B 🟢 -416 B
assets/cloudSubscription-CKU2xmc6.js (removed) 976 B 🟢 -976 B 🟢 -460 B 🟢 -398 B
assets/cloudSubscription-Yee9TB2y.js (new) 976 B 🔴 +976 B 🔴 +462 B 🔴 +399 B
assets/previousFullPath-0kMFfOzo.js (new) 838 B 🔴 +838 B 🔴 +415 B 🔴 +383 B
assets/previousFullPath-CmezY7As.js (removed) 838 B 🟢 -838 B 🟢 -414 B 🟢 -380 B
assets/nightlyBadges-BDXWqkG4.js (removed) 595 B 🟢 -595 B 🟢 -358 B 🟢 -309 B
assets/nightlyBadges-DYvfIAy6.js (new) 595 B 🔴 +595 B 🔴 +358 B 🔴 +310 B
assets/SubscriptionPanelContentWorkspace-sOt1H5Pg.js (removed) 266 B 🟢 -266 B 🟢 -136 B 🟢 -117 B
assets/SubscriptionPanelContentWorkspace-wMRKjPG6.js (new) 266 B 🔴 +266 B 🔴 +136 B 🔴 +120 B
assets/i18n-Ckejo70h.js (new) 188 B 🔴 +188 B 🔴 +151 B 🔴 +128 B
assets/i18n-tJosGSDW.js (removed) 188 B 🟢 -188 B 🟢 -151 B 🟢 -129 B
assets/WidgetBoundingBox-BTNRImOa.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -114 B
assets/WidgetBoundingBox-kYf5x876.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +116 B
assets/WidgetInputNumber-D_ZlChZc.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +107 B
assets/WidgetInputNumber-D5M3InzM.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -111 B
assets/WidgetLegacy-D9BMai6R.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -109 B
assets/WidgetLegacy-DrOIQw4_.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +104 B
assets/mixpanel.module-DaC789SX.js (new) 143 B 🔴 +143 B 🔴 +125 B 🔴 +107 B
assets/mixpanel.module-Dary_meB.js (removed) 143 B 🟢 -143 B 🟢 -125 B 🟢 -106 B
assets/Load3D-CzMIlzs7.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -106 B
assets/Load3D-DLpmE3Vp.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +100 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
assets/widget-BJiJuR5i.js 518 B 518 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 90 added / 90 removed

@simula-r simula-r marked this pull request as ready for review January 28, 2026 02:47
@simula-r simula-r requested a review from a team as a code owner January 28, 2026 02:47
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jan 28, 2026
@simula-r simula-r 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 28, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

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

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

32-45: Set remoteConfigState to error for any non‑OK response.
Line 40 logs failures, but only 401/403 update the state (Line 41-45). Other HTTP failures (e.g., 500) leave the state unchanged, which can keep auth gating or feature flags stuck on a stale state.

🔧 Suggested fix
     console.warn('Failed to load remote config:', response.statusText)
     if (response.status === 401 || response.status === 403) {
       window.__CONFIG__ = {}
       remoteConfig.value = {}
-      remoteConfigState.value = 'error'
     }
+    remoteConfigState.value = 'error'
As per coding guidelines: Implement proper error handling.
🤖 Fix all issues with AI agents
In `@src/components/auth/WorkspaceAuthGate.vue`:
- Around line 1-9: Replace the PrimeVue ProgressSpinner usage in
WorkspaceAuthGate.vue with the project-standard loading component (e.g., import
and use the shared FullscreenLoader or LoadingSpinner from src/components/) and
remove any PrimeVue-specific imports; render that component in place of
<ProgressSpinner /> inside the v-else block. Also replace the hardcoded z-[1100]
with the theme design token (use the CSS variable or class token used across the
project, e.g., use style/class that references --z-overlay or the project's
overlay z-index token) so the wrapper uses the centralized z-index token instead
of an arbitrary number.

In `@src/stores/firebaseAuthStore.ts`:
- Around line 252-275: The workspace token retrieval and expiry-check logic is
duplicated between getAuthToken and getAuthHeader; extract that shared logic
into a single helper (e.g., getValidWorkspaceToken or retrieveWorkspaceToken)
and have both getAuthToken and getAuthHeader call it; the helper should read
WORKSPACE_STORAGE_KEYS.TOKEN and WORKSPACE_STORAGE_KEYS.EXPIRES_AT from
sessionStorage, parse and validate the expiry (apply any buffer logic there),
and return the token or undefined so both functions use the same validation
behavior.

Comment on lines +1 to +9
<template>
<slot v-if="isReady" />
<div
v-else
class="fixed inset-0 z-[1100] flex items-center justify-center bg-[var(--p-mask-background)]"
>
<ProgressSpinner />
</div>
</template>
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check for existing loading/spinner components and z-index usage patterns
echo "=== Existing spinner/loading components in Vue files ==="
fd -e vue | xargs rg -l -i 'spinner|loading' 2>/dev/null | head -20

echo ""
echo "=== Search for ProgressSpinner usage ==="
rg 'ProgressSpinner' --type vue --type ts | head -20

echo ""
echo "=== Check for alternative loading indicators ==="
fd -e vue -path "*/components/*" | xargs rg -l -i 'loading|spinner' 2>/dev/null | head -20

echo ""
echo "=== z-index values in the codebase ==="
rg 'z-\[' --type vue --type ts | grep -E 'z-\[[0-9]{3,}' | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2556


🏁 Script executed:

#!/bin/bash
# Read the actual file to see what's being used
echo "=== Full WorkspaceAuthGate.vue file ==="
cat -n src/components/auth/WorkspaceAuthGate.vue

echo ""
echo "=== Search for imports of ProgressSpinner in the codebase ==="
rg 'import.*ProgressSpinner|from.*ProgressSpinner' 

echo ""
echo "=== Search for z-index definitions and arbitrary values ==="
rg 'z-\[' src/ --no-heading | head -20

echo ""
echo "=== Look for common loading/spinner alternatives ==="
fd -type f -name '*.vue' -path '*/components/*' | xargs grep -l 'loading\|spinner' 2>/dev/null | head -10

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 8139


🏁 Script executed:

#!/bin/bash
# Check for z-index design tokens or theme values
echo "=== Search for z-index in CSS/theme files ==="
find src -name '*.css' -o -name 'style.*' | xargs grep -n 'z-index' 2>/dev/null | head -20

echo ""
echo "=== Check for tailwind z-index configuration ==="
cat tailwind.config.ts 2>/dev/null | grep -A 20 'zIndex' || echo "Config check completed"

echo ""
echo "=== Look for custom loading/spinner components in src/components ==="
fd -type f -name '*.vue' src/components/ | xargs grep -l 'spinner\|loading' -i 2>/dev/null | head -10

echo ""
echo "=== Check style.css for semantic z-index values ==="
grep -n 'z-index\|--.*z' src/style.css 2>/dev/null | head -15

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 781


🏁 Script executed:

#!/bin/bash
# Check if Suspense is used in similar auth/init gate patterns
echo "=== Search for Suspense usage in Vue components ==="
rg 'Suspense|<Suspense' src/ --no-heading | head -15

echo ""
echo "=== Check if there are similar auth gate components ==="
fd -type f -name '*[Aa]uth*[Gg]ate*.vue' src/

echo ""
echo "=== Check the main App.vue to see how it handles initial loading ==="
head -50 src/App.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2601


Replace PrimeVue ProgressSpinner with a custom loading component.

Per coding guidelines, "Avoid new usage of PrimeVue components." Consider using a project-standard loading indicator from src/components/ or implementing a simple spinner alternative.

Also, the z-[1100] hardcoded value should use a design token instead of an arbitrary number to maintain consistency with the theme system and avoid conflicts with other overlays.

🧰 Tools
🪛 ESLint

[error] 1-1: Resolve error: EACCES: permission denied, open '/iVKfOXJLLN'
at Object.writeFileSync (node:fs:2409:20)
at l (file:///home/jailuser/git/node_modules/.pnpm/get-tsconfig@4.10.1/node_modules/get-tsconfig/dist/index.mjs:7:13670)
at createFilesMatcher (file:///home/jailuser/git/node_modules/.pnpm/get-tsconfig@4.10.1/node_modules/get-tsconfig/dist/index.mjs:7:14422)
at resolve (file:///home/jailuser/git/node_modules/.pnpm/eslint-import-resolver-typescript@4.4.4_eslint-plugin-import-x@4.16.1_@typescript-eslin_44eddb5b99ae4bce470e6fb9a90221ee/node_modules/eslint-import-resolver-typescript/lib/index.js:70:65)
at Object.resolve (file:///home/jailuser/git/node_modules/.pnpm/eslint-import-resolver-typescript@4.4.4_eslint-plugin-import-x@4.16.1_@typescript-eslin_44eddb5b99ae4bce470e6fb9a90221ee/node_modules/eslint-import-resolver-typescript/lib/index.js:147:20)
at file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:69
at setRuleContext (/home/jailuser/git/node_modules/.pnpm/eslint-import-context@0.1.9_unrs-resolver@1.11.1/node_modules/eslint-import-context/lib/index.js:23:20)
at fullResolve (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:30)
at relative (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:215:12)
at resolve (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:220:16)
at checkSourceValue (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/rules/no-unresolved.js:31:34)
at checkSourceValue (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:14:9)
at checkSource (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:17:9)
at ruleErrorHandler (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:1173:33)
at /home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/source-code-visitor.js:76:46
at Array.forEach ()
at SourceCodeVisitor.callSync (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/source-code-visitor.js:76:30)
at /home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/source-code-traverser.js:291:18
at Array.forEach ()
at SourceCodeTraverser.traverseSync (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/source-code-traverser.js:290:10)
at runRules (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:1214:12)
at #flatVerifyWithoutProcessors (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:2101:4)
at Linter._verifyWithFlatConfigArrayAndWithoutProcessors (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:2189:43)
at /home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:1773:17
at Array.map ()
at Linter._verifyWithFlatConfigArrayAndProcessor (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:1768:30)
at Linter._verifyWithFlatConfigArray (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:2275:16)
at Linter.verify (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:1677:10)
at Linter.verifyAndFix (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:2557:20)
at verifyText (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/eslint/eslint-helpers.js:1180:45)
at readAndVerifyFile (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/eslint/eslint-helpers.js:1321:10)

(import-x/no-unresolved)


[error] 1-1: Resolve error: EACCES: permission denied, open '/HOcZIXwqKG'
at Object.writeFileSync (node:fs:2409:20)
at l (file:///home/jailuser/git/node_modules/.pnpm/get-tsconfig@4.10.1/node_modules/get-tsconfig/dist/index.mjs:7:13670)
at createFilesMatcher (file:///home/jailuser/git/node_modules/.pnpm/get-tsconfig@4.10.1/node_modules/get-tsconfig/dist/index.mjs:7:14422)
at resolve (file:///home/jailuser/git/node_modules/.pnpm/eslint-import-resolver-typescript@4.4.4_eslint-plugin-import-x@4.16.1_@typescript-eslin_44eddb5b99ae4bce470e6fb9a90221ee/node_modules/eslint-import-resolver-typescript/lib/index.js:70:65)
at Object.resolve (file:///home/jailuser/git/node_modules/.pnpm/eslint-import-resolver-typescript@4.4.4_eslint-plugin-import-x@4.16.1_@typescript-eslin_44eddb5b99ae4bce470e6fb9a90221ee/node_modules/eslint-import-resolver-typescript/lib/index.js:147:20)
at file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:69
at setRuleContext (/home/jailuser/git/node_modules/.pnpm/eslint-import-context@0.1.9_unrs-resolver@1.11.1/node_modules/eslint-import-context/lib/index.js:23:20)
at fullResolve (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:30)
at relative (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:215:12)
at resolve (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:220:16)
at importType (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/import-type.js:126:63)
at checkImportForRelativePackage (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/rules/no-relative-packages.js:15:38)
at file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/rules/no-relative-packages.js:59:40
at checkSourceValue (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:14:9)
at checkSource (file:///home/jailuser/git/node_modules/.pnpm/eslint-plugin-import-x@4.16.1_@typescript-eslint+utils@8.50.0_eslint@9.39.1_jiti@2.6.1__eacac87f98d760f1781d40e8519857dc/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:17:9)
at ruleErrorHandler (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:1173:33)
at /home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/source-code-visitor.js:76:46
at Array.forEach ()
at SourceCodeVisitor.callSync (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/source-code-visitor.js:76:30)
at /home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/source-code-traverser.js:291:18
at Array.forEach ()
at SourceCodeTraverser.traverseSync (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/source-code-traverser.js:290:10)
at runRules (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:1214:12)
at #flatVerifyWithoutProcessors (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:2101:4)
at Linter._verifyWithFlatConfigArrayAndWithoutProcessors (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:2189:43)
at /home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:1773:17
at Array.map ()
at Linter._verifyWithFlatConfigArrayAndProcessor (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:1768:30)
at Linter._verifyWithFlatConfigArray (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:2275:16)
at Linter.verify (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:1677:10)
at Linter.verifyAndFix (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/linter/linter.js:2557:20)
at verifyText (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/eslint/eslint-helpers.js:1180:45)
at readAndVerifyFile (/home/jailuser/git/node_modules/.pnpm/eslint@9.39.1_jiti@2.6.1/node_modules/eslint/lib/eslint/eslint-helpers.js:1321:10)

(import-x/no-relative-packages)

🤖 Prompt for AI Agents
In `@src/components/auth/WorkspaceAuthGate.vue` around lines 1 - 9, Replace the
PrimeVue ProgressSpinner usage in WorkspaceAuthGate.vue with the
project-standard loading component (e.g., import and use the shared
FullscreenLoader or LoadingSpinner from src/components/) and remove any
PrimeVue-specific imports; render that component in place of <ProgressSpinner />
inside the v-else block. Also replace the hardcoded z-[1100] with the theme
design token (use the CSS variable or class token used across the project, e.g.,
use style/class that references --z-overlay or the project's overlay z-index
token) so the wrapper uses the centralized z-index token instead of an arbitrary
number.

Comment on lines +252 to +275
/**
* Returns the raw auth token (not wrapped in a header object).
* Priority: workspace token > Firebase token.
* Use this for WebSocket connections and backend node auth.
*/
const getAuthToken = async (): Promise<string | undefined> => {
if (flags.teamWorkspacesEnabled) {
const workspaceToken = sessionStorage.getItem(
WORKSPACE_STORAGE_KEYS.TOKEN
)
const expiresAt = sessionStorage.getItem(
WORKSPACE_STORAGE_KEYS.EXPIRES_AT
)

if (workspaceToken && expiresAt) {
const expiryTime = parseInt(expiresAt, 10)
if (Date.now() < expiryTime) {
return workspaceToken
}
}
}

return await getIdToken()
}
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

Code duplication with getAuthHeader() - consider extracting shared logic.

The workspace token retrieval logic (lines 258-271) duplicates lines 215-230 in getAuthHeader(). If the token validation logic changes (e.g., adding a buffer before expiry), both locations need updating.

Consider extracting the shared logic:

♻️ Proposed refactor to eliminate duplication
+  /**
+   * Returns a valid workspace token if available and not expired.
+   * Returns undefined if workspace feature is disabled or token is expired/missing.
+   */
+  function getValidWorkspaceToken(): string | undefined {
+    if (!flags.teamWorkspacesEnabled) return undefined
+    
+    const workspaceToken = sessionStorage.getItem(WORKSPACE_STORAGE_KEYS.TOKEN)
+    const expiresAt = sessionStorage.getItem(WORKSPACE_STORAGE_KEYS.EXPIRES_AT)
+    
+    if (workspaceToken && expiresAt) {
+      const expiryTime = parseInt(expiresAt, 10)
+      if (Date.now() < expiryTime) {
+        return workspaceToken
+      }
+    }
+    return undefined
+  }
+
   const getAuthHeader = async (): Promise<AuthHeader | null> => {
-    if (flags.teamWorkspacesEnabled) {
-      const workspaceToken = sessionStorage.getItem(
-        WORKSPACE_STORAGE_KEYS.TOKEN
-      )
-      const expiresAt = sessionStorage.getItem(
-        WORKSPACE_STORAGE_KEYS.EXPIRES_AT
-      )
-
-      if (workspaceToken && expiresAt) {
-        const expiryTime = parseInt(expiresAt, 10)
-        if (Date.now() < expiryTime) {
-          return {
-            Authorization: `Bearer ${workspaceToken}`
-          }
-        }
-      }
+    const workspaceToken = getValidWorkspaceToken()
+    if (workspaceToken) {
+      return { Authorization: `Bearer ${workspaceToken}` }
     }
     // ... rest unchanged
   }

   const getAuthToken = async (): Promise<string | undefined> => {
-    if (flags.teamWorkspacesEnabled) {
-      const workspaceToken = sessionStorage.getItem(
-        WORKSPACE_STORAGE_KEYS.TOKEN
-      )
-      const expiresAt = sessionStorage.getItem(
-        WORKSPACE_STORAGE_KEYS.EXPIRES_AT
-      )
-
-      if (workspaceToken && expiresAt) {
-        const expiryTime = parseInt(expiresAt, 10)
-        if (Date.now() < expiryTime) {
-          return workspaceToken
-        }
-      }
-    }
-
+    const workspaceToken = getValidWorkspaceToken()
+    if (workspaceToken) return workspaceToken
     return await getIdToken()
   }
🤖 Prompt for AI Agents
In `@src/stores/firebaseAuthStore.ts` around lines 252 - 275, The workspace token
retrieval and expiry-check logic is duplicated between getAuthToken and
getAuthHeader; extract that shared logic into a single helper (e.g.,
getValidWorkspaceToken or retrieveWorkspaceToken) and have both getAuthToken and
getAuthHeader call it; the helper should read WORKSPACE_STORAGE_KEYS.TOKEN and
WORKSPACE_STORAGE_KEYS.EXPIRES_AT from sessionStorage, parse and validate the
expiry (apply any buffer logic there), and return the token or undefined so both
functions use the same validation behavior.

@simula-r simula-r marked this pull request as draft January 28, 2026 03:15
@simula-r simula-r marked this pull request as ready for review January 28, 2026 03:57
@simula-r simula-r merged commit 34fc28a into main Jan 28, 2026
27 checks passed
@simula-r simula-r deleted the feat/workspaces-5-auth-gate-check branch January 28, 2026 04:28
@github-actions
Copy link

⚠️ Backport to cloud/1.37 failed

Reason: Merge conflicts detected during cherry-pick of 34fc28a

📄 Conflicting files
src/views/GraphView.vue
🤖 Prompt for AI Agents
Backport PR #8350 (https://github.com/Comfy-Org/ComfyUI_frontend/pull/8350) to cloud/1.37.
Cherry-pick merge commit 34fc28a39d169b94395e529d18d33f53066fb7e9 onto new branch
backport-8350-to-cloud-1.37 from origin/cloud/1.37.
Resolve conflicts in: src/views/GraphView.vue .
For test snapshots (browser_tests/**/*-snapshots/), accept PR version if
changed in original PR, else keep target. For package.json versions, keep
target branch. For pnpm-lock.yaml, regenerate with pnpm install.
Ask user for non-obvious conflicts.
Create PR titled "[backport cloud/1.37] <original title>" with label "backport".
See .github/workflows/pr-backport.yaml for workflow details.

cc @simula-r

simula-r added a commit that referenced this pull request Jan 28, 2026
## Summary

- Fix auth related race conditions with a new WorkspaceAuthGate in App.vue
- De dup initialization calls
- Add state machine to track state of refreshRemoteConfig
- Fix websocket not using new workspace jwt
- Misc improvments

(cherry picked from commit 34fc28a)
AustinMroz pushed a commit that referenced this pull request Jan 28, 2026
## Summary

Backport of #8350 to cloud/1.37

- Fix auth related race conditions with a new WorkspaceAuthGate in
App.vue
- De dup initialization calls
- Add state machine to track state of refreshRemoteConfig
- Fix websocket not using new workspace jwt
- Misc improvements

## Changes

Cherry-picked from commit 34fc28a

Resolved conflict in `src/views/GraphView.vue`:
- Kept workspace store initialization from cloud/1.37 branch
- Applied PR's refactored event listener pattern using
`useEventListener` from VueUse
- Applied PR's `useIntervalFn` for tab count tracking

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8357-backport-cloud-1-37-Feat-workspaces-5-auth-gate-check-2f66d73d365081bd8fe4f0cea481de11)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud/1.37 Backport PRs for cloud 1.37 needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch 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.

2 participants