feat: add reversible workspace panels
CI / rust (push) Successful in 2m11s

This commit is contained in:
2026-08-31 18:18:20 -07:00
parent 63c9cb6210
commit abcf664ab8
12 changed files with 652 additions and 90 deletions
+6
View File
@@ -89,6 +89,12 @@ approval boundary. The selected panel alone owns keyboard input. Six surfaces
continue updating so performance comparisons remain meaningful, with a sliding
visible window keeping the selected pane onscreen. See decisions 0008 and 0009.
Panel attachment is independent from session lifetime. Detaching removes a pane
from the layout tree but retains its definition in the workspace's detached
registry and leaves its runtime-owned process alive. Reattaching restores that
identity without a launch. Terminating an attached or detached session is a
separate Execute-capability operation. See decision 0010.
We should evaluate, not blindly copy, WezTerm, Zellij, RMUX, tmux, and cmux. The
first spike must compare a reusable terminal crate with a small first-party layer.
Remaining correctness cases include OSC 8 links, Kitty
+7
View File
@@ -79,6 +79,13 @@ capability each choice would need. Suggestions are inert data. Choosing one may
prepare a typed workspace plan, but any command, file mutation, credential use,
or external message still passes through the normal approval and command plane.
Removing a panel detaches it from the layout; it does not terminate the pane's
PTY, agent, browser, or remote session. Detached sessions remain visible in a
workspace tray and can be reattached without relaunching. Termination is a
separate, explicitly named Execute-capability action with confirmation. The add
control creates the default panel beside the selection, with a menu for choosing
a surface or reattaching a running session. At least one panel remains attached.
## Lumbridge Harness
Lumbridge Harness is an optional orchestrator distributed as a separately
+2 -1
View File
@@ -11,7 +11,8 @@ They are shallow snapshots for study, not dependencies or vendored source.
## Multiplexers and terminal engines
- `manaflow-ai/cmux`: the current cmux product; native workspace/pane model,
automation socket, embedded browser, agent hooks, and terminal UX.
automation socket, embedded browser, agent hooks, and terminal UX. The
captured tree is GPL-3.0-or-later, so it is behavior/UX study only.
- `Helvesec/rmux`: Rust multiplexer engine, daemon, typed SDKs, tmux surface.
- `tmux/tmux`: the durable client/server and command model to remain compatible
with where useful.
+4 -2
View File
@@ -104,7 +104,8 @@ who already have the final cargo-watch release installed.
## Implemented vertical-slice coverage
- The framework-neutral six-surface model has deterministic tests for focus,
direct selection, needs-input transitions, command-palette lifecycle,
direct selection, reversible attach/detach, last-panel protection, detached
background updates, needs-input transitions, command-palette lifecycle,
identical GPUI/Floem action replay, bounded output, and workload counters.
- `lumbridge-pty` runs synthetic `/bin/sh` tests for raw output, non-zero exits,
input, resize, one-chunk backpressure, hung-process termination, invalid
@@ -117,7 +118,8 @@ who already have the final cargo-watch release installed.
alternate screen, bracketed paste, protocol replies, sanitized title and
blocked OSC 52 behavior, key encoding, application-cursor mode, and resize.
- `lumbridge-core` tests capability-gated split/select/rename/close commands,
idempotent request IDs, close-tree promotion, and atomic agentic setup plans.
idempotent request IDs, close-tree promotion, detached-pane reattachment,
Execute-gated detached termination, and atomic agentic setup plans.
- The GPUI slice tests its key-event adapter, responsive one/three/five-panel
geometry, selected-panel windowing, per-panel 20/60/20 PTY sizing, xterm
256-color conversion, styled-run coalescing, cursor-run boundaries, and
+5 -2
View File
@@ -25,8 +25,11 @@ The current programs establish dependency, build, launch, and interaction
baselines. GPUI now routes a real PTY through a VT engine and keyboard encoder,
paints coalesced styled cell runs and cursor shapes, and derives PTY rows/columns
from the 60% terminal region inside each responsive one/three/five-panel layout
when the window changes. Retained-history page/top/bottom navigation is wired. Text selection,
mouse modes, a native Markdown editor, and one isolated browser child remain.
when the window or attached panel count changes. Retained-history
page/top/bottom navigation is wired. Panel detach/reattach keeps background
surface updates alive and exposes detached sessions in the sidebar. Text
selection, mouse modes, a native Markdown editor, and one isolated browser child
remain.
## Ubuntu baseline — metal, 2026-08-31
+7
View File
@@ -19,6 +19,11 @@ Remaining visible gaps are terminal text selection and mouse modes, real
decision-shelf actions, usage-detail provenance, and end-to-end platform
accessibility/IME.
Panel lifecycle is now visible in the slice: every panel has a Detach action,
the workspace bar has Add panel, and the sidebar exposes Detached sessions for
reattachment. The wording is deliberate because panel removal keeps its session
alive; termination is not exposed as a visually equivalent close action.
Screenshots for the audit are stored outside Git under
`~/shots/2026-08/lumbridge-ui-audit/`. Accessibility and IME correctness cannot
be established from screenshots and remain explicit runtime gates.
@@ -82,6 +87,8 @@ surface rather than a hosted Lumbridge control plane.
leaving ordinary terminal arrows and text available to the PTY.
- `Alt+1` through `Alt+6`: focus a pane directly while leaving terminal digits
available to the PTY.
- `Alt+Shift+N`: add or reattach the next panel in the deterministic slice.
- `Alt+Shift+W`: detach the selected panel while its session keeps running.
- `Cmd+K` on macOS or `Ctrl+K` on Linux: open the command palette.
- `Shift+PageUp/PageDown`: move the selected live terminal through retained
history; `Shift+Home/End` jumps to the history top/live bottom.
@@ -14,6 +14,11 @@ process requires Execute; layout-only changes require Configure. Launch intents
refer to a user shell or an approved harness profile and working directory, not
arbitrary executable arguments or secret values.
Detaching and reattaching an existing pane are layout-only Configure operations.
Detached pane definitions remain outside the layout tree so reattachment does
not imply a new launch. Terminating either an attached or detached session
remains an Execute operation. See decision 0010.
This reducer is not an authorization bypass. The future IPC layer authenticates
the caller and supplies its granted capability; the reducer rechecks it before
mutation. Durable audit events record request and object identities, never
@@ -0,0 +1,37 @@
# 0010: Removing a panel detaches its session before termination
Status: accepted for implementation.
A workspace panel is a view attachment, not the lifetime owner of a PTY, agent,
browser, or remote session. The normal remove action is therefore **Detach
panel**. It removes the panel from the visible layout, keeps its stable pane and
session identities, preserves output and decision state, and exposes the item in
a Detached sessions tray. Reattaching it is a Configure-capability operation and
must not launch a second process.
Termination is a separate Execute-capability operation. It is presented as
**Terminate session**, never as an ambiguous close icon, and will require a
confirmation that names the process, target machine, and any dirty or waiting
state. Detaching the selected panel chooses its next attached sibling, falling
back to the previous sibling. A workspace retains at least one attached panel.
The add affordance has two product paths: quick activation creates the user's
default panel beside the selection, while its menu offers Terminal, Browser,
Markdown, Review, and Reattach running session. The deterministic UI spike uses
six fixed fixtures, starts with five attached, and reattaches the first detached
fixture when Add panel is activated. That fixture limit is test scaffolding, not
a product limit.
The typed command plane retains detached pane definitions separately from the
layout tree. `ClosePane(Detach)` moves a definition into that registry,
`AttachPane` restores it without a launch intent, and `ClosePane(Terminate)`
requires Execute authority whether the pane is attached or detached. The future
runtime registry remains the process owner throughout these layout transitions.
This interaction vocabulary was informed by behavior study of cmux at
`fc36aea87e3b4152637597443d7aa7c22e4ec9f8` and Orca at
`02a7742406a5a84fb372d6255d5a4367421990bd`. cmux is GPL-3.0-or-later and was
used only to study workspace/split shortcuts and close-versus-detached process
behavior. Orca is MIT-licensed and was used to study worktree-first navigation,
durable terminal state, and mixed surface density. No implementation code or
visual asset was copied from either project.