Skip to content

Surface WHOOP Bluetooth on web and differentiate cloud vs BLE - #1359

Merged
Asherlc merged 11 commits into
mainfrom
Asherlc/whoop-web-vs-bluetooth
Jun 24, 2026
Merged

Asherlc merged 11 commits into
mainfrom
Asherlc/whoop-web-vs-bluetooth

Conversation

@Asherlc

@Asherlc Asherlc commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Summary

  • Rename WHOOP providers to WHOOP (Cloud) and WHOOP (Bluetooth) so web/API sync and BLE strap data are clearly distinct.
  • Add push-only provider support via sync.providers, including last-received timestamps from ClickHouse metric stream data.
  • Surface WHOOP (Bluetooth) in web Settings and the provider detail page as a read-only, mobile-ingested source (no Connect/Sync controls).

Test plan

  • Open Settings → Data Sources and confirm WHOOP (Bluetooth) appears with iOS sync copy
  • With existing BLE metric stream data, verify "Last received" and metric stream stats on the detail page
  • Confirm WHOOP (Cloud) still connects and syncs normally
  • Run npm test -- --run packages/server/src/routers/sync.test.ts packages/providers-meta/src/push-providers.test.ts

Made with Cursor


Summary by cubic

Surface WHOOP Bluetooth on web as a mobile, push-only provider with last-received timestamps, and clearly separate it from WHOOP cloud data. Tightened server typing and error handling so ClickHouse issues don’t break sync.providers.

  • New Features

    • Added push-only providers via @dofek/providers/push-providers; sync.providers returns a standardized summary with pushOnly, authorized, description, and lastSyncedAt.
    • Implemented SyncRepository.getPushProviderLastReceived() from ingest.metric_stream; push providers are authorized when data or a last-received timestamp exists.
    • Web: treat WHOOP (Bluetooth) as read-only with “Mobile sync”/“Last received”, exclude from Sync/Sync all, hide SyncHistory, and add a mobile sync section on the detail page; share SyncProviderSummary typing across components and use server-provided push descriptions.
    • Logo aliasing via providerLogoId so whoop_ble reuses WHOOP assets on web and mobile.
  • Bug Fixes

    • Catch and log ClickHouse lookup failures (provider stats and push last-received) to Sentry, and skip queries when the sensor store isn’t configured.
    • Tightened sync.providers output typing and neutral push-provider copy; expanded tests to cover push authorization and error handling. Updated SyncProviderCard stories/tests to include description in mocks to match SyncProviderSummary.
    • CI: install Infisical CLI from GitHub releases to avoid apt-get 403s; fix type/lint/formatting issues.

Written for commit e0c2864. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added support for push-based providers in sync screens, including live status, last received time, and clearer mobile/BLE labels.
    • Updated provider logos to load the correct asset for certain provider variants.
    • Refreshed WHOOP naming to distinguish cloud and Bluetooth connections.
  • Bug Fixes

    • Improved provider syncing and authorization display for push-only sources.
    • Fixed provider details and cards so push-only items no longer show full-sync or auth prompts.

Push-only WHOOP BLE now appears in sync.providers with last-received timestamps, and the web settings/detail UI treats it as a mobile-ingested source instead of a pull sync provider.

Co-authored-by: Cursor <cursoragent@cursor.com>
Copilot AI review requested due to automatic review settings June 24, 2026 13:55
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sorry @Asherlc, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds WHOOP BLE as a mobile push-only provider: new push-providers module defines PushProviderDefinition, PUSH_PROVIDERS, and isPushProvider; SyncRepository.getPushProviderLastReceived() queries ClickHouse for the most recent ingest timestamp; syncRouter.providers merges push providers into its response; web/mobile UI renders push-only state distinctly. Also renames WHOOP labels to Cloud/Bluetooth variants, adds logo aliasing, and pins Infisical CLI to a tarball.

Changes

WHOOP BLE push provider

Layer / File(s) Summary
Push provider model and WHOOP label/logo metadata
packages/providers-meta/src/push-providers.ts, packages/providers-meta/src/push-providers.test.ts, packages/providers-meta/package.json, packages/providers-meta/src/providers.ts, packages/providers-meta/src/providers.test.ts
New push-providers module exports WHOOP_BLE_PROVIDER_ID, PushProviderDefinition, PUSH_PROVIDERS, and isPushProvider. PROVIDER_LABELS renames whoop"WHOOP (Cloud)" and whoop_ble"WHOOP (Bluetooth)". LOGO_ALIASES redirects whoop_ble to whoop for logo resolution; providerLogoId is exported. ./push-providers subpath added to package exports.
WhoopProvider rename and fetchFn injection
src/providers/whoop/provider.ts, src/providers/whoop-journal.test.ts
WhoopProvider.name changes to "WHOOP (Cloud)", scheduledSyncLookbackDays = 30 is added, and the constructor gains an optional injectable fetchFn.
WhoopBleSyncRepository uses shared constant
packages/server/src/repositories/whoop-ble-sync-repository.ts
Removes local PROVIDER_ID constant; imports and uses WHOOP_BLE_PROVIDER_ID and providerLabel from providers-meta throughout ensureProvider and insertRealtimeDataBatch.
SyncRepository.getPushProviderLastReceived
packages/server/src/repositories/sync-repository.ts, packages/server/src/repositories/sync-repository.test.ts
Exports PushProviderLastReceived interface and adds getPushProviderLastReceived() which queries max(recorded_at) per provider_id from ingest.metric_stream, short-circuiting when ClickHouse is absent or PUSH_PROVIDERS is empty. Tests cover empty-store, empty-results, row mapping, SQL shape, and error propagation.
syncRouter.providers merges push providers
packages/server/src/routers/sync.ts, packages/server/src/routers/sync.test.ts
Imports SyncRepository and PUSH_PROVIDERS; adds logProvidersQueryFailure helper; expands Promise.all to fetch provider stats and last-received timestamps with per-call catch; assembles merged registeredProviders + pushProviders array where push-provider authorized is derived from metricStream or lastReceived. Tests cover authorization derivation, error logging/continuation, and no-sensor-store skipping.
Web UI: DataSourcesPanel, SyncProviderCard, ProviderDetailPage
packages/web/src/components/DataSourcesPanel.tsx, packages/web/src/components/SyncProviderCard.tsx, packages/web/src/pages/ProviderDetailPage.tsx
DataSourcesPanel excludes pushOnly providers from sync-all and click handling. SyncProviderCard gains pushOnly prop that replaces auth indicators with "Receiving data"/"iOS app" labels, changes timestamp label to "Last received", swaps dot history for BLE status text, and hides the Full sync button. ProviderDetailPage gates Mobile sync section on pushOnly, hides sync controls and SyncHistory for push-only providers.
Logo aliasing in web and mobile ProviderLogo
packages/web/src/components/ProviderLogo.tsx, packages/web/src/components/ProviderLogo.test.tsx, packages/mobile/components/ProviderLogo.tsx, packages/server/src/routers/heart-rate.test.ts
Both ProviderLogo components import providerLogoId and use it in logoUrl() so whoop_ble resolves to the whoop PNG asset. Label test expectations updated to "WHOOP (Cloud)" / "WHOOP (Bluetooth)".
Integration test sensorStore wiring
packages/server/src/index.integration.test.ts
Adds a noopSensorStore stub implementing ActivitySensorStore and passes it to createApp to give integration tests a deterministic sensor store.

CI: Infisical CLI installation pinning

Layer / File(s) Summary
Pinned tarball install in both Infisical actions
.github/actions/export-infisical-dotenv/action.yml, .github/actions/load-infisical-secrets/action.yml
Both actions replace the setup.deb.sh + apt-get install flow with a version-pinned (0.43.76) tarball download from GitHub Releases, tar extraction, sudo install to /usr/local/bin, and temp dir cleanup.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • Asherlc/dofek#1126: Modifies SyncProviderCard.tsx sync button/action rendering, the same component this PR extends with pushOnly mode UI branches.
  • Asherlc/dofek#1303: Touches WHOOP sync window/tombstoning logic and enforces the same 30-day reconcile window that this PR adds as scheduledSyncLookbackDays = 30 on WhoopProvider.
  • Asherlc/dofek#1335: Updates src/providers/whoop/provider.ts to construct #fetchFn via createProviderRateLimitFetch("whoop", fetchFn), the same injectable fetchFn plumbing this PR introduces.

Suggested labels

area/server, area/web, area/providers, area/infra, type/feature

🚥 Pre-merge checks | ✅ 1 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Title check ⚠️ Warning The title is imperative and relevant, but it misses the required area prefix such as [web] or [server]. Prefix the title with the relevant area, e.g. [web] Surface WHOOP Bluetooth on web and differentiate cloud vs BLE.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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


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.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds first-class support for a push-only (mobile/BLE) WHOOP provider and updates labeling/logo handling to distinguish cloud vs Bluetooth variants across web, server, and shared provider metadata.

Changes:

  • Introduce PUSH_PROVIDERS metadata (e.g., whoop_ble) and surface pushOnly providers via syncRouter.providers().
  • Update web UI to treat push-only providers differently (status, no manual sync controls, different messaging).
  • Add logo aliasing (whoop_blewhoop) and rename WHOOP labels to “WHOOP (Cloud)” / “WHOOP (Bluetooth)”.

Reviewed changes

Copilot reviewed 17 out of 17 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
src/providers/whoop/provider.ts Renames WHOOP cloud provider display name.
packages/web/src/pages/ProviderDetailPage.tsx Adds push-only UI path (mobile sync panel, hides sync controls/history).
packages/web/src/components/SyncProviderCard.tsx Adds push-only rendering mode and messaging.
packages/web/src/components/ProviderLogo.tsx Uses logo ID indirection for aliased providers.
packages/web/src/components/DataSourcesPanel.tsx Excludes push-only providers from “sync all” and auth/sync flows; passes pushOnly into cards.
packages/server/src/routers/sync.ts Appends push providers to providers list; computes push “last received”.
packages/server/src/routers/sync.test.ts Updates expectations for new push provider in providers list.
packages/server/src/routers/heart-rate.test.ts Updates mocked label for whoop_ble.
packages/server/src/repositories/whoop-ble-sync-repository.ts Centralizes push provider ID/label usage for inserts and external IDs.
packages/server/src/repositories/sync-repository.ts Adds ClickHouse query to compute push provider last-received timestamps.
packages/server/src/repositories/sync-repository.test.ts Adds test coverage for getPushProviderLastReceived().
packages/providers-meta/src/push-providers.ts New shared push-provider registry and helper.
packages/providers-meta/src/push-providers.test.ts Tests push-provider registry contents and lookup.
packages/providers-meta/src/providers.ts Updates labels; adds logo aliasing + providerLogoId().
packages/providers-meta/src/providers.test.ts Updates label/logo tests for WHOOP changes.
packages/providers-meta/package.json Exports new ./push-providers entrypoint.
packages/mobile/components/ProviderLogo.tsx Uses providerLogoId() for logo URL resolution.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/web/src/components/DataSourcesPanel.tsx Outdated
Comment thread packages/web/src/pages/ProviderDetailPage.tsx Outdated
Comment thread packages/web/src/components/SyncProviderCard.tsx Outdated
Comment thread packages/server/src/routers/sync.ts Outdated
Comment thread packages/server/src/repositories/sync-repository.ts
@github-actions

github-actions Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Storybook previews for 77e3183c are ready:

This comment updates automatically on each PR push.

@github-actions

github-actions Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Mobile Preview

Scan to open on device:

QR code for dofek://preview/pr-1359

Channel pr-1359
Deep Link dofek://preview/pr-1359
Commit 77e3183

To test on device:

  1. Build and install the preview client: PREVIEW_CHANNEL=pr-1359 npx expo prebuild --clean -p ios
  2. Or tap deep link on an existing preview build: dofek://preview/pr-1359

Each PR gets its own channel. Build a preview client with PREVIEW_CHANNEL=pr-{N} to test.

Asherlc and others added 7 commits June 24, 2026 07:02
Resolve typecheck, lint, and test issues from pushOnly typing, biome formatting, banned type assertions, and updated WHOOP label expectations.

Co-authored-by: Cursor <cursoragent@cursor.com>
Catch push-provider last-received query errors and use a noop sensor store in the server integration test so sync.providers no longer returns 500 when ClickHouse is unavailable.

Co-authored-by: Cursor <cursoragent@cursor.com>
Expose push provider descriptions from sync.providers, log ClickHouse lookup failures, drop FINAL from last-received query, and dedupe relative-time formatting in the detail page.

Co-authored-by: Cursor <cursoragent@cursor.com>
Add description to all sync.providers entries so web typecheck passes, and install Infisical from GitHub releases to avoid apt-get update 403s on Microsoft repos.

Co-authored-by: Cursor <cursoragent@cursor.com>
Cover push provider authorization, ClickHouse error handling, and repository fallbacks so new WHOOP BLE logic meets the mutation score threshold.

Co-authored-by: Cursor <cursoragent@cursor.com>
Keep push-only sync history hiding while adopting the provider-scoped SyncHistory key from main.

Co-authored-by: Cursor <cursoragent@cursor.com>
Apply formatter output for chained mocks and long expect assertions.

Co-authored-by: Cursor <cursoragent@cursor.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 8

Caution

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

⚠️ Outside diff range comments (2)
src/providers/whoop-journal.test.ts (1)

134-139: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Assert the new WHOOP lookback contract here too.

This test was updated for the renamed provider, but it still leaves scheduledSyncLookbackDays = 30 unverified even though that is part of the changed public behavior.

As per coding guidelines, "When a PR touches code that lacks tests, add tests for the changed behavior — never dismiss missing coverage as pre-existing."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/providers/whoop-journal.test.ts` around lines 134 - 139, The WHOOP
provider rename test in whoop-journal.test.ts only checks id and name, but it
does not verify the changed public behavior for scheduledSyncLookbackDays.
Update the WhoopProvider test block that imports WhoopProvider and instantiates
it to also assert the new lookback contract, specifically that
scheduledSyncLookbackDays is 30, so the renamed provider test covers all changed
behavior.

Source: Coding guidelines

packages/server/src/routers/sync.ts (1)

155-233: 🗄️ Data Integrity & Integration | 🟠 Major

Add an output schema to providers()
packages/server/src/routers/sync.ts returns a mixed array of configured-provider rows and push-provider rows without .output(...); add a Zod output schema that covers both variants.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/server/src/routers/sync.ts` around lines 155 - 233, The providers()
query currently returns a mixed array of registered-provider and push-provider
objects without an explicit output contract. Add a Zod .output(...) schema on
cachedProtectedQuery(CacheTTL.SHORT).query for providers() that matches the
returned shape, using a discriminated union or shared object schema to cover
both variants. Reference the provider mapping logic in providers(), including
ProviderModel and PUSH_PROVIDERS, and ensure the schema includes all fields
returned by the final array.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/actions/export-infisical-dotenv/action.yml:
- Around line 34-40: The Infisical CLI version is still pinned to an outdated
release in the action setup, so update the version variable used by the
download/install steps in the export-infisical-dotenv action and mirror the same
pin in the load-infisical-secrets action. Make sure the version string
referenced by the curl tarball URL and install flow is bumped consistently to
the latest stable CLI release so both actions stay in sync.

In @.github/actions/load-infisical-secrets/action.yml:
- Around line 32-38: The Infisical CLI version pin is stale in the Linux install
flow, so update the version used in the action’s install script to v0.43.96 and
keep it consistent with the matching Infisical action that uses the same pinned
release. Make the change in the load-infisical-secrets action by updating the
version variable and ensure any shared install logic or sibling action that
references the same CLI download URL is bumped in lockstep.

In `@packages/providers-meta/src/providers.ts`:
- Around line 167-170: Add direct test coverage for the new providerLogoId()
alias path in providers.ts, since providerLogoType("whoop_ble") alone does not
verify the actual logo ID used by web/mobile asset lookup. Update the existing
provider logo tests to call providerLogoId() for WHOOP Bluetooth and assert it
resolves through resolveLogoId() to the expected asset stem, ensuring this path
stays covered if the alias changes.

In `@packages/server/src/repositories/sync-repository.ts`:
- Around line 198-210: The query in sync-repository.ts using
this.#providerStatsStore.query against ingest.metric_stream needs to read the
deduplicated view of the versioned table. Add FINAL to the SELECT source so
max(recorded_at) is computed from the latest row state, and keep the existing
provider_id/user_id filters and is_deleted = 0 condition in place.

In `@packages/server/src/routers/sync.test.ts`:
- Around line 615-627: The test setup for `does not query ClickHouse when sensor
store is not configured` is incomplete because the `query` spy is never passed
into `createCaller()`, so the assertion cannot detect regressions. Update this
test in `sync.test.ts` to inject the `query` mock through the same path used by
the `providers` router (via `createCaller` and any related ClickHouse/client
setup), then assert against that injected spy so the test actually observes
whether `providers()` triggers a ClickHouse query.

In `@packages/server/src/routers/sync.ts`:
- Around line 161-175: The degraded ClickHouse error handlers in sync.ts are
swallowing unexpected failures after only logging a warning. In the Promise.all
branches for repo.getProviderStats() and repo.getPushProviderLastReceived(),
update the catch callbacks to call captureException(error) before returning an
empty array, keeping the existing logProvidersQueryFailure context and ensuring
the fallback still returns the typed [] result.

In `@packages/web/src/components/ProviderLogo.test.tsx`:
- Line 24: Add a test for the new whoop_ble alias behavior in
ProviderLogo.test.tsx. The current WHOOP label assertion only covers
providerLabel("whoop"); add a case that exercises providerLogoId(provider)
through rendering whoop_ble and verifies it resolves to the same shared WHOOP
asset path as whoop. Keep the existing WHOOP label test, but extend coverage so
the new alias mapping in ProviderLogo cannot regress unnoticed.

In `@packages/web/src/components/SyncProviderCard.tsx`:
- Around line 65-68: The conditional labels in SyncProviderCard should not use
provider.authorized as a proxy for live BLE activity because it can be true for
stale data; update the pushOnly copy to neutral wording and keep freshness
information in the explicit Last received timestamp. Make the same copy change
in both affected render paths in SyncProviderCard so the UI no longer says
“Receiving data” or “Live BLE push” based only on authorized.

---

Outside diff comments:
In `@packages/server/src/routers/sync.ts`:
- Around line 155-233: The providers() query currently returns a mixed array of
registered-provider and push-provider objects without an explicit output
contract. Add a Zod .output(...) schema on
cachedProtectedQuery(CacheTTL.SHORT).query for providers() that matches the
returned shape, using a discriminated union or shared object schema to cover
both variants. Reference the provider mapping logic in providers(), including
ProviderModel and PUSH_PROVIDERS, and ensure the schema includes all fields
returned by the final array.

In `@src/providers/whoop-journal.test.ts`:
- Around line 134-139: The WHOOP provider rename test in whoop-journal.test.ts
only checks id and name, but it does not verify the changed public behavior for
scheduledSyncLookbackDays. Update the WhoopProvider test block that imports
WhoopProvider and instantiates it to also assert the new lookback contract,
specifically that scheduledSyncLookbackDays is 30, so the renamed provider test
covers all changed behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: c49c209d-6c9b-4320-a5db-8068d4d5e733

📥 Commits

Reviewing files that changed from the base of the PR and between b3588b8 and 2fe8412.

📒 Files selected for processing (22)
  • .github/actions/export-infisical-dotenv/action.yml
  • .github/actions/load-infisical-secrets/action.yml
  • packages/mobile/components/ProviderLogo.tsx
  • packages/providers-meta/package.json
  • packages/providers-meta/src/providers.test.ts
  • packages/providers-meta/src/providers.ts
  • packages/providers-meta/src/push-providers.test.ts
  • packages/providers-meta/src/push-providers.ts
  • packages/server/src/index.integration.test.ts
  • packages/server/src/repositories/sync-repository.test.ts
  • packages/server/src/repositories/sync-repository.ts
  • packages/server/src/repositories/whoop-ble-sync-repository.ts
  • packages/server/src/routers/heart-rate.test.ts
  • packages/server/src/routers/sync.test.ts
  • packages/server/src/routers/sync.ts
  • packages/web/src/components/DataSourcesPanel.tsx
  • packages/web/src/components/ProviderLogo.test.tsx
  • packages/web/src/components/ProviderLogo.tsx
  • packages/web/src/components/SyncProviderCard.tsx
  • packages/web/src/pages/ProviderDetailPage.tsx
  • src/providers/whoop-journal.test.ts
  • src/providers/whoop/provider.ts

Comment thread .github/actions/export-infisical-dotenv/action.yml Outdated
Comment thread .github/actions/load-infisical-secrets/action.yml Outdated
Comment thread packages/providers-meta/src/providers.ts
Comment thread packages/server/src/repositories/sync-repository.ts
Comment thread packages/server/src/routers/sync.test.ts Outdated
Comment thread packages/server/src/routers/sync.ts Outdated
Comment thread packages/web/src/components/ProviderLogo.test.tsx
Comment thread packages/web/src/components/SyncProviderCard.tsx Outdated
Asherlc and others added 3 commits June 24, 2026 09:47
Report degraded ClickHouse lookups to Sentry, tighten providers output typing, use neutral push-provider copy, and add missing test coverage.

Co-authored-by: Cursor <cursoragent@cursor.com>
Share SyncProviderSummary typing across web components, use server-provided push descriptions, document FINAL for ReplacingMergeTree correctness, and tighten sync router test coverage.

Co-authored-by: Cursor <cursoragent@cursor.com>
Add the required description property to provider mocks after SyncProviderSummary typing was tightened.

Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants