fix(web): stop mistaking offline servers for updates - #13083
Conversation
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This single-file correction changes only how reconnecting and cached version-mismatch states are presented: offline servers are no longer shown as finishing an update, while known update progress remains unchanged. It introduces no schema, deployment, product-default, or static-analysis changes. You can add or adjust custom eligibility rules. Learn more. |
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: pingdotgg/t3code/.coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (1)
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review. 📝 WalkthroughWalkthrough
ChangesReconnect banner handling
Priority: ⬇️ Low Estimated code review effort: 2 (Simple) | ~10 minutes Change: Bug fix Suggested reviewers: Merge Risk: ⚪ Minimal · up to No established issue currently blocks merging this banner change. Security Architecture ReviewSecurity architecture risk: 🔵 Low · up to The change primarily corrects connection-status messaging. It also makes the existing Update action available in a reconnecting state where it was previously hidden. Existing authorization and update guards limit the risk, but update behavior after a refresh is not fully established. Retained concerns
Security review detailsSecurity Blast Radius
Trust Boundaries and Controls
Resilience and Maintainability Implications
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
a09004d to
0606679
Compare
## What's Changed * feat(observability): write a server heap snapshot on SIGUSR2 by @t3dotgg in pingdotgg/t3code#13694 * perf(server): shutdown no longer rewrites every stopped session row by @t3dotgg in pingdotgg/t3code#13688 * perf(server): build the thread list snapshot without decoding it twice by @t3dotgg in pingdotgg/t3code#13693 * fix(client): slow servers finish loading the thread list instead of loading it twice by @t3dotgg in pingdotgg/t3code#13683 * perf(web): hidden terminal drawers no longer keep full thread history in memory by @t3dotgg in pingdotgg/t3code#13686 * perf(server): per-thread settlement and PR checks no longer rebuild the whole thread list by @t3dotgg in pingdotgg/t3code#13691 * fix(mobile): running threads open at the latest message by @AKolenda in pingdotgg/t3code#13530 * feat(observability): record event loop stalls in the server trace by @t3dotgg in pingdotgg/t3code#13697 * perf(server): stop re-running git for every project each minute by @t3dotgg in pingdotgg/t3code#13689 * fix(usage): hide the Cursor keychain prompt when Cursor isn't set up by @Gigioxx in pingdotgg/t3code#13714 * feat(web): add chat width setting for wide screens by @otavio in pingdotgg/t3code#11594 * fix(opencode): accept v2 serve ready line when spawning server by @shirishpothi in pingdotgg/t3code#13651 * fix(editors): stop treating the agy CLI as the Antigravity IDE by @ishaanko in pingdotgg/t3code#7079 * fix(web): make the empty workspace draggable on desktop by @otavio in pingdotgg/t3code#13713 * fix(server): installed editors no longer vanish when discovery is slow by @bfowler in pingdotgg/t3code#13669 * fix(git): exclude SSH ports from provider URLs by @GaMeRaM in pingdotgg/t3code#12537 * fix(web): Mod+B bolds on non-Latin layouts by @ValeraZSD in pingdotgg/t3code#13409 * fix(server): prune expired replay-protection files from the secrets directory by @t3dotgg in pingdotgg/t3code#13695 * fix(web): terminal links drop a trailing colon by @ValeraZSD in pingdotgg/t3code#13408 * fix(server): bump node-pty to 1.2.0-beta.15 for linux-arm64 prebuild by @Ephraim-9 in pingdotgg/t3code#13748 * Show a focus ring on sidebar thread and draft rows by @ryanilano in pingdotgg/t3code#13344 * fix(mobile): keep composer within folded screen after resume by @PixPMusic in pingdotgg/t3code#13310 * fix(server): let OpenCode generate session titles by @macodev00 in pingdotgg/t3code#13368 * fix(server): let Antigravity inspect unsupported files by path by @Bil0000 in pingdotgg/t3code#13339 * fix(mobile): link URLs with ports and single-label hosts by @Yash-Singh1 in pingdotgg/t3code#13795 * feat(web): add keyboard navigation for usage by @tris203 in pingdotgg/t3code#10158 * perf(observability): stop writing empty spans on spawns, projected events, and idle polls by @t3dotgg in pingdotgg/t3code#13756 * perf(server): opening Diagnostics no longer loads the whole trace ring into memory by @t3dotgg in pingdotgg/t3code#13763 * perf(clients): sort projects and settled threads without re-parsing dates per comparison by @t3dotgg in pingdotgg/t3code#13759 * fix(observability): the renderer trace proxy stops tracing itself by @t3dotgg in pingdotgg/t3code#13761 * perf(server): background sweeps only read threads that can still settle by @t3dotgg in pingdotgg/t3code#13765 * perf(clients): saving the thread list cache no longer freezes the UI by @t3dotgg in pingdotgg/t3code#13767 * perf(server): cut idle wakeups from the Connect relay and session reaper by @t3dotgg in pingdotgg/t3code#13774 * fix(mobile): keep trailing underscores and tildes in autolinked URLs by @Yash-Singh1 in pingdotgg/t3code#13807 * fix(web): queued messages send while their thread is not open by @t3dotgg in pingdotgg/t3code#13764 * fix(server): background git status fetches no longer fill the disk with failed repacks by @t3dotgg in pingdotgg/t3code#13812 * fix(mobile): thread list shows the pull request icon instead of # by @flamboh in pingdotgg/t3code#13742 * fix(accessibility): correct control announcements and sidebar traversal by @blinding-pixels in pingdotgg/t3code#13491 * fix(usage): tolerate newer provider variants by @tris203 in pingdotgg/t3code#10076 * fix(usage): omit Cursor warning when no login is saved by @tris203 in pingdotgg/t3code#13820 * fix(usage): identify client version mismatches by @tris203 in pingdotgg/t3code#8208 * fix(web): stop mistaking offline servers for updates by @tris203 in pingdotgg/t3code#13083 * test(usage): assert contract mismatch details by @Yash-Singh1 in pingdotgg/t3code#13861 * fix(build): validate Linux node-pty prebuilds in Windows artifacts by @Yash-Singh1 in pingdotgg/t3code#13867 ## New Contributors * @otavio made their first contribution in pingdotgg/t3code#11594 * @shirishpothi made their first contribution in pingdotgg/t3code#13651 * @bfowler made their first contribution in pingdotgg/t3code#13669 * @GaMeRaM made their first contribution in pingdotgg/t3code#12537 * @ValeraZSD made their first contribution in pingdotgg/t3code#13409 * @Ephraim-9 made their first contribution in pingdotgg/t3code#13748 * @ryanilano made their first contribution in pingdotgg/t3code#13344 * @macodev00 made their first contribution in pingdotgg/t3code#13368 * @blinding-pixels made their first contribution in pingdotgg/t3code#13491 **Full Changelog**: pingdotgg/t3code@v0.0.43-nightly.20260926.2282...v0.0.43-nightly.20260926.2318 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.43-nightly.20260926.2318
Merges `pingdotgg/t3code` `main` into the fork: `eeea71a88` → `ab099178a` (35 commits). Branched from `main`; no open merge PR to stack on. ## Merge - **Conflicts:** only `pnpm-lock.yaml`. I took upstream's copy and re-ran `install.mjs`, which put the fork's own entries back (`moatless-api`, `mermaid`). - **Silent merges:** git merged nine other files both sides had changed without stopping (`ChatView.tsx`, `Sidebar.tsx`, `MessagesTimeline.tsx`, `ui/sidebar.tsx`, `__root.tsx`, `settings.tsx`, `entities.ts`, `apps/web/package.json`, `GitVcsDriverCore.test.ts`). The duplicate-line and dropped-side checks found nothing, and every delta guard held, including `FEATURES.serverUpdateBanner` after pingdotgg#13083 rewrote the offline banner code. - **File counts:** 126 files landed, exactly the 126 upstream changed. The fork delta is 756 files, unchanged. - **New upstream files in fork-owned areas:** three matched the sweep. `auth/replayMarkers.ts` and its test are upstream's own server auth; `ConnectionFormField.test.tsx` is a mobile test. Neither touches a fork-owned surface. - **`UnsupportedMethodError` union:** no methods to add or drop. ## Verification `verify.mjs` (full run) passed all 10 checks: duplicate-adds, tripwires, resolution-check, unsupported-methods, lockfile, fmt, lint, typecheck, build and test. ## Usable as-is - Queued messages now send while their thread is not open (`QueuedMessageSender`, `sendQueuedMessage.ts`, pingdotgg#13764). - Keyboard navigation for Usage, plus `useNavigateBack` (pingdotgg#10158). - Usage identifies which side has the version mismatch (pingdotgg#8208) and tolerates newer provider variants (pingdotgg#10076). - Accessibility fixes: control announcements, sidebar traversal, focus rings (pingdotgg#13491, pingdotgg#13344). - Other web fixes: reasoning-arrow alignment, tooltip resize, Mod+B on non-Latin keyboard layouts, terminal links dropping a trailing colon. - Faster project and thread sorting, and saving the thread-list cache no longer freezes the UI (pingdotgg#13759, pingdotgg#13767). - Mobile link and composer fixes. ## Unsupported in Moatless / needs implementation - Nothing new. The upstream changes in this range to editor discovery (pingdotgg#13669), Cursor Keychain prompts (pingdotgg#13870) and device tools (pingdotgg#13908) sit behind surfaces the fork already gates (`openInEditor`, `providerConfiguration`, `deviceHub`). ## Backend behavior to consider reproducing in Moatless Added to `docs/fork/gaps.md` under *Runtime fixes upstream made to its own server*: - **pingdotgg#13812:** the background git status fetch passes `--no-auto-gc`. Without it, a failing auto gc leaves a full-size `tmp_pack_*` behind on every fetch and can fill the disk. - **pingdotgg#13765:** the settlement and PR sweeps read only threads that can still settle. - **pingdotgg#13774:** the relay and session reaper no longer wake up on idle sessions. Also relevant but not recorded as gaps: pingdotgg#13736 (`OTEL_*_EXPORTER=none` honoured per signal) and pingdotgg#13695 (expired replay-protection files pruned from the secrets directory). ## Caveat Running `vp install` again after committing changes two `type-fest` entries in the lockfile (5.7.0 → 5.10.0). I kept the committed re-derived lockfile, which passes the `lockfile` check. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- Moatless task: https://moatless.soaplabstest.com/tasks/06f86e30-4ca2-4771-bf22-feb0699349ff
An offline server with a cached version mismatch could display “Finishing an update” despite no update being started.
Remove that inference and reuse the existing reconnecting/offline banner. Known running updates retain their progress banner. After refreshing during an update, the client now shows connection status until the server returns because its in-memory update state is lost.
Validation: focused ChatView logic tests, web typecheck, targeted lint and formatting. Screenshots omitted by maintainer agreement because this reuses existing status presentation.
Implemented with GPT-6 in Codex.
Summary by CodeRabbit