Repository navigation
chore: backport upstream desktop UI fixes (2026-09-29) - #243
Merged
Merged
Conversation
Ordinary keystrokes dispatched a no-op React state update on every keydown/keyup, which re-rendered work across the large sidebar tree. Track the current state in a ref and return before dispatching when the modifiers did not change. The fork has no paste-reset listener, so the guard covers keydown, keyup, and blur. Ported from pingdotgg#13884 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Encoding the whole shell snapshot through Schema walked thousands of threads on the UI thread. Decoded thread shells are already in encoded form, so only projects go through Schema and the rest is stringified directly; the cache format is unchanged (verified by a generated-value test). IndexedDB writes now listen for "abort" so quota failures that never fire "error" still fail the write. Mobile cache store not ported (desktop-only fork). Ported from pingdotgg#13767 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…oading it twice (pingdotgg#13683) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> (cherry picked from commit b2577d6)
… in memory Mounted-but-hidden terminal drawers subscribed to each thread's full detail. They now read only the thread shell; the visible drawer keeps the detail subscription it shares with ChatView (which also covers archived threads without a shell). The fork's prop is `visible`. Ported from pingdotgg#13686 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… per comparison Project activity sorting recomputed each project's timestamp (walking all of its threads) on every comparison, and settled-thread sorting re-parsed dates per comparison. Both now compute keys once per sort. The fork keeps its own sortSettledThreadsForSidebarV2 resolver in Sidebar.logic.ts, so the upstream move into client-runtime threadSort is not ported. Ported from pingdotgg#13759 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Popups that stay mounted while closed matched the floating-layer selector and made type-to-focus think a menu was open. Popup selectors now match only while open or closing. The fork's find-bar and dialog entries are kept; the fork has no paste-to-focus handler, so only type-to-focus consumes this selector. Ported from pingdotgg#13553 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 8bc9b78)
) Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> (cherry picked from commit 20f0ff1)
The reveal tint set background-color on the row, which covered the editor's selection layer. Tint through --diffs-line-bg instead so the selection paints on top. Upstream's fileSurfaceChrome.tsx does not exist in the fork; the same CSS lives in FilePreviewPanel.tsx. Ported from pingdotgg#13548 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> (cherry picked from commit 1e192b2) Conflicts resolved for the fork: kept the fork's TaggedErrorClass structure (no McpCapabilityUnavailableError, no snapshot bounding or screenshot saving here), dropped the "Agent browser access" settings hint (the fork always grants the preview capability), and replaced the upstream brand name with "desktop app" in the no-host message. Error messages only; no schema fields change. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
preview_snapshot returned the full accessibility tree, page text, and logs, which could exceed the provider's tool output limit and cost the agent its locators. Snapshots are now bounded near 20 KB: the tree is dropped, text, names, identifiers, and log strings are capped, only the newest log entries are kept, and lists (then page text, then locators) are halved until the JSON fits. Both the text block and structuredContent carry the bounded value plus an "omitted" note. The fork had no bounding at all, so this ports boundSnapshotMetadata as introduced in pingdotgg#10501 in its pingdotgg#13558 form. Screenshot saving, includeImage, and the url identity block from those upstream PRs are not ported. Ported from pingdotgg#13558 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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.
Batch 2 of the 2026-09-29 upstream backport: desktop UI responsiveness and polish from pingdotgg/t3code.
Landed
Cherry-picks (
-x):session.tshunk was comment-only and hit fork conflicts, so it was dropped. The thread-snapshot comment was trimmed because the fork has no older-turn paging.file:line:col:links drop a trailing colon (clean).markdown-clipboard.test.ts, so it now has a trimmed version with only the fake-DOM harness and the nested-task tests. Upstream's citation and code-fence tests cover features the fork lacks.TaggedErrorClassstructure. The "Agent browser access" settings hint was dropped because the fork always grants the preview capability. "T3 Code desktop app" became "desktop app" to satisfy the brand guardrail. Only message getters changed, no schema fields.Hand-ports (one commit each,
Ported from pingdotgg/t3code#NNNN):shortcutModifierState.ts: astateRefguard skips no-op modifier updates on keydown, keyup, and blur. The fork has no paste-reset listener.abortso quota failures still fail the write. Both tests are ported. The generated-value test usesSchema.toArbitrary+FastCheck.samplebecause the fork's effect has noeffect/unstable/arbitrary. Upstream's monogram-icon case was dropped because the fork has no project icons. The mobile cache store was not touched.PersistentThreadTerminalDrawersubscribes to thread detail only whilevisible; hidden drawers read the shell.sortProjectsByActivityandsortSettledThreadsForSidebarV2compute sort keys once per sort. The fork keeps its own settled resolver inSidebar.logic.ts, so the upstream move into client-runtime was not ported.TYPE_TO_FOCUS_FLOATING_LAYER_SELECTORget:is([data-open],[data-ending-style]). The fork's find-bar and dialog lines are kept. The fork has no paste-to-focus handler and no popups that stay mounted while closed, so this is hardening only and gets no changelog line.FilePreviewPanel.tsxuses--diffs-line-bg. Same@pierre/diffsversion as upstream.boundSnapshotMetadatain its fix(mcp): preview snapshots fit in the agent's tool output again pingdotgg/t3code#13558 form, as first added in fix(mcp): keep preview snapshots usable by the agent and let it save them pingdotgg/t3code#10501.structuredContentand the text block both carry the bounded value plus anomittednote. Four upstream bounding tests are ported. Screenshot saving,includeImage, and the url identity block are not ported because the fork doesn't have them.Skipped
None. pingdotgg#13553 landed as hardening only, as noted above.
Verification
vp test runon the touched tests (shortcutModifierState, storage, Sidebar.logic, terminal-links, markdown-clipboard, persistence, threadSort, McpHttpServer, McpInvocationContext, PreviewAutomationBroker, session-logic, client-runtime state, parseChangelog): all pass.tsgo --noEmitpasses for apps/web, apps/server, packages/client-runtime, and packages/contracts.vp lintandvp fmton the changed files: clean.vp run check:avicode: passes.🤖 Generated with Claude Code