feat: add persistent dynamic panels
CI / rust (push) Successful in 2m10s

This commit is contained in:
2026-08-31 18:43:36 -07:00
parent 4ed7613b22
commit 3409cabb80
13 changed files with 1125 additions and 133 deletions
@@ -22,6 +22,7 @@ derives approximately 71 columns by 42 rows per panel.
The runtime slice now owns three independent real PTYs through a pane-indexed
session registry, one for every terminal fixture. The Markdown, browser, and
review fixtures remain deterministic comparison surfaces. Adding arbitrary new
terminal panels requires replacing the fixed fixture identity pool with dynamic
pane creation; it does not require another runtime ownership design.
review fixtures remain deterministic comparison surfaces. The GPUI product
slice now adds arbitrary panels through a persistent dynamic identity layer;
each additional Terminal panel is another entry in the same runtime ownership
design. The fixed fixture remains only as the GPUI/Floem benchmark input.
@@ -15,12 +15,11 @@ 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 add affordance opens a chooser for Terminal, Browser, Markdown, Review, and
Reattach running session. The deterministic comparison model still uses six
seed fixtures and starts with five attached. The GPUI slice no longer inherits
that fixture limit: Add Panel creates a new persistent panel identity beside the
selection or reattaches the exact detached identity without relaunching it.
The typed command plane retains detached pane definitions separately from the
layout tree. `ClosePane(Detach)` moves a definition into that registry,
@@ -0,0 +1,23 @@
# 0011: Dynamic panels have persistent local identities
Status: accepted for the GPUI product slice.
The six-surface fixture remains a deterministic benchmark shared with Floem; it
is not the product's panel database. GPUI layers an unbounded workspace registry
above it. Add Panel creates Terminal, Browser, Markdown, or Review beside the
selected panel. Each new panel receives a monotonically increasing `PanelId`
that is never derived from its title, position, surface, process ID, or visible
index.
The registry persists panel identity, kind, title, target, order, attachment,
selection, and the next unused ID as one versioned, credential-free SQLite
snapshot. Invalid snapshots fail closed to the seed layout rather than partially
restoring aliases. SQLite never stores terminal output, credentials, private
keys, subscription tokens, or Buzz identity secrets through this boundary.
Every Terminal panel uses its `PanelId` as the runtime-registry key. Detaching
changes only layout attachment, so the actor and PTY keep running. Reattaching
selects the same ID. A restored in-process spike must currently launch a new PTY
for that persisted panel because actor durability across UI process restarts
requires the planned separate Lumbridge runtime and authenticated IPC; the UI
does not pretend otherwise.