zellij-org/zellij · error · anyhow::Error
NewInPlacePluginPane missing plugin
Error message
NewInPlacePluginPane missing plugin
What it means
Conversion of the protobuf IPC action NewInPlacePluginPane into the internal Action requires the nested `plugin` message (the wasm plugin to open in place of the current pane). Like the tiled/floating variants, the proto3 message field is optional and an unset value trips this error during conversion, so no pane is created.
Source
Thrown at zellij-utils/src/ipc/protobuf_conversion.rs:2680
.plugin
.ok_or_else(|| anyhow!("NewFloatingPluginPane missing plugin"))?
.try_into()?,
pane_name: new_floating_plugin_action.pane_name,
skip_cache: new_floating_plugin_action.skip_cache,
cwd: new_floating_plugin_action.cwd.map(PathBuf::from),
coordinates: new_floating_plugin_action
.coordinates
.map(|c| c.try_into())
.transpose()?,
no_focus: new_floating_plugin_action.no_focus,
tab_id: new_floating_plugin_action.tab_id.map(|t| t as usize),
})
},
ActionType::NewInPlacePluginPane(new_in_place_plugin_action) => {
Ok(crate::input::actions::Action::NewInPlacePluginPane {
plugin: new_in_place_plugin_action
.plugin
.ok_or_else(|| anyhow!("NewInPlacePluginPane missing plugin"))?
.try_into()?,
pane_name: new_in_place_plugin_action.pane_name,
skip_cache: new_in_place_plugin_action.skip_cache,
close_replaced_pane: new_in_place_plugin_action.close_replaced_pane,
no_focus: new_in_place_plugin_action.no_focus,
tab_id: new_in_place_plugin_action.tab_id.map(|t| t as usize),
})
},
ActionType::StartOrReloadPlugin(start_plugin_action) => {
Ok(crate::input::actions::Action::StartOrReloadPlugin {
plugin: start_plugin_action
.plugin
.ok_or_else(|| anyhow!("StartOrReloadPlugin missing plugin"))?
.try_into()?,
})
},
ActionType::CloseTerminalPane(close_pane_action) => {
Ok(crate::input::actions::Action::CloseTerminalPane {View on GitHub (pinned to 98a0837077)
Solutions
- Set the `plugin` field on NewInPlacePluginPane before sending
- Regenerate client stubs from the server's zellij proto definitions
- Keep client and server versions aligned
- Validate the action shape before sending and log dropped malformed actions
Example fix
// before
NewInPlacePluginPaneAction { close_replaced_pane: true, ..Default::default() } // plugin: None
// after
NewInPlacePluginPaneAction {
plugin: Some(ProtobufPlugin { _location: Some(plugin_location), ..Default::default() }),
close_replaced_pane: true,
..Default::default()
} Defensive patterns
Strategy: validation
Validate before calling
if let ActionType::NewInPlacePluginPane(a) = action.action_type.as_ref().unwrap() {
if a.plugin.is_none() {
anyhow::bail!("NewInPlacePluginPane requires a plugin location");
}
} Type guard
fn new_in_place_plugin_action_is_valid(a: &NewInPlacePluginPaneAction) -> bool {
a.plugin.is_some()
} Try / catch
match protobuf_action.try_into() {
Ok(action) => dispatch(action),
Err(e) if e.to_string().contains("NewInPlacePluginPane missing plugin") => {
log::warn!("dropping malformed NewInPlacePluginPane action");
},
Err(e) => return Err(e.context("action conversion failed")),
} Prevention
- Require a plugin location in your action-builder API (take it as a mandatory argument)
- Rebuild client protobuf code whenever you upgrade the zellij server
- Assert required fields in serialization round-trip tests
- Keep a checklist of which IPC actions carry mandatory submessages
When it happens
Trigger: IPC senders that emit NewInPlacePluginPane without the plugin submessage — default-constructed actions from custom clients, mismatched generated stubs, or truncated payloads.
Common situations: Automated layouts or plugin flows opening in-place plugin panes programmatically; version skew between the emitting client and the converting server; malformed-message testing.
Related errors
- NewTiledPluginPane missing plugin
- NewFloatingPluginPane missing plugin
- StartOrReloadPlugin missing plugin
- SkipConfirm missing action
- ChangeFloatingPaneCoordinates missing pane_id
AI-assisted analysis of zellij-org/zellij@98a0837077 (2026-08-16).
Data as JSON: /api/errors/de8ef9b187e92881.
Report an issue: GitHub.