fix: zombie terminals eating the quota; tab drop double-firing into two panes
- The per-session terminal quota counted exited zombie handles (shells closed or dropped on hosts without the close-frame protocol), so enough abandoned terminals permanently blocked new ones — the 'disconnected, reconnecting' loop. open() now sweeps the session's exited handles before the quota check, and the running instance's leftovers disappear on the next restart (disposeAll). - Dragging a tab onto the strip's background fired the drop TWICE: the TabBar handled it (merge into this pane) and the event bubbled to the pane root, which ran its edge-zone handler again — producing two splits / a duplicated instance (up+down). The strip now stops propagation for drag-over and drop. - Tests: +1 real-pty smoke (exited handle swept, new tab spawns under a quota of 1).
This commit is contained in:
@@ -96,6 +96,11 @@ export class PtyManager {
|
||||
const existing = this.sessions.get(key)
|
||||
if (existing !== undefined && !existing.exited) return existing
|
||||
if (existing !== undefined) this.close(key)
|
||||
// Zombie cleanup: a session's exited handles (shell closed, tab dropped
|
||||
// on an old host without the close frame) must not eat the quota.
|
||||
for (const [candidate, handle] of [...this.sessions]) {
|
||||
if (handle.sessionId === sessionId && handle.exited) this.close(candidate)
|
||||
}
|
||||
if (this.keysOf(sessionId).length >= this.maxPerSession) {
|
||||
throw new SidebarError('pty-error', `terminal limit reached (${this.maxPerSession}) for this session`, 400)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user