fix(tmux): hide web terminal proxy sessions

This commit is contained in:
2026-08-12 11:20:58 +08:00
parent 50371cfb0c
commit d125a8d6ec
2 changed files with 31 additions and 1 deletions

View File

@@ -3,6 +3,7 @@ import { basename } from 'node:path';
import { runProcess } from '../process.js'; import { runProcess } from '../process.js';
const PANE_FORMAT = '#{session_name}\t#{window_index}\t#{window_name}\t#{pane_id}\t#{pane_current_command}\t#{pane_current_path}'; const PANE_FORMAT = '#{session_name}\t#{window_index}\t#{window_name}\t#{pane_id}\t#{pane_current_command}\t#{pane_current_path}';
const WEB_TERMINAL_SESSION_PATTERN = /^web-\d+-\d+$/;
const ENGINE_BY_COMMAND = { const ENGINE_BY_COMMAND = {
claude: 'claude', claude: 'claude',
@@ -21,7 +22,9 @@ export function parseTmuxPanes(output) {
.map((line) => { .map((line) => {
const [session, windowIndex, windowName, paneId, command, cwd] = line.split('\t'); const [session, windowIndex, windowName, paneId, command, cwd] = line.split('\t');
const engine = ENGINE_BY_COMMAND[command]; const engine = ENGINE_BY_COMMAND[command];
if (!engine || !paneId) return null; // Web terminal sessions only link an existing pane into a temporary view.
// They are not additional agents and must not be enumerated in Live Agents.
if (!engine || !paneId || WEB_TERMINAL_SESSION_PATTERN.test(session)) return null;
return { engine, session, windowIndex: Number(windowIndex), windowName, paneId, cwd }; return { engine, session, windowIndex: Number(windowIndex), windowName, paneId, cwd };
}) })
.filter(Boolean); .filter(Boolean);

View File

@@ -36,6 +36,33 @@ test('parseTmuxPanes drops unrelated commands', () => {
assert.deepEqual(parseTmuxPanes(output), []); assert.deepEqual(parseTmuxPanes(output), []);
}); });
test('parseTmuxPanes hides temporary web terminal sessions', () => {
const output = [
'main\t1\tcodex:kanban\t%5\tnode\t/home/gahow/projects/kanban',
'web-1234-5678\t1\tcodex:kanban\t%5\tnode\t/home/gahow/projects/kanban',
'web-development\t2\tcodex:web\t%6\tnode\t/home/gahow/projects/web'
].join('\n');
assert.deepEqual(parseTmuxPanes(output), [
{
engine: 'codex',
session: 'main',
windowIndex: 1,
windowName: 'codex:kanban',
paneId: '%5',
cwd: '/home/gahow/projects/kanban'
},
{
engine: 'codex',
session: 'web-development',
windowIndex: 2,
windowName: 'codex:web',
paneId: '%6',
cwd: '/home/gahow/projects/web'
}
]);
});
test('parseTmuxPanes handles empty output', () => { test('parseTmuxPanes handles empty output', () => {
assert.deepEqual(parseTmuxPanes(''), []); assert.deepEqual(parseTmuxPanes(''), []);
assert.deepEqual(parseTmuxPanes(null), []); assert.deepEqual(parseTmuxPanes(null), []);