The ask
Give agents one obviously-named entrypoint for multi-action batches — tmux_batch —
the way claude-in-chrome exposes browser_batch. When an agent wants to run several tmux
actions in one turn, it should reach for a single tool by name, surfaced in the server's
own guidance, without having to know which batching mechanism or engine tier happens to
be active.
Why
There are now three distinct ways to batch, and an agent can discover none of them
from the server instructions:
Same goal — fewer, fatter calls — split across three surfaces, three names, one of them off
by default. The agent has no single word to reach for, so the fast path stays cold.
Desired behavior (acceptance)
- One memorable entrypoint —
tmux_batch — that takes an ordered list of tmux operations
and returns per-operation results.
- Discoverable from the guidance an agent reads at runtime, not only from docstrings and
the Sphinx docs.
- The agent should not pre-select a safety tier by choosing a wrapper name; the entrypoint
should derive its effective tier from the operations it is given and stay hidden/blocked
when that exceeds LIBTMUX_SAFETY.
- It should route to the best available backend — the engine-ops plan language when that
tier is enabled, the base wrappers otherwise — without the agent needing to know which.
Non-goals
Prior art / relationship
The ask
Give agents one obviously-named entrypoint for multi-action batches —
tmux_batch—the way claude-in-chrome exposes
browser_batch. When an agent wants to run several tmuxactions in one turn, it should reach for a single tool by name, surfaced in the server's
own guidance, without having to know which batching mechanism or engine tier happens to
be active.
Why
There are now three distinct ways to batch, and an agent can discover none of them
from the server
instructions:call_readonly_tools_batch/call_mutating_tools_batch/
call_destructive_tools_batch(Add tier-aware MCP tool batching #79) and the homogeneoussend_keys_batch(Compose / bulk operations: run multiple actions in one MCP tool call (start with send_keys) #49 / Add send_keys_batch and clarify terminal workflow primitives #78).These appear in no
instructionssegment, and the safety tier is chosen by whichwrapper name the agent picks, up front, before it knows what its own operations need.
run_tmux_operations(typed ops compiled tonative tmux
;-chains).execute_plan/build_workspace(feat: opt-in engine-ops chained plan tools and watchers #87, behindLIBTMUX_MCP_ENGINE_OPS=1), backed by libtmux's deferred chainable plan language thatsmart-folds ops into
;-chains, with the async / control-mode engines adding a secondbatching level underneath.
Same goal — fewer, fatter calls — split across three surfaces, three names, one of them off
by default. The agent has no single word to reach for, so the fast path stays cold.
Desired behavior (acceptance)
tmux_batch— that takes an ordered list of tmux operationsand returns per-operation results.
the Sphinx docs.
should derive its effective tier from the operations it is given and stay hidden/blocked
when that exceeds
LIBTMUX_SAFETY.tier is enabled, the base wrappers otherwise — without the agent needing to know which.
Non-goals
self-bounded-wait exclusions.
naming + discoverability + convergence ask, not a new engine.
Prior art / relationship
send_keys_batch(Compose / bulk operations: run multiple actions in one MCP tool call (start with send_keys) #49 / Add send_keys_batch and clarify terminal workflow primitives #78),call_*_tools_batch(Add tier-aware MCP tool batching #79),run_command(Add atomic run/wait/capture tool with exit status #73 / Harden tmux MCP tool surface #76).
run_tmux_operations(typed front door) and feat: opt-in engine-ops chained plan tools and watchers #87 engine-opsplan/watch tools (the smart backend:
LazyPlanop-folding at the plan layer, plusasync / control-mode dispatch batching at the engine layer — two batching levels).
tmux_batchshould converge with Typed tmux operation chains #81 and, when the tier is enabled, delegate tothe feat: opt-in engine-ops chained plan tools and watchers #87 plan language rather than compete with either.