diff --git a/packages/mux/providers/tmux/src/provider.ts b/packages/mux/providers/tmux/src/provider.ts index 55b2d3d..870404e 100644 --- a/packages/mux/providers/tmux/src/provider.ts +++ b/packages/mux/providers/tmux/src/provider.ts @@ -106,9 +106,10 @@ export class TmuxProvider implements MuxProviderV1, WindowCapable, SidebarCapabl tmux.setGlobalHook("after-new-window", ensureCmd); // client-resized: terminal window changed size — enforce stored width back tmux.setGlobalHook("client-resized", clientResizedCmd); - // pane-exited: a pane closed — kill orphaned sidebar panes (only pane left in window) + // after-kill-pane: a pane was killed — clean up orphaned sidebars and + // re-enforce width (pane-exited is not recognised by tmux 3.4+) const paneExitedCmd = hookPost("/pane-exited"); - tmux.setGlobalHook("pane-exited", paneExitedCmd); + tmux.setGlobalHook("after-kill-pane", paneExitedCmd); } cleanupHooks(): void { @@ -118,7 +119,7 @@ export class TmuxProvider implements MuxProviderV1, WindowCapable, SidebarCapabl tmux.unsetGlobalHook("after-select-window"); tmux.unsetGlobalHook("after-new-window"); tmux.unsetGlobalHook("client-resized"); - tmux.unsetGlobalHook("pane-exited"); + tmux.unsetGlobalHook("after-kill-pane"); } getAllPaneCounts(): Map { diff --git a/packages/mux/tmux-sdk/src/index.ts b/packages/mux/tmux-sdk/src/index.ts index 238a50b..d80988e 100644 --- a/packages/mux/tmux-sdk/src/index.ts +++ b/packages/mux/tmux-sdk/src/index.ts @@ -102,6 +102,7 @@ export const HOOK_NAMES = [ "window-layout-changed", "after-select-window", "after-new-window", + "after-kill-pane", "after-resize-pane", "pane-died", "pane-exited", diff --git a/packages/runtime/src/server/index.ts b/packages/runtime/src/server/index.ts index 7718c8d..4e01287 100644 --- a/packages/runtime/src/server/index.ts +++ b/packages/runtime/src/server/index.ts @@ -2285,13 +2285,15 @@ export function startServer(mux: MuxProvider, extraProviders?: MuxProvider[], wa return new Response("ok", { status: 200 }); } - // pane-exited hook: a pane closed — kill orphaned sidebar panes + // pane-exited hook: a pane closed — kill orphaned sidebar panes and + // re-enforce sidebar width (tmux redistributes space when panes close) if (req.method === "POST" && url.pathname === "/pane-exited") { if (isSidebarVisible()) { invalidateSidebarPaneCache(); for (const { provider } of listSidebarPanesByProvider()) { provider.killOrphanedSidebarPanes(); } + scheduleClientResizeSync(); } return new Response("ok", { status: 200 }); }