Skip to content

Conversation

@benceruleanlu
Copy link
Member

@benceruleanlu benceruleanlu commented Feb 6, 2026

Implement Impact telemetry and checkout attribution through cloud subscription checkout flows.

This PR adds Impact.com tracking support and carries attribution context from landing-page visits into subscription checkout requests so conversion attribution can be validated end-to-end.

  • Register a new ImpactTelemetryProvider during cloud telemetry initialization.
  • Initialize the Impact queue/runtime (ire) and load the Universal Tracking Tag script once.
  • Invoke ire('identify', ...) on page views with dynamic customerId and SHA-1 customerEmail (or empty strings when unknown).
  • Expand checkout attribution capture to include im_ref, UTM fields, and Google click IDs, with local persistence across navigation.
  • Attempt ire('generateClickId') with a timeout and fall back to URL/local attribution when unavailable.
  • Include attribution payloads in checkout creation requests for both:
    • /customers/cloud-subscription-checkout
    • /customers/cloud-subscription-checkout/{tier}
  • Extend begin-checkout telemetry metadata typing to include attribution fields.
  • Add focused unit coverage for provider behavior, attribution persistence/fallback logic, and checkout request payloads.

Tradeoffs / constraints:

  • Attribution collection is treated as best-effort in tiered checkout flow to avoid blocking purchases.
  • Backend checkout handlers must accept and process the additional JSON attribution fields.

Screenshots

image image image image

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

coderabbitai bot commented Feb 6, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds async checkout attribution capture (URL + external queue), persists merged attribution, integrates attribution into checkout and telemetry flows, introduces ImpactTelemetryProvider, updates types/global window typings, and adds extensive tests validating parsing, persistence, queue interactions, and identity hashing.

Changes

Cohort / File(s) Summary
Attribution Types & Globals
src/platform/telemetry/types.ts, global.d.ts
New CheckoutAttributionMetadata; extended BeginCheckoutMetadata; added ImpactQueueFunction and Window.ire / Window.ire_o globals.
Attribution Utility & Tests
src/platform/telemetry/utils/checkoutAttribution.ts, src/platform/telemetry/utils/__tests__/checkoutAttribution.test.ts
Rewrote utility: getCheckoutAttribution() → async Promise, added captureCheckoutAttributionFromSearch(), URL parsing, storage merge/persist, timeboxed generated click-id fetch, change-detection helpers; expanded tests for queue, URL params, persistence, fallbacks, and page-view capture.
Impact Provider & Tests
src/platform/telemetry/providers/cloud/ImpactTelemetryProvider.ts, src/platform/telemetry/providers/cloud/ImpactTelemetryProvider.test.ts
New ImpactTelemetryProvider: initializes Impact queue/script, captures attribution from path, resolves/ hashes user identity, issues ire.identify, dedupes identify calls; tests cover capture, hashing, identify payloads, and dedupe.
Telemetry Init
src/platform/telemetry/initTelemetry.ts
Registered ImpactTelemetryProvider alongside existing telemetry providers during init.
Subscription Integration & Tests
src/platform/cloud/subscription/.../useSubscription.ts, src/platform/cloud/subscription/composables/useSubscription.test.ts, src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.ts, src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.test.ts, src/platform/cloud/subscription/components/PricingTable.vue
Await getCheckoutAttribution() and include attribution (im_ref, utm_*, etc.) in checkout POST and telemetry payloads; tests updated and mocks added to validate propagation and failure handling.
Test scaffolding additions
src/platform/cloud/subscription/composables/useSubscription.test.ts
Exposed mockGetCheckoutAttribution and wired into module mocks for subscription tests.
Type/alias update
src/platform/telemetry/utils/checkoutAttribution.ts
Changed CheckoutAttribution alias to CheckoutAttributionMetadata and updated getCheckoutAttribution() return type to Promise<CheckoutAttributionMetadata>.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Checkout as Checkout Flow
    participant AttribUtil as Attribution Utility
    participant Queue as Impact Queue (window.ire)
    participant Storage as Local Attribution State
    participant Provider as ImpactTelemetryProvider

    User->>Checkout: start subscription or visit page
    Checkout->>AttribUtil: getCheckoutAttribution() (await)
    AttribUtil->>AttribUtil: parse URL params & read stored attribution
    AttribUtil->>Queue: request generated click id (if queue present)
    Queue-->>AttribUtil: im_ref / click id (or timeout)
    AttribUtil->>Storage: merge & persist attribution (if changed)
    AttribUtil-->>Checkout: resolved attribution object
    Checkout->>Checkout: include attribution in checkout POST

    User->>Provider: trackPageView(path)
    Provider->>AttribUtil: captureCheckoutAttributionFromSearch(path)
    AttribUtil->>Storage: merge & persist attribution
    Provider->>Provider: resolve current user & hash email
    Provider->>Queue: ire.identify({customerId, customerEmail})
    Queue-->>Provider: acknowledge identify
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Poem

🐇 I hop through queries, utm and im_ref,
I nibble click-ids, stash them safe and deft,
I wait a moment for a queue to sing,
Then tuck the data into checkout spring,
Hooray — attribution hops on board! 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.29% 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 'feat: integrate Impact telemetry with checkout attribution for subscriptions' directly and clearly summarizes the main change: adding Impact telemetry integration with checkout attribution support for subscription flows.
Description check ✅ Passed The PR description provides comprehensive coverage: a clear summary, detailed changes, review focus items, and screenshots. While it doesn't follow the exact template structure (Summary/Changes/Review Focus sections), it contains all required information and context for reviewers.

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

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/checkout-attribution-journey

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 6, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/10/2026, 01:03:03 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Feb 6, 2026

Playwright: ✅ 521 passed, 0 failed · 3 flaky

📊 Browser Reports
  • chromium: View Report (✅ 509 / ❌ 0 / ⚠️ 3 / ⏭️ 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)

Copy link
Member Author

benceruleanlu commented Feb 6, 2026

This stack of pull requests is managed by Graphite. Learn more about stacking.

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 adds comprehensive checkout attribution tracking to capture marketing attribution data (UTM parameters, Impact affiliate tracking, and Google Ads click IDs) during user sessions. The attribution data is persisted to localStorage, captured on page views via a dedicated telemetry provider, and sent to the backend during subscription checkout flows.

Changes:

  • Expanded attribution tracking from just Google Ads click IDs (gclid, gbraid, wbraid) to include UTM parameters and Impact affiliate tracking (im_ref)
  • Added a new CheckoutAttributionTelemetryProvider that captures attribution data on page views
  • Modified subscription checkout flows to send attribution data to the backend API

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
src/platform/telemetry/utils/checkoutAttribution.ts Core attribution logic: renamed functions/types, added UTM and Impact tracking, added deduplication logic to prevent unnecessary storage writes
src/platform/telemetry/utils/tests/checkoutAttribution.test.ts Comprehensive test coverage for attribution capture, storage, and deduplication scenarios
src/platform/telemetry/types.ts New CheckoutAttributionMetadata interface with all attribution fields, extended BeginCheckoutMetadata
src/platform/telemetry/providers/cloud/CheckoutAttributionTelemetryProvider.ts New telemetry provider that captures attribution from page view paths
src/platform/telemetry/initTelemetry.ts Registered new CheckoutAttributionTelemetryProvider in telemetry initialization
src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.test.ts Updated tests with new attribution fields
src/platform/cloud/subscription/composables/useSubscription.ts Modified initiateSubscriptionCheckout to send attribution data in request body
src/platform/cloud/subscription/composables/useSubscription.test.ts Added mock for getCheckoutAttribution and verified attribution is sent in checkout requests

Comment on lines 1 to 34
import { captureCheckoutAttributionFromSearch } from '@/platform/telemetry/utils/checkoutAttribution'

import type { PageViewMetadata, TelemetryProvider } from '../../types'

/**
* Internal cloud telemetry provider used to persist checkout attribution
* from query parameters during page view tracking.
*/
export class CheckoutAttributionTelemetryProvider implements TelemetryProvider {
trackPageView(_pageName: string, properties?: PageViewMetadata): void {
const search = this.extractSearchFromPath(properties?.path)

if (search) {
captureCheckoutAttributionFromSearch(search)
return
}

if (typeof window !== 'undefined') {
captureCheckoutAttributionFromSearch(window.location.search)
}
}

private extractSearchFromPath(path?: string): string {
if (!path || typeof window === 'undefined') return ''

try {
const url = new URL(path, window.location.origin)
return url.search
} catch {
const queryIndex = path.indexOf('?')
return queryIndex >= 0 ? path.slice(queryIndex) : ''
}
}
}
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

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

The CheckoutAttributionTelemetryProvider lacks test coverage. While the underlying captureCheckoutAttributionFromSearch function is well-tested, the provider's specific behavior should also be tested, particularly:

  1. The extractSearchFromPath method with various path formats
  2. The fallback to window.location.search when no path is provided
  3. Integration with the trackPageView lifecycle

This is important because the provider has its own logic for extracting search parameters from paths and choosing between the provided path and window.location.search.

Copilot uses AI. Check for mistakes.
@benceruleanlu benceruleanlu force-pushed the fix/distribution-only-desktop branch from a8df879 to e38875c Compare February 7, 2026 09:16
@benceruleanlu benceruleanlu force-pushed the feat/checkout-attribution-journey branch from 0f32622 to dafccab Compare February 7, 2026 09:16
@benceruleanlu benceruleanlu changed the base branch from fix/distribution-only-desktop to graphite-base/8688 February 7, 2026 09:16
@benceruleanlu benceruleanlu force-pushed the feat/checkout-attribution-journey branch from dafccab to 4fb386d Compare February 7, 2026 10:00
@benceruleanlu benceruleanlu changed the base branch from graphite-base/8688 to fix/distribution-only-desktop February 7, 2026 10:00
@benceruleanlu benceruleanlu changed the base branch from fix/distribution-only-desktop to graphite-base/8688 February 8, 2026 04:40
@benceruleanlu benceruleanlu force-pushed the feat/checkout-attribution-journey branch from 4fb386d to 73c0451 Compare February 8, 2026 04:40
@benceruleanlu benceruleanlu changed the base branch from graphite-base/8688 to main February 8, 2026 04:40
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/providers/cloud/CheckoutAttributionTelemetryProvider.ts`:
- Around line 23-33: The SSR guard currently returns early in
extractSearchFromPath and blocks the manual fallback; instead ensure you only
early-return when path is falsy, then attempt to construct new URL only if
typeof window !== 'undefined' (wrap new URL in try/catch), and if window is
undefined or URL construction fails fall back to using path.indexOf('?') to
slice and return the query string; update extractSearchFromPath to perform path
check first, then try the window-dependent URL parsing, and finally the manual
indexOf fallback.

Comment on lines 23 to 33
private extractSearchFromPath(path?: string): string {
if (!path || typeof window === 'undefined') return ''

try {
const url = new URL(path, window.location.origin)
return url.search
} catch {
const queryIndex = path.indexOf('?')
return queryIndex >= 0 ? path.slice(queryIndex) : ''
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

SSR guard on Line 24 also blocks the window-independent fallback path.

When window is undefined but a valid path with query params is provided (e.g. "/checkout?utm_source=google"), the early return on Line 24 prevents reaching the manual indexOf('?') fallback (lines 30–31), which doesn't need window at all. This silently drops attribution params in SSR/test environments.

Move the window guard to only protect the new URL call:

Suggested fix
  private extractSearchFromPath(path?: string): string {
-   if (!path || typeof window === 'undefined') return ''
+   if (!path) return ''

    try {
+     if (typeof window === 'undefined') throw new Error('no window')
      const url = new URL(path, window.location.origin)
      return url.search
    } catch {
      const queryIndex = path.indexOf('?')
      return queryIndex >= 0 ? path.slice(queryIndex) : ''
    }
  }
🤖 Prompt for AI Agents
In
`@src/platform/telemetry/providers/cloud/CheckoutAttributionTelemetryProvider.ts`
around lines 23 - 33, The SSR guard currently returns early in
extractSearchFromPath and blocks the manual fallback; instead ensure you only
early-return when path is falsy, then attempt to construct new URL only if
typeof window !== 'undefined' (wrap new URL in try/catch), and if window is
undefined or URL construction fails fall back to using path.indexOf('?') to
slice and return the query string; update extractSearchFromPath to perform path
check first, then try the window-dependent URL parsing, and finally the manual
indexOf fallback.

@benceruleanlu
Copy link
Member Author

Taking draft to make Impact specific

@benceruleanlu benceruleanlu marked this pull request as draft February 9, 2026 21:06
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@src/platform/cloud/subscription/components/PricingTable.vue`:
- Line 417: The call to getCheckoutAttribution in PricingTable.vue can throw and
currently bubbles up through wrapWithErrorHandlingAsync causing a user-facing
error; wrap the call in a local try/catch (around the getCheckoutAttribution
call that assigns checkoutAttribution) so any failure is swallowed for UX
purposes: on catch set checkoutAttribution to undefined (or a safe default) and
log/debug the error internally (or send non-blocking telemetry), but do not
rethrow or surface a toast; mirror the defensive pattern used in
subscriptionCheckoutUtil.ts to keep this telemetry call non-fatal.

In `@src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.ts`:
- Around line 49-50: getCheckoutAttribution() can throw and currently will block
checkout; wrap the call in a try/catch inside subscriptionCheckoutUtil (where
checkoutAttribution and checkoutPayload are built) so any error is caught,
logged (non-fatal) and you fall back to an empty attribution object (e.g., {}).
Then build checkoutPayload from the safe fallback so attribution failures cannot
prevent the checkout flow.
🧹 Nitpick comments (5)
global.d.ts (1)

8-11: ImpactQueueFunction is duplicated in ImpactTelemetryProvider.ts (lines 6-9).

Since this interface is declared globally here, the local re-declaration in the provider file is redundant. Consider removing the local copy and referencing this global type directly.

src/platform/telemetry/providers/cloud/ImpactTelemetryProvider.ts (2)

6-9: Duplicate ImpactQueueFunction interface — already declared in global.d.ts.

This local definition is identical to the one in global.d.ts (lines 8-11). Since the global declaration is ambient and available everywhere, this can be removed.

♻️ Remove local duplicate
-interface ImpactQueueFunction {
-  (...args: unknown[]): void
-  a?: unknown[][]
-}
-

37-37: Unhandled rejection risk from fire-and-forget async call.

void this.identifyCurrentUser() discards the promise. While the individual helpers (resolveCustomerIdentity, hashSha1) have their own try/catch, an unexpected throw from window.ire?.() or future code changes could surface as an unhandled promise rejection.

🛡️ Add a catch to the voided promise
-    void this.identifyCurrentUser()
+    void this.identifyCurrentUser().catch(() => {})
src/platform/telemetry/utils/checkoutAttribution.ts (2)

89-122: Timeout handle leaks if the external callback never fires.

If impactQueue('generateClickId', cb) retains a reference to cb indefinitely and the timeout fires first, the closure (and everything it captures — timeoutHandle, settled, resolve) stays alive as long as the external queue holds the callback. This is unlikely to matter in practice (single invocation, small closure), but worth noting.

Separately, the return await on Line 99 is unnecessary for an async function returning a promise directly, though it does marginally improve async stack traces — fine either way.


124-131: captureCheckoutAttributionFromSearch only persists the click ID, not full attribution.

The function name suggests it "captures checkout attribution" broadly, but it only extracts and stores the impact click ID. Other attribution params (UTMs, gclid, etc.) parsed by readAttributionFromUrl are discarded. If this is intentional (because getCheckoutAttribution re-reads them from the current URL at checkout time), consider a brief doc comment clarifying the scoping so future maintainers don't assume all attribution is being persisted here.

try {
if (isActiveSubscription.value) {
const checkoutAttribution = getCheckoutAttribution()
const checkoutAttribution = await getCheckoutAttribution()
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

Same risk: attribution failure surfaces as a user-facing error on subscription change.

wrapWithErrorHandlingAsync will catch and display the error, but users shouldn't see an error toast because a non-essential telemetry call failed. Wrap defensively, consistent with the fix suggested in subscriptionCheckoutUtil.ts.

🛡️ Proposed fix
-      const checkoutAttribution = await getCheckoutAttribution()
+      const checkoutAttribution = await getCheckoutAttribution().catch(
+        () => ({})
+      )
📝 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
const checkoutAttribution = await getCheckoutAttribution()
const checkoutAttribution = await getCheckoutAttribution().catch(
() => ({})
)
🤖 Prompt for AI Agents
In `@src/platform/cloud/subscription/components/PricingTable.vue` at line 417, The
call to getCheckoutAttribution in PricingTable.vue can throw and currently
bubbles up through wrapWithErrorHandlingAsync causing a user-facing error; wrap
the call in a local try/catch (around the getCheckoutAttribution call that
assigns checkoutAttribution) so any failure is swallowed for UX purposes: on
catch set checkoutAttribution to undefined (or a safe default) and log/debug the
error internally (or send non-blocking telemetry), but do not rethrow or surface
a toast; mirror the defensive pattern used in subscriptionCheckoutUtil.ts to
keep this telemetry call non-fatal.

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

🤖 Fix all issues with AI agents
In `@src/platform/telemetry/providers/cloud/ImpactTelemetryProvider.ts`:
- Around line 22-29: The trackPageView implementation incorrectly falls back to
window.location.search whenever extractSearchFromPath returns a falsy value
(including empty string), causing browser query params to be used even when a
path was explicitly provided; change the logic in trackPageView so you first
check whether a path was supplied (properties?.path !== undefined &&
properties?.path !== null) and only call captureCheckoutAttributionFromSearch
with the result of extractSearchFromPath(properties.path) if that returned a
non-empty string, otherwise do nothing; only when no path was supplied at all
should you fall back to using window.location.search and call
captureCheckoutAttributionFromSearch(window.location.search). Use the existing
functions trackPageView, extractSearchFromPath, and
captureCheckoutAttributionFromSearch to locate and update the branch.
- Around line 99-116: resolveCustomerIdentity currently calls useCurrentUser()
each time it runs (e.g., from trackPageView), leaking reactive subscriptions and
risking errors outside setup; refactor by calling useCurrentUser() once (or
lazily once) and storing its returned refs on the class instance during
construction or first access, then have resolveCustomerIdentity read from those
stored refs (customerId/email computed values) instead of re-invoking
useCurrentUser(); update the constructor (or a private lazy getter) to
initialize the stored refs and remove the try/catch in resolveCustomerIdentity
so it simply reads storedRef.value?.id ?? EMPTY_CUSTOMER_VALUE and
userEmailRef.value ?? EMPTY_CUSTOMER_VALUE.
- Around line 118-135: Add a short inline comment immediately above the hashSha1
method stating that SHA-1 is required by Impact.com's UTT specification for the
customerEmail field (vendor mandate), so the use of SHA-1 here is intentional
and must not be replaced; reference the function name hashSha1 and ensure the
comment is clear that this is an external requirement from Impact.com.

Comment on lines +22 to +29
trackPageView(_pageName: string, properties?: PageViewMetadata): void {
const search = this.extractSearchFromPath(properties?.path)

if (search) {
captureCheckoutAttributionFromSearch(search)
} else if (typeof window !== 'undefined') {
captureCheckoutAttributionFromSearch(window.location.search)
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Fallback to window.location.search fires even when a path is explicitly provided.

When properties.path is set to a valid path without query parameters (e.g., "/checkout"), extractSearchFromPath returns '' (falsy), so the code falls through to window.location.search. This means attribution is captured from the browser URL even though a specific path was intentionally provided — likely not the desired behavior.

If the intent is "use the provided path's query string, or fall back to the current URL only when no path is provided," the condition should distinguish between "no path given" and "path given but has no query":

Suggested fix
   trackPageView(_pageName: string, properties?: PageViewMetadata): void {
-    const search = this.extractSearchFromPath(properties?.path)
-
-    if (search) {
-      captureCheckoutAttributionFromSearch(search)
-    } else if (typeof window !== 'undefined') {
-      captureCheckoutAttributionFromSearch(window.location.search)
-    }
+    const search = properties?.path
+      ? this.extractSearchFromPath(properties.path)
+      : (typeof window !== 'undefined' ? window.location.search : '')
+
+    if (search) {
+      captureCheckoutAttributionFromSearch(search)
+    }

     void this.identifyCurrentUser()
   }
📝 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
trackPageView(_pageName: string, properties?: PageViewMetadata): void {
const search = this.extractSearchFromPath(properties?.path)
if (search) {
captureCheckoutAttributionFromSearch(search)
} else if (typeof window !== 'undefined') {
captureCheckoutAttributionFromSearch(window.location.search)
}
trackPageView(_pageName: string, properties?: PageViewMetadata): void {
const search = properties?.path
? this.extractSearchFromPath(properties.path)
: (typeof window !== 'undefined' ? window.location.search : '')
if (search) {
captureCheckoutAttributionFromSearch(search)
}
🤖 Prompt for AI Agents
In `@src/platform/telemetry/providers/cloud/ImpactTelemetryProvider.ts` around
lines 22 - 29, The trackPageView implementation incorrectly falls back to
window.location.search whenever extractSearchFromPath returns a falsy value
(including empty string), causing browser query params to be used even when a
path was explicitly provided; change the logic in trackPageView so you first
check whether a path was supplied (properties?.path !== undefined &&
properties?.path !== null) and only call captureCheckoutAttributionFromSearch
with the result of extractSearchFromPath(properties.path) if that returned a
non-empty string, otherwise do nothing; only when no path was supplied at all
should you fall back to using window.location.search and call
captureCheckoutAttributionFromSearch(window.location.search). Use the existing
functions trackPageView, extractSearchFromPath, and
captureCheckoutAttributionFromSearch to locate and update the branch.

@benceruleanlu benceruleanlu changed the title feat: add checkout attribution telemetry feat: integrate Impact telemetry with checkout attribution for subscriptions Feb 10, 2026
@benceruleanlu benceruleanlu marked this pull request as ready for review February 10, 2026 12:30
@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 Feb 10, 2026
@github-actions
Copy link

github-actions bot commented Feb 10, 2026

Bundle Size Report

Summary

  • Raw size: 19.8 MB baseline 19.8 MB — 🟢 -1.5 kB
  • Gzip: 4.23 MB baseline 4.23 MB — 🟢 -350 B
  • Brotli: 3.28 MB baseline 3.28 MB — 🟢 -250 B
  • Bundles: 234 current • 234 baseline • 132 added / 132 removed

Category Glance
Utilities & Hooks 🟢 -1.72 kB (235 kB) · Data & Services 🔴 +186 B (2.12 MB) · Other 🔴 +59 B (7.21 MB) · Vendor & Third-Party 🟢 -23 B (8.77 MB) · Graph Workspace ⚪ 0 B (855 kB) · Panels & Settings ⚪ 0 B (451 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-BFTMVd_F.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -7.2 kB 🟢 -6.24 kB
assets/index-DsxqAF9H.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +7.21 kB 🔴 +6.25 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Byys_Qbp.js (removed) 855 kB 🟢 -855 kB 🟢 -184 kB 🟢 -140 kB
assets/GraphView-CHe7egVG.js (new) 855 kB 🔴 +855 kB 🔴 +184 kB 🔴 +140 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CIINnvwT.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +3.3 kB 🔴 +2.8 kB
assets/CloudSurveyView-CVW_RHWm.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -3.3 kB 🟢 -2.8 kB
assets/CloudLoginView-CXTvlxct.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.94 kB 🟢 -2.58 kB
assets/CloudLoginView-uYota6jz.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.94 kB 🔴 +2.58 kB
assets/UserCheckView-B2Bu_poJ.js (new) 8.37 kB 🔴 +8.37 kB 🔴 +2.21 kB 🔴 +1.92 kB
assets/UserCheckView-CMOC6D9g.js (removed) 8.37 kB 🟢 -8.37 kB 🟢 -2.21 kB 🟢 -1.92 kB
assets/CloudSignupView-oNsjuD3n.js (removed) 7.46 kB 🟢 -7.46 kB 🟢 -2.35 kB 🟢 -2.05 kB
assets/CloudSignupView-S6Mdojx5.js (new) 7.46 kB 🔴 +7.46 kB 🔴 +2.35 kB 🔴 +2.05 kB
assets/CloudLayoutView-BxW3YNXC.js (new) 6.45 kB 🔴 +6.45 kB 🔴 +2.11 kB 🔴 +1.84 kB
assets/CloudLayoutView-CkxR6OX1.js (removed) 6.45 kB 🟢 -6.45 kB 🟢 -2.11 kB 🟢 -1.84 kB
assets/CloudForgotPasswordView-8jpflMyK.js (removed) 5.57 kB 🟢 -5.57 kB 🟢 -1.94 kB 🟢 -1.73 kB
assets/CloudForgotPasswordView-BaUogSHC.js (new) 5.57 kB 🔴 +5.57 kB 🔴 +1.94 kB 🔴 +1.71 kB
assets/CloudAuthTimeoutView-D__nqnQg.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/CloudAuthTimeoutView-D8i6eGwx.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/CloudSubscriptionRedirectView-Bp3YvpMF.js (new) 4.72 kB 🔴 +4.72 kB 🔴 +1.79 kB 🔴 +1.58 kB
assets/CloudSubscriptionRedirectView-CYlZ4Muk.js (removed) 4.72 kB 🟢 -4.72 kB 🟢 -1.79 kB 🟢 -1.58 kB
assets/UserSelectView-B44RwWlX.js (removed) 4.46 kB 🟢 -4.46 kB 🟢 -1.62 kB 🟢 -1.45 kB
assets/UserSelectView-jZLkELhi.js (new) 4.46 kB 🔴 +4.46 kB 🔴 +1.62 kB 🔴 +1.46 kB
assets/layout-C-ij0hfz.js (new) 296 B 🔴 +296 B 🔴 +224 B 🔴 +182 B
assets/layout-C9XfGlzo.js (removed) 296 B 🟢 -296 B 🟢 -223 B 🟢 -187 B
assets/CloudSorryContactSupportView-DPgIvmSL.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WorkspacePanel-5GEJmV-n.js (removed) 26.8 kB 🟢 -26.8 kB 🟢 -5.63 kB 🟢 -4.96 kB
assets/WorkspacePanel-D-ZXr_yH.js (new) 26.8 kB 🔴 +26.8 kB 🔴 +5.63 kB 🔴 +4.95 kB
assets/SecretsPanel-Crz63vXJ.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.29 kB 🔴 +4.64 kB
assets/SecretsPanel-f-Nc3Ttl.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.29 kB 🟢 -4.64 kB
assets/LegacyCreditsPanel-C198lQIq.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +5.61 kB 🔴 +4.92 kB
assets/LegacyCreditsPanel-CZCHUOmH.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -5.61 kB 🟢 -4.94 kB
assets/SubscriptionPanel-Bwu5XLG3.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.76 kB 🔴 +4.21 kB
assets/SubscriptionPanel-zi1G9epB.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.76 kB 🟢 -4.21 kB
assets/KeybindingPanel-_YYQnJFo.js (new) 12.6 kB 🔴 +12.6 kB 🔴 +3.64 kB 🔴 +3.22 kB
assets/KeybindingPanel-CNzDS5v1.js (removed) 12.6 kB 🟢 -12.6 kB 🟢 -3.64 kB 🟢 -3.22 kB
assets/ExtensionPanel-BO2nyLXY.js (new) 9.51 kB 🔴 +9.51 kB 🔴 +2.7 kB 🔴 +2.39 kB
assets/ExtensionPanel-ZfyWJHK0.js (removed) 9.51 kB 🟢 -9.51 kB 🟢 -2.7 kB 🟢 -2.39 kB
assets/AboutPanel-BE0SA-Og.js (removed) 8.62 kB 🟢 -8.62 kB 🟢 -2.46 kB 🟢 -2.22 kB
assets/AboutPanel-LqrGLyiZ.js (new) 8.62 kB 🔴 +8.62 kB 🔴 +2.46 kB 🔴 +2.22 kB
assets/ServerConfigPanel-B_HfqNQt.js (removed) 6.65 kB 🟢 -6.65 kB 🟢 -2.16 kB 🟢 -1.94 kB
assets/ServerConfigPanel-Di3Q-0cN.js (new) 6.65 kB 🔴 +6.65 kB 🔴 +2.16 kB 🔴 +1.96 kB
assets/UserPanel-CyWqkCcH.js (removed) 6.29 kB 🟢 -6.29 kB 🟢 -2.03 kB 🟢 -1.78 kB
assets/UserPanel-IMJSOQ37.js (new) 6.29 kB 🔴 +6.29 kB 🔴 +2.03 kB 🔴 +1.78 kB
assets/cloudRemoteConfig-BeXrPeOf.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -712 B 🟢 -621 B
assets/cloudRemoteConfig-v_emg4IZ.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +717 B 🔴 +620 B
assets/refreshRemoteConfig-Bna-0uKt.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -518 B 🟢 -467 B
assets/refreshRemoteConfig-Cl1ICpTA.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +518 B 🔴 +447 B
assets/config-BK8UYp9G.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BGE3PLDv.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CATlgsVJ.js 26.8 kB 26.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CD6qIXNU.js 23 kB 23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CwdQVmdc.js 27.7 kB 27.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D57UTXRP.js 27.7 kB 27.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dm1rtfc0.js 37.1 kB 37.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DobVJOaj.js 31.2 kB 31.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DPSdImSe.js 32.8 kB 32.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DVtNqJUL.js 27 kB 27 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dx7O9zk0.js 29.5 kB 29.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dxs8tHt9.js 23.7 kB 23.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-4bseIs8c.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +992 B
assets/auth-CMSYJuBH.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -993 B
assets/SignUpForm-BIDtR5OP.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.1 kB
assets/SignUpForm-DZwok84R.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/UpdatePasswordContent-CSqGWamc.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +1.08 kB 🔴 +950 B
assets/UpdatePasswordContent-DmjjJKPk.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -1.08 kB 🟢 -952 B
assets/firebaseAuthStore-CFffEzKu.js (new) 803 B 🔴 +803 B 🔴 +398 B 🔴 +354 B
assets/firebaseAuthStore-D0CoGHt0.js (removed) 803 B 🟢 -803 B 🟢 -395 B 🟢 -356 B
assets/auth-C47DGckG.js (removed) 317 B 🟢 -317 B 🟢 -205 B 🟢 -195 B
assets/auth-gZV8ODCf.js (new) 317 B 🔴 +317 B 🔴 +205 B 🔴 +178 B
assets/PasswordFields-BGrbyWzK.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 — 751 B (baseline 751 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-B4bG4HGd.js (removed) 751 B 🟢 -751 B 🟢 -387 B 🟢 -332 B
assets/useSubscriptionDialog-CGPSOnBg.js (new) 751 B 🔴 +751 B 🔴 +389 B 🔴 +338 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-CU3mvmTA.js (removed) 9.86 kB 🟢 -9.86 kB 🟢 -3.41 kB 🟢 -3 kB
assets/useTerminalTabs-DFX6ya1S.js (new) 9.86 kB 🔴 +9.86 kB 🔴 +3.41 kB 🔴 +3.01 kB
assets/TopbarBadge-CCkwccsC.js (new) 7.52 kB 🔴 +7.52 kB 🔴 +1.82 kB 🔴 +1.61 kB
assets/TopbarBadge-DSq-ReLB.js (removed) 7.52 kB 🟢 -7.52 kB 🟢 -1.82 kB 🟢 -1.61 kB
assets/ComfyQueueButton-2esRV_T2.js (removed) 7.17 kB 🟢 -7.17 kB 🟢 -2.32 kB 🟢 -2.07 kB
assets/ComfyQueueButton-BrFld9v_.js (new) 7.17 kB 🔴 +7.17 kB 🔴 +2.32 kB 🔴 +2.07 kB
assets/Button-B4vEq3O1.js (new) 3 kB 🔴 +3 kB 🔴 +1.21 kB 🔴 +1.08 kB
assets/Button-LGYfUhES.js (removed) 3 kB 🟢 -3 kB 🟢 -1.21 kB 🟢 -1.07 kB
assets/SubscribeButton-CRHQ-TTp.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.02 kB 🟢 -893 B
assets/SubscribeButton-D9LdFQms.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.02 kB 🔴 +892 B
assets/WidgetButton-Dd8TTZez.js (removed) 1.84 kB 🟢 -1.84 kB 🟢 -876 B 🟢 -776 B
assets/WidgetButton-DMdYkpiI.js (new) 1.84 kB 🔴 +1.84 kB 🔴 +879 B 🔴 +775 B
assets/cloudFeedbackTopbarButton-DVLdO2JC.js (removed) 1.61 kB 🟢 -1.61 kB 🟢 -866 B 🟢 -746 B
assets/cloudFeedbackTopbarButton-tlZre6Kz.js (new) 1.61 kB 🔴 +1.61 kB 🔴 +863 B 🔴 +767 B
assets/CloudBadge-BBOmSkZC.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +603 B 🔴 +532 B
assets/CloudBadge-Bjd4gDLV.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -605 B 🟢 -530 B
assets/ComfyQueueButton-CuExCGZT.js (new) 808 B 🔴 +808 B 🔴 +401 B 🔴 +357 B
assets/ComfyQueueButton-QpZD_U0Y.js (removed) 808 B 🟢 -808 B 🟢 -399 B 🟢 -358 B
assets/UserAvatar-B50esQ9A.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

Data & Services — 2.12 MB (baseline 2.12 MB) • 🔴 +186 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-NBpJPtLq.js (new) 1.34 MB 🔴 +1.34 MB 🔴 +303 kB 🔴 +234 kB
assets/dialogService-YduuZymE.js (removed) 1.34 MB 🟢 -1.34 MB 🟢 -303 kB 🟢 -234 kB
assets/api-CBAiu_Uf.js (new) 645 kB 🔴 +645 kB 🔴 +146 kB 🔴 +116 kB
assets/api-D95ioVh6.js (removed) 645 kB 🟢 -645 kB 🟢 -146 kB 🟢 -116 kB
assets/load3dService-B06eiM5s.js (removed) 91.2 kB 🟢 -91.2 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/load3dService-DjpsK1em.js (new) 91.2 kB 🔴 +91.2 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/systemStatsStore-DgNJnTNw.js (removed) 12.2 kB 🟢 -12.2 kB 🟢 -4.27 kB 🟢 -3.75 kB
assets/systemStatsStore-DZGtig2I.js (new) 12.2 kB 🔴 +12.2 kB 🔴 +4.27 kB 🔴 +3.75 kB
assets/releaseStore-4fH9sZjW.js (new) 7.99 kB 🔴 +7.99 kB 🔴 +2.22 kB 🔴 +1.96 kB
assets/releaseStore-BD8T-Y-t.js (removed) 7.99 kB 🟢 -7.99 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/keybindingService-B1Sk-CjL.js (removed) 6.57 kB 🟢 -6.57 kB 🟢 -1.72 kB 🟢 -1.48 kB
assets/keybindingService-BrDEWKJs.js (new) 6.57 kB 🔴 +6.57 kB 🔴 +1.72 kB 🔴 +1.49 kB
assets/dialogStore-BNo1twEf.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/dialogStore-CQoe9li6.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.24 kB 🔴 +1.1 kB
assets/bootstrapStore-B5ee8Xjo.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +882 B 🔴 +811 B
assets/bootstrapStore-Du1fpwZ3.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -882 B 🟢 -811 B
assets/userStore-B9Rqv136.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +721 B 🔴 +635 B
assets/userStore-CrsPnoqM.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -720 B 🟢 -633 B
assets/audioService-DJNClgAP.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -847 B 🟢 -731 B
assets/audioService-pLxNM6uA.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +845 B 🔴 +730 B
assets/releaseStore-COuto35y.js (new) 775 B 🔴 +775 B 🔴 +394 B 🔴 +341 B
assets/releaseStore-Q2XS_r9x.js (removed) 775 B 🟢 -775 B 🟢 -390 B 🟢 -342 B
assets/workflowDraftStore-BZyrDdjf.js (removed) 751 B 🟢 -751 B 🟢 -387 B 🟢 -336 B
assets/workflowDraftStore-C2cuWy5b.js (new) 751 B 🔴 +751 B 🔴 +389 B 🔴 +341 B
assets/dialogService-B8G2xnt2.js (removed) 740 B 🟢 -740 B 🟢 -379 B 🟢 -335 B
assets/dialogService-BW5wKSUJ.js (new) 740 B 🔴 +740 B 🔴 +381 B 🔴 +333 B
assets/serverConfigStore-Cg1Zzouw.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

Utilities & Hooks — 235 kB (baseline 237 kB) • 🟢 -1.72 kB

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-DsajlQ1T.js (new) 177 kB 🔴 +177 kB 🔴 +38.9 kB 🔴 +32.4 kB
assets/useConflictDetection-fsBvSr4n.js (removed) 177 kB 🟢 -177 kB 🟢 -38.9 kB 🟢 -32.4 kB
assets/useLoad3d-DjZlx3I8.js (new) 14.4 kB 🔴 +14.4 kB 🔴 +3.56 kB 🔴 +3.14 kB
assets/useLoad3d-DTvUcZwx.js (removed) 14.4 kB 🟢 -14.4 kB 🟢 -3.56 kB 🟢 -3.13 kB
assets/useLoad3dViewer-CPcyUkhF.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.16 kB 🟢 -2.8 kB
assets/useLoad3dViewer-qPht2m1T.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.16 kB 🔴 +2.8 kB
assets/colorUtil-CRttRsgp.js (new) 7 kB 🔴 +7 kB 🔴 +2.14 kB 🔴 +1.9 kB
assets/colorUtil-DOjEWuNN.js (removed) 7 kB 🟢 -7 kB 🟢 -2.14 kB 🟢 -1.9 kB
assets/subscriptionCheckoutUtil-Cp0BKuW_.js (removed) 4.25 kB 🟢 -4.25 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/useFeatureFlags-C5e8x67H.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +1.05 kB 🔴 +905 B
assets/useFeatureFlags-C7MDiL-b.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -1.05 kB 🟢 -903 B
assets/useWorkspaceUI-BuyaZv6A.js (removed) 3.15 kB 🟢 -3.15 kB 🟢 -888 B 🟢 -766 B
assets/useWorkspaceUI-DVP5gmNX.js (new) 3.15 kB 🔴 +3.15 kB 🔴 +890 B 🔴 +769 B
assets/useSubscriptionCredits-CR3pXeem.js (new) 2.75 kB 🔴 +2.75 kB 🔴 +1.04 kB 🔴 +906 B
assets/useSubscriptionCredits-z16U-crb.js (removed) 2.75 kB 🟢 -2.75 kB 🟢 -1.04 kB 🟢 -905 B
assets/subscriptionCheckoutUtil-hSstNxia.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +951 B
assets/useErrorHandling-BajqSaD4.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +553 B 🔴 +477 B
assets/useErrorHandling-CjlnwMuR.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -553 B 🟢 -477 B
assets/useLoad3d-673g5Pmd.js (new) 874 B 🔴 +874 B 🔴 +435 B 🔴 +387 B
assets/useLoad3d-B6GpBOl5.js (removed) 874 B 🟢 -874 B 🟢 -432 B 🟢 -389 B
assets/audioUtils-3cb0R8qS.js (removed) 858 B 🟢 -858 B 🟢 -500 B 🟢 -404 B
assets/audioUtils-Brx87pF_.js (new) 858 B 🔴 +858 B 🔴 +499 B 🔴 +423 B
assets/useLoad3dViewer-BzAcWBfy.js (new) 853 B 🔴 +853 B 🔴 +420 B 🔴 +379 B
assets/useLoad3dViewer-DO1NdzUh.js (removed) 853 B 🟢 -853 B 🟢 -415 B 🟢 -376 B
assets/useCurrentUser-C8Db1duf.js (removed) 737 B 🟢 -737 B 🟢 -381 B 🟢 -332 B
assets/useCurrentUser-ImZumEgF.js (new) 737 B 🔴 +737 B 🔴 +383 B 🔴 +333 B
assets/_plugin-vue_export-helper-D53b894U.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-BoEUYO9X.js 466 B 466 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-DSA9UCpE.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-Ctw9U6bO.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-C5r8rVhk.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

Vendor & Third-Party — 8.77 MB (baseline 8.77 MB) • 🟢 -23 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-C1doMZFE.js (removed) 1.55 MB 🟢 -1.55 MB 🟢 -323 kB 🟢 -257 kB
assets/vendor-other-CToGKTfi.js (new) 1.55 MB 🔴 +1.55 MB 🔴 +323 kB 🔴 +257 kB
assets/vendor-axios-qYA_aG5-.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-cn-CKf2l.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-primevue-BrYQO8Nm.js 1.74 MB 1.74 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-BBMmji0g.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-eGUDVAYp.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-BNJllOi7.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-B7dXz571.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-BTzCBa7h.js 110 kB 110 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

Other — 7.21 MB (baseline 7.21 MB) • 🔴 +59 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/groupNode-B_O3oCne.js (removed) 72.2 kB 🟢 -72.2 kB 🟢 -17.8 kB 🟢 -15.7 kB
assets/groupNode-D95jAuId.js (new) 72.2 kB 🔴 +72.2 kB 🔴 +17.8 kB 🔴 +15.7 kB
assets/core-C9QmgrSx.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -18.5 kB 🟢 -15.9 kB
assets/core-CujGU54C.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +18.5 kB 🔴 +15.9 kB
assets/WidgetSelect-BNbltCG5.js (removed) 56.8 kB 🟢 -56.8 kB 🟢 -12 kB 🟢 -10.4 kB
assets/WidgetSelect-D8jjrawT.js (new) 56.8 kB 🔴 +56.8 kB 🔴 +12 kB 🔴 +10.4 kB
assets/SubscriptionRequiredDialogContentWorkspace-CslL7d71.js (removed) 46 kB 🟢 -46 kB 🟢 -8.59 kB 🟢 -7.46 kB
assets/SubscriptionRequiredDialogContentWorkspace-Tj_1kLWb.js (new) 46 kB 🔴 +46 kB 🔴 +8.59 kB 🔴 +7.43 kB
assets/Load3DControls-CsSTV9FC.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.64 kB
assets/Load3DControls-Cvkknsd7.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/SettingDialogContent-BE57GsGK.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +8.01 kB 🔴 +7.04 kB
assets/SettingDialogContent-BLFVl9y7.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -8.01 kB 🟢 -7.06 kB
assets/SubscriptionRequiredDialogContent-B_JifKXN.js (new) 26.2 kB 🔴 +26.2 kB 🔴 +6.58 kB 🔴 +5.78 kB
assets/SubscriptionRequiredDialogContent-D5AhbHdC.js (removed) 26.1 kB 🟢 -26.1 kB 🟢 -6.57 kB 🟢 -5.77 kB
assets/Load3dViewerContent-6_2Nz2qw.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.28 kB 🟢 -4.57 kB
assets/Load3dViewerContent-B0aJBAtc.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +5.28 kB 🔴 +4.57 kB
assets/WidgetImageCrop-BY_h9SRH.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.52 kB 🟢 -4.86 kB
assets/WidgetImageCrop-CrBxuRY_.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.52 kB 🔴 +4.86 kB
assets/SubscriptionPanelContentWorkspace-Bpxz902v.js (removed) 21.8 kB 🟢 -21.8 kB 🟢 -5.19 kB 🟢 -4.59 kB
assets/SubscriptionPanelContentWorkspace-CVUT52c2.js (new) 21.8 kB 🔴 +21.8 kB 🔴 +5.19 kB 🔴 +4.59 kB
assets/CurrentUserPopoverWorkspace-CSo97xcR.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.08 kB 🟢 -4.51 kB
assets/CurrentUserPopoverWorkspace-DO4fOa21.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.08 kB 🔴 +4.51 kB
assets/FormItem-Bf0-hAcJ.js (removed) 20.2 kB 🟢 -20.2 kB 🟢 -4.87 kB 🟢 -4.25 kB
assets/FormItem-Dip9BSJb.js (new) 20.2 kB 🔴 +20.2 kB 🔴 +4.87 kB 🔴 +4.25 kB
assets/SignInContent-BJHkwSnc.js (removed) 19 kB 🟢 -19 kB 🟢 -4.82 kB 🟢 -4.21 kB
assets/SignInContent-DazeKRfv.js (new) 19 kB 🔴 +19 kB 🔴 +4.82 kB 🔴 +4.22 kB
assets/WidgetRecordAudio-BTOMbjL-.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.96 kB 🔴 +4.44 kB
assets/WidgetRecordAudio-De2blMoN.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.96 kB 🟢 -4.43 kB
assets/Load3D-Bm_w1arl.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.04 kB 🟢 -3.52 kB
assets/Load3D-RJOGiC55.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.04 kB 🔴 +3.53 kB
assets/MissingModelsWarning-BITvO9b7.js (new) 16.1 kB 🔴 +16.1 kB 🔴 +4.41 kB 🔴 +3.92 kB
assets/MissingModelsWarning-Bl7Vo3BX.js (removed) 16.1 kB 🟢 -16.1 kB 🟢 -4.41 kB 🟢 -3.91 kB
assets/WidgetInputNumber-BlceZHQU.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -4.26 kB 🟢 -3.8 kB
assets/WidgetInputNumber-ZzGJDh1y.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.26 kB 🔴 +3.8 kB
assets/load3d-D800Z_9Y.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.19 kB 🔴 +3.64 kB
assets/load3d-D9ik5Nh3.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.19 kB 🟢 -3.65 kB
assets/LazyImage-Br35X4MU.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.8 kB 🟢 -3.35 kB
assets/LazyImage-D0Axa2uY.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.8 kB 🔴 +3.33 kB
assets/AudioPreviewPlayer-BBgfE3S7.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.21 kB 🟢 -2.88 kB
assets/AudioPreviewPlayer-BkO_1RDe.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.21 kB 🔴 +2.87 kB
assets/NodeConflictDialogContent-D4giZsN5.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.35 kB 🟢 -2.06 kB
assets/NodeConflictDialogContent-INs7lyyZ.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.36 kB 🔴 +2.08 kB
assets/changeTracker-DD6lKrxG.js (removed) 9.4 kB 🟢 -9.4 kB 🟢 -2.9 kB 🟢 -2.55 kB
assets/changeTracker-DXLkEbBW.js (new) 9.4 kB 🔴 +9.4 kB 🔴 +2.9 kB 🔴 +2.56 kB
assets/nodeTemplates-BsPwpRIc.js (new) 9.34 kB 🔴 +9.34 kB 🔴 +3.27 kB 🔴 +2.88 kB
assets/nodeTemplates-DjviS02E.js (removed) 9.34 kB 🟢 -9.34 kB 🟢 -3.27 kB 🟢 -2.88 kB
assets/SelectValue-CCewhfpC.js (removed) 8.94 kB 🟢 -8.94 kB 🟢 -2.27 kB 🟢 -1.99 kB
assets/SelectValue-Silz5tDF.js (new) 8.94 kB 🔴 +8.94 kB 🔴 +2.27 kB 🔴 +1.99 kB
assets/InviteMemberDialogContent-BFJEHbuZ.js (new) 7.92 kB 🔴 +7.92 kB 🔴 +2.56 kB 🔴 +2.23 kB
assets/InviteMemberDialogContent-D8uMp-ZR.js (removed) 7.92 kB 🟢 -7.92 kB 🟢 -2.56 kB 🟢 -2.23 kB
assets/WidgetWithControl-BVQSuxWe.js (removed) 7.04 kB 🟢 -7.04 kB 🟢 -2.63 kB 🟢 -2.35 kB
assets/WidgetWithControl-DEHO9M7K.js (new) 7.04 kB 🔴 +7.04 kB 🔴 +2.64 kB 🔴 +2.37 kB
assets/Load3DConfiguration-CHQv-VoF.js (new) 6.36 kB 🔴 +6.36 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/Load3DConfiguration-CpRdOOPX.js (removed) 6.36 kB 🟢 -6.36 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/MissingNodesContent-19Yr4_vu.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +2.09 kB 🔴 +1.85 kB
assets/MissingNodesContent-Dffjm3cl.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -2.08 kB 🟢 -1.85 kB
assets/CreateWorkspaceDialogContent-1r-VRxq_.js (removed) 5.55 kB 🟢 -5.55 kB 🟢 -2 kB 🟢 -1.75 kB
assets/CreateWorkspaceDialogContent-CT4UGHav.js (new) 5.55 kB 🔴 +5.55 kB 🔴 +2 kB 🔴 +1.74 kB
assets/EditWorkspaceDialogContent-BAlVyhyO.js (removed) 5.35 kB 🟢 -5.35 kB 🟢 -1.95 kB 🟢 -1.71 kB
assets/EditWorkspaceDialogContent-BlgFMAVR.js (new) 5.35 kB 🔴 +5.35 kB 🔴 +1.96 kB 🔴 +1.7 kB
assets/ValueControlPopover-eIKpxzg2.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.78 kB 🔴 +1.58 kB
assets/ValueControlPopover-ORp2luGY.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.78 kB 🟢 -1.59 kB
assets/Preview3d-Me2n4YfJ.js (removed) 4.83 kB 🟢 -4.83 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/Preview3d-WUgO5Aio.js (new) 4.83 kB 🔴 +4.83 kB 🔴 +1.58 kB 🔴 +1.38 kB
assets/CancelSubscriptionDialogContent-CjTKLyB-.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/CancelSubscriptionDialogContent-DZekt-jA.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.79 kB 🟢 -1.57 kB
assets/MissingNodesFooter-BWUtBQSc.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.78 kB 🔴 +1.58 kB
assets/MissingNodesFooter-DCMWMkqk.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.78 kB 🟢 -1.58 kB
assets/AnimationControls-CaZCanJe.js (removed) 4.61 kB 🟢 -4.61 kB 🟢 -1.6 kB 🟢 -1.41 kB
assets/AnimationControls-CbKbMpm9.js (new) 4.61 kB 🔴 +4.61 kB 🔴 +1.6 kB 🔴 +1.41 kB
assets/DeleteWorkspaceDialogContent-B0EtsCKl.js (new) 4.25 kB 🔴 +4.25 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/DeleteWorkspaceDialogContent-DxrWbYD_.js (removed) 4.25 kB 🟢 -4.25 kB 🟢 -1.64 kB 🟢 -1.42 kB
assets/LeaveWorkspaceDialogContent-BSqtpPFE.js (new) 4.08 kB 🔴 +4.08 kB 🔴 +1.58 kB 🔴 +1.38 kB
assets/LeaveWorkspaceDialogContent-iIGmvy2k.js (removed) 4.08 kB 🟢 -4.08 kB 🟢 -1.58 kB 🟢 -1.38 kB
assets/RemoveMemberDialogContent-CtY6cj8r.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.53 kB 🔴 +1.34 kB
assets/RemoveMemberDialogContent-D91WdKyk.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.53 kB 🟢 -1.34 kB
assets/RevokeInviteDialogContent-CGAHhuJk.js (new) 3.97 kB 🔴 +3.97 kB 🔴 +1.55 kB 🔴 +1.36 kB
assets/RevokeInviteDialogContent-veuISiZN.js (removed) 3.97 kB 🟢 -3.97 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/Slider-Cwyyo6kE.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.36 kB 🔴 +1.19 kB
assets/Slider-D6pElFCM.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.37 kB 🟢 -1.19 kB
assets/saveMesh-BoCH7fdP.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.46 kB 🟢 -1.31 kB
assets/saveMesh-Cw94iMj-.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.46 kB 🔴 +1.29 kB
assets/WidgetTextarea-CNKkymLA.js (removed) 3.14 kB 🟢 -3.14 kB 🟢 -1.3 kB 🟢 -1.14 kB
assets/WidgetTextarea-DiSfG19B.js (new) 3.14 kB 🔴 +3.14 kB 🔴 +1.3 kB 🔴 +1.14 kB
assets/cloudSessionCookie-BdWB5af-.js (removed) 3.12 kB 🟢 -3.12 kB 🟢 -1.09 kB 🟢 -959 B
assets/cloudSessionCookie-DuXNxziN.js (new) 3.12 kB 🔴 +3.12 kB 🔴 +1.1 kB 🔴 +962 B
assets/GlobalToast-B006xNJl.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/GlobalToast-BI6aoKMp.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.06 kB
assets/WidgetColorPicker-D6HnwloN.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -1.23 kB 🟢 -1.11 kB
assets/WidgetColorPicker-DW6DvKRF.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +1.23 kB 🔴 +1.11 kB
assets/ApiNodesSignInContent-BSaA9BHQ.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -953 B
assets/ApiNodesSignInContent-DQGlKmxb.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +920 B
assets/WidgetToggleSwitch-DumzquCf.js (removed) 2.5 kB 🟢 -2.5 kB 🟢 -1.09 kB 🟢 -974 B
assets/WidgetToggleSwitch-qy5it8Ef.js (new) 2.5 kB 🔴 +2.5 kB 🔴 +1.1 kB 🔴 +995 B
assets/NodeConflictFooter-BkFSVbbF.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.03 kB 🔴 +919 B
assets/NodeConflictFooter-DSfiduX0.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.03 kB 🟢 -908 B
assets/SubscribeToRun-Cvbct8qs.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -872 B
assets/SubscribeToRun-ZfBAulxJ.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +889 B
assets/WidgetLayoutField-Dr-F4uad.js (removed) 1.95 kB 🟢 -1.95 kB 🟢 -881 B 🟢 -758 B
assets/WidgetLayoutField-RHKdo7nO.js (new) 1.95 kB 🔴 +1.95 kB 🔴 +882 B 🔴 +760 B
assets/ImportFailedNodeFooter-DS84ekSN.js (new) 1.88 kB 🔴 +1.88 kB 🔴 +869 B 🔴 +756 B
assets/ImportFailedNodeFooter-iwUk9oUP.js (removed) 1.88 kB 🟢 -1.88 kB 🟢 -867 B 🟢 -752 B
assets/WidgetInputText-BoC2pNt7.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -872 B 🟢 -791 B
assets/WidgetInputText-DKj3_fCM.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +874 B 🔴 +803 B
assets/SettingDialogHeader-B0OdQY5Y.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -896 B 🟢 -810 B
assets/SettingDialogHeader-CquVrUye.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +897 B 🔴 +804 B
assets/CloudRunButtonWrapper-BRmp7KSr.js (removed) 1.69 kB 🟢 -1.69 kB 🟢 -794 B 🟢 -714 B
assets/CloudRunButtonWrapper-C57No-uz.js (new) 1.69 kB 🔴 +1.69 kB 🔴 +796 B 🔴 +711 B
assets/cloudBadges-_KP0HyFG.js (removed) 1.38 kB 🟢 -1.38 kB 🟢 -718 B 🟢 -623 B
assets/cloudBadges-B9fbIgUa.js (new) 1.38 kB 🔴 +1.38 kB 🔴 +716 B 🔴 +620 B
assets/cloudSubscription-BUJtyjP9.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +668 B 🔴 +575 B
assets/cloudSubscription-CSzMPpwn.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -667 B 🟢 -576 B
assets/Load3D-Bg_xMIvi.js (removed) 1.05 kB 🟢 -1.05 kB 🟢 -489 B 🟢 -442 B
assets/Load3D-hlnDLDOE.js (new) 1.05 kB 🔴 +1.05 kB 🔴 +492 B 🔴 +437 B
assets/nightlyBadges-b8Yv6WJv.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -544 B 🟢 -479 B
assets/nightlyBadges-EHUUAFL1.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +542 B 🔴 +478 B
assets/Load3dViewerContent-2GjXx4hz.js (new) 974 B 🔴 +974 B 🔴 +464 B 🔴 +407 B
assets/Load3dViewerContent-CgAfPCPE.js (removed) 974 B 🟢 -974 B 🟢 -462 B 🟢 -412 B
assets/SubscriptionPanelContentWorkspace-BYkrF__l.js (new) 945 B 🔴 +945 B 🔴 +445 B 🔴 +389 B
assets/SubscriptionPanelContentWorkspace-DjN0JE2x.js (removed) 945 B 🟢 -945 B 🟢 -446 B 🟢 -388 B
assets/SettingDialogContent-BtO4wxNm.js (new) 887 B 🔴 +887 B 🔴 +431 B 🔴 +379 B
assets/SettingDialogContent-Ce-SqXOq.js (removed) 887 B 🟢 -887 B 🟢 -429 B 🟢 -380 B
assets/changeTracker-By-rkmz-.js (new) 772 B 🔴 +772 B 🔴 +394 B 🔴 +341 B
assets/changeTracker-DysZDI_z.js (removed) 772 B 🟢 -772 B 🟢 -393 B 🟢 -340 B
assets/graphHasMissingNodes-Bq9Q6aMD.js (new) 761 B 🔴 +761 B 🔴 +374 B 🔴 +323 B
assets/graphHasMissingNodes-DisoIuEq.js (removed) 761 B 🟢 -761 B 🟢 -375 B 🟢 -328 B
assets/WidgetLegacy-C4wfe8k_.js (new) 760 B 🔴 +760 B 🔴 +394 B 🔴 +341 B
assets/WidgetLegacy-DQvGJBe7.js (removed) 760 B 🟢 -760 B 🟢 -395 B 🟢 -343 B
assets/WidgetInputNumber-0fThUCxF.js (new) 392 B 🔴 +392 B 🔴 +232 B 🔴 +213 B
assets/WidgetInputNumber-DJH51Xd1.js (removed) 392 B 🟢 -392 B 🟢 -230 B 🟢 -199 B
assets/SettingDialogHeader-A0HCqquG.js (new) 345 B 🔴 +345 B 🔴 +207 B 🔴 +198 B
assets/SettingDialogHeader-Cqg4Pick.js (removed) 345 B 🟢 -345 B 🟢 -211 B 🟢 -200 B
assets/src-DYn37vgX.js (new) 251 B 🔴 +251 B 🔴 +213 B 🔴 +189 B
assets/src-Q7PYLmIC.js (removed) 251 B 🟢 -251 B 🟢 -213 B 🟢 -188 B
assets/auto-zCGpezkl.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-DSXMzViN.js 1.78 kB 1.78 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-Cb9w2YJJ.js 909 B 909 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B-pgsvFR.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BVMMhDLS.js 16.6 kB 16.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CF_CtN5R.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cgae_Kmu.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D3k2h7MU.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D6S8WS13.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-OSpDi1he.js 18.4 kB 18.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-r2j_2QLb.js 15.7 kB 15.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-xCwqbbnl.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-z76J85Ox.js 14.7 kB 14.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-ZBYN9Ax-.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-Ckqa-uUF.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-DgsYHOAA.js 486 kB 486 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeContent-CFc03Tip.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeHeader-BuiKS0Ld.js 1.08 kB 1.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-0tm325o3.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B_ri2Aap.js 185 kB 185 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BoiOgdKT.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CA72LWLN.js 140 kB 140 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CbQ7lJbK.js 137 kB 137 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CHRAGMyf.js 116 kB 116 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CIyZJflU.js 160 kB 160 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CneA57GN.js 135 kB 135 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CPfWyLRa.js 166 kB 166 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-TTZWL04N.js 153 kB 153 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Wdgujjxn.js 117 kB 117 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-CfSf55hX.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-BzeTTUc-.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictHeader-DyMP7Pq3.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-4juEIy52.js 406 kB 406 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-7k_SrkpD.js 442 kB 442 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B8jyTCRy.js 375 kB 375 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BFAaUCPg.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bx-PGeyT.js 330 kB 330 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BYzmerHb.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CFarW4N4.js 365 kB 365 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ChXvGFKo.js 332 kB 332 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CilYTPll.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DxpGg4BW.js 354 kB 354 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-oSLREHqB.js 405 kB 405 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/signInSchema-D5yIaVjp.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-C9AnI0k5.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-BYdQ-wbS.js 245 B 245 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DZ2L2V2o.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/WidgetGalleria-QnD5GX-o.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-BA7xV_Kz.js 3.1 kB 3.1 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/widgetTypes-CYQJBz0f.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 67 added / 67 removed

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


P1 Badge Keep checkout POSTs compatible with current API contract

This now always sends a JSON request body for checkout creation, but the current registry schema still defines both createCloudSubscriptionCheckout and createCloudSubscriptionCheckoutTier as requestBody?: never (see @comfyorg/registry-types/src/comfyRegistryTypes.ts), so deployments that enforce that schema can reject these calls with 400 and block users from starting checkout; please add a compatibility fallback (e.g., retry without body) or ship this only with the backend contract update.

ℹ️ 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".

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

Labels

size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants