@@ -491,14 +491,15 @@ class ClaudeOrchestrator {
491491 this.sessions.delete(sessionId);
492492 this.visibleTerminals.delete(sessionId);
493493
494- // Remove terminal wrapper from UI
495- const wrapper = document.getElementById(`wrapper-${sessionId}`);
494+ // Remove terminal wrapper from UI (scope to the active grid to avoid cross-tab collisions)
495+ const grid = this.getTerminalGrid();
496+ const wrapper = grid ? grid.querySelector(`#wrapper-${sessionId}`) : document.getElementById(`wrapper-${sessionId}`);
496497 if (wrapper) {
497498 console.log(`Removing terminal wrapper from DOM: ${sessionId}`);
498499 wrapper.remove();
499500 } else {
500501 // Fallback for older DOM shapes
501- const terminalElement = document.getElementById(`terminal-${sessionId}`);
502+ const terminalElement = grid ? grid.querySelector(`#terminal-${sessionId}`) : document.getElementById(`terminal-${sessionId}`);
502503 if (terminalElement) {
503504 console.log(`Removing terminal element from DOM: ${sessionId}`);
504505 terminalElement.remove();
@@ -3214,10 +3215,10 @@ class ClaudeOrchestrator {
32143215 this.renderTerminalsWithVisibility(allSessions);
32153216 }
32163217
3217- renderTerminalsWithVisibility(sessionIds) {
3218- // Render all terminals but apply visibility using CSS (don't destroy DOM)
3219- this.activeView = sessionIds.filter(id => this.isSessionVisibleInCurrentView(id));
3220- const grid = this.getTerminalGrid();
3218+ renderTerminalsWithVisibility(sessionIds) {
3219+ // Render all terminals but apply visibility using CSS (don't destroy DOM)
3220+ this.activeView = sessionIds.filter(id => this.isSessionVisibleInCurrentView(id));
3221+ const grid = this.getTerminalGrid();
32213222
32223223 if (!grid) {
32233224 console.error('Terminal grid not found!');
@@ -3236,9 +3237,9 @@ class ClaudeOrchestrator {
32363237
32373238 sessionIds.forEach((sessionId) => {
32383239 const session = this.sessions.get(sessionId);
3239- const isVisible = this.isSessionVisibleInCurrentView(sessionId);
3240- const wrapperId = `wrapper-${sessionId}`;
3241- let wrapper = document.getElementById( wrapperId);
3240+ const isVisible = this.isSessionVisibleInCurrentView(sessionId);
3241+ const wrapperId = `wrapper-${sessionId}`;
3242+ let wrapper = grid.querySelector(`#${ wrapperId}` );
32423243
32433244 console.log(`📍 ${sessionId}: session=${!!session}, visible=${isVisible}, exists=${!!wrapper}`);
32443245
@@ -3251,23 +3252,23 @@ class ClaudeOrchestrator {
32513252 grid.appendChild(wrapper);
32523253 console.log(`✅ Appended terminal to grid: ${sessionId}`);
32533254
3254- // Initialize terminal for newly created element
3255+ // Initialize terminal for newly created element (scope query to wrapper/grid to avoid cross-tab collisions)
32553256 setTimeout(() => {
3256- const terminalEl = document.getElementById(` terminal-${sessionId}`);
3257+ const terminalEl = wrapper?.querySelector?.(`#terminal-${sessionId}`) || grid.querySelector(`# terminal-${sessionId}`);
32573258 if (terminalEl && !this.terminalManager.terminals.has(sessionId)) {
32583259 this.terminalManager.createTerminal(sessionId, session);
32593260 }
32603261 }, 50);
32613262 }
3262- } else {
3263- // Show existing wrapper
3264- wrapper.style.display = '';
3265- this.updateTerminalTicketLabel(sessionId);
3266-
3267- // Refit terminal if it exists
3268- if (this.terminalManager.terminals.has(sessionId)) {
3269- requestAnimationFrame(() => {
3270- this.terminalManager.fitTerminal(sessionId);
3263+ } else {
3264+ // Show existing wrapper
3265+ wrapper.style.display = '';
3266+ this.updateTerminalTicketLabel(sessionId);
3267+
3268+ // Refit terminal if it exists
3269+ if (this.terminalManager.terminals.has(sessionId)) {
3270+ requestAnimationFrame(() => {
3271+ this.terminalManager.fitTerminal(sessionId);
32713272 });
32723273 }
32733274 }
@@ -3285,7 +3286,7 @@ class ClaudeOrchestrator {
32853286
32863287 showClaudeOnly() {
32873288 this.setViewMode('claude');
3288- }
3289+ }
32893290
32903291 showServersOnly() {
32913292 this.setViewMode('server');
0 commit comments