Skip to content

feat: Workspace tabs + splits + agent launcher (v7.8.0) - #237

Merged
vakovalskii merged 1 commit into
mainfrom
feat/workspace-splits
Jul 20, 2026
Merged

vakovalskii merged 1 commit into
mainfrom
feat/workspace-splits

Conversation

@vakovalskii

Copy link
Copy Markdown
Owner

What

Turns the single-pane terminal into an iTerm-like workspace:

  • Named tabs — double-click to rename; + to add, × to close.
  • Splits — each tab splits into 1–4 panes (layout buttons or + Pane); every pane is an independent xterm + WebSocket + server-side pty.
  • Agent launcher — a per-pane Launch ▾ dropdown types an agent command (Claude Code / Codex / Qwen / OpenCode / Kiro / Gemini) straight into that pane's shell.
  • Background tabs stay alive — each tab keeps its own hidden grid, so switching tabs never kills a running shell; only the active grid is shown.

How

  • Model: _wsTabs = [{ id, name, panes:[{id,cmd,term,sock,fit,ro}] }] + _wsActiveTabId.
  • Panes reconcile incrementally (append/remove DOM, no innerHTML rebuild), so live panes are never torn down when adding/removing others.
  • A ResizeObserver per pane refits xterm + notifies the pty ({t:'resize'}) on any layout/window/tab change.
  • renderWorkspace is idempotent — background dashboard refreshes (active-session poll, session reload) call render() while on this view and must not reset the terminal.
  • No server changes — the server already spawns one pty per /ws/terminal connection.

Testing

  • Full suite: 166 pass, 2 skipped (win32), 0 fail.
  • Browser: 2 tabs with 2- and 3-pane layouts → 5 live ptys; distinct shells; rename works; switching to a background tab and back keeps its panes/ptys alive.

Next (per docs/SUPERAPP_PLAN.md)

WebGL renderer + context-loss fallback, drag-resize pane borders, tmux-less persistence (pty-host + serialize/replay so tabs/panes survive reload), saved commands & per-project cwd, proxy.

Version

Minor bump 7.7.0 → 7.8.0.

🤖 Generated with Claude Code

Turns the single-pane terminal into an iTerm-like workspace:
- Named tabs (double-click to rename); + to add, × to close.
- Each tab splits into 1–4 panes via layout buttons or "+ Pane"; every
  pane is an independent xterm + WebSocket + server-side pty.
- Per-pane "Launch" dropdown types an agent command (claude/codex/qwen/
  opencode/kiro-cli/gemini) straight into that pane's shell.
- Background tabs stay alive on switch: each tab keeps its own hidden
  grid so its ptys keep running; only the active grid is shown.
- Panes reconcile incrementally (no innerHTML rebuild) so live panes are
  never torn down when adding/removing others; a ResizeObserver refits
  each pane and notifies the pty on any layout/window change.
- renderWorkspace is idempotent so background dashboard refreshes never
  reset the terminal.

Verified in a browser: 2 tabs with 2- and 3-pane layouts, 5 live ptys,
rename, and background-tab survival across switches. No server changes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vakovalskii
vakovalskii merged commit a51cac8 into main Jul 20, 2026
6 checks passed
@vakovalskii
vakovalskii deleted the feat/workspace-splits branch July 20, 2026 06:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant