Skip to content

fix(web): port upstream chat view, composer and timeline fixes - #457

Merged
rynfar merged 15 commits into
pylonfrom
upstream/2026-09-10-web-composer
Sep 11, 2026
Merged

fix(web): port upstream chat view, composer and timeline fixes#457
rynfar merged 15 commits into
pylonfrom
upstream/2026-09-10-web-composer

Conversation

@rynfar

@rynfar rynfar commented Sep 11, 2026

Copy link
Copy Markdown
Collaborator

Several chat view, composer and timeline fixes landed upstream in T3 Code: timestamp tooltips could mix languages, task rows only showed state as a glyph colour, streaming rebuilt checkpoint maps on every token, the composer footer and branch bar shifted while a thread loaded, and there was no shortcut to stop a running turn.

This ports 11 upstream sources through the frozen head 6c583620ff7ad3235b135af7107c0543467eecfa (tracking #414), one cherry-pick per source, each spliced into Pylon's version of the file. The 12th source in this lane, #9871 (attach files to question answers), crosses contracts, server, web and mobile, so it lands in its own PR.

Sources

Upstream commit Upstream PR Outcome
2c3353578098a9e55e203a72217abe993f97987e pingdotgg/t3code#10256 Adopted
aea9ecbc482a3d2c14d1828cb5eeaaa9294d1320 pingdotgg/t3code#10128 Adopted, with Pylon's waiting state kept
076d753ae6cb97136b6b4199fb8fc0b379282dba pingdotgg/t3code#10118 Adopted, keeping Pylon's rollback proof
b919d6389929698ddf223d35d20139f01c8bc899 pingdotgg/t3code#10478 Adopted
dadba6d95d2c4515956a6c7fef184378987e13b7 pingdotgg/t3code#2981 Adopted for interactive composers
09e8de9c655ae85410bf6b00446f272a01da81c7 pingdotgg/t3code#4308 Adopted, plus a command palette action
8588d7f63bf57e6285daafe035708cc22a99619c pingdotgg/t3code#10610 Adopted
50a76cee7c56ac22568e549dc855248967bfb9ab pingdotgg/t3code#10543 Adopted
134b7194b125dd4881ff6040f66997b23489b72e pingdotgg/t3code#8531 Adopted
de545c41737aca08359244b7778ab52e55934f17 pingdotgg/t3code#10727 Adopted
7fbc545ae8c7866ac2b39648120cb2a17250d8b4 pingdotgg/t3code#10768 Adopted, flag decided for every provider
7220dfe2c949476eaa7d21eccbcd3a0ce0eddb49 pingdotgg/t3code#9871 Separate PR

Pylon adaptations

  • Rollback (#10118). Upstream moves checkpoint and revert-count lookups into the timeline row projection, so streamed tokens skip them. Pylon does the same, but a revert button still needs Pylon's exact rollback proof: the checkpoint before the response must be ready with rollbackAvailability verified. Upstream's inferred turn counts are not used. The projection derives targets with deriveRollbackTargets over server messages only: optimistic sends and /feedback transcripts are excluded through a local id set that keeps its identity while a turn streams, so a local message can never claim a revert button. A click derives the full target (expected source revision and label) again from the server thread. buildRollbackTurnCountByMessageId and ChatView's per-token target memo are gone. Tests cover proof revocation, the unsupported state, a checkpoint landing after the turn settles, a later count moving the target, a feedback transcript between a request and its checkpointed response, and a 250-turn thread streaming with zero checkpoint reads.
  • Stop (#4308). The Stop button, thread.stop and a new Stop the running turn command palette action (via the composer handle) share one interrupt. Pylon's Stop button also works while a turn is still waiting for provider admission (session.status === "starting"), so the guard covers that case too. Upstream's guard allows only a running session, which would have silently broken Stop during admission. Covered by a test.
  • Fast mode (#2981). Normal is the default only for interactive composers. The carve-out only affects boolean fastMode options (Codex, Claude and Cursor models); Prime's speed control is a serviceTier select and is unaffected either way. Pylon's background text generation dispatches descriptor defaults, and its Settings pickers show those defaults, so keeping generation out of the implicit Normal keeps what is sent matching what Settings shows. Covered by a test.
  • Task rows (#10128). Pylon's badge has a waiting status and a screen-reader-only status prefix. The new visible labels replace that prefix, so status is announced once, and the shared label map now says "Running", matching upstream. Waiting steps keep their owner label.
  • Context window slot (#10768). This keeps Pylon's contextWindowIndicatorEnabled setting and its on-by-default behaviour. reportsContextWindow is true for Codex, Claude, and Prime in daemon mode, which emit thread.token-usage.updated. It is false for Prime's ACP compatibility mode (stamped per backend, with a test). Cursor, Grok, OpenCode and Antigravity emit no usage, so they leave it unset and reserve no slot.
  • Toolbar labels (#10478). Pylon's locked workspace label never took an earlier upstream motion wrapper, so only the trigger labels changed.
  • Mobile. Nothing in this PR changes the mobile app. thread.stop and its palette action are web/desktop only, because mobile has no keybinding system or command palette and keeps its own Stop button. The minimap turn navigation does not apply, since mobile has no minimap. reportsContextWindow is advertised in every provider snapshot, but only the web composer reserves the meter slot; the mobile composer's context ring is unchanged, as upstream's #10768 is web-only.
  • Docs. docs/user/keybindings.md documents thread.stop. docs/user/source-control.md says proactive panels open the linked review and the latest completed turn's diff when you enter a thread. docs/user/status-indicators.md describes the visible task states and the N/M complete count.

Nothing Pylon-original was removed. The screen-reader-only task status prefix is replaced by visible text that carries the same information.

Verification

  • vp test run on 25 files: 853 tests pass. Files: timestampFormat, ComposerTasksBadge, TaskProgressStatus, ChatView.logic, MessagesTimeline logic and component, BranchToolbar.logic, composerProviderState, composerDraftStore, keybindings (web and contracts), KeybindingsSettings.logic, CommandPalette.logic, rightPanelStore, composerFooterLayout, ComposerBannerStack, ContextWindowMeter logic and component, ComposerPrimaryActions, ProviderModelPicker, GitActionsControl.logic, providerSnapshot, CodexProvider, PrimeAgentProvider, client-runtime rollback.
  • Typechecks: @t3tools/web, t3, @t3tools/contracts and @t3tools/client-runtime report no errors.
  • vp lint on 40 changed TypeScript files: 0 warnings, 0 errors. vp fmt --check on all 44 changed files is clean.
  • No local client pass was run. The orchestrator runs one integrated pass. Upstream screenshots and videos are in the descriptions of fix(web): keep timestamp tooltip dates in English pingdotgg/t3code#10256, #10128, #10118, #10478, #4308, #10543 and #8531. #2981, #10610, #10727 and #10768 have none.

Ported by Claude Opus 5 in Claude Code.

@vercel

vercel Bot commented Sep 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
pylon-marketing Ready Ready Preview Sep 11, 2026 1:30am UTC

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL labels Sep 11, 2026
@github-actions

github-actions Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 14.1 KiB 13.9 KiB −150 B (−1.0%) 15.1 KiB
Codex Thread snapshot wire 7.2 KiB 7.2 KiB +11 B (+0.1%) 7.3 KiB
Codex Live turn WebSocket wire 6.9 KiB 6.7 KiB −161 B (−2.3%) 7.8 KiB
Codex Live turn WebSocket decoded 58.8 KiB 58.0 KiB −910 B (−1.5%) 66.4 KiB
Codex Live turn messages 10 8 −2 (−20.0%) 21
Claude Total thread wire 14.1 KiB 13.9 KiB −177 B (−1.2%) 15.1 KiB
Claude Thread snapshot wire 7.2 KiB 7.2 KiB +5 B (+0.1%) 7.3 KiB
Claude Live turn WebSocket wire 6.9 KiB 6.7 KiB −182 B (−2.6%) 7.8 KiB
Claude Live turn WebSocket decoded 59.7 KiB 58.8 KiB −928 B (−1.5%) 66.4 KiB
Claude Live turn messages 10 8 −2 (−20.0%) 21

Baseline: 16a9968 · PR result: 1004a33 · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 115.6 KiB
  • Claude decoded thread snapshot: 116.3 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Lucenx9 and others added 15 commits September 10, 2026 19:26
(cherry picked from commit 2c3353578098a9e55e203a72217abe993f97987e)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
(cherry picked from commit aea9ecbc482a3d2c14d1828cb5eeaaa9294d1320)
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 076d753ae6cb97136b6b4199fb8fc0b379282dba)
…(#10478)

(cherry picked from commit b919d6389929698ddf223d35d20139f01c8bc899)
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
(cherry picked from commit dadba6d95d2c4515956a6c7fef184378987e13b7)
Adds thread.stop with no default shortcut. The Stop button, the new
command palette action, and the shortcut share one interrupt path, which
also covers a turn still awaiting provider admission.

Adopted from 09e8de9c655ae85410bf6b00446f272a01da81c7 (#4308)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
(cherry picked from commit 8588d7f63bf57e6285daafe035708cc22a99619c)
(cherry picked from commit 50a76cee7c56ac22568e549dc855248967bfb9ab)
(cherry picked from commit 134b7194b125dd4881ff6040f66997b23489b72e)
…ad (#10727)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit de545c41737aca08359244b7778ab52e55934f17)
…768)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 7fbc545ae8c7866ac2b39648120cb2a17250d8b4)
Optimistic sends and /feedback transcripts sit in the timeline but never
exist on the server. A transcript sorted between a request and its
checkpointed response took that request's revert button. The projection
now derives targets from server messages only, using a local id set that
keeps its identity while a turn streams.

Also covers a checkpoint landing after a turn settles, a later count
moving the target, and revoking its proof.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 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.

10 participants