fix: resolve all 17 lint warnings across the codebase#13
Open
fix: resolve all 17 lint warnings across the codebase#13
Conversation
- Add per-provider model options, defaults, and slug aliases - Add provider-aware model normalization/resolution helpers - Preserve Codex-only constants/functions for backward compatibility - Extend tests to cover Claude aliases and provider-specific fallback behavior
- introduce `ClaudeCodeAdapter` service and live layer wiring - map runtime/session/request failures into provider adapter error types - add coverage for validation, session-not-found mapping, lifecycle forwarding, and event passthrough
Add provider-service routing coverage for explicit claudeCode sessions. Co-authored-by: codex <codex@users.noreply.github.com>
Add restart semantics when requested provider changes and cover with tests. Co-authored-by: codex <codex@users.noreply.github.com>
Add provider-aware model options and include provider in turn-start dispatch. Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
- add `@anthropic-ai/claude-agent-sdk` dependency for `apps/server` - replace placeholder Claude adapter with live session/query/event handling - add comprehensive adapter tests for runtime events, approvals, resume, rollback, and model overrides
- Replace manual prompt async iterator with `Stream.fromQueue(...).toAsyncIterable` - Use `Ref` for shared session context in tool approval callbacks - Simplify timestamp/ID generation and close sessions via queue shutdown
- Stop synthesizing `resume` from generated thread IDs - Persist resume session ID from query messages when available - Validate resume/sessionId values as UUIDs before reuse - Add tests for valid UUID resume passthrough and no synthesized resume
Co-authored-by: codex <codex@users.noreply.github.com>
- Do not pass `resumeCursor` when restarting a session after changing providers - Treat synthetic Claude thread IDs (`claude-thread-*`) as unscoped during runtime ingestion - Add tests covering provider-switch restart behavior and Claude turn lifecycle acceptance
Co-authored-by: codex <codex@users.noreply.github.com>
- Preserve active turn state when `session.started`/`thread.started` arrive mid-turn - Emit `message.delta` from assistant text when stream deltas are missing, then complete the message - Add Claude native SDK NDJSON observability logging and wire its log path in server layers - Expand ingestion/adapter tests to cover mid-turn lifecycle and delta fallback behavior
- Default Claude sessions to bypass permissions when approval policy is `never`, while preserving explicit `permissionMode` - Hide/send reasoning effort only for providers that support it in ChatView - Add coverage for Claude permission-mode derivation and precedence, and update runtime event model docs
- add per-session `sessionSequence` on provider runtime events and persist activity `sequence` - migrate `projection_thread_activities` with nullable `sequence` column + index - sort server/web activity projections by sequence fallback to timestamp/id - allow provider sessions/turns to start before a real threadId is emitted
- define `CursorAdapter` service contract and Cursor stream-json schema types - add `CursorCliStreamEvent` decoding tests for system/thinking/tool/result/retry events - add implementation plan for Cursor provider integration Co-authored-by: codex <codex@users.noreply.github.com>
- Accept `cursor` as a first-class provider in orchestration, persistence, and session directory flows - Update model/provider inference and normalization to handle Cursor model aliases - Revamp chat provider/model picker with Cursor-specific trait controls and add coverage in tests
- add `scripts/cursor-acp-probe.mjs` to run ACP protocol probing scenarios - update `package.json` scripts for probe execution - include generated probe summaries/transcripts under `.tmp/acp-probe/`
* feat: standalone PR review with auto-clone and worktree isolation
Add a standalone "Review PR" button in the sidebar Projects header that
accepts any GitHub PR URL, matches it to an existing project or clones
the repo automatically, then creates an isolated review worktree with
proper upstream tracking.
- Add git.cloneRepo endpoint (contracts, server, client bindings)
- Add git.setBranchUpstream endpoint for linking review branches to PRs
- Add projectsWorkingDirectory app setting with Settings UI
- Add StandaloneReviewPrDialog: full review flow (clone → fetch PR →
create worktree → set upstream → create thread → navigate)
- Extract shared PR review utils to apps/web/src/lib/prReviewUtils.ts
- Extract gitRemoteOriginToGitHubUrl to @t3tools/shared/git
- Remove per-project "Review PR" buttons/context menu in favor of the
unified standalone flow
- Fix removeWorktree to skip gracefully when worktree is already deleted
- Fix setBranchUpstream to fall back to git config when remote ref is
not yet fetched locally
* feat: review comment system with inline diff display and GitHub publish
Add structured review comments for PR reviews: server-side CRUD storage,
WS endpoints, inline rendering below file diffs, and GitHub publish.
- Add ReviewComment contracts (schemas, WS methods, NativeApi bindings)
- Add SQLite persistence (migration 016, repository service + layer)
- Add 5 WS routes: reviewComment.add/update/delete/list/publish
- Add DiffFileReviewComments component with severity-colored cards
- Integrate review comments below each file in DiffPanel
- Enhance review prompt with structured comment tool instructions
- Add reviewCommentTools.ts MCP server (prepared for Claude SDK wiring)
- Publish to GitHub creates individual PR review comments via gh api
The MCP tool server is created but not yet wired into the Claude Code
adapter query options (TODO: resolve Effect ServiceMap test injection).
Until then, the agent uses prompt-based review comment instructions.
* fix: wire review comment MCP tools into Claude Code adapter
Pass the ReviewCommentRepository to the Claude Code adapter via options
so createReviewCommentMcpServer() is called with a real repository.
The adapter registers review_comment, update_review_comment, and
list_review_comments as MCP tools available to the agent during queries.
* fix: register review_comments migration in static loader
The migration file existed but wasn't imported in Migrations.ts,
so the table was never created on startup.
* fix: wire review comments query into DiffPanel
Fetch review comments for the active thread and pass the
reviewCommentsByFile map to all DiffFileListView instances so
comments actually render below each file's diff.
* fix: make review comments visible in diff panel
- Add 3s refetchInterval to review comments query so comments appear
automatically after the agent creates them (no window refocus needed)
- Add standalone review comments summary section at top of diff view
showing all comments regardless of file path matching
- Normalize file paths for comment-to-diff matching (strip ./ and a/b/)
- Clean up unused ReviewCommentRepository import
* fix: remove duplicate review comments summary, keep only per-file inline
* feat: render review comments inline in diff via @pierre/diffs annotations
Use the library's native `lineAnnotations` + `renderAnnotation` props
to render review comment cards directly at the annotated line in the
diff, instead of as a separate section below the file. Comments now
appear inline like GitHub PR conversations.
* feat: show annotated code context for all review comments in diff
- Add projects.readFile WS endpoint with git-root fallback for path
resolution (handles monorepo subdirectory CWDs)
- For files not in the diff: fetch file content, generate synthetic
context-only hunks (±10 lines per comment cluster), render with
@pierre/diffs FileDiff + inline annotations; collapsible headers
- For diff files with comments on non-diff lines: append synthetic
context hunks below the actual diff showing the referenced code
- Add comment count badge to all diff file headers
- Multi-line comments (L103-104) now render after the last line
- Show review comments in all diff views (turns, working tree, branch)
even when there are no code changes
* refactor: generalize review comment annotations and fix code quality issues
- Always register review_comment/update_review_comment/list_review_comments
MCP tools for every Claude Code session (not just standalone PR reviews),
so inline diff annotations work in any agent session
- Fix reviewCommentTools.ts: replace dynamic require("effect") anti-pattern
with static import and direct Effect.runPromise(); type threadId as ThreadId
- Fix wsServer.ts projectsReadFile: replace blocking execSync with
Effect-based git.getRepoRoot() to avoid stalling the event loop
- Fix wsServer.ts reviewCommentPublish: remove dead Effect.ignore'd review
creation block; resolve actual HEAD SHA via git.resolveRef() instead of
passing literal "HEAD" to GitHub API (would have caused 422 errors)
- Add GitCore.getRepoRoot() and GitCore.resolveRef() methods
- Extract duplicated range-merge/hunk-build algorithm from DiffPanel into
buildSyntheticContextPatch() in prReviewUtils.ts
- Smart polling: reviewCommentListQueryOptions now accepts refetchInterval
param; DiffPanel polls at 2s only while the agent is actively running,
stops when idle (previously polled unconditionally every 3s)
* refactor: extract unified diff annotation pipeline from DiffPanel
Replace the review-comment-specific annotation rendering with a generic,
extensible pipeline so any annotation kind (review comments, lint warnings,
AI suggestions, …) can overlay diffs through the same plumbing.
- Add `diffAnnotations.ts` — DiffAnnotation discriminated union, path
normalization, grouping, and @pierre/diffs line-annotation builders
- Add `DiffAnnotationCards.tsx` — kind-dispatched render callback
(replaces `DiffFileReviewComments.tsx`)
- Add `DiffFileHeader.tsx` — shared collapsible file header with
annotation badge and diff stats
- Add `AnnotatedFileDiff.tsx` — unified component replacing both
`AnnotatedFileContextView` and `UnmatchedCommentsContextView` via a
shared `useSyntheticFileDiff` hook
- Simplify `DiffFileListView` props: `annotationsByFile` replaces
`reviewCommentsByFile` + `activeCwd` + `projectCwd`
- DiffPanel converts review comments → DiffAnnotation[] at the boundary
DiffPanel shrinks from 1252 → 1019 lines; duplicated file-content
fetching and synthetic-patch logic is eliminated.
* refactor: decouple annotation pipeline from DiffPanel into reusable primitives
Extract the unified diff annotation pipeline into standalone, composable
modules so any diff view can render annotations without touching DiffPanel.
- Add DiffFileList.tsx: standalone annotation-aware diff file list that
any view (checkpoint turns, working tree, branch diff, approval) can
import directly. Annotations are first-class, not optional bolt-ons.
- Add useDiffAnnotations hook: aggregates all annotation sources (review
comments today, lint/AI suggestions tomorrow) behind a single
source-agnostic DiffAnnotation[] return. DiffPanel no longer imports
review-comment-specific query options or conversion helpers.
- Move buildSyntheticContextPatch from prReviewUtils.ts (PR-review-
specific) to diffAnnotations.ts (generic diff infrastructure) since
it's needed by any annotation source that targets non-diff lines.
- Simplify DiffPanel: remove review-comment imports, use the hook,
consolidate shared props into a single object spread, extract
sortFilesByPath to eliminate 3 duplicated sorting expressions.
DiffPanel shrinks from 1019 → 817 lines. Adding a new annotation source
now requires zero changes to DiffPanel or DiffFileList — just add a
variant to DiffAnnotation, a card in DiffAnnotationCards, and a query
in useDiffAnnotations.
* fix: address review findings in PR review system
- Move zod from devDependencies to dependencies (used at runtime in
MCP tool schema definitions)
- Track actual publish successes/failures instead of silently ignoring
GitHub API errors; return { published, failed } counts
- Replace unsafe `as typeof ReviewComment.Type` blanket cast with
proper type annotation and narrow cast only on the UUID id field
- Add path traversal protection to projectsReadFile by reusing
resolveWorkspaceWritePath validation for each candidate root
- Wire review comment cleanup into thread deletion via the projection
pipeline's side-effect machinery (mirrors attachment cleanup pattern)
- Remove dead buildSyntheticContextPatch re-export from prReviewUtils
* feat: per-comment "Publish to GitHub" button in diff annotations
Each review comment card now has a "Publish" button next to the
severity badge. Clicking it publishes that single comment to the
GitHub PR via gh api. The button shows a spinner while publishing
and switches to "Published" on success.
- Add optional commentId filter to reviewComment.publish endpoint
- Add onPublish callback to ReviewCommentAnnotation type
- Wire publish context (cwd + prUrl from git status) through
useDiffAnnotations → annotation metadata → card component
- Prompt agent to check for review skills before starting
* fix: style publish button with border, hover-only visibility
- Bordered button with "Publish as GitHub Comment" label
- Hidden by default on desktop, visible on hover over the comment card
- Always visible on mobile (no hover)
- Remove accidentally committed apps/server/~/dev directory
* fix: get PR head SHA from GitHub API instead of local worktree
The local worktree git link may be broken if the clone directory was
removed. Fetch the head SHA from the PR via gh api as primary source,
with local git rev-parse as fallback.
* fix: expand ~ in clone target directory to home path
When the user configures ~/dev as the working directory, the tilde
was passed as a literal string to git clone (shells expand it, but
programmatic callers don't). Now expands ~/... to $HOME/... before
creating directories or cloning.
* fix: deduplicate worktree paths when directory already exists
When createWorktree computes the default path and it already exists
(e.g. from preparePullRequestThread or a prior review), append a
numeric suffix (-2, -3, ...) until a free path is found.
* fix: remove duplicate severity prefix from published GitHub comments
* feat: persist published state for review comments
Track publishedAt timestamp in the database so the "Published" state
survives page reloads and prevents double-publishing.
- Add published_at column to review_comments table (merged into 016)
- Update repository layer to read/write publishedAt
- Publish endpoint marks comments as published after successful gh api
- UI reads publishedAt from comment data instead of local state
- MCP list_review_comments shows (published) marker for agent visibility
* feat: GitHub icon, published URL link, and persisted publish state
- Published comments link directly to the GitHub comment (new tab)
- Store publishedUrl from gh api response in the database
- GitHub icon on both publish and published states
- Published button without URL shows static "Published" badge
- Cache invalidation after publish so UI updates immediately
- Merged published_url into migration 016
* feat: restore per-project Review PR button and fix fork PR listing
Add a per-project Review PR button (GitPullRequestIcon) to the sidebar
project action buttons, opening a simplified dialog that only shows the
selectable PR list (no free-text URL input). Also fix gh pr list
resolving to the upstream repo for forks by threading an optional
--repo owner/repo flag through the entire stack (contracts, service,
server, query, UI).
Add a notification bell in the sidebar header that shows PRs where the user has been requested as a reviewer. Review requests are fetched via gh search prs --review-requested=@me and persisted server-side in SQLite so review state survives restarts. - Add ReviewRequest contracts (schema, WS methods, NativeApi bindings) - Add SQLite persistence (migration 017, repository service + layer) - Add 3 WS routes: reviewRequest.list (fetch+sync), dismiss, linkThread - Add GitHubCli.listReviewRequests() for gh search prs - Add NotificationBell component with popover, filter tabs (Reviews/Bot/All), bot detection (dependabot, renovate, github-actions, etc.) - Badge only counts pending non-bot requests - Click pending item: opens StandaloneReviewPrDialog with auto-prefilled URL - Click in-review item: navigates to the linked thread - "Done" button on in-review items, hover X dismiss on all items - Auto-dismiss stale requests when PRs are merged/closed - StandaloneReviewPrDialog: add initialPrUrl auto-trigger and onThreadCreated callback for thread linking
Increase the upstream status fetch timeout from 5s to 15s and cache failures for 60s instead of retrying immediately. Previously a slow or unreachable remote would timeout every 15s poll cycle, spamming the server logs.
Add a terminal picker to Settings so users can choose their preferred terminal emulator (Terminal.app, iTerm2, Warp, Ghostty, Kitty, Alacritty) for the "Resume in Terminal" / "Open in Terminal" button. The server detects installed terminals and exposes them via availableTerminals in ServerConfig; the web UI stores the preference in app settings and passes it through to the launch handler.
Use origin/<base> for branch diffs so the diff reflects the actual remote state, not a potentially stale local branch. Falls back to the local ref if the remote tracking ref doesn't exist.
) * feat: improve review popover UX with inline expand, sorting, and visual hierarchy - Inline morph: clicking a row expands it in-place (no duplicate detail section) using CSS grid height animation for smooth reveal of action buttons - Sort by status (in_review first, then pending) and PR number descending for stable, triage-optimized ordering - Add sticky group headers ("In progress" / "Awaiting review") with backdrop blur - De-emphasize repo name, promote PR title as primary visual element - Fix nested button a11y: outer element is now div[role=button] with keyboard handlers - Stabilize useMemo dependency with module-level empty array constant * feat: improve notification panel mobile UX - Larger panel: full-width on mobile, w-96 on desktop - More height: 70dvh on mobile, 500px on desktop - Block sidebar interaction behind open panel via z-indexed portal backdrop - Raise popover positioner above Sheet (z-52) on mobile so it clears the sidebar drawer - Close panel and mobile sidebar when navigating to a review - Add positionerClassName prop to PopoverPopup for z-index overrides * fix: suppress composer auto-focus on touch devices Prevents the virtual keyboard from opening automatically when navigating to a thread on mobile. focusComposer now bails early on pointer:coarse devices, covering all call sites (navigation, mode switches, model selection, drag-drop, terminal close). * feat: persist and expose PR body and labels on review requests Fetches body and labels from the GitHub CLI alongside existing PR fields, stores them in two new columns (pr_body, pr_labels) added via migration 018, and surfaces them through the ReviewRequest contract so the notification panel can render PR description and label chips in the expanded item view.
* feat: add review approve/request-changes actions in chat header Add ReviewActionsControl component with a collapsible dropdown menu (matching Git/Jira action patterns) that appears when the current thread has an active PR review. Supports submitting APPROVE or REQUEST_CHANGES via the GitHub API, then auto-dismisses the review request locally. * perf: reduce GitHub API rate-limit consumption - Cache findLatestPr results per (cwd, branch) with 60s TTL, avoiding 1-3 gh API calls every git status poll - Cache repository clone URLs for 5 minutes (essentially static data fetched up to 4x per PR worktree setup) - Cache PR head SHA for 2 minutes during review comment publishing - Increase git status polling from 15s to 30s (stale 5s to 15s) - Increase git branches polling from 60s to 120s (stale 15s to 30s) - Increase review request polling from 60s to 120s (stale 30s to 60s) - Invalidate PR cache on PR creation to ensure fresh data after mutations * perf: further reduce GitHub API rate-limit consumption - Extract createTtlCache to @t3tools/shared/cache (dedup GitManager + wsServer) - Cache getDefaultBranch results for 15 minutes (essentially static) - Server-side 60s cache for reviewRequestList (collapses multi-tab polls) - Batch review comments into single POST /reviews call (N→1 API calls) - Add refetchIntervalInBackground: false to all polled queries (stops polling when tab is in background) - Add refetchOnWindowFocus to reviewRequestListQueryOptions - Add stdin passthrough to GitHubCli.execute for batch API payloads
- Swipe-to-close: crisp 1px dark edge with tight depth shadow instead of blurry theme-color border; sidebar content live-translates under finger - Swipe-to-open: edge indicator now uses sidebar background color, follows finger width directly, fades to fully opaque quickly - Pull-to-reveal: bell icon indicator with smooth fade/scale feedback; PullToReveal component wired into ThreadSidebar - NotificationBell: controlled open/onOpenChange props so pull gesture can drive it; mobile backdrop at z-51 blocks sidebar while panel is open; popover z-52 ensures it renders above the backdrop
Remove key={threadId} from ChatView so the DOM stays mounted across
thread switches (no unmount/remount blank frame). Add explicit resets
for all remaining state that isn't keyed by threadId: responding request
IDs, pending user input state, attachment preview handoffs, in-flight
send guard, and composer select lock.
On thread change, scroll the messages container to bottom synchronously
in useLayoutEffect (before paint) to avoid showing the previous thread's
scroll offset for a frame. Follow with a 120ms opacity fade-in so the
content change feels smooth rather than an abrupt swap.
- Add approved/changes_requested statuses to ReviewRequestStatus - Show review outcome in chat header (approved, changes requested) - Add "Done" tab in notification panel with proper outcome labels - Fix "Go to Review" link for completed reviews with existing threads - Unlink deleted threads from review requests on each poll - Fix race condition: await linkThread before navigating to review thread - Only auto-dismiss pending reviews (preserve completed review history) - Add listReviewedPrs GitHub CLI method for future use
- Add "Restart" button next to "Done" in notification panel for in_review items - Extract buildReviewPrompt and normalizePrReference to packages/shared/prReview - Add implementation plan for future server-driven review flow
…eads The query used NOT IN (alive threads), treating threads that don't exist yet in projection_threads the same as deleted threads. This caused a race where linkThread sets the threadId, but the next poll wipes it because the client-side draft thread hasn't materialized on the server yet. Changed to IN (explicitly deleted threads) so only threads that were created and then deleted get unlinked. Also reset status back to pending when unlinking so the UI stays consistent.
The server swallowed all gh api errors during comment publishing and
returned { published: 0 } as a success response. The client never
checked the count, so the UI always showed "Comment published to GitHub"
even when nothing was posted.
Now the server captures the actual gh error message and includes it in
the response. The client checks published count and throws with the real
error, which the existing error toast handler displays.
- ProviderRuntimeIngestion: use Effect.succeed(null) instead of Effect.succeed(undefined) to satisfy the effectSucceedWithVoid rule while preserving the truthiness check downstream - ClaudeCodeAdapter: wrap JSON.parse in Effect.sync callback to move try/catch out of the generator scope (tryCatchInEffectGen rule) - wsServer: use runProcess with allowNonZeroExit for batch comment publish so the GitHub API response body (stdout) is captured on 422 errors — previously only stderr was shown, losing the actual error detail. Also add server-side logging for publish attempts.
Check which files are in the PR diff before attempting to publish. If a comment targets a file outside the diff, return immediately with a clear error message instead of hitting GitHub's 422 rejection. Also adds file context hint to any remaining 422 errors.
The GitHub PR review API only accepts comments on files that are part of the diff. Previously, the publish button appeared on all comments, leading to confusing 422 errors for files not in the PR. Now DiffPanel passes the set of branch diff file paths through to useDiffAnnotations, which only attaches the onPublish callback (and thus the button) to comments whose file is in the diff. Also keeps the server-side pre-flight check as a safety net.
- Review prompt: remove /find-skills reference, condense tool docs to just mention review_comment tool. Keep skill check as Important. - Timeline: normalize MCP tool labels from "Mcp__server__tool_name" to "Tool name" for readability (e.g. "Review comment" instead of "Mcp__review-comments__review_comment").
- Fix missing React hook dependencies in Jira dialogs (threadId in useCallback for CreateJiraTicketDialog and UpdateJiraProgressDialog) - Remove unused imports (retainSearchParams, DiffRouteSearch, resolvePendingUserInputAnswer, ExternalLinkIcon, ensureNativeApi) - Remove unused function (normalizeAppSettings) - Remove stale eslint-disable directive (ClaudeCodeAdapter) - Replace no-useless-spread in ChatView claudeOptions - Move truncateStrings to module scope (consistent-function-scoping) - Replace no-map-spread patterns with Object.assign / direct assignment in ProviderService, Sidebar, and session-logic - Memoize publishContextBase in DiffPanel to fix re-render on every render - Replace Array#sort() with Array#toSorted() in test - Use data-driven key instead of array index in ApprovalDiffView - Apply formatting improvements to wsServer, useDiffAnnotations, and diffAnnotations for better line wrapping
54574d8 to
18c5f27
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
CreateJiraTicketDialog,UpdateJiraProgressDialog) wherethreadIdwas missing fromuseCallbackdeps, causing stale closuresChatView,Sidebar,_chat.$threadId,DiffAnnotationCards,appSettings,ClaudeCodeAdapterno-map-spreadperformance warnings inProviderService,Sidebar, andsession-logicby replacing object spread in.map()withObject.assignor direct property assignmentpublishContextBasememo instability inDiffPanel— unmemoized object literal causedpublishContextuseMemo to re-evaluate every rendertruncateStringsto module scope (ProviderRuntimeIngestion) to fixconsistent-function-scopingwarningArray#sort()withArray#toSorted()in test file to avoid mutating original arrayApprovalDiffViewwsServer,useDiffAnnotations, anddiffAnnotationsLint result: 0 warnings, 0 errors (down from 17 warnings)
Test plan
bun typecheck— 7/7 packages passbun lint— 0 errors, 0 warningsbun fmt— cleanthreadIddependency fix (manual test)