Skip to content

fix: route gtm through telemetry entrypoint#8354

Merged
benceruleanlu merged 48 commits intomainfrom
fix/gtm-telemetry-entrypoint
Feb 7, 2026
Merged

fix: route gtm through telemetry entrypoint#8354
benceruleanlu merged 48 commits intomainfrom
fix/gtm-telemetry-entrypoint

Conversation

@benceruleanlu
Copy link
Member

@benceruleanlu benceruleanlu commented Jan 28, 2026

Wire checkout attribution into GTM events and checkout POST payloads.

This updates the cloud telemetry flow so the backend team can correlate checkout events without relying on frontend cookie parsing. We now surface GA4 identity via a GTM-provided global and include attribution on both begin_checkout telemetry and the checkout POST body. The backend should continue to derive the Firebase UID from the auth header; the checkout POST body does not include a user ID.

GTM events pushed (unchanged list, updated payloads):

  • page_view (page title/location/referrer as before)
  • sign_up / login
  • begin_checkout now includes:
    • user_id, tier, cycle, checkout_type, previous_tier (if change flow)
    • ga_client_id, ga_session_id, ga_session_number
    • gclid, gbraid, wbraid

Backend-facing change:

  • POST /customers/cloud-subscription-checkout/:tier now includes a JSON body with attribution fields only:
    • ga_client_id, ga_session_id, ga_session_number
    • gclid, gbraid, wbraid
  • Backend should continue to derive the Firebase UID from the auth header.

Required GTM setup:

  • Provide window.__ga_identity__ via a GTM Custom HTML tag (after GA4/Google tag) with { client_id, session_id, session_number }. The frontend reads this to populate the GA fields.
image

Screenshots (if applicable)

image

Manual Testing:
image
image
image
image

To manually test, you will need to override api/features in devtools to also return this:

"gtm_container_id": "GTM-NP9JM6K7"

┆Issue is synchronized with this Notion page by Unito

Summary by CodeRabbit

  • New Features

    • Analytics expanded: page view tracking, richer auth telemetry (includes user IDs), and checkout begin events with attribution.
    • Google Tag Manager support and persistent checkout attribution (GA/client/session IDs, gclid/gbraid/wbraid).
  • Chores

    • Telemetry reworked to support multiple providers via a registry with cloud-only initialization.
    • Workflow module refactored for clearer exports.
  • Tests

    • Added/updated tests for attribution, telemetry, and subscription flows.
  • CI

    • New check prevents telemetry from leaking into distribution artifacts.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 28, 2026

📝 Walkthrough

Walkthrough

Adds a registry-based telemetry system (Mixpanel + GTM), cloud-only init, GTM runtime/types and remote-config flag, pageview/auth/checkout tracking and attribution, TelemetryRegistry and GTM provider, checkout-attribution util and tests, subscription checkout telemetry hooks/tests, ComfyWorkflow extraction, and a CI dist telemetry scan workflow.

Changes

Cohort / File(s) Summary
Global types & Remote Config
global.d.ts, src/platform/remoteConfig/types.ts
Add window.__CONFIG__.gtm_container_id?: string, window.dataLayer?: Array<Record<string, unknown>>, window.__ga_identity__?, and RemoteConfig.gtm_container_id?: string.
Telemetry core & types
src/platform/telemetry/index.ts, src/platform/telemetry/types.ts
Switch to registry pattern (TelemetryDispatcher), add setTelemetryRegistry(), make many provider methods optional, add PageViewMetadata and BeginCheckoutMetadata, export TelemetryDispatcher.
Telemetry registry & providers
src/platform/telemetry/TelemetryRegistry.ts, src/platform/telemetry/providers/cloud/GtmTelemetryProvider.ts
Add TelemetryRegistry that fans out events to providers; add GtmTelemetryProvider which injects GTM, ensures dataLayer, and implements page/auth/checkout pushes.
Telemetry init & startup
src/platform/telemetry/initTelemetry.ts, src/main.ts
Add cloud-only initTelemetry() that builds a TelemetryRegistry, registers Mixpanel + GTM, and src/main.ts dynamically imports/calls it in cloud builds.
Router integration
src/router.ts
Register an afterEach hook to call telemetry trackPageView when registry present.
Checkout attribution util & tests
src/platform/telemetry/utils/checkoutAttribution.ts, src/platform/telemetry/utils/__tests__/checkoutAttribution.test.ts
New getCheckoutAttribution() merging URL click IDs, persisted data, and window.__ga_identity__; add tests for parsing and persistence.
Subscription checkout flows & UI
src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.ts, src/platform/cloud/subscription/components/PricingTable.vue
Include checkout attribution in POST body; call telemetry.trackBeginCheckout (user_id, tier, cycle, checkout_type, attribution); adjust performSubscriptionCheckout call signature (extra boolean arg).
Subscription composable & tests
src/platform/cloud/subscription/composables/useSubscription.ts, .../useSubscription.test.ts, useSubscriptionCancellationWatcher*.ts, subscriptionCheckoutUtil.test.ts, PricingTable.test.ts
Tests refactored to run composables within explicit effect scopes; hoisted/shared mocks; update telemetry types to TelemetryDispatcher; add tests asserting begin_checkout telemetry and checkout POST behavior.
Telemetry API consumers
src/stores/firebaseAuthStore.ts, various tests
Add user_id to auth telemetry payloads; expose userId in some store mocks used by tests.
Workflow refactor & imports
src/platform/workflow/management/stores/comfyWorkflow.ts, src/platform/workflow/management/stores/workflowStore.ts, src/stores/subgraphStore.ts
Extract ComfyWorkflow and LoadedComfyWorkflow into comfyWorkflow.ts, re-export from workflowStore.ts, update import sites.
New tests
src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.test.ts, other updated tests
Add unit/integration tests for checkout POST + telemetry and update tests to new telemetry/checkout-attribution behavior and scoped test harness.
CI telemetry scan
.github/workflows/ci-dist-telemetry-scan.yaml
Add workflow to scan built dist for telemetry references and fail on unexpected telemetry artifacts.

Sequence Diagram(s)

sequenceDiagram
    participant App as App Startup
    participant Main as src/main.ts
    participant Init as initTelemetry()
    participant Index as telemetry index
    participant Registry as TelemetryRegistry
    participant Mixpanel as MixpanelProvider
    participant GTM as GtmTelemetryProvider

    App->>Main: boot (cloud build)
    Main->>Init: dynamic import & call initTelemetry()
    activate Init
    Init->>Registry: create TelemetryRegistry
    Registry->>Mixpanel: registerProvider(Mixpanel)
    Registry->>GTM: registerProvider(GTM)
    GTM->>GTM: initialize() (ensure window.dataLayer, inject GTM script)
    Registry-->>Init: registry ready
    Init->>Index: setTelemetryRegistry(registry)
    deactivate Init
Loading
sequenceDiagram
    participant User as User
    participant Router as src/router.ts
    participant Telemetry as TelemetryRegistry
    participant GTM as GtmTelemetryProvider
    participant Mixpanel as MixpanelProvider
    participant DataLayer as window.dataLayer

    User->>Router: navigate
    Router->>Telemetry: trackPageView(title, path)
    activate Telemetry
    Telemetry->>GTM: trackPageView(...)
    GTM->>DataLayer: push page_view event
    Telemetry->>Mixpanel: trackPageView(...)
    deactivate Telemetry
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Poem

🐰 I hopped through code with eager cheer,
Registry stitched providers near,
GTM nudged the dataLayer drum,
Attribution traced each checkout strum,
Carrots logged — the hop’s sincere 🥕✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 18.18% 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 'fix: route gtm through telemetry entrypoint' directly describes the main architectural change in the PR—routing GTM through the telemetry system.
Description check ✅ Passed The PR description provides comprehensive context: it explains the what (GTM routing, checkout attribution), the why (backend correlation without cookie parsing), required setup (window.ga_identity), and includes implementation details, testing evidence, and backend expectations.

✏️ 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-telemetry-entrypoint

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.

@benceruleanlu benceruleanlu added the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Jan 28, 2026
@benceruleanlu benceruleanlu force-pushed the fix/gtm-telemetry-entrypoint branch from 88677aa to 563cdbf Compare January 28, 2026 09:43
@github-actions
Copy link

github-actions bot commented Jan 28, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/05/2026, 06:56:12 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 28, 2026

🎭 Playwright Tests: ⚠️ Passed with flaky tests

Results: 499 passed, 0 failed, 6 flaky, 8 skipped (Total: 513)

❌ Failed Tests

📊 Browser Reports
  • chromium: View Report (✅ 487 / ❌ 0 / ⚠️ 6 / ⏭️ 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: 19.6 MB baseline 20.2 MB — 🟢 -613 kB
  • Gzip: 4.19 MB baseline 4.32 MB — 🟢 -134 kB
  • Brotli: 3.25 MB baseline 3.34 MB — 🟢 -89.2 kB
  • Bundles: 237 current • 233 baseline • 223 added / 219 removed

Category Glance
Vendor & Third-Party 🟢 -601 kB (8.77 MB) · Data & Services 🟢 -39.9 kB (2.06 MB) · Other 🔴 +12.8 kB (7.1 MB) · Graph Workspace 🔴 +12.3 kB (852 kB) · Utilities & Hooks 🔴 +2.7 kB (237 kB) · UI Components 🔴 +205 B (38 kB) · + 5 more

Per-category breakdown
App Entry Points — 22.4 kB (baseline 22.5 kB) • 🟢 -104 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BxJh6Htb.js (removed) 22.5 kB 🟢 -22.5 kB 🟢 -7.18 kB 🟢 -6.27 kB
assets/index-CBk4HbWL.js (new) 22.4 kB 🔴 +22.4 kB 🔴 +7.25 kB 🔴 +6.28 kB

Status: 1 added / 1 removed

Graph Workspace — 852 kB (baseline 840 kB) • 🔴 +12.3 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BtyMgSI4.js (new) 852 kB 🔴 +852 kB 🔴 +183 kB 🔴 +140 kB
assets/GraphView-CH--ZSma.js (removed) 840 kB 🟢 -840 kB 🟢 -180 kB 🟢 -137 kB

Status: 1 added / 1 removed

Views & Navigation — 69 kB (baseline 69 kB) • 🔴 +42 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BO66kDe-.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -3.46 kB 🟢 -2.95 kB
assets/CloudSurveyView-BvgYe3En.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.82 kB
assets/CloudLoginView-B0FkfIqg.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.95 kB 🔴 +2.58 kB
assets/CloudLoginView-2eyjobGD.js (removed) 10 kB 🟢 -10 kB 🟢 -2.93 kB 🟢 -2.56 kB
assets/UserCheckView-BSxap67Y.js (new) 8.44 kB 🔴 +8.44 kB 🔴 +2.24 kB 🔴 +1.95 kB
assets/UserCheckView-oCyGS9my.js (removed) 8.39 kB 🟢 -8.39 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/CloudSignupView-BZsV6GkK.js (new) 7.46 kB 🔴 +7.46 kB 🔴 +2.35 kB 🔴 +2.04 kB
assets/CloudSignupView-BHhGBVUt.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.31 kB 🟢 -2.02 kB
assets/CloudLayoutView-DQLzk2YJ.js (new) 6.47 kB 🔴 +6.47 kB 🔴 +2.14 kB 🔴 +1.85 kB
assets/CloudLayoutView-B4SV_kIk.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.11 kB 🟢 -1.83 kB
assets/CloudForgotPasswordView-SAoQnC2h.js (new) 5.6 kB 🔴 +5.6 kB 🔴 +1.96 kB 🔴 +1.73 kB
assets/CloudForgotPasswordView-CLkXVhij.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.94 kB 🟢 -1.71 kB
assets/CloudAuthTimeoutView-BN3rKXGB.js (new) 4.95 kB 🔴 +4.95 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/CloudAuthTimeoutView-D_S9Fylr.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CloudSubscriptionRedirectView-B86RW3pS.js (new) 4.75 kB 🔴 +4.75 kB 🔴 +1.79 kB 🔴 +1.59 kB
assets/CloudSubscriptionRedirectView-C4dcknkJ.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.77 kB 🟢 -1.57 kB
assets/UserSelectView-Dfdq2xhQ.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.64 kB 🟢 -1.47 kB
assets/UserSelectView-e3FvX-Hl.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.64 kB 🔴 +1.47 kB
assets/CloudSorryContactSupportView-BESswGvD.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +539 B 🔴 +470 B
assets/CloudSorryContactSupportView-BPXBOTez.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -539 B 🟢 -464 B
assets/layout-ItMApKHF.js (new) 296 B 🔴 +296 B 🔴 +224 B 🔴 +188 B
assets/layout-ncetNFDR.js (removed) 296 B 🟢 -296 B 🟢 -222 B 🟢 -186 B

Status: 11 added / 11 removed

Panels & Settings — 410 kB (baseline 410 kB) • 🔴 +81 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settings-BmEXiKRV.js (removed) 32 kB 🟢 -32 kB 🟢 -8.08 kB 🟢 -6.63 kB
assets/settings-DnHjsNmm.js (new) 32 kB 🔴 +32 kB 🔴 +8.08 kB 🔴 +6.66 kB
assets/settings-CKCscONF.js (removed) 28.1 kB 🟢 -28.1 kB 🟢 -7.15 kB 🟢 -6.03 kB
assets/settings-DBDXbnBv.js (new) 28.1 kB 🔴 +28.1 kB 🔴 +7.15 kB 🔴 +6.01 kB
assets/WorkspacePanel-Ba4RKocz.js (new) 27 kB 🔴 +27 kB 🔴 +5.68 kB 🔴 +5 kB
assets/WorkspacePanel-CwhGscD8.js (removed) 26.9 kB 🟢 -26.9 kB 🟢 -5.66 kB 🟢 -4.96 kB
assets/settings-B9eolMb2.js (new) 26.8 kB 🔴 +26.8 kB 🔴 +7 kB 🔴 +5.69 kB
assets/settings-D95NIw0v.js (removed) 26.8 kB 🟢 -26.8 kB 🟢 -7 kB 🟢 -5.67 kB
assets/settings-ClOVqmwi.js (new) 25.7 kB 🔴 +25.7 kB 🔴 +7.28 kB 🔴 +6.1 kB
assets/settings-DQe4OZm2.js (removed) 25.7 kB 🟢 -25.7 kB 🟢 -7.28 kB 🟢 -6.1 kB
assets/settings-BgcR6REE.js (removed) 25 kB 🟢 -25 kB 🟢 -6.99 kB 🟢 -6.11 kB
assets/settings-yd6ir1l8.js (new) 25 kB 🔴 +25 kB 🔴 +6.99 kB 🔴 +6.11 kB
assets/settings-DmYc-PH9.js (removed) 24.2 kB 🟢 -24.2 kB 🟢 -6.75 kB 🟢 -5.74 kB
assets/settings-Wod4JhTQ.js (new) 24.2 kB 🔴 +24.2 kB 🔴 +6.75 kB 🔴 +5.74 kB
assets/settings-BNs5rnMt.js (removed) 24.1 kB 🟢 -24.1 kB 🟢 -6.88 kB 🟢 -6.02 kB
assets/settings-DNLcViDS.js (new) 24.1 kB 🔴 +24.1 kB 🔴 +6.88 kB 🔴 +6.02 kB
assets/settings-Buf6BRdX.js (new) 23.6 kB 🔴 +23.6 kB 🔴 +6.64 kB 🔴 +5.8 kB
assets/settings-C5jqELHS.js (removed) 23.6 kB 🟢 -23.6 kB 🟢 -6.64 kB 🟢 -5.8 kB
assets/settings-DVdCowAx.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +7 kB 🔴 +5.81 kB
assets/settings-f2yAwEpW.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -7 kB 🟢 -5.81 kB
assets/SecretsPanel-C8X8IKq6.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.31 kB 🟢 -4.65 kB
assets/SecretsPanel-RvhbNwox.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.31 kB 🔴 +4.66 kB
assets/LegacyCreditsPanel-BBp-Yz1q.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +5.65 kB 🔴 +4.96 kB
assets/settings-BNqm8zgi.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +6.85 kB 🔴 +5.49 kB
assets/settings-CzcL_U24.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -6.85 kB 🟢 -5.49 kB
assets/LegacyCreditsPanel-Baf-izbx.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -5.62 kB 🟢 -4.93 kB
assets/settings-CeeSxfeJ.js (new) 20.3 kB 🔴 +20.3 kB 🔴 +6.62 kB 🔴 +5.16 kB
assets/settings-Dxocpd_-.js (removed) 20.3 kB 🟢 -20.3 kB 🟢 -6.62 kB 🟢 -5.16 kB
assets/SubscriptionPanel-B7RaCnPF.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.8 kB 🔴 +4.24 kB
assets/SubscriptionPanel--WFhpSTI.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -4.77 kB 🟢 -4.21 kB
assets/KeybindingPanel-CCg4Cqqm.js (new) 12.7 kB 🔴 +12.7 kB 🔴 +3.65 kB 🔴 +3.22 kB
assets/KeybindingPanel-DpUChvaS.js (removed) 12.6 kB 🟢 -12.6 kB 🟢 -3.62 kB 🟢 -3.21 kB
assets/ExtensionPanel-CKot6GGf.js (new) 9.54 kB 🔴 +9.54 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ExtensionPanel-Cy3_JGtr.js (removed) 9.49 kB 🟢 -9.49 kB 🟢 -2.69 kB 🟢 -2.4 kB
assets/AboutPanel-psz8avb4.js (new) 8.62 kB 🔴 +8.62 kB 🔴 +2.46 kB 🔴 +2.21 kB
assets/AboutPanel-qEDivQHD.js (removed) 8.62 kB 🟢 -8.62 kB 🟢 -2.46 kB 🟢 -2.21 kB
assets/ServerConfigPanel-CT_xUfMP.js (new) 6.68 kB 🔴 +6.68 kB 🔴 +2.17 kB 🔴 +1.94 kB
assets/ServerConfigPanel-DcYemXfL.js (removed) 6.64 kB 🟢 -6.64 kB 🟢 -2.15 kB 🟢 -1.93 kB
assets/UserPanel-Dw8H86-g.js (new) 6.32 kB 🔴 +6.32 kB 🔴 +2.05 kB 🔴 +1.79 kB
assets/UserPanel-CC8-S4fF.js (removed) 6.28 kB 🟢 -6.28 kB 🟢 -2.02 kB 🟢 -1.78 kB
assets/cloudRemoteConfig-D_CgAEr3.js (new) 1.48 kB 🔴 +1.48 kB 🔴 +718 B 🔴 +618 B
assets/cloudRemoteConfig-DXj5wKH9.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -702 B 🟢 -606 B
assets/refreshRemoteConfig-6iINa6it.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -509 B 🟢 -458 B
assets/refreshRemoteConfig-Ahfq98cY.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +513 B 🔴 +448 B
assets/config-DnStCGQ9.js (new) 1.01 kB 🔴 +1.01 kB 🔴 +549 B 🔴 +444 B
assets/config-HAvaVehF.js (removed) 1.01 kB 🟢 -1.01 kB 🟢 -549 B 🟢 -445 B
assets/refreshRemoteConfig-CgM0kq2O.js (removed) 345 B 🟢 -345 B 🟢 -201 B 🟢 -201 B
assets/remoteConfig-CUBB_j_I.js 581 B 581 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 23 added / 24 removed

User & Accounts — 16.1 kB (baseline 16 kB) • 🔴 +80 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/PasswordFields-BAi3GPM-.js (removed) 4.51 kB 🟢 -4.51 kB 🟢 -1.36 kB 🟢 -1.19 kB
assets/PasswordFields-BRGmy5je.js (new) 4.51 kB 🔴 +4.51 kB 🔴 +1.36 kB 🔴 +1.19 kB
assets/auth-DbcTWJMJ.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -996 B
assets/auth-jCgU6Za9.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +992 B
assets/SignUpForm-DhtG6BZb.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.24 kB 🟢 -1.1 kB
assets/SignUpForm-tUUafW2T.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/UpdatePasswordContent-BJC-w9Hc.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1.09 kB 🔴 +961 B
assets/UpdatePasswordContent-Ckoe8Piv.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -948 B
assets/WorkspaceProfilePic-B0BztYjc.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -819 B 🟢 -729 B
assets/WorkspaceProfilePic-DoXGTZeH.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +821 B 🔴 +751 B
assets/firebaseAuthStore-CltWDhJt.js (new) 830 B 🔴 +830 B 🔴 +411 B 🔴 +366 B
assets/firebaseAuthStore-CE1CAHVI.js (removed) 790 B 🟢 -790 B 🟢 -389 B 🟢 -351 B
assets/auth-D1HKJDLN.js (new) 347 B 🔴 +347 B 🔴 +221 B 🔴 +186 B
assets/auth-DSXSZQIz.js (removed) 347 B 🟢 -347 B 🟢 -221 B 🟢 -190 B

Status: 7 added / 7 removed

Editors & Dialogs — 3.57 kB (baseline 3.47 kB) • 🔴 +104 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-CdSs9B2z.js (new) 2.75 kB 🔴 +2.75 kB 🔴 +1.36 kB 🔴 +1.22 kB
assets/useSubscriptionDialog-CVdavmn4.js (removed) 2.68 kB 🟢 -2.68 kB 🟢 -1.32 kB 🟢 -1.17 kB
assets/useSubscriptionDialog-ii8Jyipc.js (new) 823 B 🔴 +823 B 🔴 +408 B 🔴 +360 B
assets/useSubscriptionDialog-DVc37k3B.js (removed) 783 B 🟢 -783 B 🟢 -386 B 🟢 -345 B

Status: 2 added / 2 removed

UI Components — 38 kB (baseline 37.8 kB) • 🔴 +205 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-I_KHq8tY.js (new) 9.94 kB 🔴 +9.94 kB 🔴 +3.43 kB 🔴 +3.02 kB
assets/useTerminalTabs-DMEPEEyp.js (removed) 9.9 kB 🟢 -9.9 kB 🟢 -3.4 kB 🟢 -3 kB
assets/TopbarBadge-BsZTG314.js (removed) 7.52 kB 🟢 -7.52 kB 🟢 -1.82 kB 🟢 -1.6 kB
assets/TopbarBadge-CUQoR-eE.js (new) 7.52 kB 🔴 +7.52 kB 🔴 +1.82 kB 🔴 +1.6 kB
assets/ComfyQueueButton-BZ2LParT.js (new) 7.17 kB 🔴 +7.17 kB 🔴 +2.32 kB 🔴 +2.09 kB
assets/ComfyQueueButton-DlwJnD1W.js (removed) 7.13 kB 🟢 -7.13 kB 🟢 -2.31 kB 🟢 -2.06 kB
assets/SubscribeButton-0u3rnOb2.js (new) 3.72 kB 🔴 +3.72 kB 🔴 +1.39 kB 🔴 +1.24 kB
assets/SubscribeButton-C8P5BwxN.js (removed) 3.68 kB 🟢 -3.68 kB 🟢 -1.38 kB 🟢 -1.24 kB
assets/Button-BIpQUnNH.js (new) 3 kB 🔴 +3 kB 🔴 +1.21 kB 🔴 +1.06 kB
assets/Button-ChqYCdrL.js (removed) 3 kB 🟢 -3 kB 🟢 -1.21 kB 🟢 -1.08 kB
assets/WidgetButton-DVfWCi_V.js (removed) 1.84 kB 🟢 -1.84 kB 🟢 -877 B 🟢 -776 B
assets/WidgetButton-DzLxB6M3.js (new) 1.84 kB 🔴 +1.84 kB 🔴 +880 B 🔴 +769 B
assets/cloudFeedbackTopbarButton-E4WqySsT.js (new) 1.64 kB 🔴 +1.64 kB 🔴 +877 B 🔴 +745 B
assets/cloudFeedbackTopbarButton-DIfMGaF3.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -857 B 🟢 -760 B
assets/CloudBadge-DvjTRe3E.js (new) 1.2 kB 🔴 +1.2 kB 🔴 +587 B 🔴 +508 B
assets/CloudBadge-V9dvGAv0.js (removed) 1.2 kB 🟢 -1.2 kB 🟢 -591 B 🟢 -510 B
assets/UserAvatar-Ce5TPKsI.js (new) 1.17 kB 🔴 +1.17 kB 🔴 +619 B 🔴 +528 B
assets/UserAvatar-Dtdiv1Hu.js (removed) 1.17 kB 🟢 -1.17 kB 🟢 -619 B 🟢 -528 B
assets/ComfyQueueButton-C8kzkKUk.js (new) 835 B 🔴 +835 B 🔴 +414 B 🔴 +366 B
assets/ComfyQueueButton-BpVKE0pb.js (removed) 795 B 🟢 -795 B 🟢 -393 B 🟢 -354 B

Status: 10 added / 10 removed

Data & Services — 2.06 MB (baseline 2.1 MB) • 🟢 -39.9 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-DKSPPY1l.js (removed) 1.3 MB 🟢 -1.3 MB 🟢 -298 kB 🟢 -232 kB
assets/dialogService-BbAPgZV-.js (new) 1.26 MB 🔴 +1.26 MB 🔴 +287 kB 🔴 +223 kB
assets/api-CFaytb2I.js (removed) 640 kB 🟢 -640 kB 🟢 -144 kB 🟢 -116 kB
assets/api-DT8ckREV.js (new) 640 kB 🔴 +640 kB 🔴 +144 kB 🔴 +115 kB
assets/load3dService-TMfIb8DZ.js (new) 91.1 kB 🔴 +91.1 kB 🔴 +19.1 kB 🔴 +16.5 kB
assets/load3dService-BAw_Fq0T.js (removed) 91.1 kB 🟢 -91.1 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/teamWorkspaceStore-BG3hzw_Z.js (removed) 27.1 kB 🟢 -27.1 kB 🟢 -6.12 kB 🟢 -5.41 kB
assets/teamWorkspaceStore-CP1wEZ1A.js (new) 27.1 kB 🔴 +27.1 kB 🔴 +6.11 kB 🔴 +5.41 kB
assets/systemStatsStore-DkzyAp-d.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +4.29 kB 🔴 +3.77 kB
assets/systemStatsStore-Pxy3Tb3i.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -4.29 kB 🟢 -3.77 kB
assets/releaseStore-37lg3G5_.js (new) 8.14 kB 🔴 +8.14 kB 🔴 +2.23 kB 🔴 +1.97 kB
assets/releaseStore-B4r4KKD9.js (removed) 8.14 kB 🟢 -8.14 kB 🟢 -2.24 kB 🟢 -1.97 kB
assets/keybindingService-ClYHnSZ7.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/keybindingService-MD7I-9rN.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/dialogStore-B14XdiMm.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.24 kB 🔴 +1.09 kB
assets/dialogStore-D2gUGUn6.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.24 kB 🟢 -1.1 kB
assets/serverConfigStore-CnHDpxrt.js (new) 2.32 kB 🔴 +2.32 kB 🔴 +788 B 🔴 +689 B
assets/serverConfigStore-DB58Z5s2.js (removed) 2.32 kB 🟢 -2.32 kB 🟢 -791 B 🟢 -690 B
assets/bootstrapStore-an8inut7.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +883 B 🔴 +814 B
assets/bootstrapStore-CvNnJGA6.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -882 B 🟢 -814 B
assets/userStore-0HhrHJRa.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +719 B 🔴 +637 B
assets/userStore-DGRTB-u5.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -721 B 🟢 -675 B
assets/audioService-C9WjWMI_.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +848 B 🔴 +724 B
assets/audioService-ChcEOCEx.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -843 B 🟢 -728 B
assets/releaseStore-BTKYuQlF.js (new) 802 B 🔴 +802 B 🔴 +405 B 🔴 +353 B
assets/workflowDraftStore-C7TIB6yP.js (new) 778 B 🔴 +778 B 🔴 +399 B 🔴 +347 B
assets/dialogService-DuQTaGcA.js (new) 767 B 🔴 +767 B 🔴 +391 B 🔴 +341 B
assets/releaseStore-BNCM_CRt.js (removed) 762 B 🟢 -762 B 🟢 -385 B 🟢 -338 B

Status: 15 added / 13 removed

Utilities & Hooks — 237 kB (baseline 234 kB) • 🔴 +2.7 kB

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-Cj_Eb9ik.js (removed) 177 kB 🟢 -177 kB 🟢 -38.9 kB 🟢 -32.4 kB
assets/useConflictDetection-DeCqHTN-.js (new) 177 kB 🔴 +177 kB 🔴 +38.9 kB 🔴 +32.4 kB
assets/useLoad3d-8GAQoiiA.js (removed) 14.4 kB 🟢 -14.4 kB 🟢 -3.56 kB 🟢 -3.15 kB
assets/useLoad3d-D93KaAmx.js (new) 14.4 kB 🔴 +14.4 kB 🔴 +3.56 kB 🔴 +3.14 kB
assets/useLoad3dViewer-BlnZivZM.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.16 kB 🟢 -2.8 kB
assets/useLoad3dViewer-C8nWIdz6.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.16 kB 🔴 +2.8 kB
assets/colorUtil-C7y_jOya.js (new) 7 kB 🔴 +7 kB 🔴 +2.14 kB 🔴 +1.89 kB
assets/colorUtil-FW_Ghng2.js (removed) 7 kB 🟢 -7 kB 🟢 -2.14 kB 🟢 -1.9 kB
assets/useErrorHandling-xYKy7a9u.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.34 kB 🟢 -1.18 kB
assets/subscriptionCheckoutUtil-BTRSMY4E.js (new) 4.12 kB 🔴 +4.12 kB 🔴 +1.53 kB 🔴 +1.33 kB
assets/useWorkspaceUI-ByNLxcoj.js (removed) 3.16 kB 🟢 -3.16 kB 🟢 -883 B 🟢 -765 B
assets/useWorkspaceUI-DAueSIlN.js (new) 3.16 kB 🔴 +3.16 kB 🔴 +881 B 🔴 +768 B
assets/useFeatureFlags-CwV1uAjl.js (new) 3.07 kB 🔴 +3.07 kB 🔴 +959 B 🔴 +830 B
assets/useSubscriptionActions-O_3U6VN4.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +768 B 🔴 +659 B
assets/useSubscriptionActions-DDT_M35K.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -759 B 🟢 -653 B
assets/subscriptionCheckoutUtil-BhtxaBle.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -782 B 🟢 -673 B
assets/useExternalLink-BGTvgS-9.js (removed) 1.63 kB 🟢 -1.63 kB 🟢 -757 B 🟢 -671 B
assets/useExternalLink-BSYlH9Z_.js (new) 1.63 kB 🔴 +1.63 kB 🔴 +759 B 🔴 +670 B
assets/useCopyToClipboard-BirO7qgg.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +668 B 🔴 +566 B
assets/useCopyToClipboard-CTuQep2Q.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -666 B 🟢 -551 B
assets/markdownRendererUtil-Cc2LFa5s.js (removed) 1.56 kB 🟢 -1.56 kB 🟢 -812 B 🟢 -694 B
assets/markdownRendererUtil-YzPqYQr3.js (new) 1.56 kB 🔴 +1.56 kB 🔴 +813 B 🔴 +703 B
assets/useErrorHandling-CNIjYPo_.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +553 B 🔴 +505 B
assets/useSubscriptionCredits-ChupeH-A.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +502 B 🔴 +457 B
assets/useSubscriptionCredits-CqRhI05b.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -503 B 🟢 -432 B
assets/networkUtil-BE0Xh9tX.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +589 B 🔴 +493 B
assets/networkUtil-Du2a_n7V.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -585 B 🟢 -476 B
assets/useLoad3d-DG-XZTfW.js (new) 901 B 🔴 +901 B 🔴 +447 B 🔴 +397 B
assets/useLoad3dViewer-KtZc-Kc3.js (new) 880 B 🔴 +880 B 🔴 +431 B 🔴 +388 B
assets/useLoad3d-CM4kUbqP.js (removed) 861 B 🟢 -861 B 🟢 -426 B 🟢 -384 B
assets/audioUtils-B69_6kT5.js (removed) 858 B 🟢 -858 B 🟢 -501 B 🟢 -420 B
assets/audioUtils-DN88SOXe.js (new) 858 B 🔴 +858 B 🔴 +501 B 🔴 +417 B
assets/useLoad3dViewer-Ces1KAc2.js (removed) 840 B 🟢 -840 B 🟢 -411 B 🟢 -374 B
assets/useCurrentUser-CrWjAhZN.js (new) 764 B 🔴 +764 B 🔴 +394 B 🔴 +342 B
assets/useCurrentUser-5GdQIsoK.js (removed) 724 B 🟢 -724 B 🟢 -372 B 🟢 -331 B
assets/_plugin-vue_export-helper-CAbbkOlw.js (removed) 315 B 🟢 -315 B 🟢 -230 B 🟢 -206 B
assets/_plugin-vue_export-helper-CGZwzNkl.js (new) 315 B 🔴 +315 B 🔴 +230 B 🔴 +206 B
assets/SkeletonUtils-DLC8UxUp.js (new) 133 B 🔴 +133 B 🔴 +114 B 🔴 +109 B
assets/SkeletonUtils-DwBAnKr-.js (removed) 133 B 🟢 -133 B 🟢 -114 B 🟢 -112 B
assets/envUtil-Djb4sHrV.js 524 B 524 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 20 added / 19 removed

Vendor & Third-Party — 8.77 MB (baseline 9.37 MB) • 🟢 -601 kB

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-DPcKX1Hx.js (removed) 2.16 MB 🟢 -2.16 MB 🟢 -456 kB 🟢 -346 kB
assets/vendor-three-CJhOuqDg.js (removed) 1.8 MB 🟢 -1.8 MB 🟢 -386 kB 🟢 -280 kB
assets/vendor-three-DRQwuk_9.js (new) 1.8 MB 🔴 +1.8 MB 🔴 +386 kB 🔴 +280 kB
assets/vendor-primevue-8AsLpxT_.js (new) 1.74 MB 🔴 +1.74 MB 🔴 +313 kB 🔴 +190 kB
assets/vendor-primevue-Dw8RivU1.js (removed) 1.74 MB 🟢 -1.74 MB 🟢 -313 kB 🟢 -190 kB
assets/vendor-other-BJ0C5Lwu.js (new) 1.55 MB 🔴 +1.55 MB 🔴 +323 kB 🔴 +257 kB
assets/vendor-tiptap-BkdC6us-.js (new) 632 kB 🔴 +632 kB 🔴 +147 kB 🔴 +120 kB
assets/vendor-tiptap-CvX7mojg.js (removed) 632 kB 🟢 -632 kB 🟢 -147 kB 🟢 -119 kB
assets/vendor-chart-CIdI9Yl4.js (removed) 399 kB 🟢 -399 kB 🟢 -95.7 kB 🟢 -79.6 kB
assets/vendor-chart-DhYgJMoy.js (new) 399 kB 🔴 +399 kB 🔴 +95.7 kB 🔴 +79.6 kB
assets/vendor-xterm-DAqJtL42.js (new) 398 kB 🔴 +398 kB 🔴 +79.3 kB 🔴 +63.5 kB
assets/vendor-xterm-DOEEpxXk.js (removed) 398 kB 🟢 -398 kB 🟢 -79.3 kB 🟢 -63.5 kB
assets/vendor-reka-ui-BgL8c-eH.js (new) 240 kB 🔴 +240 kB 🔴 +49 kB 🔴 +40.8 kB
assets/vendor-reka-ui-CPrt7lw0.js (removed) 240 kB 🟢 -240 kB 🟢 -49 kB 🟢 -40.8 kB
assets/vendor-markdown-BkVHYrKV.js (removed) 102 kB 🟢 -102 kB 🟢 -24.9 kB 🟢 -22 kB
assets/vendor-markdown-CLFqBOQ2.js (new) 102 kB 🔴 +102 kB 🔴 +24.9 kB 🔴 +22 kB
assets/vendor-axios-D0w6WYH0.js 71.6 kB 71.6 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-sentry-BVA5kbUC.js 183 kB 183 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-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

Status: 8 added / 8 removed

Other — 7.1 MB (baseline 7.08 MB) • 🔴 +12.8 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-CPvZppmN.js (removed) 479 kB 🟢 -479 kB 🟢 -91.5 kB 🟢 -71.3 kB
assets/i18n-DiQ1SGvj.js (new) 479 kB 🔴 +479 kB 🔴 +91.5 kB 🔴 +71.3 kB
assets/nodeDefs-PGdfR_x_.js (removed) 441 kB 🟢 -441 kB 🟢 -66.9 kB 🟢 -46.2 kB
assets/nodeDefs-xS-1m-nG.js (new) 441 kB 🔴 +441 kB 🔴 +66.9 kB 🔴 +46.2 kB
assets/nodeDefs-BcADFj4z.js (removed) 404 kB 🟢 -404 kB 🟢 -60.9 kB 🟢 -42.7 kB
assets/nodeDefs-v7-oTX86.js (new) 404 kB 🔴 +404 kB 🔴 +60.9 kB 🔴 +42.7 kB
assets/nodeDefs-Drkpcosr.js (new) 404 kB 🔴 +404 kB 🔴 +62.9 kB 🔴 +44.3 kB
assets/nodeDefs-SDKvs0-9.js (removed) 404 kB 🟢 -404 kB 🟢 -62.9 kB 🟢 -44.3 kB
assets/nodeDefs-BddTsShn.js (removed) 374 kB 🟢 -374 kB 🟢 -60.9 kB 🟢 -42.6 kB
assets/nodeDefs-DzKj_MzH.js (new) 374 kB 🔴 +374 kB 🔴 +60.9 kB 🔴 +42.6 kB
assets/nodeDefs-Cfjv7JEn.js (removed) 364 kB 🟢 -364 kB 🟢 -59.8 kB 🟢 -42.3 kB
assets/nodeDefs-CXOt97gz.js (new) 364 kB 🔴 +364 kB 🔴 +59.8 kB 🔴 +42.3 kB
assets/nodeDefs-CEMSHoZg.js (removed) 360 kB 🟢 -360 kB 🟢 -58.4 kB 🟢 -42.7 kB
assets/nodeDefs-djrO_t-9.js (new) 360 kB 🔴 +360 kB 🔴 +58.4 kB 🔴 +42.7 kB
assets/nodeDefs-aApbAbNI.js (removed) 360 kB 🟢 -360 kB 🟢 -59.7 kB 🟢 -43.5 kB
assets/nodeDefs-Bn04JNL-.js (new) 360 kB 🔴 +360 kB 🔴 +59.7 kB 🔴 +43.5 kB
assets/nodeDefs-BbVIS5BG.js (removed) 357 kB 🟢 -357 kB 🟢 -57.2 kB 🟢 -41.7 kB
assets/nodeDefs-DmlCle2B.js (new) 357 kB 🔴 +357 kB 🔴 +57.2 kB 🔴 +41.7 kB
assets/nodeDefs-DTPAo_v7.js (removed) 353 kB 🟢 -353 kB 🟢 -56.3 kB 🟢 -41.1 kB
assets/nodeDefs-JZczorgb.js (new) 353 kB 🔴 +353 kB 🔴 +56.3 kB 🔴 +41.1 kB
assets/nodeDefs-B2JRfCRl.js (removed) 332 kB 🟢 -332 kB 🟢 -58.4 kB 🟢 -41 kB
assets/nodeDefs-okPmUczq.js (new) 332 kB 🔴 +332 kB 🔴 +58.4 kB 🔴 +41 kB
assets/nodeDefs-BrQNg87y.js (removed) 329 kB 🟢 -329 kB 🟢 -57.3 kB 🟢 -39.8 kB
assets/nodeDefs-DF3fmXVW.js (new) 329 kB 🔴 +329 kB 🔴 +57.3 kB 🔴 +39.8 kB
assets/main-CN7pSufO.js (removed) 180 kB 🟢 -180 kB 🟢 -47.6 kB 🟢 -38 kB
assets/main-CtIc2Idr.js (new) 180 kB 🔴 +180 kB 🔴 +47.6 kB 🔴 +38 kB
assets/main-DMGBq1K7.js (new) 161 kB 🔴 +161 kB 🔴 +42.9 kB 🔴 +35 kB
assets/main-Dt6bQoC3.js (removed) 161 kB 🟢 -161 kB 🟢 -42.9 kB 🟢 -35 kB
assets/main-5vUvgJMx.js (removed) 155 kB 🟢 -155 kB 🟢 -42.8 kB 🟢 -34.6 kB
assets/main-I1Q8N4hZ.js (new) 155 kB 🔴 +155 kB 🔴 +42.8 kB 🔴 +34.6 kB
assets/main-B_En4SpT.js (removed) 148 kB 🟢 -148 kB 🟢 -42.6 kB 🟢 -34.4 kB
assets/main-q33R-w8D.js (new) 148 kB 🔴 +148 kB 🔴 +42.6 kB 🔴 +34.4 kB
assets/main-B5xucplh.js (new) 136 kB 🔴 +136 kB 🔴 +41.3 kB 🔴 +35 kB
assets/main-BYoy9XSQ.js (removed) 136 kB 🟢 -136 kB 🟢 -41.3 kB 🟢 -35 kB
assets/main-2HxSpwOp.js (removed) 133 kB 🟢 -133 kB 🟢 -40.8 kB 🟢 -33.4 kB
assets/main-DmqjIQU2.js (new) 133 kB 🔴 +133 kB 🔴 +40.8 kB 🔴 +33.4 kB
assets/main-DhitjpPn.js (new) 131 kB 🔴 +131 kB 🔴 +40.3 kB 🔴 +33.9 kB
assets/main-Dn8ME7jP.js (removed) 131 kB 🟢 -131 kB 🟢 -40.4 kB 🟢 -34 kB
assets/main-BuWOig7p.js (removed) 129 kB 🟢 -129 kB 🟢 -40.2 kB 🟢 -34 kB
assets/main-BzyfT78m.js (new) 129 kB 🔴 +129 kB 🔴 +40.2 kB 🔴 +34 kB
assets/main-CzuVgBRT.js (new) 128 kB 🔴 +128 kB 🔴 +39.6 kB 🔴 +33.6 kB
assets/main-dc7AuxCr.js (removed) 128 kB 🟢 -128 kB 🟢 -39.6 kB 🟢 -33.6 kB
assets/main-BAqaXKV_.js (new) 114 kB 🔴 +114 kB 🔴 +39.4 kB 🔴 +31.7 kB
assets/main-CKN_4E4Z.js (removed) 114 kB 🟢 -114 kB 🟢 -39.4 kB 🟢 -31.7 kB
assets/main-BpnmNj1n.js (removed) 113 kB 🟢 -113 kB 🟢 -39.4 kB 🟢 -31.5 kB
assets/main-DUObyxIe.js (new) 113 kB 🔴 +113 kB 🔴 +39.4 kB 🔴 +31.5 kB
assets/core-DHrditPP.js (new) 71.6 kB 🔴 +71.6 kB 🔴 +18.4 kB 🔴 +15.9 kB
assets/core-CravAKl5.js (removed) 71.4 kB 🟢 -71.4 kB 🟢 -18.4 kB 🟢 -15.8 kB
assets/groupNode-RkL14ZBi.js (new) 70.9 kB 🔴 +70.9 kB 🔴 +17.5 kB 🔴 +15.4 kB
assets/groupNode-B1FajR-l.js (removed) 70.9 kB 🟢 -70.9 kB 🟢 -17.5 kB 🟢 -15.4 kB
assets/WidgetSelect-BsaK6DBb.js (new) 56.7 kB 🔴 +56.7 kB 🔴 +12 kB 🔴 +10.4 kB
assets/WidgetSelect-C9zyEiXz.js (removed) 56.6 kB 🟢 -56.6 kB 🟢 -12 kB 🟢 -10.4 kB
assets/SettingDialogContent-BI58HJ_G.js (new) 31 kB 🔴 +31 kB 🔴 +8.04 kB 🔴 +7.09 kB
assets/SettingDialogContent-CuGAUU5i.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -8 kB 🟢 -7.05 kB
assets/Load3DControls-DGZFiJMm.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +5.33 kB 🔴 +4.64 kB
assets/Load3DControls-DLe3CqNR.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -5.33 kB 🟢 -4.63 kB
assets/SubscriptionRequiredDialogContent-LQPHJEZW.js (new) 26 kB 🔴 +26 kB 🔴 +6.51 kB 🔴 +5.71 kB
assets/SubscriptionRequiredDialogContent-BIZSAM2E.js (removed) 25.4 kB 🟢 -25.4 kB 🟢 -6.36 kB 🟢 -5.58 kB
assets/Load3dViewerContent-CHkOmm6t.js (new) 23.2 kB 🔴 +23.2 kB 🔴 +5.24 kB 🔴 +4.54 kB
assets/Load3dViewerContent-Ntns7T2d.js (removed) 23.2 kB 🟢 -23.2 kB 🟢 -5.24 kB 🟢 -4.54 kB
assets/WidgetImageCrop-DJQUT-Sf.js (new) 22.4 kB 🔴 +22.4 kB 🔴 +5.53 kB 🔴 +4.86 kB
assets/WidgetImageCrop-Daa1PfN9.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.51 kB 🟢 -4.84 kB
assets/FormItem-D9KRSnWc.js (removed) 20.2 kB 🟢 -20.2 kB 🟢 -4.87 kB 🟢 -4.25 kB
assets/FormItem-DGFsMP_l.js (new) 20.2 kB 🔴 +20.2 kB 🔴 +4.87 kB 🔴 +4.24 kB
assets/CurrentUserPopoverWorkspace-Byo2p0MC.js (new) 19.8 kB 🔴 +19.8 kB 🔴 +4.77 kB 🔴 +4.25 kB
assets/CurrentUserPopoverWorkspace-BICAEI95.js (removed) 19.7 kB 🟢 -19.7 kB 🟢 -4.74 kB 🟢 -4.24 kB
assets/SignInContent-DAcUTcsi.js (new) 19 kB 🔴 +19 kB 🔴 +4.82 kB 🔴 +4.22 kB
assets/SignInContent-gVQmfkYa.js (removed) 19 kB 🟢 -19 kB 🟢 -4.8 kB 🟢 -4.2 kB
assets/commands-CfXEpW8L.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +3.84 kB 🔴 +2.99 kB
assets/commands-D7Ez6YeH.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -3.84 kB 🟢 -3 kB
assets/WidgetRecordAudio-BRU3_IMb.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.95 kB 🔴 +4.42 kB
assets/WidgetRecordAudio-BQvLHGiR.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -4.93 kB 🟢 -4.41 kB
assets/TopUpCreditsDialogContent-Z_PeMT3F.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.89 kB 🔴 +4.31 kB
assets/TopUpCreditsDialogContent--zU91uEP.js (removed) 16.9 kB 🟢 -16.9 kB 🟢 -4.8 kB 🟢 -4.25 kB
assets/commands-DqYVMdnw.js (new) 16.7 kB 🔴 +16.7 kB 🔴 +3.54 kB 🔴 +2.75 kB
assets/commands-DuYqNMWX.js (removed) 16.7 kB 🟢 -16.7 kB 🟢 -3.54 kB 🟢 -2.75 kB
assets/commands-BaA9zLXt.js (new) 16.7 kB 🔴 +16.7 kB 🔴 +3.57 kB 🔴 +2.84 kB
assets/commands-Ds7u8tBA.js (removed) 16.7 kB 🟢 -16.7 kB 🟢 -3.57 kB 🟢 -2.84 kB
assets/commands-CHVhdqal.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +3.63 kB 🔴 +2.88 kB
assets/commands-ovF76AYH.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -3.64 kB 🟢 -2.89 kB
assets/Load3D-C4QZt1DZ.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.51 kB
assets/Load3D-DudL_V2S.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.5 kB
assets/MissingModelsWarning-Dm0t0Zx4.js (new) 16.1 kB 🔴 +16.1 kB 🔴 +4.42 kB 🔴 +3.93 kB
assets/MissingModelsWarning-g5a553b3.js (removed) 16.1 kB 🟢 -16.1 kB 🟢 -4.4 kB 🟢 -3.9 kB
assets/commands-BTIhwSf_.js (removed) 15.9 kB 🟢 -15.9 kB 🟢 -3.39 kB 🟢 -2.84 kB
assets/commands-CAJK1bFu.js (new) 15.9 kB 🔴 +15.9 kB 🔴 +3.39 kB 🔴 +2.84 kB
assets/SubscriptionPanelContentWorkspace-B4bLL3Cc.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.03 kB 🔴 +3.56 kB
assets/SubscriptionPanelContentWorkspace-CywNBIdI.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -4.03 kB 🟢 -3.55 kB
assets/WidgetInputNumber-CjGVap8y.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +4.2 kB 🔴 +3.75 kB
assets/WidgetInputNumber-CkoKmr5O.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -4.2 kB 🟢 -3.75 kB
assets/commands-DFfk2Km5.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -3.37 kB 🟢 -2.83 kB
assets/commands-Dx9OeTzi.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +3.37 kB 🔴 +2.83 kB
assets/commands-C6vkfksh.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +3.28 kB 🔴 +2.67 kB
assets/commands-tMQq9SrH.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -3.28 kB 🟢 -2.67 kB
assets/commands-BYGUQRX1.js (removed) 15.3 kB 🟢 -15.3 kB 🟢 -3.23 kB 🟢 -2.67 kB
assets/commands-CmxM7Xny.js (new) 15.3 kB 🔴 +15.3 kB 🔴 +3.23 kB 🔴 +2.67 kB
assets/commands-CtxsvHdf.js (removed) 15.2 kB 🟢 -15.2 kB 🟢 -3.5 kB 🟢 -2.75 kB
assets/commands-DPZnTcGf.js (new) 15.2 kB 🔴 +15.2 kB 🔴 +3.5 kB 🔴 +2.75 kB
assets/load3d-Db-nnrxf.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.2 kB 🔴 +3.65 kB
assets/load3d-DukagXnf.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.18 kB 🟢 -3.63 kB
assets/commands-BxiMWv9a.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.42 kB 🟢 -2.56 kB
assets/commands-FqQ1oC_a.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.42 kB 🔴 +2.56 kB
assets/commands-D273RBYT.js (new) 14.4 kB 🔴 +14.4 kB 🔴 +3.41 kB 🔴 +2.5 kB
assets/commands-D4xkLWYG.js (removed) 14.4 kB 🟢 -14.4 kB 🟢 -3.41 kB 🟢 -2.5 kB
assets/LazyImage-CVvKb-rW.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.78 kB 🟢 -3.32 kB
assets/LazyImage-DlDANsBS.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.78 kB 🔴 +3.32 kB
assets/NodeConflictDialogContent-CERnqxCG.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.39 kB 🔴 +2.1 kB
assets/NodeConflictDialogContent-D3HvN8uk.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.36 kB 🟢 -2.06 kB
assets/AudioPreviewPlayer-nawai7mO.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +3.01 kB 🔴 +2.69 kB
assets/AudioPreviewPlayer-F6R9cg0k.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.99 kB 🟢 -2.68 kB
assets/changeTracker-Cu6fsK_f.js (new) 9.4 kB 🔴 +9.4 kB 🔴 +2.9 kB 🔴 +2.56 kB
assets/nodeTemplates-hN_k3PeW.js (new) 9.37 kB 🔴 +9.37 kB 🔴 +3.29 kB 🔴 +2.89 kB
assets/nodeTemplates-BsDi-b2E.js (removed) 9.33 kB 🟢 -9.33 kB 🟢 -3.27 kB 🟢 -2.88 kB
assets/SelectValue-1KJOqzqF.js (removed) 8.94 kB 🟢 -8.94 kB 🟢 -2.27 kB 🟢 -1.99 kB
assets/SelectValue-W3nH782D.js (new) 8.94 kB 🔴 +8.94 kB 🔴 +2.27 kB 🔴 +1.99 kB
assets/InviteMemberDialogContent-0ORkx3CQ.js (new) 7.99 kB 🔴 +7.99 kB 🔴 +2.59 kB 🔴 +2.25 kB
assets/InviteMemberDialogContent-DwsAzeo9.js (removed) 7.95 kB 🟢 -7.95 kB 🟢 -2.56 kB 🟢 -2.23 kB
assets/WidgetWithControl-DfL2Brmi.js (new) 7.04 kB 🔴 +7.04 kB 🔴 +2.63 kB 🔴 +2.35 kB
assets/WidgetWithControl-CqlGvB8N.js (removed) 6.97 kB 🟢 -6.97 kB 🟢 -2.59 kB 🟢 -2.31 kB
assets/Load3DConfiguration-DHFTHtB4.js (new) 6.36 kB 🔴 +6.36 kB 🔴 +1.92 kB 🔴 +1.69 kB
assets/Load3DConfiguration-DSi3v-Ef.js (removed) 6.36 kB 🟢 -6.36 kB 🟢 -1.92 kB 🟢 -1.69 kB
assets/MissingNodesContent-n_-BMlkU.js (new) 6.18 kB 🔴 +6.18 kB 🔴 +2.1 kB 🔴 +1.86 kB
assets/MissingNodesContent-DY1mKPJv.js (removed) 6.14 kB 🟢 -6.14 kB 🟢 -2.08 kB 🟢 -1.85 kB
assets/CreateWorkspaceDialogContent-DaHd9SkL.js (new) 5.62 kB 🔴 +5.62 kB 🔴 +2.02 kB 🔴 +1.77 kB
assets/CreateWorkspaceDialogContent-DsDTIujZ.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -2 kB 🟢 -1.75 kB
assets/EditWorkspaceDialogContent-7Y6goMRV.js (new) 5.42 kB 🔴 +5.42 kB 🔴 +1.98 kB 🔴 +1.72 kB
assets/EditWorkspaceDialogContent-D-4Ym1_s.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.96 kB 🟢 -1.71 kB
assets/ValueControlPopover-ByzsSlXR.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.79 kB 🔴 +1.59 kB
assets/ValueControlPopover-l696M1lA.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.77 kB 🟢 -1.58 kB
assets/Preview3d-BAhwIHy1.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.59 kB 🔴 +1.38 kB
assets/MissingNodesFooter-CV81lnkh.js (new) 4.84 kB 🔴 +4.84 kB 🔴 +1.8 kB 🔴 +1.59 kB
assets/Preview3d-CiNGcNnH.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/MissingNodesFooter-C1sNgPa8.js (removed) 4.8 kB 🟢 -4.8 kB 🟢 -1.78 kB 🟢 -1.57 kB
assets/AnimationControls-bPyINTJI.js (removed) 4.61 kB 🟢 -4.61 kB 🟢 -1.6 kB 🟢 -1.41 kB
assets/AnimationControls-CgyY-mOr.js (new) 4.61 kB 🔴 +4.61 kB 🔴 +1.6 kB 🔴 +1.41 kB
assets/DeleteWorkspaceDialogContent-Y5oM8nBN.js (new) 4.32 kB 🔴 +4.32 kB 🔴 +1.67 kB 🔴 +1.45 kB
assets/DeleteWorkspaceDialogContent-lCMeatVK.js (removed) 4.28 kB 🟢 -4.28 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/LeaveWorkspaceDialogContent-DEhy-Ttx.js (new) 4.15 kB 🔴 +4.15 kB 🔴 +1.61 kB 🔴 +1.4 kB
assets/RemoveMemberDialogContent-DdMMyYrj.js (new) 4.13 kB 🔴 +4.13 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/LeaveWorkspaceDialogContent-weg_b6Er.js (removed) 4.11 kB 🟢 -4.11 kB 🟢 -1.59 kB 🟢 -1.38 kB
assets/RemoveMemberDialogContent-Cl4UD9C5.js (removed) 4.09 kB 🟢 -4.09 kB 🟢 -1.54 kB 🟢 -1.34 kB
assets/RevokeInviteDialogContent-NmJVxDlo.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.57 kB 🔴 +1.38 kB
assets/RevokeInviteDialogContent-B6LQp6YX.js (removed) 4 kB 🟢 -4 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/WidgetBoundingBox-2w5BjjHm.js (removed) 3.94 kB 🟢 -3.94 kB 🟢 -996 B 🟢 -862 B
assets/WidgetBoundingBox-CXCf1Zmy.js (new) 3.94 kB 🔴 +3.94 kB 🔴 +995 B 🔴 +859 B
assets/WidgetGalleria-BZ15zui5.js (new) 3.61 kB 🔴 +3.61 kB 🔴 +1.4 kB 🔴 +1.25 kB
assets/WidgetGalleria-C8ikSQqn.js (removed) 3.61 kB 🟢 -3.61 kB 🟢 -1.39 kB 🟢 -1.25 kB
assets/Slider-Bh_ZdHn9.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.36 kB 🟢 -1.19 kB
assets/Slider-DGWWLxYt.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.37 kB 🔴 +1.19 kB
assets/saveMesh-BvqwOdNu.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +1.47 kB 🔴 +1.31 kB
assets/saveMesh-BhGKyecf.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.29 kB
assets/cloudSessionCookie-BHK7PAA8.js (new) 3.11 kB 🔴 +3.11 kB 🔴 +1.1 kB 🔴 +964 B
assets/WidgetImageCompare-B1RSu0_k.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.15 kB 🟢 -1.02 kB
assets/WidgetImageCompare-CeiqRiDq.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.15 kB 🔴 +996 B
assets/WidgetTextarea-B_lJFREi.js (new) 3.09 kB 🔴 +3.09 kB 🔴 +1.28 kB 🔴 +1.12 kB
assets/WidgetTextarea-COgaptkR.js (removed) 3.09 kB 🟢 -3.09 kB 🟢 -1.28 kB 🟢 -1.12 kB
assets/cloudSessionCookie-C7MGXxmB.js (removed) 3.07 kB 🟢 -3.07 kB 🟢 -1.09 kB 🟢 -978 B
assets/WidgetColorPicker-j39s6iU-.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +1.23 kB 🔴 +1.11 kB
assets/WidgetColorPicker-jDbRm4n6.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -1.23 kB 🟢 -1.11 kB
assets/WidgetMarkdown-Dt405Eef.js (new) 2.88 kB 🔴 +2.88 kB 🔴 +1.22 kB 🔴 +1.05 kB
assets/WidgetMarkdown-wePHc2fh.js (removed) 2.88 kB 🟢 -2.88 kB 🟢 -1.22 kB 🟢 -1.07 kB
assets/ApiNodesSignInContent-CVI5X6EB.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +957 B
assets/ApiNodesSignInContent-CWyRM9Uw.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -919 B
assets/WidgetToggleSwitch-BcKFJkbH.js (new) 2.5 kB 🔴 +2.5 kB 🔴 +1.09 kB 🔴 +976 B
assets/WidgetToggleSwitch-CoKD027B.js (removed) 2.5 kB 🟢 -2.5 kB 🟢 -1.09 kB 🟢 -990 B
assets/ImportFailedNodeContent-VPjQzi79.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -974 B 🟢 -828 B
assets/ImportFailedNodeContent-wCUWeVsl.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +972 B 🔴 +829 B
assets/NodeConflictFooter-BOtQMVYa.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.03 kB 🟢 -908 B
assets/NodeConflictFooter-Clmzxnqh.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.03 kB 🔴 +904 B
assets/GlobalToast-ChLHvBVt.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +962 B 🔴 +805 B
assets/GlobalToast-Dlqa77Dp.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -964 B 🟢 -802 B
assets/MediaVideoTop--PIICXLo.js (new) 2.23 kB 🔴 +2.23 kB 🔴 +937 B 🔴 +799 B
assets/MediaVideoTop-CQw3f2T6.js (removed) 2.23 kB 🟢 -2.23 kB 🟢 -937 B 🟢 -800 B
assets/WidgetChart-B9Jc5IV_.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +950 B 🔴 +823 B
assets/WidgetChart-Dsp6bf_j.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -948 B 🟢 -821 B
assets/SubscribeToRun-BdSNQMow.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1 kB 🔴 +882 B
assets/SubscribeToRun-CWqp3-Y3.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -991 B 🟢 -868 B
assets/WidgetLayoutField-BcUSnWUK.js (removed) 1.95 kB 🟢 -1.95 kB 🟢 -879 B 🟢 -763 B
assets/WidgetLayoutField-DIgrxw2d.js (new) 1.95 kB 🔴 +1.95 kB 🔴 +879 B 🔴 +758 B
assets/ImportFailedNodeFooter-CjhrHKQ6.js (new) 1.88 kB 🔴 +1.88 kB 🔴 +866 B 🔴 +752 B
assets/ImportFailedNodeFooter-DR052jYb.js (removed) 1.88 kB 🟢 -1.88 kB 🟢 -866 B 🟢 -750 B
assets/WidgetInputText-C0bfHUiz.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +873 B 🔴 +813 B
assets/WidgetInputText-MXN3EUoN.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -872 B 🟢 -795 B
assets/Media3DTop-DTYkrVtB.js (removed) 1.82 kB 🟢 -1.82 kB 🟢 -897 B 🟢 -767 B
assets/Media3DTop-MCiIm0p5.js (new) 1.82 kB 🔴 +1.82 kB 🔴 +897 B 🔴 +765 B
assets/BaseViewTemplate-B4dKkNV6.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +912 B 🔴 +826 B
assets/BaseViewTemplate-BnXUotno.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -910 B 🟢 -799 B
assets/MediaImageTop-9JfFyMCn.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +878 B 🔴 +750 B
assets/MediaImageTop-ATOoJCQr.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -879 B 🟢 -750 B
assets/CloudRunButtonWrapper-nBQmVu8P.js (new) 1.71 kB 🔴 +1.71 kB 🔴 +799 B 🔴 +719 B
assets/auto-DjoqfnTX.js (removed) 1.7 kB 🟢 -1.7 kB 🟢 -622 B 🟢 -552 B
assets/auto-DoiC2YHm.js (new) 1.7 kB 🔴 +1.7 kB 🔴 +620 B 🔴 +546 B
assets/CloudRunButtonWrapper-DcPY2-FX.js (removed) 1.67 kB 🟢 -1.67 kB 🟢 -780 B 🟢 -709 B
assets/SettingDialogHeader-BHt-6Ao_.js (removed) 1.62 kB 🟢 -1.62 kB 🟢 -810 B 🟢 -719 B
assets/SettingDialogHeader-D4jTcYvP.js (new) 1.62 kB 🔴 +1.62 kB 🔴 +812 B 🔴 +717 B
assets/signInSchema-DRCn-HX6.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +563 B 🔴 +512 B
assets/signInSchema-Dx5pd6PK.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -562 B 🟢 -510 B
assets/MediaAudioTop-AFmsiWi3.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -759 B 🟢 -632 B
assets/MediaAudioTop-BKlWJ200.js (new) 1.43 kB 🔴 +1.43 kB 🔴 +761 B 🔴 +636 B
assets/cloudBadges-Cneve7O3.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +718 B 🔴 +628 B
assets/cloudBadges-DRGw0Rrh.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -703 B 🟢 -614 B
assets/cloudSubscription-WT1TEdMZ.js (new) 1.36 kB 🔴 +1.36 kB 🔴 +675 B 🔴 +581 B
assets/cloudSubscription-CCZk_xit.js (removed) 1.32 kB 🟢 -1.32 kB 🟢 -652 B 🟢 -563 B
assets/PanelTemplate-C1h0RxBM.js (removed) 1.2 kB 🟢 -1.2 kB 🟢 -612 B 🟢 -539 B
assets/PanelTemplate-uPQbPRxz.js (new) 1.2 kB 🔴 +1.2 kB 🔴 +612 B 🔴 +537 B
assets/SubscriptionPanelContentWorkspace-BvxHNdRH.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +503 B 🔴 +433 B
assets/widgetPropFilter-D24sWKXI.js (new) 1.1 kB 🔴 +1.1 kB 🔴 +510 B 🔴 +449 B
assets/widgetPropFilter-DyQHILEf.js (removed) 1.1 kB 🟢 -1.1 kB 🟢 -509 B 🟢 -448 B
assets/MissingNodesHeader-BOlbqJ0O.js (removed) 1.09 kB 🟢 -1.09 kB 🟢 -580 B 🟢 -501 B
assets/MissingNodesHeader-Co1VyewS.js (new) 1.09 kB 🔴 +1.09 kB 🔴 +578 B 🔴 +504 B
assets/NodeConflictHeader-B5z8suH8.js (new) 1.09 kB 🔴 +1.09 kB 🔴 +567 B 🔴 +478 B
assets/NodeConflictHeader-DRxQs5TH.js (removed) 1.09 kB 🟢 -1.09 kB 🟢 -565 B 🟢 -478 B
assets/ImportFailedNodeHeader-BjUwapVq.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +552 B 🔴 +469 B
assets/ImportFailedNodeHeader-DUns4_x2.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -550 B 🟢 -471 B
assets/Load3D-B6hra9UG.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +504 B 🔴 +448 B
assets/SubscriptionPanelContentWorkspace-VXqb5LKb.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -481 B 🟢 -422 B
assets/nightlyBadges-DsGw6qzx.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +557 B 🔴 +489 B
assets/Load3D-CAzHTQPo.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -483 B 🟢 -438 B
assets/nightlyBadges-C6lXKAGi.js (removed) 1 kB 🟢 -1 kB 🟢 -536 B 🟢 -478 B
assets/Load3dViewerContent-OYxcY4-P.js (new) 1 kB 🔴 +1 kB 🔴 +474 B 🔴 +423 B
assets/Load3dViewerContent-BNdLOwdg.js (removed) 961 B 🟢 -961 B 🟢 -456 B 🟢 -408 B
assets/SettingDialogContent-CE6ubPv9.js (new) 957 B 🔴 +957 B 🔴 +461 B 🔴 +404 B
assets/SettingDialogContent-mG46Yhm0.js (removed) 917 B 🟢 -917 B 🟢 -441 B 🟢 -392 B
assets/ComfyOrgHeader-32ZIoIYN.js (removed) 909 B 🟢 -909 B 🟢 -495 B 🟢 -434 B
assets/ComfyOrgHeader-Byh2iGZo.js (new) 909 B 🔴 +909 B 🔴 +493 B 🔴 +432 B
assets/changeTracker-yJXskUVT.js (new) 799 B 🔴 +799 B 🔴 +406 B 🔴 +354 B
assets/WidgetLegacy-UOftNB8t.js (new) 787 B 🔴 +787 B 🔴 +404 B 🔴 +354 B
assets/graphHasMissingNodes-Be9AxQjS.js (removed) 761 B 🟢 -761 B 🟢 -373 B 🟢 -327 B
assets/graphHasMissingNodes-C4oqnlUd.js (new) 761 B 🔴 +761 B 🔴 +373 B 🔴 +328 B
assets/WidgetLegacy-CXvbQMOv.js (removed) 747 B 🟢 -747 B 🟢 -386 B 🟢 -336 B
assets/previousFullPath-C87_p0MP.js (new) 665 B 🔴 +665 B 🔴 +367 B 🔴 +318 B
assets/previousFullPath-DsBk66MD.js (removed) 665 B 🟢 -665 B 🟢 -368 B 🟢 -321 B
assets/widgetTypes-BCsKJASV.js (removed) 393 B 🟢 -393 B 🟢 -258 B 🟢 -234 B
assets/widgetTypes-DJ2QItvD.js (new) 393 B 🔴 +393 B 🔴 +259 B 🔴 +243 B
assets/WidgetInputNumber-C1wm12U2.js (removed) 392 B 🟢 -392 B 🟢 -230 B 🟢 -189 B
assets/WidgetInputNumber-DuEHxZFb.js (new) 392 B 🔴 +392 B 🔴 +230 B 🔴 +198 B
assets/src-DAMctjF_.js (removed) 251 B 🟢 -251 B 🟢 -210 B 🟢 -177 B
assets/src-LvM3B3rx.js (new) 251 B 🔴 +251 B 🔴 +210 B 🔴 +191 B
assets/SettingDialogHeader-Cg_xaJpQ.js (new) 244 B 🔴 +244 B 🔴 +168 B 🔴 +142 B
assets/SettingDialogHeader-D5wathvf.js (removed) 244 B 🟢 -244 B 🟢 -165 B 🟢 -141 B
assets/telemetry-DthHaMK5.js (new) 226 B 🔴 +226 B 🔴 +184 B 🔴 +150 B
assets/i18n-CEuPC6JE.js (removed) 199 B 🟢 -199 B 🟢 -160 B 🟢 -160 B
assets/i18n-CUZO7r8k.js (new) 199 B 🔴 +199 B 🔴 +161 B 🔴 +138 B
assets/comfy-logo-single-BshbMAGE.js (new) 198 B 🔴 +198 B 🔴 +162 B 🔴 +132 B
assets/comfy-logo-single-DCVL1uOL.js (removed) 198 B 🟢 -198 B 🟢 -160 B 🟢 -126 B
assets/WidgetBoundingBox-B9PnQdl5.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +86 B
assets/WidgetBoundingBox-Djm16aYN.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -104 B
assets/mixpanel.module-Dq6XmUX_.js (removed) 92 B 🟢 -92 B 🟢 -100 B 🟢 -81 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 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/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

Status: 125 added / 123 removed

@benceruleanlu benceruleanlu marked this pull request as ready for review January 28, 2026 11:30
@benceruleanlu benceruleanlu requested a review from a team as a code owner January 28, 2026 11:30
Copilot AI review requested due to automatic review settings January 28, 2026 11:30
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jan 28, 2026
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 consolidates Google Tag Manager (GTM) initialization and data-layer event tracking behind the telemetry entrypoint to enable tree-shaking of GTM code in non-cloud builds. The implementation uses compile-time constants (__DISTRIBUTION__) and dynamic imports to ensure GTM dependencies are excluded from OSS builds while maintaining full functionality in cloud builds.

Changes:

  • Created new src/platform/telemetry/gtm.ts module with GTM initialization and event pushing logic
  • Updated src/platform/telemetry/index.ts to expose initGtm() and pushDataLayerEvent() functions that dynamically import GTM only in cloud builds
  • Added subscription purchase tracking with localStorage-based pending purchase tracker
  • Added sign-up tracking with SHA-256 hashed user IDs for email, Google, and GitHub authentication methods
  • Added page view tracking on route navigation

Reviewed changes

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

Show a summary per file
File Description
src/platform/telemetry/index.ts Added GTM module loading with dynamic imports and cloud build guards
src/platform/telemetry/gtm.ts New file containing GTM initialization and dataLayer event pushing logic
src/main.ts Added GTM initialization call in cloud builds
src/router.ts Added page view tracking on route changes
src/stores/firebaseAuthStore.ts Added sign-up tracking with hashed user IDs
src/platform/cloud/subscription/utils/subscriptionPurchaseTracker.ts New utility for tracking pending subscription purchases via localStorage
src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.ts Added call to start subscription purchase tracking
src/platform/cloud/subscription/composables/useSubscription.ts Added purchase event tracking when subscription completes
src/platform/cloud/subscription/composables/useSubscription.test.ts Added test coverage for purchase tracking and updated test structure with effectScope
global.d.ts Added TypeScript definition for window.dataLayer

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

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/composables/useSubscription.test.ts (1)

101-130: Potential test isolation issue: window.dataLayer not cleaned up between tests.

The mockPushDataLayerEvent implementation (lines 115-118) pushes to window.dataLayer, and line 248 initializes it to an empty array. However, there's no cleanup of window.dataLayer in afterEach, which could cause state leakage between tests.

Also, scope?.stop() on line 107 in beforeEach is redundant since afterEach already handles scope cleanup.

🧹 Proposed fix: Add dataLayer cleanup and remove redundant stop
  afterEach(() => {
    scope?.stop()
    scope = undefined
+   window.dataLayer = undefined
  })

  beforeEach(() => {
-   scope?.stop()
    scope = effectScope()

    vi.clearAllMocks()
🤖 Fix all issues with AI agents
In `@src/platform/cloud/subscription/composables/useSubscription.ts`:
- Around line 242-247: The call to trackSubscriptionPurchase is synchronous
(returns void) but is being awaited; remove the unnecessary await in the try
block (replace "await trackSubscriptionPurchase(statusData)" with
"trackSubscriptionPurchase(statusData)") so the code correctly reflects
synchronous behavior while preserving the existing try/catch error handling
around the trackSubscriptionPurchase invocation.

In `@src/platform/cloud/subscription/utils/subscriptionPurchaseTracker.ts`:
- Around line 12-13: Replace the hardcoded VALID_TIERS and VALID_CYCLES arrays
in subscriptionPurchaseTracker.ts by importing exported constants from the
source-of-truth files: add export const TIER_KEYS: TierKey[] = [...] to
tierPricing.ts and export const BILLING_CYCLES: BillingCycle[] = [...] to
subscriptionTierRank.ts, then remove the local definitions of VALID_TIERS and
VALID_CYCLES and import TIER_KEYS and BILLING_CYCLES into
subscriptionPurchaseTracker.ts (use these imported symbols wherever VALID_TIERS
and VALID_CYCLES were used, preserving types and behavior).

In `@src/platform/telemetry/gtm.ts`:
- Around line 8-37: Change initGtm from a void function to return the
initialization Promise so callers can await GTM readiness: have initGtm return
initPromise (Promise<void>) when created or return a resolved Promise if already
initialized; reference the existing symbols initGtm, initPromise, isInitialized
and finalize to locate the logic that creates and resolves the promise. Also
adjust the error handler on the script element (the listener that currently
calls finalize on 'error') to still resolve for telemetry resilience but emit a
development-only warning (e.g., when NODE_ENV !== 'production' or a dev flag) so
load failures are visible during debugging.

Comment on lines 8 to 37
export function initGtm(): void {
if (!isCloud || typeof window === 'undefined') return
if (typeof document === 'undefined') return
if (isInitialized) return

if (!initPromise) {
initPromise = new Promise((resolve) => {
const dataLayer = window.dataLayer ?? (window.dataLayer = [])
dataLayer.push({
'gtm.start': Date.now(),
event: 'gtm.js'
})

const script = document.createElement('script')
script.async = true
script.src = `https://www.googletagmanager.com/gtm.js?id=${GTM_CONTAINER_ID}`

const finalize = () => {
isInitialized = true
resolve()
}

script.addEventListener('load', finalize, { once: true })
script.addEventListener('error', finalize, { once: true })
document.head?.appendChild(script)
})
}

void initPromise
}
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

initGtm returns void but internal promise is never exposed to callers.

The function creates initPromise but the void initPromise on line 36 is a no-op that simply suppresses the floating-promise lint. Callers cannot await GTM initialization completion. If callers need to wait for GTM to be ready before pushing events, consider returning the promise.

Additionally, script load errors are silently swallowed (line 31 resolves on error). This is acceptable for telemetry but consider logging a warning in development for debuggability.

♻️ Optional: Return promise for callers who need to await
-export function initGtm(): void {
+export function initGtm(): Promise<void> {
   if (!isCloud || typeof window === 'undefined') return
+    return Promise.resolve()
   if (typeof document === 'undefined') return
+    return Promise.resolve()
   if (isInitialized) return
+    return Promise.resolve()

   if (!initPromise) {
     initPromise = new Promise((resolve) => {
       // ... existing code ...
     })
   }

-  void initPromise
+  return initPromise
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export function initGtm(): void {
if (!isCloud || typeof window === 'undefined') return
if (typeof document === 'undefined') return
if (isInitialized) return
if (!initPromise) {
initPromise = new Promise((resolve) => {
const dataLayer = window.dataLayer ?? (window.dataLayer = [])
dataLayer.push({
'gtm.start': Date.now(),
event: 'gtm.js'
})
const script = document.createElement('script')
script.async = true
script.src = `https://www.googletagmanager.com/gtm.js?id=${GTM_CONTAINER_ID}`
const finalize = () => {
isInitialized = true
resolve()
}
script.addEventListener('load', finalize, { once: true })
script.addEventListener('error', finalize, { once: true })
document.head?.appendChild(script)
})
}
void initPromise
}
export function initGtm(): Promise<void> {
if (!isCloud || typeof window === 'undefined') return Promise.resolve()
if (typeof document === 'undefined') return Promise.resolve()
if (isInitialized) return Promise.resolve()
if (!initPromise) {
initPromise = new Promise((resolve) => {
const dataLayer = window.dataLayer ?? (window.dataLayer = [])
dataLayer.push({
'gtm.start': Date.now(),
event: 'gtm.js'
})
const script = document.createElement('script')
script.async = true
script.src = `https://www.googletagmanager.com/gtm.js?id=${GTM_CONTAINER_ID}`
const finalize = () => {
isInitialized = true
resolve()
}
script.addEventListener('load', finalize, { once: true })
script.addEventListener('error', finalize, { once: true })
document.head?.appendChild(script)
})
}
return initPromise
}
🤖 Prompt for AI Agents
In `@src/platform/telemetry/gtm.ts` around lines 8 - 37, Change initGtm from a
void function to return the initialization Promise so callers can await GTM
readiness: have initGtm return initPromise (Promise<void>) when created or
return a resolved Promise if already initialized; reference the existing symbols
initGtm, initPromise, isInitialized and finalize to locate the logic that
creates and resolves the promise. Also adjust the error handler on the script
element (the listener that currently calls finalize on 'error') to still resolve
for telemetry resilience but emit a development-only warning (e.g., when
NODE_ENV !== 'production' or a dev flag) so load failures are visible during
debugging.

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2db667bde4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@benceruleanlu benceruleanlu added the cloud/1.38 Backport PRs for cloud 1.38 label Jan 28, 2026
@dosubot dosubot bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Jan 29, 2026
@benceruleanlu
Copy link
Member Author

The dist telemetry sniffing code can be made more strict by modifying the regex.

@benceruleanlu benceruleanlu removed their assignment Feb 3, 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: 1

🤖 Fix all issues with AI agents
In `@src/platform/telemetry/TelemetryRegistry.ts`:
- Around line 109-117: The current checkForCompletedTopup uses Array.some which
short-circuits and prevents later providers from running; change it to iterate
all providers (like the dispatch() pattern) using providers.forEach, call
provider.checkForCompletedTopup?.(events) inside a try/catch for each provider,
accumulate a boolean result (e.g., orAggregate = orAggregate || result) and
return that aggregated boolean at the end; ensure you still log errors in the
catch and reference the checkForCompletedTopup method and providers collection
when making the change.
🧹 Nitpick comments (1)
src/platform/cloud/subscription/composables/useSubscription.test.ts (1)

63-77: Replace any[] with generics for type safety in the mock.

The mock uses any[] which violates the "Never use any type" guideline. A small generic keeps type safety without changing behavior.

♻️ Typed alternative
     wrapWithErrorHandlingAsync: vi.fn(
-      (fn, errorHandler) =>
-        async (...args: any[]) => {
+      <TArgs extends unknown[], TReturn>(
+        fn: (...args: TArgs) => Promise<TReturn> | TReturn,
+        errorHandler?: (error: unknown) => void
+      ) =>
+        async (...args: TArgs) => {
           try {
             return await fn(...args)
           } catch (error) {
             if (errorHandler) {
               errorHandler(error)

Comment on lines +109 to +117
checkForCompletedTopup(events: AuditLog[] | undefined | null): boolean {
return this.providers.some((provider) => {
try {
return provider.checkForCompletedTopup?.(events) ?? false
} catch (error) {
console.error('[Telemetry] Provider dispatch failed', error)
return false
}
})
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 | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# First, let's view the full TelemetryRegistry.ts file to understand context
head -n 200 src/platform/telemetry/TelemetryRegistry.ts | tail -n +90

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 3651


🏁 Script executed:

# Find all call sites of checkForCompletedTopup to understand expected behavior
rg -n "checkForCompletedTopup" --type ts -B 3 -A 3

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 8602


🏁 Script executed:

# Check if there are other similar dispatcher methods to understand the pattern
rg -n "this\.providers\.(some|forEach|map)" --type ts -B 2 -A 5

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1403


🏁 Script executed:

# View the dispatch method and context to confirm pattern
sed -n '45,55p' src/platform/telemetry/TelemetryRegistry.ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 337


🏁 Script executed:

# Check all methods that call dispatch to confirm they use forEach pattern
rg "this\.dispatch\(" src/platform/telemetry/TelemetryRegistry.ts | wc -l

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 72


🏁 Script executed:

# Verify no other method uses some() with providers
rg "this\.providers\.(some|map)" src/platform/telemetry/TelemetryRegistry.ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 116


Use forEach instead of some() to ensure all providers execute.

checkForCompletedTopup is the only method not using the dispatch() pattern with forEach, which calls every provider. Using some() stops after the first truthy result, preventing later providers from executing their check logic and updating state. Aggregate the boolean while calling all providers.

🛠️ Proposed fix
   checkForCompletedTopup(events: AuditLog[] | undefined | null): boolean {
-    return this.providers.some((provider) => {
-      try {
-        return provider.checkForCompletedTopup?.(events) ?? false
-      } catch (error) {
-        console.error('[Telemetry] Provider dispatch failed', error)
-        return false
-      }
-    })
+    let completed = false
+    this.providers.forEach((provider) => {
+      try {
+        if (provider.checkForCompletedTopup?.(events)) {
+          completed = true
+        }
+      } catch (error) {
+        console.error('[Telemetry] Provider dispatch failed', error)
+      }
+    })
+    return completed
   }
🤖 Prompt for AI Agents
In `@src/platform/telemetry/TelemetryRegistry.ts` around lines 109 - 117, The
current checkForCompletedTopup uses Array.some which short-circuits and prevents
later providers from running; change it to iterate all providers (like the
dispatch() pattern) using providers.forEach, call
provider.checkForCompletedTopup?.(events) inside a try/catch for each provider,
accumulate a boolean result (e.g., orAggregate = orAggregate || result) and
return that aggregated boolean at the end; ensure you still log errors in the
catch and reference the checkForCompletedTopup method and providers collection
when making the change.

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

Caution

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

⚠️ Outside diff range comments (1)
src/platform/telemetry/types.ts (1)

470-493: ⚠️ Potential issue | 🟡 Minor

Missing PageViewMetadata and BeginCheckoutMetadata in union type.

The TelemetryEventProperties union type does not include the newly added PageViewMetadata and BeginCheckoutMetadata types. If this union is used for type-checking event properties elsewhere, it should include these new metadata types for completeness.

🔧 Proposed fix
 export type TelemetryEventProperties =
   | AuthMetadata
   | SurveyResponses
   | TemplateMetadata
   | ExecutionContext
   | RunButtonProperties
   | ExecutionErrorMetadata
   | ExecutionSuccessMetadata
   | CreditTopupMetadata
   | WorkflowImportMetadata
   | TemplateLibraryMetadata
   | TemplateLibraryClosedMetadata
   | PageVisibilityMetadata
   | TabCountMetadata
   | NodeSearchMetadata
   | NodeSearchResultMetadata
   | TemplateFilterMetadata
   | SettingChangedMetadata
   | UiButtonClickMetadata
   | HelpCenterOpenedMetadata
   | HelpResourceClickedMetadata
   | HelpCenterClosedMetadata
   | WorkflowCreatedMetadata
   | EnterLinearMetadata
+  | PageViewMetadata
+  | BeginCheckoutMetadata
🧹 Nitpick comments (1)
src/platform/cloud/subscription/components/PricingTable.test.ts (1)

205-233: Consider adding telemetry assertion for new subscriber flow.

This test verifies new subscribers go through the checkout flow but doesn't assert on trackBeginCheckout. Since subscriptionCheckoutUtil.ts now tracks checkout for new subscribers, consider adding an assertion to verify telemetry is called with checkout_type: 'new'.

💡 Suggested addition
       expect(windowOpenSpy).toHaveBeenCalledWith(
         'https://checkout.stripe.com/test',
         '_blank'
       )
+
+      expect(mockTrackBeginCheckout).toHaveBeenCalledWith({
+        user_id: 'user-123',
+        tier: expect.any(String),
+        cycle: 'yearly',
+        checkout_type: 'new'
+      })

       windowOpenSpy.mockRestore()

@benceruleanlu benceruleanlu added the preview-cpu Creates a preview ephemeral environment for this PR (CPU only) label Feb 4, 2026
simula-r
simula-r previously approved these changes Feb 5, 2026
Copy link
Contributor

@simula-r simula-r left a comment

Choose a reason for hiding this comment

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

LGTM. Nice job on this.

@benceruleanlu benceruleanlu dismissed christian-byrne’s stale review February 5, 2026 18:55

PR changed direction, last review was from Jake

Copy link
Member Author

benceruleanlu commented Feb 5, 2026

@benceruleanlu benceruleanlu merged commit dd4d36d into main Feb 7, 2026
45 of 46 checks passed
@benceruleanlu benceruleanlu deleted the fix/gtm-telemetry-entrypoint branch February 7, 2026 09:08
@github-actions
Copy link

github-actions bot commented Feb 7, 2026

⚠️ Backport to cloud/1.38 failed

Reason: Merge conflicts detected during cherry-pick of dd4d36d

📄 Conflicting files
src/platform/workflow/management/stores/workflowStore.ts
🤖 Prompt for AI Agents
Backport PR #8354 (https://github.com/Comfy-Org/ComfyUI_frontend/pull/8354) to cloud/1.38.
Cherry-pick merge commit dd4d36d459833f08913dddb07716a1fd4a58ba52 onto new branch
backport-8354-to-cloud-1.38 from origin/cloud/1.38.
Resolve conflicts in: src/platform/workflow/management/stores/workflowStore.ts .
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.38] <original title>" with label "backport".
See .github/workflows/pr-backport.yaml for workflow details.

cc @benceruleanlu

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud/1.38 Backport PRs for cloud 1.38 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:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants