Uh oh!
There was an error while loading. Please reload this page.
feat(web): add copy path button to diff headers - #2403
Conversation
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Warning Your free Security trial is over. An organization admin can activate Security or dismiss this notice. Comment |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR adds an always-visible copy-path control to production diff headers and introduces new clipboard interaction behavior through a new component. The implementation is localized and reuses existing infrastructure, but the new user-facing capability warrants human review. You can add or adjust custom eligibility rules. Learn more. |
Dismissing prior approval to re-evaluate b028ddf
juliusmarminge
commented
Jun 19, 2026
ipanasenko
commented
Jun 19, 2026
From what I see, to achieve this we'd need to use |
…53b397b # Conflicts: # apps/web/src/components/DiffPanel.tsx
Dismissing prior approval to re-evaluate a29ebac
Uh oh!
There was an error while loading. Please reload this page.
Dismissing prior approval to re-evaluate 6f44eec
Dismissing prior approval to re-evaluate e3c290e
There was a problem hiding this comment.
Two consistency issues around the new diff-header icon button. Both come from reconstructing the Button primitive as a raw class string instead of using the existing icon-micro / ghost contract.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Dismissing prior approval to re-evaluate 36cfa99
Dismissing prior approval to re-evaluate 56930d4
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 56930d4. Configure here.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
One finding on the latest commit (56930d4, "remove copy path button background"): the background suppression is expressed as an unconditional !important call-site override of the ghost variant instead of the repo's variant-scoped idiom. Everything flagged in the previous run (raw <button>, DIFF_HEADER_ICON_BUTTON_CLASS_NAME) is resolved.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
…continuation, provider editor redesign, context meter opt-in, linked-PR summaries) Brings the fork up to origin/main e0da6c6..b57726c. Highlights: continue active threads across server self-updates (pingdotgg#9167), provider editor and models list redesign (pingdotgg#8508), opt-in context window meter (pingdotgg#9190), linked-PR summary RPC with last-good caching (pingdotgg#9176), relay credential refresh before expiry (pingdotgg#9178), composer draft preserved through worktree setup (pingdotgg#9197), project skill discovery for Claude (pingdotgg#9210), copy-path on diff headers (pingdotgg#2403), mobile long-press file references (pingdotgg#9258). Conflict resolutions (14 files), keep-both unless noted: - RpcAuthorization / contracts rpc / ws.ts: fork's PR rank, cherry-pick and upstream-release RPCs sit beside upstream's new pullRequestsSummary. - ws.ts route layer: fork's computer task/view brokers plus upstream's serverSelfUpdate wrapped in withRunningThreadContinuation. - PullRequestService: fork's upstream-project reads and scoped diff epochs kept; upstream's summary read, refCacheKey and viewer-flight invalidation added. invalidate() now scopes diff-only invalidation AND clears viewer flights on a whole-workspace refresh. Test file keeps both new suites. - client-runtime pullRequests: fork's PR stack atoms kept, TTL constant takes upstream's new name. - ChatMarkdown: upstream's one-character gutter rule replaces the fork's equivalent digitWidth fix. - ChatComposer: fork's voice-session button kept; context meter now honours settings.contextWindowMeterEnabled. - ConnectionsSettings: fork's EnvironmentLabelControl kept with upstream's min-w-0 truncate. - mobile ThreadFeed: upstream's markdownLinkHandlers plus the fork's onCancelQueuedMessage. - ClaudeDriver imports: fork's superset. build-desktop-artifact: distro and arch both threaded through. Integration: upstream's restart continuation and the fork's resume-on-restart both ran at boot on the same orphans. The continuation-marker helpers move to provider/serverUpdateContinuation.ts and SessionStartupReconciler now defers any binding carrying the marker to upstream's pass (logged as deferred), so a thread is never continued twice. Test added. Dependencies reinstalled for the expo-sharing pin; the stale pnpm copy of @t3tools/mobile-markdown-text was what broke the mobile typecheck. Typecheck clean: contracts, shared, client-runtime, server, web, mobile (desktop exits 1 on a pre-existing warning-level diagnostic). Startup and self-update suites 36 passing; web sidebar/composer/settings suites 419 passing; fork guard script OK. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
## What's Changed * fix(web): hide deleted providers with prototype keys by @Lucenx9 in pingdotgg/t3code#8337 * feat(mobile): long-press file references for path and open actions by @juliusmarminge in pingdotgg/t3code#9258 * fix(desktop): exclude opposite macOS pty prebuilds by @extoci in pingdotgg/t3code#9240 * feat(web): add copy path button to diff headers by @ipanasenko in pingdotgg/t3code#2403 * fix(server): subscribe before provider settings watcher by @t3-code[bot] in pingdotgg/t3code#9271 * fix(mobile): show filled filter icon on Android when filters are active by @none23 in pingdotgg/t3code#9217 * fix(chat): show single tool calls without summaries by @maria-rcks in pingdotgg/t3code#9267 * fix(web): warn when shared settings have no target environment by @imabdulazeez in pingdotgg/t3code#9207 * fix(web): confirm closing agent-controlled browsers by @maria-rcks in pingdotgg/t3code#9272 **Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1260...v0.0.39-nightly.20260902.1261 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1261


Hey guys!
I find myself in a need to copy a file path from diff view quite often. I use it to paste into the chat and ask questions about this specific file. I think it makes it much more obvious for model (and for me) what file we are talking about.
Currently the best workflow in T3 Code I found for copying file path is to manually select file path and do Cmd+C. I think this can be improved by adding a copy button, GitHub-style.
Summary
renderHeaderFilenameSuffixslotNote
Add copy path button to diff headers
DiffFilePathCopyButtoncontrol to each diff file header via a new requiredfilename-suffixrenderer prop in AnnotatableCodeView.tsx.AnnotatableCodeViewnow requires afilename-suffixrenderer prop; existing callers must pass it or rendering will fail.Macroscope summarized ce84909.
Note
Low Risk
UI-only clipboard affordance and a small shared toast helper refactor with no auth, data, or API impact.
Overview
Adds a copy path control next to each file name in the diff view so users can paste the full path into chat without manual selection.
DiffFilePathCopyButtoncopies the resolved path viauseCopyToClipboardand shows anchored success/error toasts.DiffPanelmounts it through a newrenderHeaderFilenameSuffixcallback onAnnotatableCodeView, which forwards that slot to the underlying diff header renderer for diff items only.Anchored copy toast logic is extracted from
MessageCopyButtonintoanchoredCopyToast.tsso message and diff copy buttons share the same behavior.renderHeaderFilenameSuffixis now required onAnnotatableCodeView(call sites pass the copy button or() => nullin tests).Reviewed by Cursor Bugbot for commit ce84909. Bugbot is set up for automated code reviews on this repo. Configure here.