{"record":{"id":"f838524922e303d2","repo":"zellij-org/zellij","slug":"startorreloadplugin-missing-plugin","errorCode":null,"errorMessage":"StartOrReloadPlugin missing plugin","messagePattern":"StartOrReloadPlugin missing plugin","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"zellij-utils/src/ipc/protobuf_conversion.rs","lineNumber":2693,"sourceCode":"            },\n            ActionType::NewInPlacePluginPane(new_in_place_plugin_action) => {\n                Ok(crate::input::actions::Action::NewInPlacePluginPane {\n                    plugin: new_in_place_plugin_action\n                        .plugin\n                        .ok_or_else(|| anyhow!(\"NewInPlacePluginPane missing plugin\"))?\n                        .try_into()?,\n                    pane_name: new_in_place_plugin_action.pane_name,\n                    skip_cache: new_in_place_plugin_action.skip_cache,\n                    close_replaced_pane: new_in_place_plugin_action.close_replaced_pane,\n                    no_focus: new_in_place_plugin_action.no_focus,\n                    tab_id: new_in_place_plugin_action.tab_id.map(|t| t as usize),\n                })\n            },\n            ActionType::StartOrReloadPlugin(start_plugin_action) => {\n                Ok(crate::input::actions::Action::StartOrReloadPlugin {\n                    plugin: start_plugin_action\n                        .plugin\n                        .ok_or_else(|| anyhow!(\"StartOrReloadPlugin missing plugin\"))?\n                        .try_into()?,\n                })\n            },\n            ActionType::CloseTerminalPane(close_pane_action) => {\n                Ok(crate::input::actions::Action::CloseTerminalPane {\n                    pane_id: close_pane_action.pane_id,\n                })\n            },\n            ActionType::ClosePluginPane(close_pane_action) => {\n                Ok(crate::input::actions::Action::ClosePluginPane {\n                    pane_id: close_pane_action.pane_id,\n                })\n            },\n            ActionType::FocusTerminalPaneWithId(focus_pane_action) => {\n                Ok(crate::input::actions::Action::FocusTerminalPaneWithId {\n                    pane_id: focus_pane_action.pane_id,\n                    should_float_if_hidden: focus_pane_action.should_float_if_hidden,\n                    should_be_in_place_if_hidden: focus_pane_action.should_be_in_place_if_hidden,","sourceCodeStart":2675,"sourceCodeEnd":2711,"githubUrl":"https://github.com/zellij-org/zellij/blob/98a0837077492d53dd252ab30bc3e43e41e504f4/zellij-utils/src/ipc/protobuf_conversion.rs#L2675-L2711","documentation":"Conversion of the protobuf IPC action StartOrReloadPlugin into the internal Action: this action starts a plugin not currently running, or reloads it if it is. It carries exactly one meaningful submessage, `plugin`; an incoming action without it cannot identify what to start/reload and fails conversion here.","triggerScenarios":"Sending StartOrReloadPlugin with plugin unset — default-constructed protobuf from custom tooling, stale stubs from before the action existed in its current shape, or hand-assembled payloads that only set optional wrapper fields.","commonSituations":"Plugin hot-reload scripts and CI tooling that drive zellij over IPC; client built from an older release talking to a newer server; partial refactors of shared proto code.","solutions":["Populate the `plugin` field identifying the plugin to start or reload","Regenerate the protobuf stubs used by the client against the running server's version","Use matching zellij versions on both ends of the IPC connection","Pre-validate the action before sending; skip and log when required submessages are absent"],"exampleFix":"// before\nStartPluginAction::default() // plugin: None -> \"StartOrReloadPlugin missing plugin\"\n\n// after\nStartPluginAction { plugin: Some(ProtobufPlugin { _location: Some(plugin_location), ..Default::default() }) }","handlingStrategy":"validation","validationCode":"if let ActionType::StartOrReloadPlugin(a) = action.action_type.as_ref().unwrap() {\n    if a.plugin.is_none() {\n        anyhow::bail!(\"StartOrReloadPlugin requires a plugin\");\n    }\n}","typeGuard":"fn start_plugin_action_is_valid(a: &StartPluginAction) -> bool {\n    a.plugin.is_some()\n}","tryCatchPattern":"match protobuf_action.try_into() {\n    Ok(action) => dispatch(action),\n    Err(e) if e.to_string().contains(\"StartOrReloadPlugin missing plugin\") => {\n        log::warn!(\"dropping malformed StartOrReloadPlugin action\");\n    },\n    Err(e) => return Err(e.context(\"action conversion failed\")),\n}","preventionTips":["For reload tooling, resolve the plugin location once and attach it to every emitted action","Version-gate automation that uses newer actions against older servers","Prefer the CLI (`zellij action ...`) which populates fields correctly, over raw protobuf","Fail fast in the client when building an action with missing required parts"],"tags":["protobuf","ipc","action","plugin","reload","validation"],"backgroundTag":null,"analyzedSha":"98a0837077492d53dd252ab30bc3e43e41e504f4","analyzedAt":"2026-08-16T13:02:01.396Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}