Skip to content

fix: keep begin_checkout user_id reactive in subscription flows#8726

Merged
benceruleanlu merged 2 commits intomainfrom
fix/gtm-userid-storetorefs
Feb 9, 2026
Merged

fix: keep begin_checkout user_id reactive in subscription flows#8726
benceruleanlu merged 2 commits intomainfrom
fix/gtm-userid-storetorefs

Conversation

@benceruleanlu
Copy link
Member

@benceruleanlu benceruleanlu commented Feb 7, 2026

Summary

Use reactive userId reads for begin_checkout telemetry so delayed auth state updates are reflected at event time instead of using a stale snapshot.

Changes

  • What: switched subscription checkout telemetry paths to storeToRefs(useFirebaseAuthStore()) and read userId.value when dispatching trackBeginCheckout.
  • What: added regression tests that mutate userId after setup / after checkout starts and assert telemetry uses the updated ID.

Review Focus

  • Verify PricingTable and performSubscriptionCheckout still emit exactly one begin_checkout event per action, with checkout_type: change and checkout_type: new in their respective paths.
  • Verify the new tests would fail with stale store destructuring (manually validated during development).

Screenshots (if applicable)

N/A

┆Issue is synchronized with this Notion page by Unito

@benceruleanlu benceruleanlu requested a review from a team as a code owner February 7, 2026 23:20
Copilot AI review requested due to automatic review settings February 7, 2026 23:20
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Feb 7, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 7, 2026

📝 Walkthrough

Walkthrough

Refactors Firebase auth store usage to use Pinia's storeToRefs pattern so userId is a reactive ref/computed value; updates components, utilities, and tests to read userId.value and to assert telemetry and checkout behavior when userId changes during checkout flows.

Changes

Cohort / File(s) Summary
Tests updating mocks & assertions
src/platform/cloud/subscription/components/PricingTable.test.ts, src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.test.ts
Mocks changed to expose userId as a reactive/computed backed by mockUserId ref; added/updated tests to assert that changes to mockUserId after mount or during checkout are reflected in telemetry payloads and opened checkout URLs. Added createDeferred helper and wider mockUserId typing.
Component consuming reactive store
src/platform/cloud/subscription/components/PricingTable.vue
Replaced direct destructuring with storeToRefs(useFirebaseAuthStore()); updated logic and telemetry to reference userId.value.
Utility consuming reactive store
src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.ts
Introduced firebaseAuthStore and storeToRefs usage; updated performSubscriptionCheckout to read userId from a ref (userId.value) and to call getFirebaseAuthHeader() on the store instance.
Minor test import adjustments
src/platform/cloud/subscription/components/PricingTable.test.ts, src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.test.ts
Imported reactive/computed from Vue where mocks use reactive/computed values.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐇 I nudge the ref, then hop aside,
userId ripples on the reactive tide.
Telemetry wakes and checks who's there,
Checkout opens — fresh user in the air. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: making userId reactive in subscription checkout flows for telemetry.
Description check ✅ Passed The PR description covers all required sections from the template: summary, changes, and review focus. The description clearly explains what changed and why, with specific technical details and test coverage.

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

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/gtm-userid-storetorefs

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

github-actions bot commented Feb 7, 2026

🎭 Playwright Tests: ⚠️ Passed with flaky tests

Results: 513 passed, 0 failed, 5 flaky, 8 skipped (Total: 526)

❌ Failed Tests

📊 Browser Reports
  • chromium: View Report (✅ 501 / ❌ 0 / ⚠️ 5 / ⏭️ 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 Feb 7, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/07/2026, 11:25:05 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Feb 7, 2026

Bundle Size Report

Summary

  • Raw size: 19.7 MB baseline 19.7 MB — 🔴 +175 B
  • Gzip: 4.2 MB baseline 4.2 MB — 🔴 +79 B
  • Brotli: 3.26 MB baseline 3.26 MB — 🔴 +112 B
  • Bundles: 234 current • 234 baseline • 111 added / 111 removed

Category Glance
Utilities & Hooks 🔴 +132 B (237 kB) · Other 🔴 +43 B (7.15 MB) · Vendor & Third-Party ⚪ 0 B (8.77 MB) · Data & Services ⚪ 0 B (2.11 MB) · Graph Workspace ⚪ 0 B (854 kB) · Panels & Settings ⚪ 0 B (409 kB) · + 5 more

Per-category breakdown
App Entry Points — 22.2 kB (baseline 22.2 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-ANN21I5p.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -7.19 kB 🟢 -6.24 kB
assets/index-Cohdkz8I.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +7.19 kB 🔴 +6.24 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Cc3taE-P.js (removed) 854 kB 🟢 -854 kB 🟢 -183 kB 🟢 -140 kB
assets/GraphView-CFo-HmWr.js (new) 854 kB 🔴 +854 kB 🔴 +183 kB 🔴 +140 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-Bc5lCtc4.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -3.3 kB 🟢 -2.8 kB
assets/CloudSurveyView-CkfH2Nin.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +3.3 kB 🔴 +2.8 kB
assets/CloudLoginView-BXVikDqj.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.95 kB 🔴 +2.59 kB
assets/CloudLoginView-CApBqFpc.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.95 kB 🟢 -2.58 kB
assets/UserCheckView-DcJWWJ2g.js (new) 8.4 kB 🔴 +8.4 kB 🔴 +2.23 kB 🔴 +1.93 kB
assets/UserCheckView-Di3RbggW.js (removed) 8.4 kB 🟢 -8.4 kB 🟢 -2.22 kB 🟢 -1.93 kB
assets/CloudSignupView-DAFtAnLo.js (removed) 7.46 kB 🟢 -7.46 kB 🟢 -2.35 kB 🟢 -2.05 kB
assets/CloudSignupView-nhiE9KsR.js (new) 7.46 kB 🔴 +7.46 kB 🔴 +2.35 kB 🔴 +2.05 kB
assets/CloudLayoutView-B_eIGYKz.js (new) 6.47 kB 🔴 +6.47 kB 🔴 +2.13 kB 🔴 +1.85 kB
assets/CloudLayoutView-BjrY60gw.js (removed) 6.47 kB 🟢 -6.47 kB 🟢 -2.13 kB 🟢 -1.84 kB
assets/CloudForgotPasswordView-epHoBlGl.js (removed) 5.6 kB 🟢 -5.6 kB 🟢 -1.96 kB 🟢 -1.74 kB
assets/CloudForgotPasswordView-YdUhqroL.js (new) 5.6 kB 🔴 +5.6 kB 🔴 +1.96 kB 🔴 +1.73 kB
assets/CloudAuthTimeoutView-9gFC7mhC.js (removed) 4.95 kB 🟢 -4.95 kB 🟢 -1.79 kB 🟢 -1.57 kB
assets/CloudAuthTimeoutView-BTSTT_VY.js (new) 4.95 kB 🔴 +4.95 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/CloudSubscriptionRedirectView-A0EjgEy6.js (removed) 4.75 kB 🟢 -4.75 kB 🟢 -1.8 kB 🟢 -1.59 kB
assets/CloudSubscriptionRedirectView-Dbx8UHJ2.js (new) 4.75 kB 🔴 +4.75 kB 🔴 +1.8 kB 🔴 +1.59 kB
assets/UserSelectView-BK2XYe7Q.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.64 kB 🟢 -1.47 kB
assets/UserSelectView-DN4sB7VO.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.64 kB 🔴 +1.47 kB
assets/CloudSorryContactSupportView-BO-_Aoqq.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-o35PGLAb.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WorkspacePanel-B7IeVDKC.js (removed) 26.8 kB 🟢 -26.8 kB 🟢 -5.64 kB 🟢 -4.96 kB
assets/WorkspacePanel-Dx1fpubD.js (new) 26.8 kB 🔴 +26.8 kB 🔴 +5.64 kB 🔴 +4.96 kB
assets/SecretsPanel-DA-IBHDy.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.31 kB 🟢 -4.66 kB
assets/SecretsPanel-kg81ohZ8.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.3 kB 🔴 +4.65 kB
assets/LegacyCreditsPanel-CJ5fTblO.js (removed) 20.9 kB 🟢 -20.9 kB 🟢 -5.63 kB 🟢 -4.95 kB
assets/LegacyCreditsPanel-CVIq-123.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +5.63 kB 🔴 +4.94 kB
assets/SubscriptionPanel-DXPYIYrc.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.76 kB 🟢 -4.2 kB
assets/SubscriptionPanel-uvpA37Nb.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.76 kB 🔴 +4.2 kB
assets/KeybindingPanel-CZ9PyFeO.js (removed) 12.7 kB 🟢 -12.7 kB 🟢 -3.65 kB 🟢 -3.22 kB
assets/KeybindingPanel-DMh89eQZ.js (new) 12.7 kB 🔴 +12.7 kB 🔴 +3.65 kB 🔴 +3.22 kB
assets/ExtensionPanel-DAaKuRhj.js (new) 9.54 kB 🔴 +9.54 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ExtensionPanel-FqRcPiF-.js (removed) 9.54 kB 🟢 -9.54 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/AboutPanel-BO9Nx84Z.js (removed) 8.62 kB 🟢 -8.62 kB 🟢 -2.46 kB 🟢 -2.23 kB
assets/AboutPanel-oprcmEyt.js (new) 8.62 kB 🔴 +8.62 kB 🔴 +2.46 kB 🔴 +2.23 kB
assets/ServerConfigPanel-DHwhBUsF.js (new) 6.68 kB 🔴 +6.68 kB 🔴 +2.18 kB 🔴 +1.95 kB
assets/ServerConfigPanel-DqK2NaWR.js (removed) 6.68 kB 🟢 -6.68 kB 🟢 -2.18 kB 🟢 -1.97 kB
assets/UserPanel-CdQ1Y8vi.js (removed) 6.32 kB 🟢 -6.32 kB 🟢 -2.04 kB 🟢 -1.79 kB
assets/UserPanel-fT48369H.js (new) 6.32 kB 🔴 +6.32 kB 🔴 +2.04 kB 🔴 +1.8 kB
assets/cloudRemoteConfig-BKzBPga9.js (removed) 1.48 kB 🟢 -1.48 kB 🟢 -732 B 🟢 -626 B
assets/cloudRemoteConfig-D_HEV6W8.js (new) 1.48 kB 🔴 +1.48 kB 🔴 +731 B 🔴 +628 B
assets/refreshRemoteConfig-DawS_0e-.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -519 B 🟢 -474 B
assets/refreshRemoteConfig-rZwm79IQ.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +521 B 🔴 +471 B
assets/config-CJ8VnGvP.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B4SEKci9.js 26.8 kB 26.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BC1cc0fS.js 23.6 kB 23.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bc2B6dtS.js 24.1 kB 24.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BcpoYtvB.js 20.8 kB 20.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BthVWLgQ.js 23.3 kB 23.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CBYZ18F3.js 28.1 kB 28.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cnka_dKX.js 25.7 kB 25.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D6HkNk7G.js 25 kB 25 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-gIPnacUu.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-HfVYOjFC.js 32 kB 32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-KJ7OpQSN.js 20.3 kB 20.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-DWPirw_1.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +994 B
assets/auth-voln8Yeb.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -989 B
assets/SignUpForm-BdEx1IbS.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/SignUpForm-D6GOmEa-.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.1 kB
assets/UpdatePasswordContent-CQL9REqZ.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1.09 kB 🔴 +963 B
assets/UpdatePasswordContent-CTlbOLKU.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1.09 kB 🟢 -964 B
assets/firebaseAuthStore-DfAyZ-Oc.js (removed) 833 B 🟢 -833 B 🟢 -410 B 🟢 -368 B
assets/firebaseAuthStore-DonhYFM-.js (new) 833 B 🔴 +833 B 🔴 +409 B 🔴 +367 B
assets/auth-CJUhsUua.js (new) 347 B 🔴 +347 B 🔴 +222 B 🔴 +208 B
assets/auth-Da_-CzX5.js (removed) 347 B 🟢 -347 B 🟢 -220 B 🟢 -214 B
assets/PasswordFields-DZduq3DY.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-B0BztYjc.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Editors & Dialogs — 781 B (baseline 781 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-Bpzj9IKL.js (removed) 781 B 🟢 -781 B 🟢 -400 B 🟢 -344 B
assets/useSubscriptionDialog-Df45WXq4.js (new) 781 B 🔴 +781 B 🔴 +400 B 🔴 +340 B

Status: 1 added / 1 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-Cy3zSFPb.js (new) 9.88 kB 🔴 +9.88 kB 🔴 +3.42 kB 🔴 +3.01 kB
assets/useTerminalTabs-Dt2RcBzl.js (removed) 9.88 kB 🟢 -9.88 kB 🟢 -3.42 kB 🟢 -3.02 kB
assets/ComfyQueueButton-C1YCXv_5.js (new) 7.17 kB 🔴 +7.17 kB 🔴 +2.32 kB 🔴 +2.07 kB
assets/ComfyQueueButton-DOv24G3Y.js (removed) 7.17 kB 🟢 -7.17 kB 🟢 -2.32 kB 🟢 -2.07 kB
assets/SubscribeButton-BIjp1vOi.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.02 kB 🟢 -893 B
assets/SubscribeButton-CAZVGm09.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.02 kB 🔴 +889 B
assets/cloudFeedbackTopbarButton-B3Ki9ft0.js (new) 1.64 kB 🔴 +1.64 kB 🔴 +878 B 🔴 +776 B
assets/cloudFeedbackTopbarButton-EALvv_dL.js (removed) 1.64 kB 🟢 -1.64 kB 🟢 -878 B 🟢 -774 B
assets/ComfyQueueButton-D6n447H8.js (new) 838 B 🔴 +838 B 🔴 +414 B 🔴 +365 B
assets/ComfyQueueButton-Jqi6ML2I.js (removed) 838 B 🟢 -838 B 🟢 -415 B 🟢 -374 B
assets/Button-uiq1UxTY.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-DQn-idej.js 1.24 kB 1.24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-BtCjsN6c.js 7.52 kB 7.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-B50esQ9A.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-CA5MtriV.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.11 MB (baseline 2.11 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-d0MnK8xi.js (new) 1.34 MB 🔴 +1.34 MB 🔴 +302 kB 🔴 +234 kB
assets/dialogService-D3I9SxLx.js (removed) 1.34 MB 🟢 -1.34 MB 🟢 -302 kB 🟢 -234 kB
assets/api-BVJQvya3.js (new) 643 kB 🔴 +643 kB 🔴 +145 kB 🔴 +116 kB
assets/api-d0snTXIQ.js (removed) 643 kB 🟢 -643 kB 🟢 -145 kB 🟢 -116 kB
assets/load3dService-Bp3N4UfW.js (removed) 91.2 kB 🟢 -91.2 kB 🟢 -19.1 kB 🟢 -16.5 kB
assets/load3dService-CpIbbHaP.js (new) 91.2 kB 🔴 +91.2 kB 🔴 +19.1 kB 🔴 +16.5 kB
assets/systemStatsStore-BKpp2Xlt.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +4.29 kB 🔴 +3.77 kB
assets/systemStatsStore-CN3ytykv.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -4.29 kB 🟢 -3.77 kB
assets/releaseStore-BSiIM4sx.js (new) 8.14 kB 🔴 +8.14 kB 🔴 +2.23 kB 🔴 +1.97 kB
assets/releaseStore-DKmC47x4.js (removed) 8.14 kB 🟢 -8.14 kB 🟢 -2.23 kB 🟢 -1.97 kB
assets/keybindingService-9i1EY4lc.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/keybindingService-DQr2_kj-.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/bootstrapStore-B05KfpVC.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -884 B 🟢 -812 B
assets/bootstrapStore-BQmzXjS1.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +885 B 🔴 +811 B
assets/userStore-CQKf-5Wv.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -721 B 🟢 -684 B
assets/userStore-WgXQraEg.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +720 B 🔴 +637 B
assets/audioService-D6z_8C0k.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -849 B 🟢 -728 B
assets/audioService-DZeB256r.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +847 B 🔴 +725 B
assets/releaseStore-B5YgXfNy.js (new) 805 B 🔴 +805 B 🔴 +404 B 🔴 +350 B
assets/releaseStore-DkAuVX4_.js (removed) 805 B 🟢 -805 B 🟢 -406 B 🟢 -353 B
assets/workflowDraftStore-BInV1Ybt.js (removed) 781 B 🟢 -781 B 🟢 -400 B 🟢 -346 B
assets/workflowDraftStore-CK9MEXPm.js (new) 781 B 🔴 +781 B 🔴 +400 B 🔴 +347 B
assets/dialogService-C0Kyp-2u.js (removed) 770 B 🟢 -770 B 🟢 -392 B 🟢 -343 B
assets/dialogService-CXOjzWfV.js (new) 770 B 🔴 +770 B 🔴 +391 B 🔴 +343 B
assets/dialogStore-Ch4cJ-8o.js 4.1 kB 4.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-Cg1Zzouw.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

Utilities & Hooks — 237 kB (baseline 237 kB) • 🔴 +132 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-CDDHLXP7.js (new) 177 kB 🔴 +177 kB 🔴 +38.9 kB 🔴 +32.4 kB
assets/useConflictDetection-Cgs5mKzE.js (removed) 177 kB 🟢 -177 kB 🟢 -38.9 kB 🟢 -32.4 kB
assets/useLoad3d-C4N7M51p.js (new) 14.4 kB 🔴 +14.4 kB 🔴 +3.56 kB 🔴 +3.14 kB
assets/useLoad3d-ezR4laCc.js (removed) 14.4 kB 🟢 -14.4 kB 🟢 -3.56 kB 🟢 -3.14 kB
assets/useLoad3dViewer-BqsW_Lbn.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.16 kB 🔴 +2.8 kB
assets/useLoad3dViewer-gl4YwT8Y.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.16 kB 🟢 -2.8 kB
assets/subscriptionCheckoutUtil-BBgQSiCd.js (new) 4.25 kB 🔴 +4.25 kB 🔴 +1.57 kB 🔴 +1.38 kB
assets/subscriptionCheckoutUtil-BU8CR5tb.js (removed) 4.12 kB 🟢 -4.12 kB 🟢 -1.53 kB 🟢 -1.33 kB
assets/useFeatureFlags-CV9BbBqc.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -1.05 kB 🟢 -904 B
assets/useFeatureFlags-Wmx--FjG.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +1.05 kB 🔴 +903 B
assets/useWorkspaceUI-BAjCI-FK.js (removed) 3.15 kB 🟢 -3.15 kB 🟢 -891 B 🟢 -758 B
assets/useWorkspaceUI-Dbg1Ih7a.js (new) 3.15 kB 🔴 +3.15 kB 🔴 +890 B 🔴 +764 B
assets/useSubscriptionCredits-BukJ_MT6.js (removed) 2.75 kB 🟢 -2.75 kB 🟢 -1.04 kB 🟢 -909 B
assets/useSubscriptionCredits-DqqoqmcH.js (new) 2.75 kB 🔴 +2.75 kB 🔴 +1.04 kB 🔴 +909 B
assets/useErrorHandling-D-7ZCvsH.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +554 B 🔴 +477 B
assets/useErrorHandling-lLuQk7tJ.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -554 B 🟢 -481 B
assets/useLoad3d-DHxt6BJ3.js (new) 904 B 🔴 +904 B 🔴 +445 B 🔴 +394 B
assets/useLoad3d-Tv_YuMfU.js (removed) 904 B 🟢 -904 B 🟢 -445 B 🟢 -396 B
assets/useLoad3dViewer-C_5JntzH.js (removed) 883 B 🟢 -883 B 🟢 -431 B 🟢 -387 B
assets/useLoad3dViewer-DOGjyyxk.js (new) 883 B 🔴 +883 B 🔴 +432 B 🔴 +385 B
assets/audioUtils-BlIn_7zF.js (new) 858 B 🔴 +858 B 🔴 +499 B 🔴 +419 B
assets/audioUtils-nSC-AYhw.js (removed) 858 B 🟢 -858 B 🟢 -500 B 🟢 -421 B
assets/useCurrentUser-CjfRrJP9.js (removed) 767 B 🟢 -767 B 🟢 -394 B 🟢 -343 B
assets/useCurrentUser-DRrj5gyi.js (new) 767 B 🔴 +767 B 🔴 +394 B 🔴 +342 B
assets/_plugin-vue_export-helper-D3CTfeG5.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-CMnqUgIc.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Djb4sHrV.js 524 B 524 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-YzPqYQr3.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/networkUtil-OoGWgngm.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-CWsb-x0f.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCopyToClipboard-DfGUC3g3.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-f0I8RuzF.js 1.63 kB 1.63 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-D0w6WYH0.js 71.6 kB 71.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-DPuwexxf.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-CLEC0CcJ.js 842 kB 842 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-C6_f776o.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-CLFqBOQ2.js 102 kB 102 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-B5SCkhZ3.js 1.55 MB 1.55 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-BrYQO8Nm.js 1.74 MB 1.74 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CPrt7lw0.js 240 kB 240 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-BVA5kbUC.js 183 kB 183 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-Q97wQk05.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BkdC6us-.js 632 kB 632 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-BBP9kkTE.js 312 kB 312 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-CS5mlw4Q.js 111 kB 111 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-CZroAclV.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-BtrvIr1x.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-gAWmQIF-.js 110 kB 110 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.15 MB (baseline 7.15 MB) • 🔴 +43 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-UmSmOyEv.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +18.5 kB 🔴 +15.9 kB
assets/core-vvTxeZ41.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -18.5 kB 🟢 -15.9 kB
assets/groupNode-CSVuujyQ.js (removed) 70.9 kB 🟢 -70.9 kB 🟢 -17.5 kB 🟢 -15.4 kB
assets/groupNode-DsI7jdD3.js (new) 70.9 kB 🔴 +70.9 kB 🔴 +17.5 kB 🔴 +15.4 kB
assets/WidgetSelect-CrFu21GU.js (removed) 56.8 kB 🟢 -56.8 kB 🟢 -12 kB 🟢 -10.4 kB
assets/WidgetSelect-Cx1MQjQ0.js (new) 56.8 kB 🔴 +56.8 kB 🔴 +12 kB 🔴 +10.5 kB
assets/SubscriptionRequiredDialogContentWorkspace-_qb85vjF.js (removed) 46 kB 🟢 -46 kB 🟢 -8.61 kB 🟢 -7.45 kB
assets/SubscriptionRequiredDialogContentWorkspace-D_kll2yu.js (new) 46 kB 🔴 +46 kB 🔴 +8.61 kB 🔴 +7.43 kB
assets/Load3DControls-Ci5y4bkP.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.64 kB
assets/Load3DControls-CjSxg5a9.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/SettingDialogContent-CsFHSrZc.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -8.01 kB 🟢 -7.04 kB
assets/SettingDialogContent-dCPPRRe1.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +8 kB 🔴 +7.05 kB
assets/SubscriptionRequiredDialogContent-BX2q-RKx.js (new) 26.1 kB 🔴 +26.1 kB 🔴 +6.57 kB 🔴 +5.75 kB
assets/SubscriptionRequiredDialogContent-DQ7Yntbv.js (removed) 26.1 kB 🟢 -26.1 kB 🟢 -6.55 kB 🟢 -5.76 kB
assets/Load3dViewerContent-BA2vSsRT.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.28 kB 🟢 -4.57 kB
assets/Load3dViewerContent-DTLLeuau.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +5.28 kB 🔴 +4.57 kB
assets/WidgetImageCrop-BFt4i-WL.js (new) 22.4 kB 🔴 +22.4 kB 🔴 +5.54 kB 🔴 +4.87 kB
assets/WidgetImageCrop-x8dFIkFm.js (removed) 22.4 kB 🟢 -22.4 kB 🟢 -5.53 kB 🟢 -4.87 kB
assets/SubscriptionPanelContentWorkspace-DoXxwTNM.js (new) 21.8 kB 🔴 +21.8 kB 🔴 +5.19 kB 🔴 +4.59 kB
assets/SubscriptionPanelContentWorkspace-mzJk8qxm.js (removed) 21.8 kB 🟢 -21.8 kB 🟢 -5.19 kB 🟢 -4.59 kB
assets/CurrentUserPopoverWorkspace-BELZJEIG.js (new) 20.7 kB 🔴 +20.7 kB 🔴 +5.11 kB 🔴 +4.53 kB
assets/CurrentUserPopoverWorkspace-DtT3_ge0.js (removed) 20.7 kB 🟢 -20.7 kB 🟢 -5.11 kB 🟢 -4.53 kB
assets/FormItem-Csnm0Goo.js (new) 20.2 kB 🔴 +20.2 kB 🔴 +4.87 kB 🔴 +4.25 kB
assets/FormItem-Dg5u4a7J.js (removed) 20.2 kB 🟢 -20.2 kB 🟢 -4.87 kB 🟢 -4.25 kB
assets/SignInContent-B-XwcEcD.js (removed) 19 kB 🟢 -19 kB 🟢 -4.83 kB 🟢 -4.22 kB
assets/SignInContent-DpOqPQBZ.js (new) 19 kB 🔴 +19 kB 🔴 +4.83 kB 🔴 +4.22 kB
assets/WidgetRecordAudio-Bi6vmoAR.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.97 kB 🔴 +4.44 kB
assets/WidgetRecordAudio-D2watA4T.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.97 kB 🟢 -4.44 kB
assets/Load3D-BZ_Yy4Cl.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.04 kB 🔴 +3.53 kB
assets/Load3D-WqGqjLuA.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.04 kB 🟢 -3.53 kB
assets/MissingModelsWarning-Cd-usuaE.js (removed) 16.1 kB 🟢 -16.1 kB 🟢 -4.41 kB 🟢 -3.93 kB
assets/MissingModelsWarning-Ch9SlJ4_.js (new) 16.1 kB 🔴 +16.1 kB 🔴 +4.42 kB 🔴 +3.93 kB
assets/WidgetInputNumber-BP7rkueB.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -4.26 kB 🟢 -3.8 kB
assets/WidgetInputNumber-Bu0no-1L.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.26 kB 🔴 +3.8 kB
assets/load3d-C7rxbJi7.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.2 kB 🔴 +3.65 kB
assets/load3d-DlWXP9V7.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.2 kB 🟢 -3.66 kB
assets/AudioPreviewPlayer-10QylVrQ.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.21 kB 🟢 -2.87 kB
assets/AudioPreviewPlayer-D0QDdKUx.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.21 kB 🔴 +2.87 kB
assets/NodeConflictDialogContent-BhQY3RNr.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.37 kB 🟢 -2.09 kB
assets/NodeConflictDialogContent-D0iegBMD.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.37 kB 🔴 +2.08 kB
assets/changeTracker-BN9jq8-D.js (new) 9.4 kB 🔴 +9.4 kB 🔴 +2.9 kB 🔴 +2.56 kB
assets/changeTracker-DmLTQ-2d.js (removed) 9.4 kB 🟢 -9.4 kB 🟢 -2.9 kB 🟢 -2.56 kB
assets/nodeTemplates-D7FVdOLk.js (new) 9.37 kB 🔴 +9.37 kB 🔴 +3.29 kB 🔴 +2.89 kB
assets/nodeTemplates-DCk_xPNa.js (removed) 9.37 kB 🟢 -9.37 kB 🟢 -3.29 kB 🟢 -2.89 kB
assets/InviteMemberDialogContent-CUNmGYs9.js (removed) 7.95 kB 🟢 -7.95 kB 🟢 -2.58 kB 🟢 -2.23 kB
assets/InviteMemberDialogContent-fP59271k.js (new) 7.95 kB 🔴 +7.95 kB 🔴 +2.58 kB 🔴 +2.25 kB
assets/WidgetWithControl-CB9kGFL7.js (new) 7.04 kB 🔴 +7.04 kB 🔴 +2.63 kB 🔴 +2.35 kB
assets/WidgetWithControl-D2TFp1ZT.js (removed) 7.04 kB 🟢 -7.04 kB 🟢 -2.63 kB 🟢 -2.34 kB
assets/Load3DConfiguration-ADSOUzrx.js (new) 6.36 kB 🔴 +6.36 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/Load3DConfiguration-Bs9u-tYN.js (removed) 6.36 kB 🟢 -6.36 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/MissingNodesContent-Ct_PivfK.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -2.08 kB 🟢 -1.85 kB
assets/MissingNodesContent-DTIyLXqm.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +2.09 kB 🔴 +1.85 kB
assets/CreateWorkspaceDialogContent-CKQVKWN-.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -2.01 kB 🟢 -1.75 kB
assets/CreateWorkspaceDialogContent-oYdfMu7p.js (new) 5.58 kB 🔴 +5.58 kB 🔴 +2.01 kB 🔴 +1.75 kB
assets/EditWorkspaceDialogContent-B4gsYwIf.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.97 kB 🟢 -1.71 kB
assets/EditWorkspaceDialogContent-CaL0spH8.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.97 kB 🔴 +1.71 kB
assets/ValueControlPopover-B0gyxJA9.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.8 kB 🔴 +1.6 kB
assets/ValueControlPopover-DHe-QyS8.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.79 kB 🟢 -1.6 kB
assets/Preview3d-BeHgoJVL.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.59 kB 🔴 +1.38 kB
assets/Preview3d-CbfYeYpF.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.59 kB 🟢 -1.39 kB
assets/CancelSubscriptionDialogContent-BdocZni7.js (removed) 4.84 kB 🟢 -4.84 kB 🟢 -1.8 kB 🟢 -1.58 kB
assets/CancelSubscriptionDialogContent-Bx32fz6P.js (new) 4.84 kB 🔴 +4.84 kB 🔴 +1.8 kB 🔴 +1.58 kB
assets/MissingNodesFooter-C-wbZjtD.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.79 kB 🔴 +1.58 kB
assets/MissingNodesFooter-DgYp66d_.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.78 kB 🟢 -1.57 kB
assets/DeleteWorkspaceDialogContent-_CBVxQwv.js (removed) 4.28 kB 🟢 -4.28 kB 🟢 -1.65 kB 🟢 -1.43 kB
assets/DeleteWorkspaceDialogContent-BZbRVXMV.js (new) 4.28 kB 🔴 +4.28 kB 🔴 +1.65 kB 🔴 +1.44 kB
assets/LeaveWorkspaceDialogContent-BVsTPcFi.js (new) 4.11 kB 🔴 +4.11 kB 🔴 +1.6 kB 🔴 +1.39 kB
assets/LeaveWorkspaceDialogContent-DyuB-JO_.js (removed) 4.11 kB 🟢 -4.11 kB 🟢 -1.6 kB 🟢 -1.39 kB
assets/RemoveMemberDialogContent-Bf471soy.js (new) 4.09 kB 🔴 +4.09 kB 🔴 +1.55 kB 🔴 +1.35 kB
assets/RemoveMemberDialogContent-CsLbxbvi.js (removed) 4.09 kB 🟢 -4.09 kB 🟢 -1.55 kB 🟢 -1.35 kB
assets/RevokeInviteDialogContent-BDc-Ni36.js (removed) 4 kB 🟢 -4 kB 🟢 -1.56 kB 🟢 -1.37 kB
assets/RevokeInviteDialogContent-ByqZOnWs.js (new) 4 kB 🔴 +4 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/saveMesh-Cj9h8W4y.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +1.47 kB 🔴 +1.32 kB
assets/saveMesh-Cx0AMLcj.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -1.47 kB 🟢 -1.31 kB
assets/cloudSessionCookie-D22sDh14.js (removed) 3.12 kB 🟢 -3.12 kB 🟢 -1.09 kB 🟢 -964 B
assets/cloudSessionCookie-DLOGd4Lq.js (new) 3.12 kB 🔴 +3.12 kB 🔴 +1.1 kB 🔴 +965 B
assets/GlobalToast-B2lLjZKI.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.22 kB 🟢 -1.07 kB
assets/GlobalToast-DLRtRuTn.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.06 kB
assets/SubscribeToRun-B4eL1j8O.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +895 B
assets/SubscribeToRun-CswYzceR.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -899 B
assets/SettingDialogHeader-6lLjnhPt.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +894 B 🔴 +790 B
assets/SettingDialogHeader-Bh7iIKnA.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -895 B 🟢 -792 B
assets/CloudRunButtonWrapper-Ca-WTICZ.js (new) 1.72 kB 🔴 +1.72 kB 🔴 +810 B 🔴 +729 B
assets/CloudRunButtonWrapper-DoPRxCYv.js (removed) 1.72 kB 🟢 -1.72 kB 🟢 -809 B 🟢 -733 B
assets/cloudBadges-Dg7vdSl9.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -730 B 🟢 -636 B
assets/cloudBadges-DMeRgoms.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +729 B 🔴 +625 B
assets/cloudSubscription-CpUhJXpp.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +679 B 🔴 +586 B
assets/cloudSubscription-D-pdzhjs.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -678 B 🟢 -584 B
assets/Load3D-CQJjzZNS.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +505 B 🔴 +450 B
assets/Load3D-D5owQZKw.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -508 B 🟢 -449 B
assets/nightlyBadges-CLQXWWpt.js (new) 1.05 kB 🔴 +1.05 kB 🔴 +554 B 🔴 +488 B
assets/nightlyBadges-VvXHbYaC.js (removed) 1.05 kB 🟢 -1.05 kB 🟢 -555 B 🟢 -492 B
assets/Load3dViewerContent-BnycR1Ae.js (new) 1 kB 🔴 +1 kB 🔴 +475 B 🔴 +423 B
assets/Load3dViewerContent-QeBgBqk5.js (removed) 1 kB 🟢 -1 kB 🟢 -478 B 🟢 -426 B
assets/SubscriptionPanelContentWorkspace-B_H2V92Q.js (removed) 975 B 🟢 -975 B 🟢 -460 B 🟢 -396 B
assets/SubscriptionPanelContentWorkspace-BHOrGIr5.js (new) 975 B 🔴 +975 B 🔴 +457 B 🔴 +396 B
assets/SettingDialogContent-CdKrMxnS.js (removed) 917 B 🟢 -917 B 🟢 -443 B 🟢 -394 B
assets/SettingDialogContent-CI6G7qT3.js (new) 917 B 🔴 +917 B 🔴 +441 B 🔴 +387 B
assets/changeTracker-C3KkkGk5.js (new) 802 B 🔴 +802 B 🔴 +404 B 🔴 +350 B
assets/changeTracker-DfMB7KTU.js (removed) 802 B 🟢 -802 B 🟢 -406 B 🟢 -352 B
assets/WidgetLegacy-BAiHQnw4.js (new) 790 B 🔴 +790 B 🔴 +407 B 🔴 +350 B
assets/WidgetLegacy-CS2zdwQ_.js (removed) 790 B 🟢 -790 B 🟢 -407 B 🟢 -358 B
assets/graphHasMissingNodes-CxEGaFyi.js (removed) 761 B 🟢 -761 B 🟢 -373 B 🟢 -323 B
assets/graphHasMissingNodes-D_W_ukEP.js (new) 761 B 🔴 +761 B 🔴 +374 B 🔴 +328 B
assets/WidgetInputNumber-CCnYwFxg.js (removed) 392 B 🟢 -392 B 🟢 -231 B 🟢 -205 B
assets/WidgetInputNumber-ChxI1Oo3.js (new) 392 B 🔴 +392 B 🔴 +231 B 🔴 +208 B
assets/SettingDialogHeader-DGO7tI8d.js (new) 375 B 🔴 +375 B 🔴 +225 B 🔴 +218 B
assets/SettingDialogHeader-jyR7Y2ds.js (removed) 375 B 🟢 -375 B 🟢 -227 B 🟢 -211 B
assets/AnimationControls-s1zsJztH.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-CORRuzcg.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-zCGpezkl.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-CUITYRai.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-CzGozBag.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-DFENHLtB.js 909 B 909 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-5h65sKz2.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B1ebAe6N.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CRx-vqG1.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DIwahzUa.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DMlRtEU0.js 15.3 kB 15.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DpS8y4O5.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-FXC3_zxH.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-hWSmKRGf.js 14.6 kB 14.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-j-tQgnMj.js 14.4 kB 14.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-SmCqaJk0.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-WU4257sl.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-CVBqs4R5.js 482 kB 482 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-KKbabUHa.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeContent-CFc03Tip.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeFooter-DtjCNMK9.js 1.88 kB 1.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeHeader-BoA1xnh6.js 1.08 kB 1.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-27bDBTQB.js 12.3 kB 12.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C38gxHH8.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CgjHOkrX.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cgqg3q6e.js 180 kB 180 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CqLSuwgg.js 128 kB 128 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CUnKsvCy.js 129 kB 129 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D1jWNpGv.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D5rAzkkP.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DmB5sahX.js 136 kB 136 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DY2iV8sv.js 148 kB 148 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-MY2-qMci.js 155 kB 155 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-ZndfQssq.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-68BNrAjP.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-Iq5PlzyI.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-Ci7hK6Hx.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-MY4C12Xl.js 2.23 kB 2.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingNodesHeader-YwveLyUp.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictFooter-Bkib4phv.js 2.37 kB 2.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictHeader-WwA-9ZoH.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BSsCapVw.js 375 kB 375 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BtRKM3M2.js 405 kB 405 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ClO6R62B.js 329 kB 329 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DJgvVsx3.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DjqMN7vc.js 332 kB 332 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DLQi6_4L.js 406 kB 406 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DSY1ao6T.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-eHA8ICwM.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-GqHfcoE5.js 354 kB 354 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-oC4LLwGi.js 442 kB 442 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ZrZ0pB9x.js 365 kB 365 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/PanelTemplate-CIz8rKRB.js 1.2 kB 1.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-B7z583a8.js 665 B 665 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-Ca2S-reV.js 1.87 kB 1.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-DlZV-zTo.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-CXnpEfIH.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-B7gOoOBF.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-Dgc1EJR_.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-ClsP3hA9.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-VDank0gz.js 318 B 318 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-RLUqfB5N.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-DNUpZ6Xj.js 131 B 131 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-q5CDrAhg.js 3.94 kB 3.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-rk55tEpB.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-r92nsnE8.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-DXX2ajdG.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-D8fnwO5D.js 3.1 kB 3.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-Dco9umyN.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-D2vH95iI.js 1.95 kB 1.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-C97vcvEN.js 2.88 kB 2.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-HMrZZpDm.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-IA4Drc0U.js 3.14 kB 3.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-gI503ait.js 2.5 kB 2.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-CvFcS86j.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 54 added / 54 removed

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes stale user_id values in begin_checkout telemetry for cloud subscription flows by ensuring userId is read reactively at event-dispatch time, matching delayed auth-state updates.

Changes:

  • Switch subscription checkout telemetry to use storeToRefs(useFirebaseAuthStore()) and read userId.value when calling trackBeginCheckout.
  • Update performSubscriptionCheckout to avoid destructured store snapshots and call getFirebaseAuthHeader() from the store instance.
  • Add regression tests that mutate userId after mount / after checkout starts and assert telemetry uses the latest value.

Reviewed changes

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

File Description
src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.ts Make userId reactive via storeToRefs and read .value at telemetry dispatch time.
src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.test.ts Add deferred-auth regression test verifying late userId updates are reflected.
src/platform/cloud/subscription/components/PricingTable.vue Use storeToRefs for reactive userId reads in the “change plan” telemetry path.
src/platform/cloud/subscription/components/PricingTable.test.ts Add regression test verifying userId updates after mount are used in telemetry.

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.

Caution

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

⚠️ Outside diff range comments (1)
src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.ts (1)

64-84: ⚠️ Potential issue | 🟡 Minor

Double response.text() call in error handling could throw.

If the response body stream has already been consumed by the failed response.json() call on Line 67, the subsequent response.text() call on Line 72 may throw because the body stream is already read. In practice, most runtime implementations allow only one body read — the second read throws TypeError: body stream already read.

This is a pre-existing issue (not introduced by this PR), but it's worth noting since it's in the changed file.

Proposed fix: clone the response or read text first
   if (!response.ok) {
     let errorMessage = 'Failed to initiate checkout'
     try {
-      const errorData = await response.json()
+      const errorText = await response.text()
+      const errorData = JSON.parse(errorText)
       errorMessage = errorData.message || errorMessage
     } catch {
-      // If JSON parsing fails, try to get text response or use HTTP status
-      try {
-        const errorText = await response.text()
-        errorMessage =
-          errorText || `HTTP ${response.status} ${response.statusText}`
-      } catch {
-        errorMessage = `HTTP ${response.status} ${response.statusText}`
-      }
+      // errorText is not accessible here, fall back to HTTP status
+      errorMessage = `HTTP ${response.status} ${response.statusText}`
     }

Alternatively, restructure to read text once, then try to parse as JSON:

   if (!response.ok) {
     let errorMessage = `HTTP ${response.status} ${response.statusText}`
     try {
+      const errorText = await response.text()
+      try {
+        const errorData = JSON.parse(errorText)
+        errorMessage = errorData.message || errorMessage
+      } catch {
+        errorMessage = errorText || errorMessage
+      }
-      const errorData = await response.json()
-      errorMessage = errorData.message || errorMessage
     } catch {
-      try {
-        const errorText = await response.text()
-        errorMessage =
-          errorText || `HTTP ${response.status} ${response.statusText}`
-      } catch {
-        errorMessage = `HTTP ${response.status} ${response.statusText}`
-      }
+      // Body unreadable, keep HTTP status fallback
     }
🧹 Nitpick comments (1)
src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.test.ts (1)

36-41: Mock store relies on lazy computed evaluation — subtle but correct.

The mock returns a fresh reactive({ userId: computed(() => mockUserId.value) }) on each useFirebaseAuthStore() call. Since mockUserId is a plain (non-reactive) object, Vue won't track it as a dependency — meaning the computed will not re-evaluate after its first read. The new test on Line 119 works because the computed is lazily created and never read until after mockUserId.value is mutated.

This is fine for the current single-read scenario, but be aware that if the SUT ever reads userId.value twice (e.g., once for the guard and once for the payload), the second read would return the stale cached value. If that ever becomes the case, wrap mockUserId with ref() instead:

-  mockUserId: { value: 'user-123' as string | undefined },
+  mockUserId: { value: 'user-123' as string | undefined },  // works for single-read; switch to ref() if multi-read needed

No action needed now.

Copy link
Contributor

@Myestery Myestery left a comment

Choose a reason for hiding this comment

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

Approved with a nit

Promise.resolve({ Authorization: 'Bearer test-token' })
),
mockUserId: { value: 'user-123' },
mockUserId: { value: 'user-123' as string | undefined },
Copy link
Contributor

Choose a reason for hiding this comment

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

no need for this assertion

Suggested change
mockUserId: { value: 'user-123' as string | undefined },
mockUserId: { value: 'user-123' },

@benceruleanlu benceruleanlu merged commit 815be49 into main Feb 9, 2026
28 checks passed
@benceruleanlu benceruleanlu deleted the fix/gtm-userid-storetorefs branch February 9, 2026 10:01
benceruleanlu added a commit that referenced this pull request Feb 12, 2026
## Summary

Use reactive `userId` reads for `begin_checkout` telemetry so delayed
auth state updates are reflected at event time instead of using a stale
snapshot.

## Changes

- **What**: switched subscription checkout telemetry paths to
`storeToRefs(useFirebaseAuthStore())` and read `userId.value` when
dispatching `trackBeginCheckout`.
- **What**: added regression tests that mutate `userId` after setup /
after checkout starts and assert telemetry uses the updated ID.

## Review Focus

- Verify `PricingTable` and `performSubscriptionCheckout` still emit
exactly one `begin_checkout` event per action, with `checkout_type:
change` and `checkout_type: new` in their respective paths.
- Verify the new tests would fail with stale store destructuring
(manually validated during development).

## Screenshots (if applicable)

N/A

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8726-fix-keep-begin_checkout-user_id-reactive-in-subscription-flows-3006d73d365081888c84c0335ab52e09)
by [Unito](https://www.unito.io)

(cherry picked from commit 815be49)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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