Skip to content

Drop legacy lineup system: tanquery-first + new playback slice across all pages#14178

Merged
dylanjeffers merged 18 commits into
mainfrom
improve-lineup-remaining
Apr 27, 2026
Merged

Drop legacy lineup system: tanquery-first + new playback slice across all pages#14178
dylanjeffers merged 18 commits into
mainfrom
improve-lineup-remaining

Conversation

@dylanjeffers
Copy link
Copy Markdown
Contributor

Summary

Replaces the legacy redux lineup stack (lineup reducers, sagas, <Lineup>/<TanQueryLineup>/<LineupProvider>, useLineupQuery, useLineupTable, LineupSagas class, lineupRegistry) with a simpler two-concept model across every page in the web + mobile apps:

  • Track ordering comes from a tanquery hook returning trackIds: ID[].
  • Queue + transport lives in a new playback slice with a single saga driving the existing audio pipeline.

Click-to-play collapses from tile → lineup.togglePlay → lineup.play → queue.play → player.play (3 sagas, 4 dispatches) down to tile → playbackActions.playFrom → saga → audio.

This PR combines the trending-only rewrite (previously #14168) with the full migration of the remaining pages into one big cleanup.

What's new

  • packages/common/src/store/playback/ — slice + selectors + saga (shadows to the legacy queue + player slices so PlayBar / NowPlaying / mobile audio screens stay working unchanged).
  • packages/web/src/components/lineup/TrackLineup.tsx + packages/mobile/src/components/lineup/TrackLineup.tsx — tanquery-first lineup components. Take trackIds: ID[] + source: string + optional querySource: { queryKey } for auto-pagination. Dispatch playbackActions.playFrom on tile tap. No redux lineup state.
  • playbackSource prop on CommentSectionProvider replaces the old lineupActions + uid pair for play-from-comment.

Pages migrated

Trending, trending-underground, trending-winners, feed, profile tracks + reposts, track page (hero + more-by + remixes + recommended), remixes page, history, search, library, collection (playlist + album), pick-winners, contest submissions, exclusive-tracks, premium-tracks (FanClub), deleted-page 'more by'. Every page-owned lineup is now tanquery-driven.

Full legacy deletion

Components deleted:

  • Web: Lineup.tsx, LineupProvider.tsx, TanQueryLineup.tsx, hooks.ts
  • Mobile: components/lineup/Lineup.tsx, TanQueryLineup.tsx, index.ts, useFavoritesLineup.ts, useFetchCollectionLineup.ts

Helpers deleted:

  • common/api/tan-query/lineups/useLineupQuery.ts
  • common/store/lineup/useLineupTable.ts
  • web/common/store/lineup/sagas.ts (LineupSagas class)
  • web/common/store/cache/collections/utils/updateCollectionPageLineup.ts + refreshCollectionPageLineup.ts

Per-page lineup state + sagas deleted for: collection, track, search-results, remixes, profile (tracks + feed), feed, history-page, library-page. All pages/*/lineup[s]/ directories in both common and web are gone. lineupRegistry is now empty.

Saga registrations removed from web + mobile root sagas: historySagas, remixesSagas, searchTracksLineupSagas, profile's feed + tracks lineup sagas, track's lineup saga, library's lineup saga, feed's lineup saga, collection's tracks lineup saga. Dashboard's retrieveUserTracks helper was inlined into its saga (was the only surviving caller).

Rewires

  • useCollectionPage + useLibraryPage — build tracks.entries from useCollection + useTracks + useUsers. Sort/reorder is now UI-owned local state (sortedOrder / customOrder). No more legacy lineup state needed for the sortable/reorderable TracksTable.
  • TrackTableLineup — now takes trackIds: ID[] + source: string; dispatches playback slice directly (desktop history + library).
  • useRemixesLineup + useTrackHistory — pure tanquery, no lineup bridge.
  • commentsContext — takes playbackSource string; playTrack dispatches playbackActions.playFrom for the current track. Both web + mobile comment drawers updated.

Compat preserved

Source tags match legacy lineup prefixes (SAVED_TRACKS, COLLECTION_TRACKS, TRACK_TRACKS, DISCOVER_FEED, PROFILE_TRACKS, etc.) so downstream consumers keying on queueSource keep working — most notably mobile AudioPlayer's offline-download check and desktop PlaylistLibrary current-track highlight.

The playback saga's shadow into legacy queue + player slices keeps PlayBar, NowPlayingDrawer, and all mobile audio screens functioning unchanged.

Test plan

  • packages/common, packages/web, packages/mobile all typecheck clean
  • Web anonymous (localhost:3002): trending, track page (hero + more-by), remixes, search, profile Tracks + Reposts, collection/playlist — all play with the correct source and queue length
  • Web authenticated (@DuranDylan): feed (DISCOVER_FEED), library/tracks (SAVED_TRACKS), history (HISTORY_TRACKS) — row click dispatches playFrom, playback + player slices stay synced, real artist names render (no "Unknown")
  • iOS Simulator (iPhone 17 Pro): trending tile play + next, library Tracks row play, library Albums → collection screen Play, feed tile play, track screen hero Play — all with real audio, PlayBar updates, and state synced across screens
  • Two bugs found and fixed during testing: useCollectionPage + useLibraryPage were missing useUsers() + user attachment on each entry (TQTrack omits the user field). Both fixed via parallel useUsers(ownerIds) + skipping entries whose user hasn't loaded yet.
  • Reviewer: smoke test on your own stage/prod to confirm end-to-end playback and that nothing else regressed.

Scope

Touched: 251 files, +4724 / -11612.

🤖 Generated with Claude Code

dylanjeffers and others added 10 commits April 24, 2026 10:41
Replaces the legacy lineup/queue/player-coupled flow for the trending page
with a simpler two-concept model: tanquery hooks own track ordering, and a
single playback slice owns the queue + transport. On tile tap the trending
page dispatches playbackActions.playFrom({ tracks, startIndex, querySource })
and a new saga drives the existing audio pipeline.

Added:
- packages/common/src/store/playback/ (slice, selectors, saga, tests)
- packages/web/src/components/lineup/TrackLineup.tsx — tanquery-first
  replacement for <Lineup>/<TanQueryLineup>, takes trackIds + source
- packages/mobile/src/components/lineup/TrackLineup.tsx — RN equivalent

Simplified:
- useTrending now returns { trackIds, hasNextPage, loadNextPage, queryKey,
  ... }; dropped the useLineupQuery wrapper + legacy lineup dispatches.

Migrated:
- Trending web (desktop + mobile) and mobile trending screens to use the
  new hook + TrackLineup.

Deleted:
- packages/common/src/store/pages/trending/lineup/ (actions, reducer,
  selectors)
- packages/web/src/common/store/pages/trending/ (lineup sagas)
- packages/web/src/pages/trending-page/hooks/ (6 hooks replaced by inlined
  query logic) + selectors.ts + providerTypes.ts
- Legacy lineup-reset calls from mobile trending filter drawers and header
- Registry, reducer, pages/index, and both web/mobile store sagas.ts entries

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Same pattern as the trending PR: simplify useTrendingUnderground to return
clean tanquery state, point web desktop + mobile trending pages and the
mobile TrendingUndergroundLineup at <TrackLineup>, delete the legacy
per-page lineup/slice/saga + registry/reducer/index entries.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… history, search, pick-winners, contest, exclusive-tracks
…, exclusive-tracks) + stripdead dispatches from feed/profile/search
…eupQuery, useLineupTable, per-page lineup actions/reducers/sagas + rewire library, collection, track, history, remixes, search, profile, feed, dashboard consumers to tanquery + playback slice
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 24, 2026

⚠️ No Changeset found

Latest commit: 1aea18e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Conflict resolutions:
- useLineupQuery.ts: kept delete (HEAD) \u2014 helper removed in lineup migration
- ProfilePage.tsx: merged imports to include both useMemo (HEAD) and useRef (main)
Both pre-existing on main (PR #14163) but blocking CI on this branch.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 25, 2026

🌐 Web preview ready

Preview URL: https://audius-web-preview-pr-14178.audius.workers.dev

Unique preview for this PR (deployed from this branch).
Workflow run

dylanjeffers and others added 3 commits April 27, 2026 15:14
Mirror queueActions.shuffle / queueActions.repeat into the playback slice
in the playback saga so that when the audio element's onEnd callback
fires playbackActions.next (set during the initial playFrom), the
playback slice's reducer correctly honors the user's shuffle/repeat
selection.

Before this fix only the next/previous buttons honored shuffle (because
they dispatch queueActions.next which goes through the legacy queue
saga). Natural track-end silently advanced linearly because the playback
slice's own shuffle state was never set — the PlayBar UI dispatches
queueActions.shuffle, not playbackActions.setShuffle.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…aded

The ShuffleButton restores shuffleState=ON from localStorage on mount,
which dispatches queue/shuffle against an empty queue. The legacy queue's
shuffle reducer only generates shuffleOrder when state.order.length > 0,
so shuffleOrder remained empty even after tracks were later loaded via
queue.add (which by design does not regenerate shuffleOrder).

Result: clicking next caused the legacy queue's next reducer to overshoot
immediately (shuffleIndex+1 >= shuffleOrder.length=0), the watchNext saga
saw overshot=true and reset+paused the player.

Fix: in shadowToLegacyQueue, after adding entries, re-toggle shuffle if
the queue is currently in shuffle mode so the legacy queue regenerates
its shuffleOrder against the now-populated order.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The playback slice's next reducer didn't honor RepeatMode.SINGLE, so
when the audio element ended and fired playbackActions.next (the onEnd
set by the playback saga's playCurrent), playback advanced linearly
instead of replaying the same track.

Also: with repeat=OFF at end of queue, the saga's watchNext
unconditionally called playCurrent, which restarted the last track
instead of stopping playback.

Fix:
- Honor RepeatMode.SINGLE && !skip in the playback next reducer (skip=true
  from the next button still advances, matching legacy queue semantics).
- Add overshot/undershot flags to PlaybackState, set by next/previous
  when at end/start of queue without a wrap. Cleared on
  playFrom / playTrackAt / any successful advance.
- Saga's watchNext / watchPrevious read overshot/undershot and dispatch
  playerActions.reset({shouldAutoplay: false}) instead of replaying.

Verified on localhost:3002:
- repeat=SINGLE natural end → same track replays (was: advanced).
- repeat=ALL at end → wraps to index 0 (already worked, confirmed).
- repeat=OFF at end → player resets and pauses (was: last track restarted).
- Next button (skip=true) with repeat=SINGLE still advances.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@socket-security
Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addednpm/​@​babel/​plugin-proposal-class-static-block@​7.21.01001007150100
Addednpm/​@​certusone/​wormhole-sdk@​0.1.18110010050100
Addednpm/​@​esbuild-plugins/​node-globals-polyfill@​0.2.31001007180100
Updatednpm/​@​babel/​preset-typescript@​7.28.5 ⏵ 7.22.151001007290100
Addednpm/​@​babel/​register@​7.7.0991007390100
Updatednpm/​@​babel/​plugin-transform-runtime@​7.29.0 ⏵ 7.18.29910074 +191100
Addednpm/​@​emotion/​server@​11.11.01001007584100
Updatednpm/​@​babel/​helper-compilation-targets@​7.28.6 ⏵ 7.27.1100 +110075 +192 +2100
Addednpm/​@​audius/​fetch-nft@​0.2.8751009984100
Addednpm/​@​babel/​plugin-transform-react-jsx@​7.21.01001007690100
Addednpm/​@​babel/​template@​7.27.11001007690100
Addednpm/​@​babel/​cli@​7.7.0991007691100
Addednpm/​@​audius/​hedgehog@​3.0.0-alpha.1761009483100
Addednpm/​@​ethersproject/​solidity@​5.0.51001007780100
Addednpm/​@​babel/​preset-env@​7.22.15961007792100
Addednpm/​@​atlaskit/​pragmatic-drag-and-drop@​1.7.71001007786100
Addednpm/​@​audius/​stems@​0.3.10771009384100
Updatednpm/​@​babel/​helper-module-transforms@​7.28.6 ⏵ 7.27.1100 +110077 +191100
Addednpm/​@​babel/​parser@​7.27.1991007793100
Addednpm/​@​babel/​compat-data@​7.27.11001007893100
Addednpm/​@​coral-xyz/​anchor@​0.29.0931007883100
Updatednpm/​@​babel/​runtime@​7.28.6 ⏵ 7.18.310099 -17992100
Addednpm/​@​babel/​generator@​7.27.11001007991100
Addednpm/​@​babel/​traverse@​7.27.11001007992100
Updatednpm/​@​babel/​helpers@​7.28.6 ⏵ 7.27.199 +11008092100
Updatednpm/​@​babel/​core@​7.29.0 ⏵ 7.23.798 +11008092100
Addednpm/​@​elastic/​elasticsearch@​8.1.0991001009880
Addednpm/​@​babel/​types@​7.27.1981008192100
Addednpm/​@​emotion/​styled@​11.14.01001008285100
Addednpm/​@​cloudflare/​kv-asset-handler@​0.3.110010010082100
Addednpm/​@​bravemobile/​react-native-code-push@​12.3.28210010092100
Addednpm/​@​apollo/​client@​3.3.7931008299100
See 12 more rows in the dashboard

View full report

@socket-security
Copy link
Copy Markdown

Caution

Review the following alerts detected in dependencies.

According to your organization's Security Policy, you must resolve all "Block" alerts before proceeding. It is recommended to resolve "Warn" alerts too. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Block Low
Potential code anomaly (AI signal): npm @amplitude/session-replay-browser is 100.0% likely to have a medium risk anomaly

Notes: This is a session-replay / DOM-capture library that intentionally collects detailed page state (DOM, canvas bitmaps, user interactions), persists them locally, compresses, and sends them to Amplitude session-replay endpoints. The behavior is expected for such SDKs. The primary security concern is privacy/data exfiltration: if misconfigured or used without user consent, the library can capture sensitive inputs and page content. No evidence of traditional malware (reverse shell, arbitrary remote code execution, eval-based payloads) was found in the provided fragment. Recommendations: only use from trusted package sources, ensure masking/ignore selectors are tightly configured (especially for inputs and sensitive CSS selectors), review remote config behavior (it fetches sampling/privacy config), consider privacy/legal implications (consent), and monitor network endpoints and API keys.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@amplitude/plugin-session-replay-browser@1.8.2npm/@amplitude/session-replay-browser@1.15.1

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@amplitude/session-replay-browser@1.15.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @ampproject/remapping is 100.0% likely to have a medium risk anomaly

Notes: The code implements a standard SourceMap remapping mechanism. There is no inherent malicious behavior or backdoor within the shown fragment. The only potential risk lies in the use of the user-supplied loader callback, which could be misused by a project integrating this library. If the loader is trusted and sandboxed, the code poses no evident security threats. Overall, the security risk is moderate due to loader trust requirements.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@babel/core@7.23.7npm/@ampproject/remapping@2.2.1

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@ampproject/remapping@2.2.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @ampproject/remapping is 100.0% likely to have a medium risk anomaly

Notes: The code is a conventional, loader-driven Source Map remapping utility. It exhibits a legitimate trust boundary at the loader. No intrinsic malware present; security concerns hinge on loader trust and content exposure. Recommend reviewing loader implementations and ensuring options properly redact or restrict sourcesContent when distributing SourceMaps.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@babel/core@7.23.7npm/@ampproject/remapping@2.2.1

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@ampproject/remapping@2.2.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @apollo/protobufjs is 100.0% likely to have a medium risk anomaly

Notes: The analyzed code segment is a standard RPC service wrapper (protobufjs style) with conventional input validation, encoding/decoding, event emission, and end handling. No malicious behavior is evident, and there are no observable security vulnerabilities beyond ordinary library-level error handling. It does not exhibit data exfiltration, backdoors, or other anti-security patterns.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@apollo/protobufjs@1.2.7

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@apollo/protobufjs@1.2.7. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @audius/hedgehog is 100.0% likely to have a medium risk anomaly

Notes: The source code contains hardcoded sensitive credentials and cryptographic material that are directly exported, posing a high security risk if used in production or published publicly. There is no evidence of malware or obfuscation, but the insecure practice of embedding plaintext passwords and keys in source code can lead to credential leakage and compromise. It is strongly recommended to remove hardcoded secrets, implement secure credential management, and restrict exposure of sensitive data.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@audius/hedgehog@3.0.0-alpha.1

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@audius/hedgehog@3.0.0-alpha.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @babel/core is 100.0% likely to have a medium risk anomaly

Notes: The analyzed code fragment is a standard Babel core error handling and code-frame rendering utility. It reads internal node and code data to produce informative errors but does not perform any suspicious network activity, data exfiltration, or backdoor behavior. The observed behavior is typical for a compiler/transpiler component and, in this isolated context, does not indicate malicious activity.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@babel/core@7.23.7

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@babel/core@7.23.7. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @babel/core is 100.0% likely to have a medium risk anomaly

Notes: The analyzed fragment implements a conventional file transformation entry point with no evident malicious behavior or hard-coded secrets. Security concerns depend on the downstream transformation logic (run) and configuration loading (loadConfig). The code maintains safe control flow (null config handling) and avoids arbitrary code execution within this scope.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@babel/core@7.23.7

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@babel/core@7.23.7. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @babel/helper-module-transforms is 100.0% likely to have a medium risk anomaly

Notes: The code is a legitimate, static-code transformation utility used in Babel to ensure proper behavior of ES module bindings after transforms. There is no evidence of malicious behavior, data leakage, or external communications within this fragment. It operates purely on AST-level transformations consistent with module import/export handling.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@babel/helper-module-transforms@7.27.1

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@babel/helper-module-transforms@7.27.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @babel/helpers is 100.0% likely to have a medium risk anomaly

Notes: The analyzed fragment is a conventional Babel/TypeScript-style decorators runtime (applyDecs) responsible for applying decorators to class members and managing metadata and initializers. There is no evidence of malware, backdoors, or external data leakage within this module. While complex, the code behaves as a metadata-driven decorator processor and should be considered low risk when used as intended. Downstream risks depend on the decorators provided by consumers, not this utility itself.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@babel/helpers@7.27.1

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@babel/helpers@7.27.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @babel/plugin-syntax-typescript is 100.0% likely to have a medium risk anomaly

Notes: The code is a standard Babel plugin fragment that configures syntax support for TypeScript by manipulating parser plugins. There is no malicious logic, no data exfiltration, and no unsafe operations. It appears to be a legitimate helper for enabling TypeScript syntax in Babel pipelines.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@babel/preset-typescript@7.22.15npm/@babel/plugin-syntax-typescript@7.27.1

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@babel/plugin-syntax-typescript@7.27.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @babel/runtime is 100.0% likely to have a medium risk anomaly

Notes: The module implements a legitimate Babel runtime polyfill for named capture groups, using established patterns (WeakMap, prototype inheritance, lazy initialization) to augment RegExp results and substitutions. No evidence of malicious activity, data leakage, or external communication. Overall security risk is low but the code warrants standard review for potential debugging complexity due to prototype and factory redefinition.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@babel/runtime@7.18.3

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@babel/runtime@7.18.3. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @babel/runtime is 100.0% likely to have a medium risk anomaly

Notes: Selected report 1 provides a thorough evaluation of decorator-related runtime utilities and concludes low risk with potential for finishers to alter constructors if used with untrusted inputs. The improved assessment confirms normal, expected behavior for Babel decorator infrastructure and notes that the primary risk lies in the finishers channel if untrusted code is supplied. Security risk remains low to moderate depending on input provenance; malware likelihood is negligible based on the fragment.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@changesets/cli@2.27.1npm/@babel/runtime@7.24.0

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@babel/runtime@7.24.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @bravemobile/react-native-code-push is 75.0% likely to have a medium risk anomaly

Notes: The fragment represents a standard, legitimate OTA update mechanism for React Native, with normal update orchestration, user prompts, retry/rollback, and status reporting. There is no obvious malicious behavior or backdoor within this code fragment. The main security considerations relate to the integrity and authenticity of updates, secure transport, and the security of the native bridge implementation. Overall risk is moderate due to remote updates, but not due to internal malicious code in this snippet.

Confidence: 0.75

Severity: 0.55

From: package-lock.jsonnpm/@bravemobile/react-native-code-push@12.3.2

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@bravemobile/react-native-code-push@12.3.2. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @certusone/wormhole-sdk is 100.0% likely to have a medium risk anomaly

Notes: The analyzed code is a standard, autogenerated ethers.js ContractFactory for an NFTBridge contract. No malicious behavior detected within this fragment. Security posture is typical for library code; risk depends on the on-chain contract and provider configuration, not this loader.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@certusone/wormhole-sdk@0.1.1

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@certusone/wormhole-sdk@0.1.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @clack/prompts is 100.0% likely to have a medium risk anomaly

Notes: The code fragment appears to be a part of a larger project related to CLI interactions and logging. The heavy obfuscation, incomplete functions, and potential untrusted input handling raise concerns about its security and reliability.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@clack/prompts@0.7.0

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@clack/prompts@0.7.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @emnapi/runtime is 100.0% likely to have a medium risk anomaly

Notes: Overall, this code fragment is a standard and legitimate binding/runtime infrastructure for Node.js native addon interoperability (EMNAPI). There is no evidence of data exfiltration, remote control, backdoors, or malware behavior within this snippet. The primary security considerations relate to the complexity and correct handling of finalizers, weak references, and policy-driven warning paths; misconfiguration or misuse by host applications could introduce risk, but the code itself does not demonstrate malicious activity.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@emnapi/runtime@1.5.0

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@emnapi/runtime@1.5.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @emotion/cache is 100.0% likely to have a medium risk anomaly

Notes: The analyzed fragment is a legitimate part of Emotion’s CSS-in-JS cache that manages hydration of server-rendered styles and style insertion. It does not exhibit malicious behavior or supply chain exploits within this snippet. The security risk is low to moderate (primarily DOM manipulation, which is expected for a UI library), with no evident data leakage or external communications.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@emotion/css@11.13.5npm/@emotion/react@11.14.0npm/@emotion/cache@11.14.0

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@emotion/cache@11.14.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm @emotion/styled is 100.0% likely to have a medium risk anomaly

Notes: Overall, this is a standard, non-malicious portion of the Emotion styling library. No evidence of backdoors, credential theft, or external network/data exfiltration. The primary risk vector is the CSS-in-DOM injection path via dangerouslySetInnerHTML, which is expected but should be reviewed in the context of trusted inputs. Security posture is low-to-moderate; no immediate danger, but maintain caution with user-supplied template literals and ensure dependencies are trusted.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/@emotion/styled@11.14.0

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@emotion/styled@11.14.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm axios is 100.0% likely to have a medium risk anomaly

Notes: The code appears to be a standard, well-scoped progress-event utility used to report progress (upload/download) to a consumer listener. It reads input from the event object and computes metrics, then forwards a structured payload to a listener. A minor data exposure risk exists due to passing the raw event object to the listener; mitigations include sanitizing the payload or removing the event object before emission. Overall security risk remains modest, with malware likelihood negligible in this isolated module.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/axios@1.7.4

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/axios@1.7.4. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm axios is 100.0% likely to have a medium risk anomaly

Notes: The code is a legitimate, self-contained throttling transformer designed for Axios-like streaming workflows. It throttles data output based on maxRate and timeWindow, preserves data integrity by splitting chunks when necessary, and emits optional progress telemetry. No malicious activity or data leakage is detected in this fragment. Security risk remains moderate due to throttling complexity and potential misconfiguration in real deployments, but the module itself does not introduce obvious security flaws.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/axios@1.7.4

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/axios@1.7.4. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm cacache is 100.0% likely to have a medium risk anomaly

Notes: The analyzed code is a straightforward content-cache retrieval and streaming utility. It reads from a cache using an index, supports digest-based access, and optionally memoizes results. There is no evidence of malicious behavior, data exfiltration, backdoors, or external network activity within this module. The security risk appears low, assuming the surrounding system properly manages cache integrity and does not expose untrusted cache contents without validation.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/cacache@18.0.4

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/cacache@18.0.4. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Block Low
Potential code anomaly (AI signal): npm commander is 100.0% likely to have a medium risk anomaly

Notes: The code represents a standard Commander-like CLI framework with dynamic subcommand execution via spawning local executables. It is not inherently malicious, but the external-executable dispatch mechanism introduces a legitimate supply-chain risk: untrusted or misconfigured subcommands can execute arbitrary local code. Recommend tightening executable discovery (absolute trusted paths only, explicit allowlists), validating subcommand targets before spawning, and ensuring regular security reviews of any projects using this pattern.

Confidence: 1.00

Severity: 0.60

From: package-lock.jsonnpm/commander@5.1.0

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/commander@5.1.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

See 12 more rows in the dashboard

View full report

@dylanjeffers dylanjeffers merged commit 001955c into main Apr 27, 2026
25 of 26 checks passed
dylanjeffers added a commit that referenced this pull request Apr 28, 2026
## Summary

- Deletes the legacy `queue` and `player` slices and folds everything
into a single `playback` slice
- Combines the old `web/common/store/queue/sagas.ts` (494 lines) +
`web/common/store/player/sagas.ts` (~570 lines) into one
`web/common/store/playback/sagas.ts`
- Rewires ~70 consumers from
`queueActions/queueSelectors/playerActions/playerSelectors` →
`playbackActions/playbackSelectors`

The previous PR (#14178) introduced `playback` that *shadowed* `queue`
and `player` for compat. This finishes the job — `playback` becomes the
single source of truth for queue, transport, and audio-engine state. Two
slices for one concern was exactly the legacy complexity we wanted gone;
the new design replaces a saga whose only job was keeping them in sync.

## What's gone

- `packages/common/src/store/queue/` (slice + selectors + types + tests)
- `packages/common/src/store/player/` (slice + selectors + types + utils
+ sagas)
- `packages/web/src/common/store/queue/sagas.ts`
- `packages/web/src/common/store/player/sagas.ts` + `errorSagas.ts`
- `state.queue` and `state.player` from the root reducer + types

## What's new — `packages/common/src/store/playback/`

- **`slice.ts`** — owns the queue (`PlaybackTrack[]`), index,
`playingUid`/`playingTrackId`, `playing`/`buffering`/`previewing`,
`seek`/`seekCounter`/`counter`, `playbackRate`,
`repeat`/`shuffle`/`shuffleOrder`/`shuffleIndex`, `querySource`,
`retries`, `overshot`/`undershot`. New actions: `set`, `setIndex`,
`play({uid})`-style, `addToQueue`/`removeByUid`/`reorder`,
`setPlayingState`, `playSucceeded`, `reset`/`resetSucceeded`,
`incrementCounter`, `error`, `queueAutoplay`.
- **`selectors.ts`** — `getCurrentPlaybackTrack`, `getCurrentTrackId`,
`getCurrentSource`, `getCurrentEntryUid`, `getCurrentPlayerBehavior`,
`getCollectionId`, `makeGetCurrent`, `getOrder` (Queueable adapter for
the mobile `AudioPlayer`),
`getUid`/`getTrackId`/`getPlaying`/`getBuffering`/`getCounter`/`getPlaybackRate`/`getSeek`/etc.
- **`types.ts`** — owns `PlaybackTrack`, `PlaybackQuerySource`,
`PlaybackState`, plus the formerly-queue/player types (`QueueSource`,
`Queueable`, `QueueItem`, `RepeatMode`, `PlayerBehavior`,
`PlaybackRate`).

## Web-side engine — `packages/web/src/common/store/playback/sagas.ts`

Combines the old player + queue sagas into one. Handles audio loading
via the `audioPlayer` service (HTML on web, RNTrackPlayer shim on
mobile), cascading mirror retries, audio-element listener bridge,
buffering / error channels, listen counting, queue-driven `playCurrent`
on `playFrom`/`playTrackAt`/`next`/`previous`/`togglePlay`,
skip-deleted/owner-deactivated/locked tracks, `queueAutoplay`
(genre-based recommendation append), `PLAYBACK_PLAY` analytics, cache
subscribe on enqueue, and pagination via `querySource.queryKey`.

## Migration

~70 consumer files updated. Action-name renames the new shape requires:

| Legacy | New |
|---|---|
| `queueActions.add({entries})` | `playbackActions.addToQueue({tracks:
PlaybackTrack[]})` |
| `queueActions.clear` | `playbackActions.clearQueue` |
| `queueActions.remove({uid})` | `playbackActions.removeByUid({uid})` |
| `queueActions.repeat`/`shuffle` |
`playbackActions.setRepeat`/`setShuffle` |
| `queueActions.updateIndex` | `playbackActions.setIndex` |
| `playerActions.seek` | `playbackActions.seekTo` |
| `playerActions.incrementCount` | `playbackActions.incrementCounter` |
| `playerSelectors.getUid` | `playbackSelectors.getUid` |
| `queueSelectors.getSource` | `playbackSelectors.getCurrentSource` |
| `queueSelectors.getPlayerBehavior` |
`playbackSelectors.getCurrentPlayerBehavior` |

`PlaybackTrack.legacyUid` field renamed to `uid`.

## Compat preserved

`PlaybackTrack.uid` matches what the rendered tile uses, so
tile-highlight comparisons (`playingUid === entry.uid`) and the desktop
`PlaylistLibrary` "currently playing source" highlight keep working. The
mobile `AudioPlayer` reads from a `getOrder` Queueable adapter on top of
`playback.queue`, so RNTrackPlayer keeps driving exactly as before.

## Test plan

- [x] `packages/common`, `packages/web`, `packages/mobile` typecheck
clean
- [x] **Web (localhost:3002, @DuranDylan)**: Trending tile play → audio
loads, PlayBar populates, tile speaker icon lights up. Next button
advances, previous button returns. Library/SAVED_TRACKS row click loads
+ plays with the correct source. Pause / resume flips engine state. No
console errors.
- [x] **iOS Simulator (iPhone 17 Pro)**: Trending tile play →
mini-player + NowPlayingDrawer populate, position counter advances (0:13
→ 0:37 → 1:01 with real audio). Next loads new track. Pause freezes
position; resume advances. Shuffle button toggled to active (purple).
Repeat button cycled state.
- [ ] Reviewer: smoke test on your own stage/prod to confirm end-to-end
playback and that nothing else regressed.

## Scope

Touched: **100 files, +4014 / −3280.**

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dylanjeffers added a commit that referenced this pull request May 26, 2026
lineupForRoute.js destructured selectors (getDiscoverFeedLineup,
getHistoryTracksLineup, etc.) that the legacy-lineup migration in
#14178 deleted, so every branch returned undefined — and nothing read
the resulting context field anyway. The build only stayed green
because feedPageSelectors still existed as an empty namespace; this
PR's removal of the feed-page redux slice made rollup catch the
missing export.

- delete packages/web/src/store/lineup/lineupForRoute.js
- remove the import + assignment in packages/web/src/store/storeContext.ts
- drop the optional getLineupSelectorForRoute field (and now-unused
  Location/LineupState/Track/CommonState imports) from
  packages/common/src/store/storeContext.ts

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant