Skip to content

fix(web): stop mistaking offline servers for updates - #13083

Merged
Yash-Singh1 merged 1 commit into
pingdotgg:mainfrom
tris203:t3code/fix-offline-server-status
Sep 26, 2026
Merged

Yash-Singh1 merged 1 commit into
pingdotgg:mainfrom
tris203:t3code/fix-offline-server-status

Conversation

@tris203

@tris203 tris203 commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

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

  • Bug Fixes
    • Reconnecting environments with version mismatches now use the standard unavailable status instead of a specialized connecting or reconnecting update message.
    • Unavailable status messaging is suppressed while an update is in progress and during the reconnect-warning grace period.
    • Version-mismatch update notifications remain visible when applicable.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 22, 2026
@macroscopeapp

macroscopeapp Bot commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at a09004d

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.

@coderabbitai

coderabbitai Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

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 configuration

Configuration used: Repository: pingdotgg/t3code/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 45962762-d7fb-479f-92c7-f5cd85ef9159

📥 Commits

Reviewing files that changed from the base of the PR and between a09004d and 0606679.

📒 Files selected for processing (1)
  • apps/web/src/components/ChatView.tsx

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.


📝 Walkthrough

Walkthrough

systemComposerBannerItems now uses the standard unavailable banner for version-skew reconnects. The banner remains suppressed while an update runs or during the reconnect-warning grace period. The version-mismatch update banner is no longer suppressed during version-skew reconnects.

Changes

Reconnect banner handling

Layer / File(s) Summary
Standard reconnect banner path
apps/web/src/components/ChatView.tsx
Removed the special version-skew reconnect progress banner and its update-notice suppression. Reconnecting environments now use the standard unavailable banner logic.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Suggested reviewers: t3dotgg

Merge Risk: ⚪ Minimal · up to 06066

No established issue currently blocks merging this banner change.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 06066

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

  • Low · reliability · inferred: A cached version mismatch can now present Update during reconnect even when the client has lost its in-memory update state. Existing guards reject an update already in flight on the running server, but cross-refresh and post-handoff repetition are not fully established.
Security review details

Security Blast Radius

  • inferred — The newly reachable action is limited to the existing environment-targeted update flow; the inspected change does not increase RPC privilege or establish a new cross-service entrypoint.

Trust Boundaries and Controls

  • observed — The banner does not authorize updates itself. The existing RPC enforces operate-scope authorization, while the server update owner rejects an update already in flight in the running service.

Resilience and Maintainability Implications

  • inferred — Same-tab pending protection and server-side in-flight protection limit repetition, but the inspected evidence does not settle duplicate initiation after a refresh or server handoff.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main fix: offline servers are no longer mistaken for updates. It is concise and specific.
Description check ✅ Passed The description explains what changed, why it changed, the UI presentation decision, and validation performed. It does not use the template headings or checklist, but it covers the required informatio…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
  • Fix all pre-merge checks with AI
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR

Comment @coderabbitai help to get the list of available commands.

@tris203
tris203 force-pushed the t3code/fix-offline-server-status branch from a09004d to 0606679 Compare September 26, 2026 14:12
@Yash-Singh1
Yash-Singh1 merged commit dd582de into pingdotgg:main Sep 26, 2026
22 checks passed
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 26, 2026
## 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
aorwall added a commit to aorwall/t3code that referenced this pull request Sep 27, 2026
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M 30-99 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants