Skip to content

Commit d379ea3

Browse files
committed
mcp(fix[pane_tools]): Replace deprecated resize_pane with state-aware zoom
why: pane.resize_pane() always raises DeprecatedError since libtmux v0.28, making the resize_pane MCP tool 100% broken. what: - Replace pane.resize_pane() with pane.resize() for height/width - Add state-aware zoom: check window_zoomed_flag before toggling - Add mutual exclusivity check for zoom + height/width - Add tests for dimensions, zoom, and mutual exclusivity
1 parent 80fa25c commit d379ea3

File tree

2 files changed

+58
-5
lines changed

2 files changed

+58
-5
lines changed

src/libtmux/mcp/tools/pane_tools.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -145,19 +145,28 @@ def resize_pane(
145145
str
146146
JSON of the updated pane.
147147
"""
148+
from fastmcp.exceptions import ToolError
149+
150+
if zoom is not None and (height is not None or width is not None):
151+
msg = "Cannot combine zoom with height/width"
152+
raise ToolError(msg)
153+
148154
server = _get_server(socket_name=socket_name)
149155
pane = _resolve_pane(
150156
server,
151157
pane_id=pane_id,
152158
session_name=session_name,
153159
window_id=window_id,
154160
)
155-
if zoom is True:
156-
pane.resize_pane(zoom=True)
157-
elif zoom is False:
158-
pane.resize_pane(zoom=False)
161+
if zoom is not None:
162+
window = pane.window
163+
is_zoomed = getattr(window, "window_zoomed_flag", "0") == "1"
164+
if zoom and not is_zoomed:
165+
pane.resize(zoom=True)
166+
elif not zoom and is_zoomed:
167+
pane.resize(zoom=True) # toggle off
159168
else:
160-
pane.resize_pane(height=height, width=width)
169+
pane.resize(height=height, width=width)
161170
return json.dumps(_serialize_pane(pane))
162171

163172

tests/mcp/test_pane_tools.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@
55
import json
66
import typing as t
77

8+
import pytest
9+
from fastmcp.exceptions import ToolError
10+
811
from libtmux.mcp.tools.pane_tools import (
912
capture_pane,
1013
clear_pane,
1114
get_pane_info,
1215
kill_pane,
16+
resize_pane,
1317
send_keys,
1418
set_pane_title,
1519
)
@@ -71,6 +75,46 @@ def test_clear_pane(mcp_server: Server, mcp_pane: Pane) -> None:
7175
assert "cleared" in result.lower()
7276

7377

78+
def test_resize_pane_dimensions(mcp_server: Server, mcp_pane: Pane) -> None:
79+
"""resize_pane resizes a pane with height/width."""
80+
result = resize_pane(
81+
pane_id=mcp_pane.pane_id,
82+
height=10,
83+
width=40,
84+
socket_name=mcp_server.socket_name,
85+
)
86+
data = json.loads(result)
87+
assert data["pane_id"] == mcp_pane.pane_id
88+
89+
90+
def test_resize_pane_zoom(mcp_server: Server, mcp_session: Session) -> None:
91+
"""resize_pane zooms a pane."""
92+
window = mcp_session.active_window
93+
window.split()
94+
pane = window.active_pane
95+
assert pane is not None
96+
result = resize_pane(
97+
pane_id=pane.pane_id,
98+
zoom=True,
99+
socket_name=mcp_server.socket_name,
100+
)
101+
data = json.loads(result)
102+
assert data["pane_id"] == pane.pane_id
103+
104+
105+
def test_resize_pane_zoom_mutual_exclusivity(
106+
mcp_server: Server, mcp_pane: Pane
107+
) -> None:
108+
"""resize_pane raises ToolError when zoom combined with dimensions."""
109+
with pytest.raises(ToolError, match="Cannot combine zoom"):
110+
resize_pane(
111+
pane_id=mcp_pane.pane_id,
112+
zoom=True,
113+
height=10,
114+
socket_name=mcp_server.socket_name,
115+
)
116+
117+
74118
def test_kill_pane(mcp_server: Server, mcp_session: Session) -> None:
75119
"""kill_pane kills a pane."""
76120
window = mcp_session.active_window

0 commit comments

Comments
 (0)