{"record":{"id":"aa0e758fd5cf6554","repo":"zellij-org/zellij","slug":"resizebypaneid-missing-pane-id","errorCode":null,"errorMessage":"ResizeByPaneId missing pane_id","messagePattern":"ResizeByPaneId missing pane_id","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"zellij-utils/src/ipc/protobuf_conversion.rs","lineNumber":2986,"sourceCode":"                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"HalfPageScrollDownByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })\n            },\n            ActionType::ResizeByPaneId(a) => {\n                let resize_action = a\n                    .resize_action\n                    .ok_or_else(|| anyhow!(\"ResizeByPaneId missing resize_action\"))?;\n                let resize = proto_i32_to_resize(resize_action.resize)?;\n                let direction = resize_action\n                    .direction\n                    .map(|d| proto_i32_to_direction(d))\n                    .transpose()?;\n                Ok(crate::input::actions::Action::ResizeByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"ResizeByPaneId missing pane_id\"))?\n                        .try_into()?,\n                    resize,\n                    direction,\n                })\n            },\n            ActionType::MovePaneByPaneId(a) => {\n                let direction = a.direction.map(|d| proto_i32_to_direction(d)).transpose()?;\n                Ok(crate::input::actions::Action::MovePaneByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"MovePaneByPaneId missing pane_id\"))?\n                        .try_into()?,\n                    direction,\n                })\n            },\n            ActionType::MovePaneBackwardsByPaneId(a) => {\n                Ok(crate::input::actions::Action::MovePaneBackwardsByPaneId {\n                    pane_id: a","sourceCodeStart":2968,"sourceCodeEnd":3004,"githubUrl":"https://github.com/zellij-org/zellij/blob/98a0837077492d53dd252ab30bc3e43e41e504f4/zellij-utils/src/ipc/protobuf_conversion.rs#L2968-L3004","documentation":"ResizeByPaneId resizes one specific pane; its protobuf message ResizeByPaneIdAction carries optional pane_id and optional resize_action. The conversion checks resize_action first, then requires pane_id for the final Action construction. Hitting 'ResizeByPaneId missing pane_id' means resize_action was present and valid but pane_id was None, so the resize target is unknown and the action is dropped.","triggerScenarios":"An action message with action_type = ResizeByPaneId, a populated resize_action, but ResizeByPaneIdAction.pane_id = None.","commonSituations":"Hand-built resize actions where the author focused on the resize parameters and forgot the target; clients built from a contract where pane_id was not yet optional-aware; intending the focused-pane Resize variant instead.","solutions":["Set pane_id: Some(PaneId { pane_type: Some(PaneType::Terminal(id)) }) together with resize_action.","Use the plain Resize action when resizing the focused pane.","Keep client, server, and plugins on one zellij version so both optional fields exist.","Write a constructor function for resize actions that requires all fields, so incomplete messages cannot be built."],"exampleFix":"// before\nlet action = ActionType::ResizeByPaneId(ResizeByPaneIdAction {\n    pane_id: None, // -> \"ResizeByPaneId missing pane_id\"\n    resize_action: Some(ResizeAction {\n        resize: ResizeType::Increase as i32,\n        direction: None,\n    }),\n});\n\n// after\nlet action = ActionType::ResizeByPaneId(ResizeByPaneIdAction {\n    pane_id: Some(PaneId { pane_type: Some(PaneType::Terminal(1)) }),\n    resize_action: Some(ResizeAction {\n        resize: ResizeType::Increase as i32,\n        direction: None,\n    }),\n});","handlingStrategy":"validation","validationCode":"fn is_sendable(a: &ResizeByPaneIdAction) -> bool {\n    a.pane_id\n        .as_ref()\n        .and_then(|p| p.pane_type.as_ref())\n        .is_some()\n        && a.resize_action.is_some()\n}","typeGuard":"fn has_valid_pane_id(a: &ResizeByPaneIdAction) -> 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(\"ResizeByPaneId missing pane_id\") => {\n        log::warn!(\"resize without target pane: {e}\");\n    },\n    Err(e) => return Err(e),\n}","preventionTips":["Remember the converter checks resize_action first - a valid resize payload alone is not enough.","When porting from the focused-pane Resize action, always add an explicit pane target.","Round-trip test resize actions through the proto layer."],"tags":["zellij","ipc","protobuf","rust","pane-id","resize"],"backgroundTag":null,"analyzedSha":"98a0837077492d53dd252ab30bc3e43e41e504f4","analyzedAt":"2026-08-16T13:02:01.396Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}