fix(web): allow expanding duplicate tool call commands - #10981
Conversation
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a small, self-contained web UI fix that re-enables expansion for duplicate tool-call commands and preserves the existing expansion rendering path. It affects only one component and introduces no schema, deployment, security, billing, or configuration changes. You can add or adjust custom eligibility rules. Learn more. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review. 📝 WalkthroughWalkthrough
ChangesWork entry expansion
Priority: ⬇️ Low Estimated code review effort: 1 (Trivial) | ~5 minutes Merge Risk: ⚪ Minimal · up to Work-entry rows with duplicate command previews can now expand whenever additional content is available, with no concrete current-head merge-blocking risk identified. Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Before and after in the web client, replaying the same 75-line Before: the entire command wraps into the timeline by default, with no expand/collapse control. After: the command stays on one truncated line with an expand control. Verified that clicking reveals the full script and collapsing restores the single-line row. |
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. |
## What's Changed * fix(web): allow expanding duplicate tool call commands by @Yash-Singh1 in pingdotgg/t3code#10981 * fix(mobile): prevent Android chat rows overlapping during sync by @SunkenInTime in pingdotgg/t3code#10983 * fix(mobile): prevent text leaking through Android glass by @juliusmarminge in pingdotgg/t3code#10998 * feat(pull-requests): link multiple pull requests to threads by @juliusmarminge in pingdotgg/t3code#10839 * feat(search): find threads by linked pull request by @juliusmarminge in pingdotgg/t3code#10870 * feat(prs): navigate, merge and rebase GitHub stacks by @juliusmarminge in pingdotgg/t3code#10875 * fix(server): preserve recent PR reads across server restarts by @juliusmarminge in pingdotgg/t3code#11007 * feat(web): zoom and pan expanded images by @maria-rcks in pingdotgg/t3code#10869 * fix(ui): use available space for composer model names by @juliusmarminge in pingdotgg/t3code#11002 **Full Changelog**: pingdotgg/t3code@v0.0.41-nightly.20260909.1461...v0.0.41-nightly.20260910.1473 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.41-nightly.20260910.1473
Merges `pingdotgg/t3code` `2a3035353..0f602b3` (16 commits) into the fork. - **Landed:** 283 files (`HEAD^1..HEAD`) against 277 in the upstream range — `merge-stats.mjs` reports an exact 277/277 file match, so nothing in the range was dropped and nothing extra came in. The six over are three typecheck fixes and three fork docs, both listed below. Fork delta 733 files (`HEAD^2..HEAD`). - **Conflicts:** 6 files, all on one upstream feature (pingdotgg#10839, linking several pull requests to a thread). Resolutions in `docs/fork/upstream-merge-log.md`. - **Sweep:** 13 owned-concern hits, all `infra/relay/**` FCM/Android-push files under the decided-out `cloud-relay-connect` concern. Inherited in tree, adopted by nothing. - **Unsupported methods:** 0 ADD, 0 DROP — no `packages/contracts/src/rpc.ts` edit needed. ## What upstream shipped ### Usable as-is against Moatless Pure client work, no backend involvement — these are live the moment this merges. - **pingdotgg#11020** message copy buttons show on touch devices. - **pingdotgg#11018** middle-click pastes in the terminal on Linux. - **pingdotgg#10869** expanded images zoom and pan. - **pingdotgg#11002** the composer uses the available space for model names. - **pingdotgg#10981** duplicate tool-call commands can be expanded independently. - **pingdotgg#10947** provider settings grow a bulk model toggle. - **pingdotgg#10609** the PR list's diff counts return to the top right. - **pingdotgg#11022** remote projects open in Zed (`packages/contracts/src/editor.ts` plus the desktop shell — the fork ships both). - **pingdotgg#10998 / pingdotgg#10983 / pingdotgg#10964** three Android glass/overlap fixes in `apps/mobile`. ### Unsupported in Moatless — needs backend implementation - **pingdotgg#10839 — several pull requests per thread.** This is the substantive decision in the merge. Upstream now carries `thread.pullRequests: ThreadPullRequestLink[]`, `packages/shared/src/threadPullRequests.ts`, and a `ThreadPullRequestBadgeControl` pill with its own `pull-requests` stack tab. That is exactly the equivalent the fork's `task-bound-pull-request` convergence entry said to re-home its `+N` menu onto — but it cannot be re-homed yet: Moatless serves no `pullRequests` array on a thread and does not advertise the new `threadPullRequests` capability, so upstream's badge would resolve to nothing and paint an empty pill over a working one. Taking `theirs` would have silently deleted live fork behaviour. **Resolution:** upstream's implementation landed whole, and the two presentations are switched on `useSupportsMultiplePullRequests` — upstream's badge and stack where the server advertises the capability, the fork's binding-derived pill and `+N` menu where it does not. Additive, no prop threading, and it re-homes itself the day the backend advertises. `docs/fork/inventory.json` and `docs/fork/gaps.md` are updated with the switch and with the exact deletion list for when that happens. **To close it:** serve `thread.pullRequests` on `OrchestrationThread`/`OrchestrationThreadShell` from `task_bindings`, and report `capabilities.threadPullRequests: true`. - **pingdotgg#10870 — find threads by linked pull request.** Search terms come off the same `thread.pullRequests` array, so sidebar and command-palette search by PR number/URL match nothing here until the array is served. Closes with pingdotgg#10839. - **pingdotgg#10875 — navigate, merge and rebase GitHub stacks.** Adds two RPC methods, `pullRequests.stack` and `pullRequests.linkedThreads`, which the Moatless backend does not dispatch. Both are already covered by the shared `PullRequestRpcError` union, so the client decodes the refusal correctly and the stack UI stays inert — no contract change needed. Implementing the two methods is what turns it on. - **pingdotgg#10416 — Android agent notifications and ongoing activity.** Rides FCM through `infra/relay`, which is part of the decided-out `cloud-relay-connect` concern (being removed with Clerk). Inherited in tree, not adopted. ### Backend behaviour worth reproducing in Moatless - **pingdotgg#11007 — recent PR reads survive a server restart.** Upstream added `apps/server/src/pullRequest/PullRequestReadCache.ts`, persisting which pull requests a user has already read so a restart does not re-mark the whole list unread. Moatless owns this surface itself, so nothing in this repository holds it open — recorded so whoever touches the backend's PR read state knows the answer exists upstream. ## Verification `verify.mjs`, seven of eight green: `duplicate-adds`, `tripwires`, `resolution-check`, `unsupported-methods`, `fmt:check`, `lint`, `typecheck`. `test` is red on `@t3tools/desktop` alone — `scripts/browser-secret-native.test.mjs > bundled libsecret helper` fails to compile because `libsecret-1` is not installed in this sandbox. **Pre-existing environment gap, not merge-introduced:** it is already an entry in `docs/fork/gaps.md`, and `git diff --name-only HEAD^1 HEAD | grep browser-secret` is empty. 100 of 102 desktop files pass. Four packages did not finish under `vp run -r test` (`@t3tools/mobile`, `t3`, `@t3tools/web`, `t3code-relay`) and all four pass when run alone, which is parallel load rather than the merge. Three typecheck failures were fixed in the merge commit, all fork-only web code that upstream's widened shared types reached: `sandboxControl.placement.test.tsx` needed the two new `RightPanelTabs` props, and `useSandboxAvailability.ts` / `useSandboxDetail.ts` needed `isSuccess` threaded through now that `EnvironmentQueryView` carries it. Nothing is unresolved. --- Moatless task: https://moatless.soaplabstest.com/tasks/db1b3cbe-4401-441b-bbec-6b0c725c93ce


What Changed
Why
Duplicate tool call commands could appear non-expandable when the visible label matched the command text. Expansion now depends on whether additional content is available, so duplicate commands remain inspectable.
The mobile glass cleanup reduces unnecessary blur-target complexity, while provider model settings retain their existing per-model controls.
Implemented with Codex (GPT-5).
UI Changes
Before/after screenshots are not included. This change affects web tool-call expansion and mobile/settings UI behavior.
Checklist
Summary by CodeRabbit