Skip to content

feat: integrate nightly survey system into app#8480

Open
christian-byrne wants to merge 2 commits intomainfrom
feat/survey-integration
Open

feat: integrate nightly survey system into app#8480
christian-byrne wants to merge 2 commits intomainfrom
feat/survey-integration

Conversation

@christian-byrne
Copy link
Contributor

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

Summary

Wires the nightly survey system into the app by adding a controller component and a convenience composable for feature-site usage tracking.

Changes

  • What: NightlySurveyController iterates enabled surveys from the registry and renders a NightlySurveyPopover for each. useSurveyFeatureTracking wraps useFeatureUsageTracker with a config-enabled guard for use at feature call sites.
  • Tree-shaking: Controller is loaded via defineAsyncComponent behind a compile-time isNightly/isCloud/isDesktop guard in SideToolbar.vue, so the entire survey module subtree is eliminated from cloud/desktop/stable builds.

Review Focus

  • DCE pattern: controller imported conditionally via defineAsyncComponent + distribution guard (same pattern as ComfyRunButton/index.ts)
  • useSurveyFeatureTracking short-circuits early when config is absent/disabled (avoids initializing tracker storage)
  • No user-facing behavior change: FEATURE_SURVEYS registry is still empty

Part of Nightly Survey System

This is part 5 of a stacked PR chain:

  1. feat/feature-usage-tracker - useFeatureUsageTracker (merged in feat: add composable to determine if user is eligible for nightly survey(s) #8189)
  2. feat/survey-eligibility - useSurveyEligibility (feat: add composable to determine if user is eligible for nightly survey(s) #8189, merged)
  3. feat/survey-config - surveyRegistry.ts (feat: add survey registry for feature survey configurations #8355, merged)
  4. feat/survey-popover - NightlySurveyPopover.vue (feat: add NightlySurveyPopover component for feature surveys #9083, merged)
  5. feat/survey-integration - NightlySurveyController.vue (this PR)

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 30, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7cfa2e3 and 9719333.

📒 Files selected for processing (1)
  • src/components/sidebar/SideToolbar.vue

📝 Walkthrough

Walkthrough

Adds a lazy-loaded NightlySurveyController rendered from the sidebar when nightly mode is active, a new NightlySurveyController component that renders popovers for enabled surveys, and a useSurveyFeatureTracking composable with unit tests for tracking survey feature usage.

Changes

Cohort / File(s) Summary
Sidebar integration
src/components/sidebar/SideToolbar.vue
Adds conditional lazy loading (defineAsyncComponent) and Suspense rendering for NightlySurveyController when isNightly is true and not cloud/desktop.
Survey controller SFC
src/platform/surveys/NightlySurveyController.vue
New Vue SFC that computes enabledSurveys via getEnabledSurveys() and renders a NightlySurveyPopover for each enabled survey.
Feature tracking composable
src/platform/surveys/useSurveyFeatureTracking.ts
New composable useSurveyFeatureTracking(featureId) that returns a no-op when config missing/disabled, otherwise delegates to useFeatureUsageTracker; exposes trackFeatureUsed and useCount.
Unit tests
src/platform/surveys/useSurveyFeatureTracking.test.ts
Adds tests for enabled, disabled, and missing survey config scenarios; mocks registry and verifies useCount behavior and localStorage reset between tests.

Sequence Diagram(s)

sequenceDiagram
    participant Sidebar as SideToolbar
    participant Controller as NightlySurveyController
    participant Registry as SurveyRegistry / getEnabledSurveys
    participant Popover as NightlySurveyPopover
    participant Tracker as useSurveyFeatureTracking

    Sidebar->>Controller: lazy-load when isNightly && !isCloud && !isDesktop
    Controller->>Registry: getEnabledSurveys()
    Registry-->>Controller: list of enabled survey configs
    Controller->>Popover: render popover for each config
    Popover->>Tracker: call trackFeatureUsed(featureId) on interaction
    Tracker->>Tracker: delegate to useFeatureUsageTracker or no-op
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 In the hush of nightly code I hop and write,
Popovers bloom like stars in soft moonlight,
I track a twitch, a click, a curious nudge,
Surveys whisper secrets I gently judge,
Hooray for features waking up tonight! 🌙

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: integrating the nightly survey system into the app through a new controller component and composable.
Description check ✅ Passed The description is comprehensive and follows the template structure with all required sections completed, including summary, changes, and review focus.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ 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/survey-integration

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Jan 30, 2026

🎭 Playwright: ✅ 555 passed, 0 failed · 2 flaky

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

@github-actions
Copy link

github-actions bot commented Jan 30, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/05/2026, 12:17:29 AM UTC

Links

@christian-byrne christian-byrne marked this pull request as ready for review February 22, 2026 06:40
@christian-byrne christian-byrne requested a review from a team as a code owner February 22, 2026 06:40
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Feb 22, 2026
@dosubot
Copy link

dosubot bot commented Feb 22, 2026

Related Documentation

Checked 0 published document(s) in 1 knowledge base(s). No updates required.

How did I do? Any feedback?  Join Discord

@christian-byrne christian-byrne requested a review from a team as a code owner February 22, 2026 06:45
christian-byrne added a commit that referenced this pull request Feb 23, 2026
## Summary

Adds NightlySurveyPopover component that displays a Typeform survey to
eligible nightly users after a configurable delay.

## Changes

- **What**: Vue component that uses `useSurveyEligibility` to show/hide
a survey popover with accept, dismiss, and opt-out actions. Loads
Typeform embed script dynamically with HTTPS and deduplication.

## Review Focus

- Typeform script injection security (HTTPS-only, load-once guard,
typeformId alphanumeric validation)
- Timeout lifecycle (clears pending timeout when eligibility changes)

## Part of Nightly Survey System

This is part 4 of a stacked PR chain:
1. ✅ feat/feature-usage-tracker - useFeatureUsageTracker (merged in
#8189)
2. ✅ feat/survey-eligibility - useSurveyEligibility (#8189, merged)
3. ✅ feat/survey-config - surveyRegistry.ts (#8355, merged)
4. **feat/survey-popover** - NightlySurveyPopover.vue (this PR)
5. feat/survey-integration - NightlySurveyController.vue (#8480)

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9083-feat-add-NightlySurveyPopover-component-for-feature-surveys-30f6d73d365081d1beb2f92555a4b2f4)
by [Unito](https://www.unito.io)

Co-authored-by: Amp <amp@ampcode.com>
Base automatically changed from feat/survey-popover to main February 23, 2026 04:20
@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 23, 2026
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Feb 23, 2026
@github-actions
Copy link

github-actions bot commented Feb 23, 2026

📦 Bundle: 4.49 MB gzip 🔴 +2.86 kB

Details

Summary

  • Raw size: 21.1 MB baseline 21.1 MB — 🔴 +9.28 kB
  • Gzip: 4.49 MB baseline 4.49 MB — 🔴 +2.86 kB
  • Brotli: 3.47 MB baseline 3.46 MB — 🔴 +2.62 kB
  • Bundles: 228 current • 227 baseline • 122 added / 121 removed

Category Glance
Other 🔴 +8.92 kB (7.92 MB) · Graph Workspace 🔴 +358 B (913 kB) · Vendor & Third-Party ⚪ 0 B (8.86 MB) · Data & Services ⚪ 0 B (2.73 MB) · Panels & Settings ⚪ 0 B (436 kB) · Views & Navigation ⚪ 0 B (72.1 kB) · + 5 more

App Entry Points — 17.7 kB (baseline 17.7 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CSOW9BT2.js (new) 17.7 kB 🔴 +17.7 kB 🔴 +6.25 kB 🔴 +5.42 kB
assets/index-CYkwBSoc.js (removed) 17.7 kB 🟢 -17.7 kB 🟢 -6.25 kB 🟢 -5.45 kB

Status: 1 added / 1 removed

Graph Workspace — 913 kB (baseline 913 kB) • 🔴 +358 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BlyAw1uA.js (new) 913 kB 🔴 +913 kB 🔴 +194 kB 🔴 +147 kB
assets/GraphView-B1EKGqF0.js (removed) 913 kB 🟢 -913 kB 🟢 -194 kB 🟢 -147 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-DpxaLFg7.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.31 kB 🔴 +2.82 kB
assets/CloudSurveyView-DPxE7FYX.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.82 kB
assets/CloudLoginView-CoBcGPmT.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.19 kB 🟢 -2.82 kB
assets/CloudLoginView-QpcjP-AK.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.19 kB 🔴 +2.82 kB
assets/CloudSignupView-B3MWeath.js (new) 9.37 kB 🔴 +9.37 kB 🔴 +2.69 kB 🔴 +2.37 kB
assets/CloudSignupView-DqpjexmG.js (removed) 9.37 kB 🟢 -9.37 kB 🟢 -2.69 kB 🟢 -2.36 kB
assets/UserCheckView-3c66lCIV.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.22 kB 🔴 +1.94 kB
assets/UserCheckView-C-ebGAL1.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.22 kB 🟢 -1.93 kB
assets/CloudLayoutView-BeZF6eQD.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.1 kB 🟢 -1.83 kB
assets/CloudLayoutView-C-c2J-7M.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.1 kB 🔴 +1.82 kB
assets/CloudForgotPasswordView-BmgC7Tka.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.93 kB 🟢 -1.7 kB
assets/CloudForgotPasswordView-CDPYytIl.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.93 kB 🔴 +1.71 kB
assets/CloudAuthTimeoutView-bvWk8tOy.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CloudAuthTimeoutView-igz4SNr7.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/CloudSubscriptionRedirectView-DK-qzAwo.js (new) 4.75 kB 🔴 +4.75 kB 🔴 +1.78 kB 🔴 +1.58 kB
assets/CloudSubscriptionRedirectView-n9O1_m8d.js (removed) 4.75 kB 🟢 -4.75 kB 🟢 -1.79 kB 🟢 -1.58 kB
assets/UserSelectView-CSaUh6Dh.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.46 kB
assets/UserSelectView-Drp3450T.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/layout-BOZSqios.js (new) 296 B 🔴 +296 B 🔴 +222 B 🔴 +186 B
assets/layout-C7HwWHX2.js (removed) 296 B 🟢 -296 B 🟢 -225 B 🟢 -188 B
assets/CloudSorryContactSupportView-oBJgqwAb.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-C3a1KmR6.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.65 kB
assets/SecretsPanel-Dim0RWyW.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.3 kB 🔴 +4.66 kB
assets/LegacyCreditsPanel-CAJIH6rC.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.56 kB 🔴 +4.88 kB
assets/LegacyCreditsPanel-Ck97gevB.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.57 kB 🟢 -4.89 kB
assets/SubscriptionPanel-DOaICIuW.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.72 kB 🔴 +4.15 kB
assets/SubscriptionPanel-FG2FK1fZ.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.72 kB 🟢 -4.17 kB
assets/KeybindingPanel-3t2MBvvw.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.51 kB 🔴 +3.12 kB
assets/KeybindingPanel-C4Rhl2Tn.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.51 kB 🟢 -3.12 kB
assets/AboutPanel-CjVGjIY2.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.47 kB
assets/AboutPanel-D22DP8Fi.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.73 kB 🔴 +2.46 kB
assets/ExtensionPanel-Ck_BfoyH.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.65 kB 🟢 -2.36 kB
assets/ExtensionPanel-fJnvvR9s.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.65 kB 🔴 +2.35 kB
assets/ServerConfigPanel-D3K5AxKi.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.12 kB 🟢 -1.92 kB
assets/ServerConfigPanel-DX-mwdTE.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.12 kB 🔴 +1.89 kB
assets/UserPanel-0D0FOVzN.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +1.99 kB 🔴 +1.74 kB
assets/UserPanel-Dr9xtFOy.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -1.99 kB 🟢 -1.74 kB
assets/cloudRemoteConfig-DXHD7Q9b.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +699 B 🔴 +614 B
assets/cloudRemoteConfig-tdB-wl5W.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -701 B 🟢 -609 B
assets/refreshRemoteConfig-4rseZ8jb.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +520 B 🔴 +456 B
assets/refreshRemoteConfig-Csa03SSB.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -517 B 🟢 -463 B
assets/config-CGn5JFmU.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B5oF6TeI.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BVYOg4dh.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CBEvSL1z.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CGx1t8IZ.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CNcb_4nC.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cx1dZM6H.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dw-QS6Nb.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DXxgnCSn.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-GRFn4guL.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-mgwKIVQ2.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-s83B801I.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-199E7ha-.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -990 B
assets/auth-DNsu_P9b.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +991 B
assets/SignUpForm-CVJnBXud.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.1 kB
assets/SignUpForm-DUxB4RBn.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.11 kB
assets/UpdatePasswordContent-BlLrGpF_.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.06 kB 🔴 +941 B
assets/UpdatePasswordContent-Dr-3pKxp.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.06 kB 🟢 -940 B
assets/WorkspaceProfilePic-D9lCv5xq.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -821 B 🟢 -739 B
assets/WorkspaceProfilePic-KL8Hs2yn.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +821 B 🔴 +746 B
assets/firebaseAuthStore-BT6C8ecQ.js (new) 788 B 🔴 +788 B 🔴 +381 B 🔴 +339 B
assets/firebaseAuthStore-CWuIXqzW.js (removed) 788 B 🟢 -788 B 🟢 -382 B 🟢 -342 B
assets/auth-eunjSdSE.js (removed) 357 B 🟢 -357 B 🟢 -225 B 🟢 -221 B
assets/auth-OZyPBF4w.js (new) 357 B 🔴 +357 B 🔴 +224 B 🔴 +216 B
assets/PasswordFields-D2N9Ml9Z.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-C_1JmjIQ.js (removed) 736 B 🟢 -736 B 🟢 -377 B 🟢 -352 B
assets/useSubscriptionDialog-DfARuHyP.js (new) 736 B 🔴 +736 B 🔴 +373 B 🔴 +321 B

Status: 1 added / 1 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-DdjLrvOH.js (new) 9.84 kB 🔴 +9.84 kB 🔴 +3.39 kB 🔴 +3 kB
assets/useTerminalTabs-DqC8CA5_.js (removed) 9.84 kB 🟢 -9.84 kB 🟢 -3.39 kB 🟢 -3 kB
assets/ComfyQueueButton-BCo9Co4L.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.49 kB 🟢 -2.22 kB
assets/ComfyQueueButton-wcHo1Ril.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.48 kB 🔴 +2.22 kB
assets/FormSearchInput-BJeGeP_m.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.54 kB 🟢 -1.36 kB
assets/FormSearchInput-COUCpr9G.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.54 kB 🔴 +1.36 kB
assets/SubscribeButton-4-w6awFn.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.01 kB 🔴 +888 B
assets/SubscribeButton-DvlyWCzY.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1.01 kB 🟢 -882 B
assets/WidgetButton-DQ_BOv-g.js (removed) 1.84 kB 🟢 -1.84 kB 🟢 -876 B 🟢 -765 B
assets/WidgetButton-Dy4aY7ju.js (new) 1.84 kB 🔴 +1.84 kB 🔴 +877 B 🔴 +766 B
assets/cloudFeedbackTopbarButton-e_1cZ8P1.js (removed) 1.59 kB 🟢 -1.59 kB 🟢 -850 B 🟢 -756 B
assets/cloudFeedbackTopbarButton-jeyNM3zV.js (new) 1.59 kB 🔴 +1.59 kB 🔴 +848 B 🔴 +754 B
assets/ComfyQueueButton-BFVibsOI.js (new) 793 B 🔴 +793 B 🔴 +390 B 🔴 +345 B
assets/ComfyQueueButton-OhOfrks2.js (removed) 793 B 🟢 -793 B 🟢 -391 B 🟢 -348 B
assets/Button-Dw6K3LMw.js 3.08 kB 3.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-y8d0lfIa.js 1.16 kB 1.16 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-_Rw93HFG.js 5.95 kB 5.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-BpSw2jyq.js 7.44 kB 7.44 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-4quz6WWI.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 7 added / 7 removed

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

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-DF7hm7Dd.js (new) 1.91 MB 🔴 +1.91 MB 🔴 +429 kB 🔴 +321 kB
assets/dialogService-mD6ipIqv.js (removed) 1.91 MB 🟢 -1.91 MB 🟢 -429 kB 🟢 -321 kB
assets/api-Cja_Vxgs.js (removed) 689 kB 🟢 -689 kB 🟢 -155 kB 🟢 -124 kB
assets/api-DVVC5Dma.js (new) 689 kB 🔴 +689 kB 🔴 +155 kB 🔴 +124 kB
assets/load3dService-CLnn7P5i.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-D0dkzMKp.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/extensionStore-Cb8y_zit.js (removed) 13 kB 🟢 -13 kB 🟢 -4.42 kB 🟢 -3.9 kB
assets/extensionStore-DQotSgrH.js (new) 13 kB 🔴 +13 kB 🔴 +4.42 kB 🔴 +3.91 kB
assets/releaseStore-B388p86v.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/releaseStore-BJL9AooP.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.96 kB
assets/keybindingService-CUEWc-mE.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -1.71 kB 🟢 -1.47 kB
assets/keybindingService-vofOUQUC.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/bootstrapStore-DMjj8a2w.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -877 B 🟢 -794 B
assets/bootstrapStore-QSdC9Pz6.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +877 B 🔴 +792 B
assets/userStore-ByFG7ZWO.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -721 B 🟢 -677 B
assets/userStore-CRDOyiIp.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +717 B 🔴 +672 B
assets/audioService-B9mk1fNo.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -850 B 🟢 -724 B
assets/audioService-Dj76iHet.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +849 B 🔴 +728 B
assets/releaseStore-Dmje1su8.js (new) 760 B 🔴 +760 B 🔴 +381 B 🔴 +335 B
assets/releaseStore-DrpAhRRS.js (removed) 760 B 🟢 -760 B 🟢 -379 B 🟢 -337 B
assets/settingStore-CLkKnJwT.js (new) 744 B 🔴 +744 B 🔴 +381 B 🔴 +338 B
assets/settingStore-DhIWxLuV.js (removed) 744 B 🟢 -744 B 🟢 -382 B 🟢 -339 B
assets/workflowDraftStore-DGPKF-cP.js (new) 736 B 🔴 +736 B 🔴 +372 B 🔴 +326 B
assets/workflowDraftStore-DWoeqVNz.js (removed) 736 B 🟢 -736 B 🟢 -374 B 🟢 -355 B
assets/dialogService-CAm9-mCa.js (removed) 725 B 🟢 -725 B 🟢 -366 B 🟢 -327 B
assets/dialogService-dUcTCchr.js (new) 725 B 🔴 +725 B 🔴 +365 B 🔴 +323 B
assets/serverConfigStore-CjFLR4Tj.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-BgdFMjdn.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-CJRKgcMA.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3dViewer-Br1_U3ib.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useLoad3dViewer-CNB6nS1a.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.79 kB
assets/useFeatureFlags-DcqEir9h.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.24 kB 🔴 +1.05 kB
assets/useFeatureFlags-DQviwjuV.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.23 kB 🟢 -1.05 kB
assets/useWorkspaceUI-BCF94ze5.js (removed) 3 kB 🟢 -3 kB 🟢 -823 B 🟢 -702 B
assets/useWorkspaceUI-BHW7Zzt-.js (new) 3 kB 🔴 +3 kB 🔴 +822 B 🔴 +705 B
assets/subscriptionCheckoutUtil-BPc3y1AH.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -955 B
assets/subscriptionCheckoutUtil-Gl-Rh8GF.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +929 B
assets/useErrorHandling-CrBXUx4r.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +630 B 🔴 +534 B
assets/useErrorHandling-EniFX0bl.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -629 B 🟢 -535 B
assets/useWorkspaceSwitch-ByBG9eoF.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -543 B 🟢 -487 B
assets/useWorkspaceSwitch-kcY_rc2V.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +543 B 🔴 +482 B
assets/useLoad3d-BKf3rNid.js (new) 859 B 🔴 +859 B 🔴 +419 B 🔴 +378 B
assets/useLoad3d-DvScjcWg.js (removed) 859 B 🟢 -859 B 🟢 -423 B 🟢 -379 B
assets/audioUtils-FcSlP6NF.js (removed) 858 B 🟢 -858 B 🟢 -499 B 🟢 -420 B
assets/audioUtils-zkbrJIXV.js (new) 858 B 🔴 +858 B 🔴 +502 B 🔴 +427 B
assets/useLoad3dViewer-9VDJDgmZ.js (new) 838 B 🔴 +838 B 🔴 +405 B 🔴 +365 B
assets/useLoad3dViewer-DWs06iki.js (removed) 838 B 🟢 -838 B 🟢 -406 B 🟢 -371 B
assets/useCurrentUser-Chc-iUvH.js (new) 722 B 🔴 +722 B 🔴 +368 B 🔴 +322 B
assets/useCurrentUser-JXqIu58r.js (removed) 722 B 🟢 -722 B 🟢 -370 B 🟢 -352 B
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-BdnFBncR.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Clzmwvt4.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-BwTAJqBg.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BputJAFn.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-BxmhAhZ0.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-BxkFiWzp.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DccD0mxo.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-5I_5Qfg0.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-BleJN4K0.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-C-tDe-KL.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-LBLOE6BD.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-z9_RK3Ae.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-CmHHRvL9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-cYXYo6hi.js 121 kB 121 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-MKpa1ZAW.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.92 MB (baseline 7.91 MB) • 🔴 +8.92 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-CXLjCoJJ.js (new) 73.6 kB 🔴 +73.6 kB 🔴 +19 kB 🔴 +16.2 kB
assets/core-zKQ4tOwQ.js (removed) 73.6 kB 🟢 -73.6 kB 🟢 -19 kB 🟢 -16.2 kB
assets/groupNode-BDbCBVKD.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.6 kB
assets/groupNode-BkBgDf99.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.5 kB
assets/WidgetSelect-BdtTf2Ra.js (removed) 58.3 kB 🟢 -58.3 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/WidgetSelect-D0qO1JA1.js (new) 58.3 kB 🔴 +58.3 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-D6g1mgwT.js (removed) 46.3 kB 🟢 -46.3 kB 🟢 -8.65 kB 🟢 -7.5 kB
assets/SubscriptionRequiredDialogContentWorkspace-DnyZYxtF.js (new) 46.3 kB 🔴 +46.3 kB 🔴 +8.65 kB 🔴 +7.51 kB
assets/WidgetPainter-BL9cwMOO.js (new) 32.5 kB 🔴 +32.5 kB 🔴 +7.95 kB 🔴 +7.07 kB
assets/WidgetPainter-OiV9FmbU.js (removed) 32.5 kB 🟢 -32.5 kB 🟢 -7.95 kB 🟢 -7.04 kB
assets/Load3DControls-Dy8EMjTS.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.64 kB
assets/Load3DControls-tZl--vF0.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/WorkspacePanelContent-C4kb-hLq.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.14 kB 🟢 -5.41 kB
assets/WorkspacePanelContent-CjQGsOBs.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.14 kB 🔴 +5.39 kB
assets/SubscriptionRequiredDialogContent-D7BS_sxk.js (new) 25.7 kB 🔴 +25.7 kB 🔴 +6.57 kB 🔴 +5.78 kB
assets/SubscriptionRequiredDialogContent-Dm-972Fv.js (removed) 25.7 kB 🟢 -25.7 kB 🟢 -6.57 kB 🟢 -5.77 kB
assets/Load3dViewerContent-B5cDMYGs.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.49 kB
assets/Load3dViewerContent-Ds7qwc17.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.5 kB
assets/WidgetImageCrop-BByPBO7r.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.51 kB 🟢 -4.85 kB
assets/WidgetImageCrop-Bg65T0aa.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.5 kB 🔴 +4.85 kB
assets/SubscriptionPanelContentWorkspace-Br9jgtuL.js (removed) 22 kB 🟢 -22 kB 🟢 -5.11 kB 🟢 -4.5 kB
assets/SubscriptionPanelContentWorkspace-FDnHlAEg.js (new) 22 kB 🔴 +22 kB 🔴 +5.11 kB 🔴 +4.51 kB
assets/CurrentUserPopoverWorkspace-MCjzVSEt.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -4.94 kB 🟢 -4.41 kB
assets/CurrentUserPopoverWorkspace-nD3ckKRm.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +4.93 kB 🔴 +4.41 kB
assets/SignInContent-BFxYA6tZ.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.76 kB 🟢 -4.16 kB
assets/SignInContent-Dw1qmuxi.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.76 kB 🔴 +4.17 kB
assets/WidgetInputNumber-B7f2FEex.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +4.8 kB 🔴 +4.27 kB
assets/WidgetInputNumber-CMeu0uem.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -4.8 kB 🟢 -4.27 kB
assets/WidgetRecordAudio-D1Wj_yRl.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -4.99 kB 🟢 -4.46 kB
assets/WidgetRecordAudio-DaZcjcua.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +4.99 kB 🔴 +4.46 kB
assets/Load3D-Cyq1N5Bg.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.02 kB 🔴 +3.51 kB
assets/Load3D-F5msIS-n.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.02 kB 🟢 -3.52 kB
assets/load3d-FdPeJTbW.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.19 kB 🟢 -3.63 kB
assets/load3d-Y2RRn5xd.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.19 kB 🔴 +3.63 kB
assets/AudioPreviewPlayer-C1s1IX6K.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.24 kB 🔴 +2.91 kB
assets/AudioPreviewPlayer-DJD72jqo.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.24 kB 🟢 -2.89 kB
assets/changeTracker-B841d2EA.js (new) 9.43 kB 🔴 +9.43 kB 🔴 +2.9 kB 🔴 +2.55 kB
assets/changeTracker-BgZJGPo-.js (removed) 9.43 kB 🟢 -9.43 kB 🟢 -2.9 kB 🟢 -2.55 kB
assets/nodeTemplates-BZ6mMLL9.js (removed) 9.29 kB 🟢 -9.29 kB 🟢 -3.25 kB 🟢 -2.86 kB
assets/nodeTemplates-CXb_7rCI.js (new) 9.29 kB 🔴 +9.29 kB 🔴 +3.25 kB 🔴 +2.85 kB
assets/NightlySurveyController-CTOTihK2.js (new) 8.92 kB 🔴 +8.92 kB 🔴 +2.9 kB 🔴 +2.53 kB
assets/InviteMemberDialogContent-BTqqiNN7.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.29 kB 🟢 -2.03 kB
assets/InviteMemberDialogContent-DtrZa4vt.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.29 kB 🔴 +1.99 kB
assets/WidgetImageCompare-C6hTlaKi.js (removed) 7 kB 🟢 -7 kB 🟢 -2.07 kB 🟢 -1.81 kB
assets/WidgetImageCompare-D_c_bnu7.js (new) 7 kB 🔴 +7 kB 🔴 +2.07 kB 🔴 +1.81 kB
assets/WidgetToggleSwitch-BBrQMwt0.js (removed) 6.8 kB 🟢 -6.8 kB 🟢 -2.19 kB 🟢 -1.94 kB
assets/WidgetToggleSwitch-QRA1Ez1-.js (new) 6.8 kB 🔴 +6.8 kB 🔴 +2.19 kB 🔴 +1.94 kB
assets/Load3DConfiguration-B0yfJK-L.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.67 kB
assets/Load3DConfiguration-PSwUwEKc.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/CreateWorkspaceDialogContent-Bf3RC2ia.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +1.98 kB 🔴 +1.74 kB
assets/CreateWorkspaceDialogContent-Cj3NlCvW.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -1.99 kB 🟢 -1.73 kB
assets/onboardingCloudRoutes-5B7OAuLN.js (removed) 5.41 kB 🟢 -5.41 kB 🟢 -1.84 kB 🟢 -1.6 kB
assets/onboardingCloudRoutes-BMjWQPh7.js (new) 5.41 kB 🔴 +5.41 kB 🔴 +1.84 kB 🔴 +1.63 kB
assets/FreeTierDialogContent-BnpoL5dY.js (new) 5.39 kB 🔴 +5.39 kB 🔴 +1.89 kB 🔴 +1.67 kB
assets/FreeTierDialogContent-DFHIfhga.js (removed) 5.39 kB 🟢 -5.39 kB 🟢 -1.89 kB 🟢 -1.67 kB
assets/EditWorkspaceDialogContent-B00qsTCd.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.94 kB 🟢 -1.69 kB
assets/EditWorkspaceDialogContent-DT_Gha1u.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.94 kB 🔴 +1.69 kB
assets/ValueControlPopover-Cbw9y9Mc.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/ValueControlPopover-CZ05uAet.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.76 kB 🟢 -1.58 kB
assets/Preview3d-7JPa8m_p.js (new) 4.85 kB 🔴 +4.85 kB 🔴 +1.59 kB 🔴 +1.39 kB
assets/Preview3d-BSj_nYUP.js (removed) 4.85 kB 🟢 -4.85 kB 🟢 -1.59 kB 🟢 -1.39 kB
assets/CancelSubscriptionDialogContent-DHqr2jr7.js (removed) 4.79 kB 🟢 -4.79 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/CancelSubscriptionDialogContent-h5Q2JQjP.js (new) 4.79 kB 🔴 +4.79 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/DeleteWorkspaceDialogContent-CsE4Ojjg.js (removed) 4.23 kB 🟢 -4.23 kB 🟢 -1.63 kB 🟢 -1.42 kB
assets/DeleteWorkspaceDialogContent-daWGXR50.js (new) 4.23 kB 🔴 +4.23 kB 🔴 +1.63 kB 🔴 +1.42 kB
assets/WidgetWithControl-D7EmgS1c.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.78 kB 🟢 -1.61 kB
assets/WidgetWithControl-XYXlHD6p.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.78 kB 🔴 +1.59 kB
assets/LeaveWorkspaceDialogContent-92FDsGME.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.58 kB 🟢 -1.37 kB
assets/LeaveWorkspaceDialogContent-BJmhwtMj.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/RemoveMemberDialogContent-BwQRX5f5.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.52 kB 🔴 +1.33 kB
assets/RemoveMemberDialogContent-Cj5QWAWW.js (removed) 4.04 kB 🟢 -4.04 kB 🟢 -1.52 kB 🟢 -1.33 kB
assets/WidgetTextarea-D4ckclZT.js (removed) 3.96 kB 🟢 -3.96 kB 🟢 -1.49 kB 🟢 -1.3 kB
assets/WidgetTextarea-DUQOq_XV.js (new) 3.96 kB 🔴 +3.96 kB 🔴 +1.49 kB 🔴 +1.3 kB
assets/RevokeInviteDialogContent-BM3zZVX0.js (new) 3.95 kB 🔴 +3.95 kB 🔴 +1.54 kB 🔴 +1.35 kB
assets/RevokeInviteDialogContent-BVfnl0mo.js (removed) 3.95 kB 🟢 -3.95 kB 🟢 -1.54 kB 🟢 -1.35 kB
assets/InviteMemberUpsellDialogContent-BwGSCgjT.js (new) 3.82 kB 🔴 +3.82 kB 🔴 +1.4 kB 🔴 +1.23 kB
assets/InviteMemberUpsellDialogContent-plYuRJFu.js (removed) 3.82 kB 🟢 -3.82 kB 🟢 -1.4 kB 🟢 -1.23 kB
assets/tierBenefits-D-L-TE2E.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.3 kB 🟢 -1.17 kB
assets/tierBenefits-D-nGqQ2l.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.3 kB 🔴 +1.17 kB
assets/WidgetGalleria-BHbklsS7.js (removed) 3.61 kB 🟢 -3.61 kB 🟢 -1.39 kB 🟢 -1.25 kB
assets/WidgetGalleria-BqelVzkR.js (new) 3.61 kB 🔴 +3.61 kB 🔴 +1.39 kB 🔴 +1.25 kB
assets/saveMesh-ChSvjDF1.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.3 kB
assets/saveMesh-DcAmTo0I.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.45 kB 🔴 +1.29 kB
assets/cloudSessionCookie-BCh4-Xna.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.08 kB 🔴 +982 B
assets/cloudSessionCookie-Dzq-0xzd.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.08 kB 🟢 -959 B
assets/WidgetMarkdown-BArFg9m6.js (new) 2.93 kB 🔴 +2.93 kB 🔴 +1.23 kB 🔴 +1.08 kB
assets/WidgetMarkdown-CFetMknf.js (removed) 2.93 kB 🟢 -2.93 kB 🟢 -1.23 kB 🟢 -1.08 kB
assets/GlobalToast-Cnx8QKYA.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.03 kB
assets/GlobalToast-DBQVpeml.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.07 kB
assets/WidgetColorPicker-CwzSWM1s.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +1.23 kB 🔴 +1.11 kB
assets/WidgetColorPicker-DfzN4kvf.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -1.23 kB 🟢 -1.11 kB
assets/WidgetChart-BF6Uqf9O.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -954 B 🟢 -824 B
assets/WidgetChart-BSt38Of0.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +954 B 🔴 +823 B
assets/SubscribeToRun-Cq5N1E6l.js (removed) 2.06 kB 🟢 -2.06 kB 🟢 -950 B 🟢 -831 B
assets/SubscribeToRun-Ct3Go_JE.js (new) 2.06 kB 🔴 +2.06 kB 🔴 +949 B 🔴 +839 B
assets/WidgetLayoutField-BueH00xv.js (new) 1.98 kB 🔴 +1.98 kB 🔴 +892 B 🔴 +775 B
assets/WidgetLayoutField-CIhDMEfL.js (removed) 1.98 kB 🟢 -1.98 kB 🟢 -892 B 🟢 -792 B
assets/WidgetInputText-Cw-UHrCY.js (new) 1.86 kB 🔴 +1.86 kB 🔴 +875 B 🔴 +790 B
assets/WidgetInputText-CwLynoNC.js (removed) 1.86 kB 🟢 -1.86 kB 🟢 -874 B 🟢 -796 B
assets/CloudRunButtonWrapper-CSn23R-o.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -782 B 🟢 -704 B
assets/CloudRunButtonWrapper-DfLPUzsl.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +780 B 🔴 +710 B
assets/previousFullPath-AV0NxLEP.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +650 B 🔴 +589 B
assets/previousFullPath-Be8lnhvB.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -649 B 🟢 -556 B
assets/cloudBadges-D-g6SHiW.js (removed) 1.36 kB 🟢 -1.36 kB 🟢 -703 B 🟢 -613 B
assets/cloudBadges-Ds-mzo03.js (new) 1.36 kB 🔴 +1.36 kB 🔴 +701 B 🔴 +614 B
assets/cloudSubscription-5Retxi99.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +650 B 🔴 +568 B
assets/cloudSubscription-CM9-AWuY.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -653 B 🟢 -571 B
assets/widgetPropFilter-C6ZYch5M.js (new) 1.1 kB 🔴 +1.1 kB 🔴 +511 B 🔴 +431 B
assets/widgetPropFilter-DN03zIgB.js (removed) 1.1 kB 🟢 -1.1 kB 🟢 -510 B 🟢 -432 B
assets/Load3D-D9UikAde.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -495 B 🟢 -442 B
assets/Load3D-DMEG7caS.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +492 B 🔴 +437 B
assets/nightlyBadges-Dl-UDQsQ.js (new) 1 kB 🔴 +1 kB 🔴 +526 B 🔴 +476 B
assets/nightlyBadges-Gu4Rsxbp.js (removed) 1 kB 🟢 -1 kB 🟢 -529 B 🟢 -476 B
assets/Load3dViewerContent-ByicAgoH.js (new) 993 B 🔴 +993 B 🔴 +463 B 🔴 +414 B
assets/Load3dViewerContent-CloAKF06.js (removed) 993 B 🟢 -993 B 🟢 -464 B 🟢 -415 B
assets/SubscriptionPanelContentWorkspace-CmyFyOo6.js (new) 920 B 🔴 +920 B 🔴 +434 B 🔴 +373 B
assets/SubscriptionPanelContentWorkspace-Ir7Xq0Sp.js (removed) 920 B 🟢 -920 B 🟢 -436 B 🟢 -378 B
assets/graphHasMissingNodes-D_4QXcOB.js (removed) 761 B 🟢 -761 B 🟢 -375 B 🟢 -324 B
assets/graphHasMissingNodes-D1LftOhc.js (new) 761 B 🔴 +761 B 🔴 +374 B 🔴 +325 B
assets/changeTracker-CS52iwAx.js (new) 757 B 🔴 +757 B 🔴 +381 B 🔴 +333 B
assets/changeTracker-DYJodx9S.js (removed) 757 B 🟢 -757 B 🟢 -379 B 🟢 -336 B
assets/WidgetLegacy-CdOictEV.js (removed) 744 B 🟢 -744 B 🟢 -383 B 🟢 -352 B
assets/WidgetLegacy-Cz46VRvO.js (new) 744 B 🔴 +744 B 🔴 +379 B 🔴 +353 B
assets/AnimationControls-rvj0ANn9.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-u7O-u4Qv.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-BTnZwrs2.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-BNRU5hKJ.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-D9MrYETV.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-BbfHqQlJ.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BEYCqLzR.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BFgRi4P3.js 19 kB 19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BUxt8PgP.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BWxUDagn.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CaYVZOZt.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CQAp--Ck.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CTQPlIVl.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DBek0Hch.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DU-y2_NM.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-g_-oH-q2.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ji49gKfP.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-htt0vt7m.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-C0ZZdb5u.js 535 kB 535 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-Dl81vo8V.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BEMY9ugQ.js 158 kB 158 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BfwPzKFt.js 173 kB 173 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bii6Trku.js 150 kB 150 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bpn2Hd-v.js 188 kB 188 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BSlofMTK.js 155 kB 155 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BwvjM7NS.js 210 kB 210 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BzFhiL9M.js 150 kB 150 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C2qCKfdm.js 181 kB 181 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cu-O7-UJ.js 153 kB 153 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D_rzH3JH.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DWCBhr37.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-DjGAidD-.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-CXjvquTX.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-CCi6hDYh.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-z-FoiFro.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-BUmyBrmT.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-C5eK56v1.js 2.77 kB 2.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BRiV_JqD.js 451 kB 451 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BRNi4BQJ.js 404 kB 404 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BYxgBGHq.js 400 kB 400 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CRJ1lnRc.js 396 kB 396 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CYplVYdX.js 364 kB 364 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Czw9YrJ_.js 368 kB 368 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dp7_2zi-.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DY1M9TFM.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-EIvY3SXE.js 491 kB 491 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-TppPBr5S.js 416 kB 416 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-WGHIzLau.js 450 kB 450 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-CiXBGsU8.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-mHgijvCJ.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-Bz9Krv8L.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-CQRjYlXR.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-DqM23qfs.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-CC52XK_P.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-D_dHFUc0.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DIRwAHBY.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-aM9dgT_H.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BYsbWVeN.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-D_JEKVtF.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DYLaC2lj.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 62 added / 61 removed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/sidebar/SideToolbar.vue`:
- Line 54: The async component NightlySurveyController is being rendered
directly; wrap its usage in a Vue <Suspense> so the defineAsyncComponent
resolves correctly — replace the direct <component :is="NightlySurveyController"
v-if="NightlySurveyController" /> with a <Suspense> that conditionally renders
the async component in the default slot (and provide a simple fallback in the
fallback slot or via template `#fallback`) to satisfy async-component guidelines;
ensure you still check NightlySurveyController (or guard in setup) so the
Suspense only mounts when the async is available.

In `@src/platform/surveys/useSurveyFeatureTracking.test.ts`:
- Around line 3-15: The tests use a module-level mutable object
mockSurveyConfigs and a vi.mock that reads it; replace this pattern by hoisting
a mock function with vi.hoisted and using that in the mock implementation for
getSurveyConfig, then reset/configure that hoisted mock per test instead of
mutating mockSurveyConfigs. Concretely, create a hoisted const (e.g., const
hoistedGetSurveyConfig = vi.hoisted(() => vi.fn())) and have
vi.mock('./surveyRegistry', () => ({ getSurveyConfig: hoistedGetSurveyConfig }))
so the mock is created before module init; in beforeEach call
hoistedGetSurveyConfig.mockReset() and set
hoistedGetSurveyConfig.mockImplementationOnce(...) or mockReturnValue(...) for
each test to control returned { enabled } values rather than clearing a shared
object.

@github-actions
Copy link

github-actions bot commented Feb 28, 2026

⚡ Performance Report

Metric Baseline PR Δ
canvas-idle: style recalcs 126 125 -1% ⚪
canvas-idle: layouts 1 0 -100% 🟢
canvas-idle: task duration 476ms 412ms -14% 🟢
canvas-mouse-sweep: style recalcs 175 163 -7% ⚪
canvas-mouse-sweep: layouts 12 12 +0% ⚪
canvas-mouse-sweep: task duration 949ms 761ms -20% 🟢
dom-widget-clipping: style recalcs 47 40 -15% 🟢
dom-widget-clipping: layouts 0 0 +0% ⚪
dom-widget-clipping: task duration 416ms 349ms -16% 🟢
subgraph-dom-widget-clipping: style recalcs 80 75 -6% ⚪
subgraph-dom-widget-clipping: layouts 1 0 -100% 🟢
subgraph-dom-widget-clipping: task duration 485ms 429ms -12% 🟢
subgraph-idle: style recalcs 122 123 +1% ⚪
subgraph-idle: layouts 0 1 new 🔴
subgraph-idle: task duration 522ms 382ms -27% 🟢
subgraph-mouse-sweep: style recalcs 172 157 -9% ⚪
subgraph-mouse-sweep: layouts 16 16 +0% ⚪
subgraph-mouse-sweep: task duration 1034ms 729ms -29% 🟢
Raw data
{
  "timestamp": "2026-03-05T00:19:54.560Z",
  "gitSha": "0f70f92d04143afb385f3c41ae67a2310687d4a3",
  "branch": "feat/survey-integration",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2057.7799999999797,
      "styleRecalcs": 125,
      "styleRecalcDurationMs": 19.258999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 411.87300000000005,
      "heapDeltaBytes": -1941600
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1795.548999999994,
      "styleRecalcs": 163,
      "styleRecalcDurationMs": 45.966,
      "layouts": 12,
      "layoutDurationMs": 3.133,
      "taskDurationMs": 760.972,
      "heapDeltaBytes": -2555492
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 548.2139999999731,
      "styleRecalcs": 40,
      "styleRecalcDurationMs": 12.551,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 349.22800000000007,
      "heapDeltaBytes": 8144348
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 632.0900000000051,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 15.683999999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 428.568,
      "heapDeltaBytes": -9920704
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2008.088999999984,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 23.416999999999998,
      "layouts": 1,
      "layoutDurationMs": 0.25599999999999995,
      "taskDurationMs": 382.38300000000004,
      "heapDeltaBytes": -2578340
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1738.833999999997,
      "styleRecalcs": 157,
      "styleRecalcDurationMs": 49.719,
      "layouts": 16,
      "layoutDurationMs": 4.034,
      "taskDurationMs": 729.485,
      "heapDeltaBytes": -3810900
    }
  ]
}

Copy link
Contributor

@Myestery Myestery left a comment

Choose a reason for hiding this comment

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

Should we go with config.enabled!=false or !!config.enabled?

export function useSurveyFeatureTracking(featureId: string) {
const config = getSurveyConfig(featureId)

if (!config?.enabled) {
Copy link
Contributor

Choose a reason for hiding this comment

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

useSurveyFeatureTracking treats enabled as required-true, while the rest of the survey system defaults missing enabled to true, so a survey without enabled set can render and pass eligibility but won’t record usage, potentially never reaching its threshold.

see

(config) => config.enabled !== false

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

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants