{"record":{"id":"0e9a82423e441a53","repo":"zellij-org/zellij","slug":"undorenamepanebypaneid-missing-pane-id","errorCode":null,"errorMessage":"UndoRenamePaneByPaneId missing pane_id","messagePattern":"UndoRenamePaneByPaneId missing pane_id","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"zellij-utils/src/ipc/protobuf_conversion.rs","lineNumber":3071,"sourceCode":"            ActionType::CloseFocusByPaneId(a) => {\n                Ok(crate::input::actions::Action::CloseFocusByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"CloseFocusByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })\n            },\n            ActionType::RenamePaneByPaneId(a) => {\n                Ok(crate::input::actions::Action::RenamePaneByPaneId {\n                    pane_id: a.pane_id.map(|p| p.try_into()).transpose()?,\n                    name: a.name,\n                })\n            },\n            ActionType::UndoRenamePaneByPaneId(a) => {\n                Ok(crate::input::actions::Action::UndoRenamePaneByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"UndoRenamePaneByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })\n            },\n            ActionType::TogglePanePinnedByPaneId(a) => {\n                Ok(crate::input::actions::Action::TogglePanePinnedByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"TogglePanePinnedByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })\n            },\n            ActionType::FocusPaneByPaneId(a) => {\n                Ok(crate::input::actions::Action::FocusPaneByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"FocusPaneByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })","sourceCodeStart":3053,"sourceCodeEnd":3089,"githubUrl":"https://github.com/zellij-org/zellij/blob/98a0837077492d53dd252ab30bc3e43e41e504f4/zellij-utils/src/ipc/protobuf_conversion.rs#L3053-L3089","documentation":"UndoRenamePaneByPaneId restores the automatic name of one specific pane after a rename. Note the asymmetry in the conversion: RenamePaneByPaneId accepts an optional pane_id (Option<PaneId> internally), but UndoRenamePaneByPaneId requires it. Its protobuf message UndoRenamePaneByPaneIdAction has one optional pane_id; if None, conversion fails with 'UndoRenamePaneByPaneId missing pane_id'.","triggerScenarios":"Sending ActionType::UndoRenamePaneByPaneId with UndoRenamePaneByPaneIdAction.pane_id = None, e.g. mirroring the optional-pane_id pattern used for RenamePaneByPaneId.","commonSituations":"Plugins implementing rename/undo-rename pairs and assuming both accept optional pane ids; default prost construction; version skew; intending the focused-pane UndoRenamePane variant.","solutions":["Set pane_id: Some(PaneId { pane_type: Some(PaneType::Terminal(id)) }) - undo requires a concrete pane.","Use the plain UndoRenamePane action for the focused pane.","If the pane lookup returns None, skip the undo instead of sending an incomplete message.","Pin client, server, and plugins to the same zellij version."],"exampleFix":"// before\nlet action = ActionType::UndoRenamePaneByPaneId(\n    UndoRenamePaneByPaneIdAction { pane_id: None },\n); // -> \"UndoRenamePaneByPaneId missing pane_id\"\n\n// after\nlet action = ActionType::UndoRenamePaneByPaneId(\n    UndoRenamePaneByPaneIdAction {\n        pane_id: Some(PaneId { pane_type: Some(PaneType::Terminal(1)) }),\n    },\n);","handlingStrategy":"validation","validationCode":"fn is_sendable(a: &UndoRenamePaneByPaneIdAction) -> bool {\n    a.pane_id\n        .as_ref()\n        .and_then(|p| p.pane_type.as_ref())\n        .is_some()\n}","typeGuard":"fn has_valid_pane_id(a: &UndoRenamePaneByPaneIdAction) -> bool {\n    matches!(\n        a.pane_id.as_ref().and_then(|p| p.pane_type.as_ref()),\n        Some(pane_id::PaneType::Terminal(_)) | Some(pane_id::PaneType::Plugin(_))\n    )\n}","tryCatchPattern":"match Action::try_from(proto_action) {\n    Ok(action) => dispatch(action),\n    Err(e) if e.to_string().contains(\"UndoRenamePaneByPaneId missing pane_id\") => {\n        log::warn!(\"undo-rename without pane target: {e}\");\n    },\n    Err(e) => return Err(e),\n}","preventionTips":["Rename accepts an optional pane_id but Undo requires one - do not mirror their builders.","Carry the pane id used for Rename into the later Undo call.","Document per-variant required fields in your action-sending wrapper."],"tags":["zellij","ipc","protobuf","rust","pane-id","rename"],"backgroundTag":null,"analyzedSha":"98a0837077492d53dd252ab30bc3e43e41e504f4","analyzedAt":"2026-08-16T13:02:01.396Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}