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:
@@ -22,6 +22,7 @@ func (st *uiState) drawSidebar() {
|
||||
st.mu.Lock()
|
||||
palOpen := st.palette != nil
|
||||
focus := st.focusedID
|
||||
activeAgent := st.activeAgentID
|
||||
st.mu.Unlock()
|
||||
if palOpen {
|
||||
return
|
||||
@@ -70,12 +71,46 @@ func (st *uiState) drawSidebar() {
|
||||
return styleHint + "●" + styleReset
|
||||
}
|
||||
|
||||
writeHeader("Session tree")
|
||||
children := visibleSessionTree(st.sess.Children(), focus)
|
||||
if len(children) == 0 {
|
||||
// Processes section — top-level command/terminal processes,
|
||||
// session-wide (does not change when the user switches agent tabs).
|
||||
writeHeader("Processes")
|
||||
procs := processList(st.sess.Children())
|
||||
if len(procs) == 0 {
|
||||
write(" " + styleDim + "(none)" + styleReset)
|
||||
}
|
||||
for _, c := range procs {
|
||||
if row > maxRow {
|
||||
break
|
||||
}
|
||||
focused := c.ID == focus
|
||||
glyph := statusGlyph(c, focused)
|
||||
marker := ""
|
||||
if c.AutoRestart() {
|
||||
marker = " " + styleDim + "⟳" + styleReset
|
||||
}
|
||||
var line string
|
||||
if focused {
|
||||
line = " " + styleAccent + "▎" + styleReset + " " + glyph + " " +
|
||||
styleBold + c.DisplayName() + styleReset + marker
|
||||
} else {
|
||||
line = " " + glyph + " " + styleHint + c.DisplayName() + styleReset + marker
|
||||
}
|
||||
write(line)
|
||||
}
|
||||
|
||||
// Agent Tree section — formerly "Session tree". Shows the active
|
||||
// agent tab's root plus its sub-agents. The active agent is pinned
|
||||
// by activeAgentID, so the tree keeps showing the right tab even
|
||||
// when focus moves into the Processes section above.
|
||||
if row+2 <= maxRow {
|
||||
write("")
|
||||
}
|
||||
writeHeader("Agent Tree")
|
||||
agents := visibleAgentTree(st.sess.Children(), activeAgent)
|
||||
if len(agents) == 0 {
|
||||
write(" " + styleDim + "(empty)" + styleReset)
|
||||
}
|
||||
for _, c := range children {
|
||||
for _, c := range agents {
|
||||
if row > maxRow {
|
||||
break
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user