zellij-org/zellij · error · anyhow::Error
no active pane for client
Error message
no active pane for client {client_id} What it means
Thrown by Tab::paste_to_active_terminal when Tab::get_active_pane_id(client_id) returns None before a paste (clipboard) is delivered. Unlike the write path, get_active_pane_id (tab/mod.rs:3732-3737) consults ONLY the floating pane set when floating panes are visible, and only the tiled set otherwise — no cross-fallback. So the paste fails whenever the consulted map has no active pane for that client, even if the other map has one.
Solutions
- Check whether a pane is actually focused for your client at paste time (look at the highlight in the UI); if the tab is empty, no paste target exists — open a pane first.
- If tiled panes exist but floats are visible, dismiss or focus a floating pane (e.g. toggle-float / click a float) and retry the paste.
- If it reproduces reliably with visible panes, capture the client_id and tab state and report upstream — get_active_pane_id lacking the tiled fallback here is a known asymmetry vs. write_to_active_terminal.
- Update zellij to pick up pane-close focus-fixes.
Defensive patterns
Strategy: validation
Validate before calling
// verify a paste target exists before pasting
match tab.get_active_pane_id(client_id) {
Some(pane_id) => tab.paste_to_pane_id(bytes, pane_id, completion),
None => {
log::debug!("paste dropped: no active pane for client {client_id}");
Ok(())
},
} Try / catch
match tab.paste_to_active_terminal(bytes, client_id, completion) {
Ok(_) => {},
Err(e) if e.to_string().contains("no active pane for client") => Ok(()), // benign: nowhere to paste
Err(e) => Err(e),
} Prevention
- Disable or rebind paste so it cannot fire in empty tabs (or guard it in a custom plugin).
- Remember get_active_pane_id only consults floating panes when floats are visible — ensure a float is focused before pasting in that state.
- Re-run focus assignment after closing panes so a paste target always exists.
When it happens
Trigger: Paste action (e.g. the paste keybinding or clipboard plugin) fires while: the tab has no panes left; floating panes are visible but no floating pane is focused for the client; or the client's tiled focus was never initialized (fresh connect, first input).
Common situations: Pasting immediately after closing all panes or after a command pane exits; pasting while a floating-pane overlay is shown with no float focused; web/reconnecting clients pasting before focus assignment.
Related errors
- Failed to find active pane
- failed to find active pane id for client
- cannot acquire poisoned lock
- cannot acquire poisoned lock for
- Character key needs character data
AI-assisted analysis of zellij-org/zellij@474ea0cef6 (2026-08-19).
Data as JSON: /api/errors/334e97e2fed4db47.
Report an issue: GitHub.
Appendix: source
Thrown at zellij-server/src/tab/mod.rs:4436
let bracketed_paste_begin = vec![27, 91, 50, 48, 48, 126];
let bracketed_paste_end = vec![27, 91, 50, 48, 49, 126];
self.write_to_pane_id(&None, bracketed_paste_begin, false, pane_id, None, None)?;
self.write_to_pane_id(&None, bytes, false, pane_id, None, None)?;
self.write_to_pane_id(&None, bracketed_paste_end, false, pane_id, None, completion)?;
Ok(())
}
pub fn paste_to_active_terminal(
&mut self,
bytes: Vec<u8>,
client_id: ClientId,
completion: Option<NotificationEnd>,
) -> Result<()> {
let err_context = || format!("failed to paste to active terminal for client {client_id}");
let active_pane_id = self
.get_active_pane_id(client_id)
.ok_or_else(|| anyhow!("no active pane for client {client_id}"))
.with_context(err_context)?;
self.paste_to_pane_id(bytes, active_pane_id, completion)
}
pub fn write_to_pane_id(
&mut self,
key_with_modifier: &Option<KeyWithModifier>,
raw_input_bytes: Vec<u8>,
raw_input_bytes_are_kitty: bool,
pane_id: PaneId,
client_id: Option<ClientId>,
completion_tx: Option<NotificationEnd>,
) -> Result<bool> {
// returns true if we need to update the UI (eg. when a command pane is closed with ctrl-c)
let err_context = || format!("failed to write to pane with id {pane_id:?}");
let mut should_update_ui = false;
let is_sync_panes_active = self.is_sync_panes_active();View on GitHub (pinned to 474ea0cef6)