feat: sidebar hierarchy tree-line connectors - #126
Conversation
Add CSS-drawn tree-line connectors (├─/└─) to the hierarchy view in the sidebar Agents section, giving a clear visual trace of parent-child relationships between agents. Key design decisions: - Compact connectors (10px indent, 5px arm) to minimize sidebar space usage - Guide lines aligned with parent status icon centers via recursive guideX/treePaddingLeft computation - Colored left border preserved on parent nodes (blue=expanded, dim=collapsed) - Downward connector from parent icon to children, hidden when collapsed - No connectors at root level (depth 0) — only children get tree lines Implementation: - TreeLineGuides component renders vertical continuation lines + branch/elbow connectors as absolutely positioned divs in a pointer-events-none overlay - HierarchyNodeRow passes isLastChild and ancestorIsLast[] through the tree recursion to determine which guides to draw - SessionRow gains paddingLeftOverride prop for hierarchy-specific padding - Exited/stopped rows wrapped in borderless div for correct guide alignment Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
f88201e to
8a6e1fc
Compare
nox-0x
left a comment
There was a problem hiding this comment.
Solid implementation of tree-line connectors for the hierarchy view. The recursive geometry calculations (guideX / treePaddingLeft) are well-reasoned and produce consistent alignment with parent icon centers across all depth levels. ancestorIsLast propagation is correct, TreeLineGuides handles the last-child elbow vs branch case properly, and the pointer-events-none overlay avoids interaction conflicts. No critical issues found — LGTM ✅
nox-0x
left a comment
There was a problem hiding this comment.
Reviewed the full diff. The geometry functions (guideX, treePaddingLeft) are correctly recursive — icon center alignment is consistent at every depth. ancestorIsLast propagation is logically sound (i > 0 guard correctly skips depth-0 ancestor level in the reduce). The pointer-events-none overlay with zIndex:1 is safe, and indent={0} with paddingLeftOverride is the right split for SessionRow. No critical or blocking issues. LGTM ✅
Add ghostty-web (Coder's WASM-based terminal emulator) as an alternative renderer to xterm.js, switchable live via the Settings panel. Architecture: - terminal/ directory with typed TerminalInstance interface, factory pattern, and separate backend modules (xterm-backend.ts, ghostty-backend.ts) - Live switching: changing renderer recreates terminals instantly via React effect lifecycle — PTY survives, output buffer replays - Server-side persistence: setting stored in ~/.autonomos/settings.json - Client-side reactivity: Zustand store triggers terminal re-creation Key design decisions: - Static imports (both renderers bundled) — localhost dashboard, bundle size irrelevant - Typed interface catches API mismatches at compile time - WASM init() uses promise deduplication to prevent race conditions - Error feedback: failed backend shows message in terminal container + status bar Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add ghostty-web (Coder's WASM-based terminal emulator) as an alternative renderer to xterm.js, switchable live via the Settings panel. Architecture: - terminal/ directory with typed TerminalInstance interface, factory pattern, and separate backend modules (xterm-backend.ts, ghostty-backend.ts) - Live switching: changing renderer recreates terminals instantly via React effect lifecycle — PTY survives, output buffer replays - Server-side persistence: setting stored in ~/.autonomos/settings.json - Client-side reactivity: Zustand store triggers terminal re-creation Key design decisions: - Static imports (both renderers bundled) — localhost dashboard, bundle size irrelevant - Typed interface catches API mismatches at compile time - WASM init() uses promise deduplication to prevent race conditions - Error feedback: failed backend shows message in terminal container + status bar Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: swappable terminal renderer — xterm.js + ghostty-web (#126) Add ghostty-web (Coder's WASM-based terminal emulator) as an alternative renderer to xterm.js, switchable live via the Settings panel. Architecture: - terminal/ directory with typed TerminalInstance interface, factory pattern, and separate backend modules (xterm-backend.ts, ghostty-backend.ts) - Live switching: changing renderer recreates terminals instantly via React effect lifecycle — PTY survives, output buffer replays - Server-side persistence: setting stored in ~/.autonomos/settings.json - Client-side reactivity: Zustand store triggers terminal re-creation Key design decisions: - Static imports (both renderers bundled) — localhost dashboard, bundle size irrelevant - Typed interface catches API mismatches at compile time - WASM init() uses promise deduplication to prevent race conditions - Error feedback: failed backend shows message in terminal container + status bar Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Summary
Design
Key decisions:
guideX/treePaddingLeftfunctions align guides with parent icon centers rather than using a fixed linear formulaTreeLineGuidescomponent renders as apointer-events-noneoverlay withz-index: 1Test plan
make checkpasses (biome lint + tsc + 70 tests)page.statusFg)🤖 Generated with Claude Code