From 57151c0e8497932aea32c2b15b5b4b86e6f3245f Mon Sep 17 00:00:00 2001 From: ZacharyZcR Date: Sat, 3 Oct 2026 21:04:04 +0800 Subject: [PATCH] fix(tmux): pass full session info to the terminal's session picker (#1552) The tmux.sessions service reduced detected sessions to bare names, but the picker reads session.name, so every entry rendered blank and selecting one sent an empty name, which created a new session instead of attaching. --- plugins/ssh-terminal/src/backend/services.ts | 10 ++++++++- plugins/tmux-monitor/src/backend/service.ts | 14 ++++--------- .../tests/backend/service.test.ts | 21 ++++++++++++++++--- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/plugins/ssh-terminal/src/backend/services.ts b/plugins/ssh-terminal/src/backend/services.ts index efb6cc222..de36ceec9 100644 --- a/plugins/ssh-terminal/src/backend/services.ts +++ b/plugins/ssh-terminal/src/backend/services.ts @@ -65,9 +65,17 @@ export interface TerminalHistoryV1 { list: (hostId: number, limit?: number) => Promise; } +export interface TmuxSessionInfo { + name: string; + created: number; + lastActivity: number; + windows: number; + attachedClients: number; +} + export interface TmuxDetection { available: boolean; - sessions: string[]; + sessions: TmuxSessionInfo[]; } /** diff --git a/plugins/tmux-monitor/src/backend/service.ts b/plugins/tmux-monitor/src/backend/service.ts index 254aac9c0..afd7e1851 100644 --- a/plugins/tmux-monitor/src/backend/service.ts +++ b/plugins/tmux-monitor/src/backend/service.ts @@ -4,12 +4,10 @@ import { attachOrCreateTmuxSession, detectTmux, waitForTmuxSession, + type TmuxDetectionResult, } from "./tmux-commands.js"; -export interface TmuxDetection { - available: boolean; - sessions: string[]; -} +export type TmuxDetection = TmuxDetectionResult; /** * What the terminal (ssh-terminal's optional "tmux.sessions" consumer) asks @@ -29,12 +27,8 @@ export interface TmuxSessionsV1 { export function createTmuxSessionsService(ctx: PluginContext): TmuxSessionsV1 { return { - async detect(client) { - const result = await detectTmux(client as Client); - return { - available: result.available, - sessions: result.sessions.map((s) => s.name), - }; + detect(client) { + return detectTmux(client as Client); }, async attachOrCreate(stream, name, newName, hostId) { diff --git a/plugins/tmux-monitor/tests/backend/service.test.ts b/plugins/tmux-monitor/tests/backend/service.test.ts index 5339e20fa..4b8c998de 100644 --- a/plugins/tmux-monitor/tests/backend/service.test.ts +++ b/plugins/tmux-monitor/tests/backend/service.test.ts @@ -38,17 +38,32 @@ describe("createTmuxSessionsService", () => { }); }); - it("detect() lists session names when tmux is available", async () => { + it("detect() lists full session info when tmux is available", async () => { const { ctx } = createFakeContext({ pluginId: "tmux-monitor" }); const service = createTmuxSessionsService(ctx); const client = fakeSshClient({ "-V": "tmux 3.7b\n", - "list-sessions": "main|1|2|1\nlogs|3|4|0\n", + "list-sessions": "main|1|2|3|1\nlogs|4|5|1|0\n", }); await expect(service.detect(client)).resolves.toEqual({ available: true, - sessions: ["main", "logs"], + sessions: [ + { + name: "main", + created: 1, + lastActivity: 2, + windows: 3, + attachedClients: 1, + }, + { + name: "logs", + created: 4, + lastActivity: 5, + windows: 1, + attachedClients: 0, + }, + ], }); });