fix: terminal quota leak and dead-terminal reuse; error boundary against blank panel

- Terminals were never destroyed when their tab closed (socket drop only
  detached listeners), so the per-session quota (3) filled up and new
  terminals failed to mount with 'terminal limit reached'. Now the client
  sends a {type:'close'} control frame on tab teardown and the host releases
  the pty immediately; a bare socket drop (refresh/switch) keeps the process
  for a 30s grace period, and a reconnect within it cancels the pending
  close. open() also respawns a process whose shell already exited instead
  of reusing a dead handle (input sink).
- The sidebar portal renders inside an error boundary: a render failure now
  shows a dismissible error strip with the message (console.error with the
  component stack) instead of a silent blank panel.
- Tests: +2 real-pty smoke specs (close releases quota + respawn after
  exit; reconnect cancels pending close).
This commit is contained in:
Menghuan1918
2026-08-08 12:31:22 +08:00
parent 56a27990d7
commit 0621504e1b
6 changed files with 158 additions and 9 deletions
+18
View File
@@ -609,6 +609,24 @@
background: var(--dsw-alias-state-warn-tertiary);
}
.boundaryError {
position: fixed;
right: 0;
top: 0;
bottom: 0;
z-index: 50;
display: flex;
flex-direction: column;
gap: 8px;
align-items: flex-start;
padding: 16px;
background: var(--dsw-alias-bg-layer-1);
border-left: 1px solid var(--dsw-alias-border-l2);
font: var(--dsw-font-xxs-12);
color: var(--dsw-alias-state-error-primary);
overflow: auto;
}
.terminalRetry {
flex: none;
padding: 1px 8px;