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

  1. Set the `plugin` field on NewInPlacePluginPane before sending
  2. Regenerate client stubs from the server's zellij proto definitions
  3. Keep client and server versions aligned
  4. 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

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


AI-assisted analysis of zellij-org/zellij@98a0837077 (2026-08-16). Data as JSON: /api/errors/de8ef9b187e92881. Report an issue: GitHub.