Repository navigation
fix(web): paste terminal text once and clear the shortcut on release - #19366
Conversation
The paste shortcut races navigator.clipboard.readText() against the browser's native paste event. The token only covered the native event landing first. When Chromium routes the paste through its menu (installed web apps, Electron), the read resolves first and the native paste that follows was also sent. The read now records the text it sent on the shortcut's gesture, and onPaste drops the one matching native paste. The gesture ends on the shortcut key's keyup, the next shortcut, blur, or that paste, so a later Edit > Paste of the same text still lands. Design from r4iju's #13357 and the #13346 triage. Fixes #13346 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a narrowly scoped terminal paste bug fix that prevents duplicate delivery while preserving fallback and encoding behavior. The production change is localized and covered by focused tests, with no schema, infrastructure, sensitive-area, product-default, or static-analysis configuration impact. You can add or adjust custom eligibility rules. Learn more. |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
|
Taking over this one. I’ll keep your commits and push the maintainer rebuild on this branch. |
## What's Changed * fix(mobile): sheets close with an X and confirm with a checkmark by @juliusmarminge in pingdotgg/t3code#21319 * fix(tailscale): a slow tailscale status no longer hides Tailscale in Settings by @SunkenInTime in pingdotgg/t3code#21057 * chore(deps): web and mobile share React 19.3 from the catalog by @juliusmarminge in pingdotgg/t3code#21376 * fix(server): migrate legacy thread pull request links by @Yash-Singh1 in pingdotgg/t3code#19129 * fix(server): a failed Codex turn no longer traps the queue behind its subagents by @juliusmarminge in pingdotgg/t3code#21366 * feat(server): count which product features people use by @juliusmarminge in pingdotgg/t3code#15921 * feat(server): count which T3 MCP tools agents use by @juliusmarminge in pingdotgg/t3code#15913 * perf(web): HTML renders drop the loading skeleton by @maria-rcks in pingdotgg/t3code#21480 * fix(mobile): sent steer and queued messages are marked like desktop by @flamboh in pingdotgg/t3code#21417 * fix(server): keep queued subagent status in sync by @Yash-Singh1 in pingdotgg/t3code#21487 * perf(web): virtualize large changed-file trees by @Yash-Singh1 in pingdotgg/t3code#21482 * fix(pull-requests): distinguish skipped checks with a slash icon by @Yash-Singh1 in pingdotgg/t3code#21498 * fix(mobile): crash report shows the store build number by @mohamed-akef in pingdotgg/t3code#16052 * fix(files): load PDFs in browser previews by @Yash-Singh1 in pingdotgg/t3code#21095 * fix(server): device-host SSH tunnels exit when the server dies by @kcazin in pingdotgg/t3code#17448 * fix(web): Open in → Finder in the file preview opened the file in its default app instead of revealing it by @jamesvillarrubia in pingdotgg/t3code#16955 * fix(web): project actions no longer reuse the right-panel terminal by @TonybynMp4 in pingdotgg/t3code#18340 * fix(web): the device screen keeps focus when typing or returning to the window by @haydenkz in pingdotgg/t3code#14534 * fix(server): keep browser input responsive during slow navigation by @josephv123 in pingdotgg/t3code#16691 * fix(grok): a Homebrew-installed Grok updates through brew and is compared against the cask by @Mnigos in pingdotgg/t3code#18772 * fix(antigravity): read usage from each instance data directory by @fixfon in pingdotgg/t3code#17769 * fix(server): reconnecting no longer reopens a closed terminal by @Gigioxx in pingdotgg/t3code#18444 * fix(shared): preview addresses containing another URL open instead of searching by @maxwellyoung in pingdotgg/t3code#17943 * fix(server): ACP Registry loads on networks with slow IPv4 connects by @Gigioxx in pingdotgg/t3code#15054 * fix(preview): keep desktop-rendered tabs out of idle cleanup by @TDanks2000 in pingdotgg/t3code#18147 * fix(server): auto-delivered messages queue between provider turns by @Gigioxx in pingdotgg/t3code#15691 * fix(server): OpenCode 2 threads keep T3's tools after an idle project is evicted by @voltcrash in pingdotgg/t3code#16796 * fix(server): install the advertised version for pnpm-global provider updates by @RaphaelFakhri in pingdotgg/t3code#14295 * fix(web): ignore right-clicks in the flat Device viewport by @samaluk in pingdotgg/t3code#17020 * fix(web): "No project" picker shows its full label on the new-thread screen by @flamboh in pingdotgg/t3code#21504 * fix(web): up-arrow recall skips automation and agent messages by @maria-rcks in pingdotgg/t3code#21510 * fix(desktop): reattach a browser tab whose debugger Chromium dropped by @tobymarks in pingdotgg/t3code#17525 * fix(web): Integrations settings show one Browser section, not two by @RakshithBhat03 in pingdotgg/t3code#18264 * fix(web): hide the empty reset badge on unstarted limit windows by @akash3444 in pingdotgg/t3code#18579 * fix(cli): browser setup installs missing fonts by @adrilasar in pingdotgg/t3code#17570 * fix(web,mobile): queued messages no longer say "From queue" once sent by @flamboh in pingdotgg/t3code#21474 * fix(web): refresh embedded assets in markdown file previews by @Saikrishna1876 in pingdotgg/t3code#18647 * fix(web,mobile): keep reporting client activity after an interrupted report by @skyhong2002 in pingdotgg/t3code#15738 * fix(web): paste terminal text once and clear the shortcut on release by @t3dotgg in pingdotgg/t3code#19366 * fix(server): fall back when checkpoint fsync is unsupported by @mdshzb04 in pingdotgg/t3code#14411 * fix(preview): browser tabs no longer go blank when the tab list reorders by @mkiera in pingdotgg/t3code#13799 * fix(server): terminals no longer inherit the launching tmux session by @UzEE in pingdotgg/t3code#13359 ## New Contributors * @mohamed-akef made their first contribution in pingdotgg/t3code#16052 * @haydenkz made their first contribution in pingdotgg/t3code#14534 * @RaphaelFakhri made their first contribution in pingdotgg/t3code#14295 * @samaluk made their first contribution in pingdotgg/t3code#17020 * @tobymarks made their first contribution in pingdotgg/t3code#17525 * @adrilasar made their first contribution in pingdotgg/t3code#17570 * @skyhong2002 made their first contribution in pingdotgg/t3code#15738 * @mkiera made their first contribution in pingdotgg/t3code#13799 **Full Changelog**: pingdotgg/t3code@v0.1.1-nightly.20261018.3335...v0.1.1-nightly.20261019.3348 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.1-nightly.20261019.3348
## What's Changed * fix(mobile): sheets close with an X and confirm with a checkmark by @juliusmarminge in pingdotgg/t3code#21319 * fix(tailscale): a slow tailscale status no longer hides Tailscale in Settings by @SunkenInTime in pingdotgg/t3code#21057 * chore(deps): web and mobile share React 19.3 from the catalog by @juliusmarminge in pingdotgg/t3code#21376 * fix(server): migrate legacy thread pull request links by @Yash-Singh1 in pingdotgg/t3code#19129 * fix(server): a failed Codex turn no longer traps the queue behind its subagents by @juliusmarminge in pingdotgg/t3code#21366 * feat(server): count which product features people use by @juliusmarminge in pingdotgg/t3code#15921 * feat(server): count which T3 MCP tools agents use by @juliusmarminge in pingdotgg/t3code#15913 * perf(web): HTML renders drop the loading skeleton by @maria-rcks in pingdotgg/t3code#21480 * fix(mobile): sent steer and queued messages are marked like desktop by @flamboh in pingdotgg/t3code#21417 * fix(server): keep queued subagent status in sync by @Yash-Singh1 in pingdotgg/t3code#21487 * perf(web): virtualize large changed-file trees by @Yash-Singh1 in pingdotgg/t3code#21482 * fix(pull-requests): distinguish skipped checks with a slash icon by @Yash-Singh1 in pingdotgg/t3code#21498 * fix(mobile): crash report shows the store build number by @mohamed-akef in pingdotgg/t3code#16052 * fix(files): load PDFs in browser previews by @Yash-Singh1 in pingdotgg/t3code#21095 * fix(server): device-host SSH tunnels exit when the server dies by @kcazin in pingdotgg/t3code#17448 * fix(web): Open in → Finder in the file preview opened the file in its default app instead of revealing it by @jamesvillarrubia in pingdotgg/t3code#16955 * fix(web): project actions no longer reuse the right-panel terminal by @TonybynMp4 in pingdotgg/t3code#18340 * fix(web): the device screen keeps focus when typing or returning to the window by @haydenkz in pingdotgg/t3code#14534 * fix(server): keep browser input responsive during slow navigation by @josephv123 in pingdotgg/t3code#16691 * fix(grok): a Homebrew-installed Grok updates through brew and is compared against the cask by @Mnigos in pingdotgg/t3code#18772 * fix(antigravity): read usage from each instance data directory by @fixfon in pingdotgg/t3code#17769 * fix(server): reconnecting no longer reopens a closed terminal by @Gigioxx in pingdotgg/t3code#18444 * fix(shared): preview addresses containing another URL open instead of searching by @maxwellyoung in pingdotgg/t3code#17943 * fix(server): ACP Registry loads on networks with slow IPv4 connects by @Gigioxx in pingdotgg/t3code#15054 * fix(preview): keep desktop-rendered tabs out of idle cleanup by @TDanks2000 in pingdotgg/t3code#18147 * fix(server): auto-delivered messages queue between provider turns by @Gigioxx in pingdotgg/t3code#15691 * fix(server): OpenCode 2 threads keep T3's tools after an idle project is evicted by @voltcrash in pingdotgg/t3code#16796 * fix(server): install the advertised version for pnpm-global provider updates by @RaphaelFakhri in pingdotgg/t3code#14295 * fix(web): ignore right-clicks in the flat Device viewport by @samaluk in pingdotgg/t3code#17020 * fix(web): "No project" picker shows its full label on the new-thread screen by @flamboh in pingdotgg/t3code#21504 * fix(web): up-arrow recall skips automation and agent messages by @maria-rcks in pingdotgg/t3code#21510 * fix(desktop): reattach a browser tab whose debugger Chromium dropped by @tobymarks in pingdotgg/t3code#17525 * fix(web): Integrations settings show one Browser section, not two by @RakshithBhat03 in pingdotgg/t3code#18264 * fix(web): hide the empty reset badge on unstarted limit windows by @akash3444 in pingdotgg/t3code#18579 * fix(cli): browser setup installs missing fonts by @adrilasar in pingdotgg/t3code#17570 * fix(web,mobile): queued messages no longer say "From queue" once sent by @flamboh in pingdotgg/t3code#21474 * fix(web): refresh embedded assets in markdown file previews by @Saikrishna1876 in pingdotgg/t3code#18647 * fix(web,mobile): keep reporting client activity after an interrupted report by @skyhong2002 in pingdotgg/t3code#15738 * fix(web): paste terminal text once and clear the shortcut on release by @t3dotgg in pingdotgg/t3code#19366 * fix(server): fall back when checkpoint fsync is unsupported by @mdshzb04 in pingdotgg/t3code#14411 * fix(preview): browser tabs no longer go blank when the tab list reorders by @mkiera in pingdotgg/t3code#13799 * fix(server): terminals no longer inherit the launching tmux session by @UzEE in pingdotgg/t3code#13359 ## New Contributors * @mohamed-akef made their first contribution in pingdotgg/t3code#16052 * @haydenkz made their first contribution in pingdotgg/t3code#14534 * @RaphaelFakhri made their first contribution in pingdotgg/t3code#14295 * @samaluk made their first contribution in pingdotgg/t3code#17020 * @tobymarks made their first contribution in pingdotgg/t3code#17525 * @adrilasar made their first contribution in pingdotgg/t3code#17570 * @skyhong2002 made their first contribution in pingdotgg/t3code#15738 * @mkiera made their first contribution in pingdotgg/t3code#13799 **Full Changelog**: pingdotgg/t3code@v0.1.1-nightly.20261018.3335...v0.1.1-nightly.20261019.3348 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.1-nightly.20261019.3348
A terminal shortcut can send text twice when its clipboard read resolves before Chromium’s native paste event. Keep one gesture’s sent text so the matching native duplicate is consumed, while native-first paste still cancels a late read.
End the gesture on shortcut or modifier release and blur. This also handles macOS omitting V keyup while Command is held, so a later identical menu paste still works. Native fallback after a denied read and paste encoding are preserved.
Fixes #13346. Maintainer takeover of @t3dotgg’s #19366, retaining the original commits and @r4iju’s earlier design contribution.
Verification:
Before (actual base, two sends):
After (one send):
Before interaction recording · After interaction recording
Implemented with Codex GPT-6.1 Sol; regression tests with Codex GPT-6 Astra; reviewed with Claude Opus 5.5 and Codex GPT-6 Sol through T3 Code.