Clear TODO backlog: --debug/--profile, codex selection, MCP orientation, perf
- Add --debug[=DIR] / --profile[=DIR] flags that write run artefacts
(patterm.log, events.jsonl, per-child raw PTY captures, CPU + heap
+ goroutine pprof) to a dir without polluting stdout/stderr.
- Strengthen vendor-TUI orientation in three places (MCP
initialize.instructions, the spawn_agent tool description, and
help('spawning')) to head off codex's habits of poking the Unix
socket via perl and shelling out to launch peers — both bypass
caller identity and produce orphaned top-level tabs.
- Fix click-and-drag text selection from alt-screen TUIs. Host SGR
mouse reporting now follows the focused child's screen side
instead of being permanently armed; alt-screen TUIs that need
mouse re-enable it themselves and the toggle is forwarded.
- Move drawSidebar() off the per-PTY-chunk hot path. Long claude
session resume was paying a full sidebar rebuild for every
scrolled chunk; the chrome ticker now drains a dirty flag at 60 Hz.
- Gate the per-chunk Title() CGO poll on a containsOSC scan so
codex/ratatui's many SGR-only chunks no longer pay a CGO call each.
This commit is contained in:
@@ -24,8 +24,36 @@ func TestViewportRendererShiftsCursor(t *testing.T) {
|
||||
func TestViewportRendererSwallowsAltScreenToggles(t *testing.T) {
|
||||
vr := newViewportRenderer(newTerminalLayout(120, 40))
|
||||
got := string(vr.Render([]byte("a\x1b[?1049hb\x1b[?1049lc")))
|
||||
// The ?1049h/l toggles themselves must not reach the host (patterm
|
||||
// owns its own alt screen). On the transition we re-sync host mouse
|
||||
// reporting so codex (which doesn't request mouse) lets the user
|
||||
// drag-select; leaving alt re-arms it for primary-screen wheel
|
||||
// scrollback.
|
||||
want := "a\x1b[?1000l\x1b[?1006lb\x1b[?1000h\x1b[?1006hc"
|
||||
if got != want {
|
||||
t.Fatalf("alt-screen toggles: got %q want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestViewportRendererMouseTrackingFilteredOnPrimary(t *testing.T) {
|
||||
vr := newViewportRenderer(newTerminalLayout(120, 40))
|
||||
got := string(vr.Render([]byte("a\x1b[?1000lb\x1b[?1000hc")))
|
||||
if got != "abc" {
|
||||
t.Fatalf("alt-screen toggles: got %q", got)
|
||||
t.Fatalf("mouse mode on primary should be filtered: got %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestViewportRendererMouseTrackingForwardedOnAlt(t *testing.T) {
|
||||
vr := newViewportRenderer(newTerminalLayout(120, 40))
|
||||
// Enter alt; subsequent mouse-mode toggles should reach the host so
|
||||
// alt-screen TUIs (vim, less) can run with mouse on, and selection-
|
||||
// using ones (codex) stay with mouse off.
|
||||
got := string(vr.Render([]byte("\x1b[?1049h\x1b[?1000lx\x1b[?1000hy")))
|
||||
if !strings.Contains(got, "\x1b[?1000l") {
|
||||
t.Fatalf("alt-screen mouse disable should reach host: %q", got)
|
||||
}
|
||||
if !strings.Contains(got, "\x1b[?1000h") {
|
||||
t.Fatalf("alt-screen mouse enable should reach host: %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user