Repository navigation
fix(server): keep terminal history after cancelled sequences - #25193
Conversation
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a focused server bug fix that preserves terminal output after cancelled control sequences, with targeted regression tests covering the supported sequence forms. It does not alter product defaults, schemas, deployment behavior, or static-analysis settings. You can add or adjust custom eligibility rules. Learn more. |
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. |
|
No actionable comments were generated in the recent review.
|
| Layer / File(s) | Summary |
|---|---|
Cancellation-aware history parsing apps/server/src/terminal/Manager.ts, apps/server/src/terminal/Manager.test.ts |
The sanitizer recognizes CAN and SUB in control-string and CSI parsing. Parameterized tests check that output following canceled ESC and C1 sequences is retained in reopened history. |
Priority:
Estimated code review effort: 2 (Simple) | ~10 minutes
Change: Bug fix
Possibly related PRs
- pingdotgg/t3code#23819: Updates the same terminal-history sanitizer’s terminator scanning for ESC- and C1-prefixed string sequences.
Suggested labels: bugfix, size:S, takeover
Suggested reviewers: t3dotgg
Merge Risk: 
Minimal · up to 25d71
-
No actionable merge-blocking risk is identified; merge after normal checks.
Pre-merge checks: 
4
-
Full details: Description check
-
Explanation
The pull request includes all required sections: Problem, Change, Scope and approval, and Verification. It explains the bug, fix, approval basis, focused test results, manual verification, screenshots, unverified environments, and agent details.
-
Finishing Touches
-
📝 Generate docstrings
-
- Commit to this branch
- Create a new PR
🧪 Generate unit tests (beta)
-
- Commit to this branch
- Create a new PR
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Comment @coderabbitai help to get the list of available commands.
|
Note Written by Verified in a real dev environmentverified unchanged head added a project pointing at a real git repository through the app, created a thread, selected codex typed this command into the web terminal on both revisions: printf '\033[2J\033[HBEFORE_CANCEL\n\033]0;unfinished\030AFTER_CAN\nNORMAL_OUTPUT\n'also ran a real node process through the web terminal producing 40 combinations: osc/dcs/pm/apc/csi in esc and c1 forms, can/sub cancellation, and single/split writes. the terminal snapshot delivered over the running server's websocket after reload contained all 40 unique following-output markers. normal osc termination and ansi color output remained; dcs and csi queries remained stripped from saved history. these checks cover retained server output, rather than claiming full native c1 rendering support. blacksmith: main after reload, where the following lines disappear: pr after reload with the same terminal command and project: pr terminal drawer close and reopen retains the output: inspected the captures and verified uploaded video playback and seeking in t3's browser. Not verifiednative electron, ios/android, macos/windows shells, and remote/relay/tunnel connections were not exercised on this linux vm. other providers were not exercised; the changed terminal history parser is shared server code. full c1 visual interpretation is outside this parser check. |
**v0.1.6-nightly.20261029.3892** · 86 changes from 24 contributors ## Highlights Resize the file explorer to see long paths. ## Fixes - Commits no longer land on a switched branch (#24473) - Password-protected OpenCode servers accept configured credentials (#25230) - Provider errors and logs no longer expose certain credentials (#23313) - Signed attachment URLs no longer leak into traces (#24556) - Self-hosted GitLab merge request URLs are recognized (#23848) - Terminal links with wide characters open correctly (#24013) - Terminal history survives cancelled control sequences (#25193) - Review guides use the latest diff (#23225) - MCP forms appear when tool results report errors (#25225) - Clearing desktop browser data also clears cached responses (#22002) <details> <summary>Full changelog</summary> ## What's Changed * fix(web): reconnecting notice no longer shifts the new thread composer by @t3dotgg in pingdotgg/t3code#26958 * feat(marketing): homepage looks like the app by @t3dotgg in pingdotgg/t3code#26960 * fix(cli): restore Windows desktop launcher console input by @t3-code-bot[bot] in pingdotgg/t3code#24870 * feat(settings): add and list 1Password secret providers behind T3CODE_FEATURE_SECRETS by @yordis in pingdotgg/t3code#25709 * fix(mobile): use monospace in the Android terminal preview by @only21mil in pingdotgg/t3code#23401 * fix(web): edit from here uses a pencil icon by @voltcrash in pingdotgg/t3code#21878 * fix(desktop): clear Cache Storage when deleting browser profile data by @only21mil in pingdotgg/t3code#22002 * fix(web): respect reduced motion in thread loading controls by @saphid in pingdotgg/t3code#22100 * fix(provider-acp): redact API keys with underscores in ACP stderr logs by @only21mil in pingdotgg/t3code#24015 * fix(provider-core): redact compound credential keys in provider errors by @only21mil in pingdotgg/t3code#23313 * fix(web): show rounded diff counts as 1m instead of 1000k by @only21mil in pingdotgg/t3code#23723 * fix(desktop): a timed-out login-shell probe no longer skips the server's PATH repair by @tiliakoos in pingdotgg/t3code#21771 * fix(server): keep the previous preview browser version on a shared home by @only21mil in pingdotgg/t3code#23771 * fix(settings): servers check secret provider writes and keep unknown configs to themselves by @juliusmarminge in pingdotgg/t3code#27044 * fix(web): keep a closed split terminal's tab in view by @only21mil in pingdotgg/t3code#22106 * fix(web): the ~ breadcrumb opens the home folder by @Onkarj012 in pingdotgg/t3code#22412 * fix(gitlab): accept merge request URLs from self-hosted hosts by @only21mil in pingdotgg/t3code#23848 * fix(server): commits no longer land on a branch switched in mid-action by @only21mil in pingdotgg/t3code#24473 * fix(server): image attachments report their size when the T3 home is behind a symlink by @MarcoDotIO in pingdotgg/t3code#24245 * fix(ssh): skip directories in config includes by @maria-rcks in pingdotgg/t3code#25187 * fix(server): Authorized clients names Edge, Firefox and Opera on phones correctly by @MarcoDotIO in pingdotgg/t3code#23340 * fix(mobile): fork rows show a readable label instead of a thread ID by @JeremiahDJordan in pingdotgg/t3code#22064 * fix(markdown): formulas ending in a comma render by @NikitaMGrimm in pingdotgg/t3code#22883 * fix(scripts): dev runner expands ~ in --home-dir and T3CODE_HOME by @MarcoDotIO in pingdotgg/t3code#25560 * fix(desktop): keep development protocol requests on the configured server by @only21mil in pingdotgg/t3code#22010 * fix(mobile): apply terminal toolbar modifiers to arrow keys by @only21mil in pingdotgg/t3code#22161 * fix(server): clean old logs and artifacts under a symlinked T3 home by @only21mil in pingdotgg/t3code#24097 * fix(server): preserve URL arguments in Android device actions by @maria-rcks in pingdotgg/t3code#25205 * fix(server): keep terminal history after cancelled sequences by @maria-rcks in pingdotgg/t3code#25193 * fix(auth): accept a typed pairing code regardless of letter case by @only21mil in pingdotgg/t3code#22089 * fix(web): find in thread opens from the thread title menu, so phones can reach it by @mkantautas in pingdotgg/t3code#22352 * fix(desktop): resolve executable commands when checking CLI shadowing by @only21mil in pingdotgg/t3code#22046 * fix(server): SQLite temp files no longer block the event loop by @only21mil in pingdotgg/t3code#24194 * fix(server): a branch named like a tag no longer reads as heads/<name> by @MarcoDotIO in pingdotgg/t3code#24258 * fix(server): cap generated worktree folder names by @maria-rcks in pingdotgg/t3code#25212 * perf(server): checkpoint capture scans the index listing by record instead of by byte by @josephv123 in pingdotgg/t3code#21329 * fix(server): PR discovery sweeps skip hidden subagent threads by @juliusmarminge in pingdotgg/t3code#26983 * fix(shared): stop parsing CLI flags after -- by @maria-rcks in pingdotgg/t3code#25204 * fix(server): remove abandoned v1 database copies on startup by @maria-rcks in pingdotgg/t3code#25301 * fix(web): Enter no longer skips an unanswered question by @mkantautas in pingdotgg/t3code#23626 * fix(web): keep wide characters in terminal links by @only21mil in pingdotgg/t3code#24013 * fix(server): session stops no longer trigger storage sweeps unless a deleted worktree waits by @juliusmarminge in pingdotgg/t3code#26038 * fix(provider-core): subagent threads no longer inherit the parent's pin by @only21mil in pingdotgg/t3code#21271 * fix(device): report failed Android permission changes by @only21mil in pingdotgg/t3code#22358 * fix(server): thread lists load beyond SQLite variable limit by @juliusmarminge in pingdotgg/t3code#25696 * fix(server): allow large git status metadata by @maria-rcks in pingdotgg/t3code#25207 * perf(mobile): flatten large file trees without copying descendants by @luke2x in pingdotgg/t3code#21276 * fix(web): show theme conflicts even when another import fails by @only21mil in pingdotgg/t3code#23223 * fix(usage): reject cyclic model mappings before saving by @only21mil in pingdotgg/t3code#23963 * fix(settings): offer Use existing CLI in managed Codex settings by @only21mil in pingdotgg/t3code#23160 * fix(git): honor project provider settings by @parmartejass in pingdotgg/t3code#23672 * fix(desktop): force-close stalled Linux MIME cache helpers by @maria-rcks in pingdotgg/t3code#25210 * fix(cli): auth pairing create rejects a --base-url without http(s):// by @MarcoDotIO in pingdotgg/t3code#23343 * fix(server): signed asset and upload URLs stay out of HTTP traces by @only21mil in pingdotgg/t3code#24556 * fix(server): clone errors no longer show a token from the URL's query by @only21mil in pingdotgg/t3code#24698 * fix(claude): pass every --add-dir launch directory to Claude by @only21mil in pingdotgg/t3code#23281 * fix(composer): retry expired catalogs after failed discovery by @only21mil in pingdotgg/t3code#23174 * fix(auth): preserve pairing codes after scope rejection by @maria-rcks in pingdotgg/t3code#25222 * fix(mobile): discard unchanged queued edits after starting by @maria-rcks in pingdotgg/t3code#25232 * fix(server): t3 project commands wait for a busy server's reply by @only21mil in pingdotgg/t3code#24090 * fix(web): wait for fresh diff pages in review guides by @only21mil in pingdotgg/t3code#23225 * fix(server): Antigravity stops retrying session startup while signed out by @only21mil in pingdotgg/t3code#24939 * fix(web): create tasks on a permitted connected environment by @only21mil in pingdotgg/t3code#23244 * fix(mobile): recognize this thread's main checkout by @only21mil in pingdotgg/t3code#23764 * fix(web): keep usage hubs that share a host by @only21mil in pingdotgg/t3code#23767 * fix(github): read text and mixed-case pull request templates by @maria-rcks in pingdotgg/t3code#25025 * fix(web): keep HTML prototype selection rings visible by @stevan-borus in pingdotgg/t3code#23745 * fix(mobile): list pull request repositories once per environment by @maria-rcks in pingdotgg/t3code#25219 * fix(shared): Open in Zed prefers zeditor over the ZFS zed on Linux by @pujitha24 in pingdotgg/t3code#23416 * fix(server): native Codex subagents no longer show the parent's reasoning effort by @koushikxd in pingdotgg/t3code#24467 * fix(server): mark unread works after an automatic compaction by @flamboh in pingdotgg/t3code#25286 * fix(server): show MCP App forms from failed tool results by @maria-rcks in pingdotgg/t3code#25225 * fix(server): restore Linux session display for editor launches by @maria-rcks in pingdotgg/t3code#25228 * fix(usage): keep host identity across container recreation by @maria-rcks in pingdotgg/t3code#25220 * fix(opencode): authenticate with the resolved server password by @maria-rcks in pingdotgg/t3code#25230 * feat(web): allow resizing the file explorer by @maria-rcks in pingdotgg/t3code#25737 * fix(server): update shared Codex installs from their owning home by @maria-rcks in pingdotgg/t3code#25235 * fix(cli): keep published runtimes in place during installation by @only21mil in pingdotgg/t3code#24092 * fix(web): right panel launcher letters work on non-Latin keyboard layouts by @MarMarLabs in pingdotgg/t3code#21508 * fix(server): report a deleted or replaced ownership lock by @ScottN-PV in pingdotgg/t3code#21886 * fix(server): mark unread no longer brings back a dismissed wake by @fixfon in pingdotgg/t3code#24080 * fix(mobile): stop refreshes in hidden PR Guide panes by @saphid in pingdotgg/t3code#25486 * fix(desktop): installing the t3 command no longer reports its own launcher as another t3 by @Gourav224 in pingdotgg/t3code#22375 * test(mobile): load the branch occupancy test without native sources by @maria-rcks in pingdotgg/t3code#27063 * fix(settings): project edits keep overrides the client does not know by @only21mil in pingdotgg/t3code#24472 ## New Contributors * @parmartejass made their first contribution in pingdotgg/t3code#23672 **Full Changelog**: pingdotgg/t3code@v0.1.5-nightly.20261029.3877...v0.1.6-nightly.20261029.3892 </details> Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.6-nightly.20261029.3892



Problem
Cancelled terminal control sequences can swallow subsequent output from saved history. Text visible live then disappears when the terminal reconnects or reopens.
Change
Recognize CAN and SUB as cancellation boundaries in CSI and string sequences, retaining the original implementation without refactoring the parser. Extend the existing regression matrix to OSC, DCS, PM and APC in ESC and C1 forms, plus both CSI forms, with split and single-chunk output.
Scope and approval
This is an obvious bug fix: valid cancellation bytes must end a pending control sequence so later terminal output survives replay. This maintainer-directed takeover is limited to that parser behavior and its existing test file.
Verification
888a3d47d3) before the fix; all 53 terminal manager tests pass after it.vp run check:changedpasses formatting, lint, both dependency checks, GraphQL checks, affected package typechecks, and the terminal manager suite.25d718f6fb.Before, after reload:
After, after reload:
Before, live output followed by reload:
After, live output followed by reload:
Takeover
Replaces #23417, with thanks to @yashranaway for the original implementation.
Built with GPT-6.1-Sol in the Codex harness on T3 Code.