From d2dc25e567003b1fc1a21c2ad022d6da5566eef6 Mon Sep 17 00:00:00 2001 From: liu-qingyuan <2981185462@qq.com> Date: Thu, 19 Feb 2026 00:18:39 +0800 Subject: [PATCH] fix(tmux): address review feedback for split/defer reliability --- src/features/tmux-subagent/grid-planning.ts | 3 +++ src/features/tmux-subagent/manager.ts | 10 +++++++++- src/features/tmux-subagent/pane-state-querier.ts | 8 ++++++-- src/features/tmux-subagent/types.ts | 2 +- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/features/tmux-subagent/grid-planning.ts b/src/features/tmux-subagent/grid-planning.ts index 2107b65e0..8d9ccb6af 100644 --- a/src/features/tmux-subagent/grid-planning.ts +++ b/src/features/tmux-subagent/grid-planning.ts @@ -30,6 +30,9 @@ function resolveMinPaneWidth(options?: CapacityOptions): number { if (typeof options === "number") { return Math.max(1, options) } + if (options && typeof options.agentPaneWidth === "number") { + return Math.max(1, options.agentPaneWidth) + } return MIN_PANE_WIDTH } diff --git a/src/features/tmux-subagent/manager.ts b/src/features/tmux-subagent/manager.ts index 670a36119..15e851213 100644 --- a/src/features/tmux-subagent/manager.ts +++ b/src/features/tmux-subagent/manager.ts @@ -58,6 +58,7 @@ export class TmuxSessionManager { private deferredSessions = new Map() private deferredQueue: string[] = [] private deferredAttachInterval?: ReturnType + private deferredAttachTickScheduled = false private deps: TmuxUtilDeps private pollingManager: TmuxPollingManager constructor(ctx: PluginInput, tmuxConfig: TmuxConfig, deps: TmuxUtilDeps = defaultTmuxDeps) { @@ -130,8 +131,14 @@ export class TmuxSessionManager { private startDeferredAttachLoop(): void { if (this.deferredAttachInterval) return this.deferredAttachInterval = setInterval(() => { + if (this.deferredAttachTickScheduled) return + this.deferredAttachTickScheduled = true void this.enqueueSpawn(async () => { - await this.tryAttachDeferredSession() + try { + await this.tryAttachDeferredSession() + } finally { + this.deferredAttachTickScheduled = false + } }) }, POLL_INTERVAL_BACKGROUND_MS) log("[tmux-session-manager] deferred attach polling started", { @@ -143,6 +150,7 @@ export class TmuxSessionManager { if (!this.deferredAttachInterval) return clearInterval(this.deferredAttachInterval) this.deferredAttachInterval = undefined + this.deferredAttachTickScheduled = false log("[tmux-session-manager] deferred attach polling stopped") } diff --git a/src/features/tmux-subagent/pane-state-querier.ts b/src/features/tmux-subagent/pane-state-querier.ts index d5f6559df..28d5158a4 100644 --- a/src/features/tmux-subagent/pane-state-querier.ts +++ b/src/features/tmux-subagent/pane-state-querier.ts @@ -14,7 +14,7 @@ export async function queryWindowState(sourcePaneId: string): Promise