github / github/copilot-cli

ANSI escape stripping garbles output at PTY read boundaries

未關閉
#2,103 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
area:terminal-rendering area:tools
主要語言
Shell
星號
11.2k
分支
1.9k
平均合併
14 小時 16 分鐘
30 天內合併 PR
6

描述

## Describe the bug

The bash tool's ANSI-stripping logic garbles output when escape sequences are split across PTY read boundaries. Fragments like `1m`, `]8;;`, or URL text from OSC 8 hyperlinks leak into captured output. The bug is non-deterministic — the same command can produce different garbled lines or sometimes render cleanly.

## Affected version

1.0.6

## Steps to reproduce

Run this in a Copilot CLI session (no dependencies needed — pure bash):

```bash
for d in $(seq -w 4 17); do
printf '\e]8;;https://example.com/2026-03-%s\aDate-%s\e]8;;\a \e[1mA\e[22m \e[36mB\e[39m \e[32mC\e[39m \e[31mD\e[39m\n' "$d" "$d"
done
```

Run multiple times. Some runs will show garbled output on one or more lines, such as:
```
Date-13 A B C D
ttps://example.com/2026-03-14Date-14 A B C D ← URL leaked
Date-15 A B C D
```
or:
```
Date-14]8;; A B C D ← OSC fragment leaked
```

Other runs of the exact same command will be completely clean.

## Expected behavior

All escape sequences should be fully stripped in every run, producing 14 identical lines of `Date-XX A B C D`.

## Additional context

The stripping appears to process bytes as they arrive from each PTY `read()` call. Since reads don't align with writes, an escape sequence can be split across two reads. Neither contains the complete sequence, so the regex fails to match and leaves fragments in the output. The non-determinism (different lines garbled across runs, sometimes clean) confirms this is a read-timing issue, not a regex pattern bug.

貢獻指南

開啟貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。