Bundles the in-flight work into the first tagged release. See CHANGELOG.md `[0.0.1] - 2026-05-14` for the full per-change list. Highlights: - Sidebar / chrome stability: clamp absolute cursor positioning and printable bytes to the viewport so long-running TUIs (claude, codex) can't spray into the right rail; bound tab bar's row clear to the viewport width so the rail isn't wiped on every tab redraw; flag scroll escapes (RI/IND/NEL/SU/SD/IL/DL) and clamp `CSI 0/1/2 J`/`K` to viewport columns. - Palette: "Spawn process…" form, macros (`sw `, `k `, `sp `), kill entries mark the focused tab, dead agents drop out of the switch list. - Sidebar: split into Processes (session-wide) + Agent Tree (per-active-agent) sections; relaunch indicator; Ctrl+W/S walks the combined list, Ctrl+A/D steps tabs. - MCP: protocol handshake (`initialize`, `tools/list`, `tools/call`, `ping`), `mcp_injection.kind = cli_override / config_env` so codex and opencode pick up the server with no file writes, `lifecycle` help topic and tool-description cleanup-duty pointers. - Lifecycle: orchestrator-spawned children cascade-killed when the parent dies; orchestrator-injected prompts end with CR + delayed Enter so claude submits cleanly.
This commit is contained in:
@@ -30,8 +30,14 @@ func (st *uiState) drawTabBar() {
|
||||
return
|
||||
}
|
||||
|
||||
// Tabs list top-level agent sessions only. Command/terminal
|
||||
// processes live in the Processes sidebar section and never own a
|
||||
// tab — they're global to the session, not per-tab.
|
||||
var sessions []*Child
|
||||
for _, c := range st.sess.Children() {
|
||||
if c.Kind != KindAgent {
|
||||
continue
|
||||
}
|
||||
if c.ParentID == "" && c.Status() == StatusRunning {
|
||||
sessions = append(sessions, c)
|
||||
}
|
||||
@@ -125,9 +131,13 @@ func (st *uiState) drawTabBar() {
|
||||
|
||||
var b strings.Builder
|
||||
// Clear both rows so a stale label from the previous frame can't
|
||||
// bleed through.
|
||||
b.WriteString("\x1b[1;1H\x1b[2K")
|
||||
b.WriteString("\x1b[2;1H\x1b[2K")
|
||||
// bleed through. Use ECH clamped to `width` (= childCols) instead of
|
||||
// `\x1b[2K`: 2K wipes the entire line including the sidebar columns,
|
||||
// and if drawSidebar's chrome cache is fresh it won't repaint to
|
||||
// fill them back in — the user sees a gap where the sidebar border
|
||||
// and content should be.
|
||||
fmt.Fprintf(&b, "\x1b[1;1H\x1b[%dX", width)
|
||||
fmt.Fprintf(&b, "\x1b[2;1H\x1b[%dX", width)
|
||||
|
||||
for _, t := range tabs {
|
||||
// Row 1: centre-ish label inside the tab cell.
|
||||
|
||||
Reference in New Issue
Block a user