From 565a651a548414eede65f973c0b6519dc4a8a15c Mon Sep 17 00:00:00 2001 From: Abhinav Vedmala Date: Fri, 1 May 2026 15:39:54 -0700 Subject: [PATCH] preserve legacy PreToolUse blocks with context --- codex-rs/hooks/src/engine/output_parser.rs | 1 - codex-rs/hooks/src/events/pre_tool_use.rs | 36 ++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/codex-rs/hooks/src/engine/output_parser.rs b/codex-rs/hooks/src/engine/output_parser.rs index 4f20b1e87e..464c7f8608 100644 --- a/codex-rs/hooks/src/engine/output_parser.rs +++ b/codex-rs/hooks/src/engine/output_parser.rs @@ -99,7 +99,6 @@ pub(crate) fn parse_pre_tool_use(stdout: &str) -> Option { output.permission_decision.is_some() || output.permission_decision_reason.is_some() || output.updated_input.is_some() - || output.additional_context.is_some() }); let invalid_reason = unsupported_pre_tool_use_universal(&universal).or_else(|| { if use_hook_specific_decision { diff --git a/codex-rs/hooks/src/events/pre_tool_use.rs b/codex-rs/hooks/src/events/pre_tool_use.rs index 932f070931..39d0e61258 100644 --- a/codex-rs/hooks/src/events/pre_tool_use.rs +++ b/codex-rs/hooks/src/events/pre_tool_use.rs @@ -362,6 +362,42 @@ mod tests { ); } + #[test] + fn deprecated_block_decision_with_additional_context_blocks_processing() { + let parsed = parse_completed( + &handler(), + run_result( + Some(0), + r#"{"decision":"block","reason":"do not run that","hookSpecificOutput":{"hookEventName":"PreToolUse","additionalContext":"remember this"}}"#, + "", + ), + Some("turn-1".to_string()), + ); + + assert_eq!( + parsed.data, + PreToolUseHandlerData { + should_block: true, + block_reason: Some("do not run that".to_string()), + additional_contexts_for_model: vec!["remember this".to_string()], + } + ); + assert_eq!(parsed.completed.run.status, HookRunStatus::Blocked); + assert_eq!( + parsed.completed.run.entries, + vec![ + HookOutputEntry { + kind: HookOutputEntryKind::Context, + text: "remember this".to_string(), + }, + HookOutputEntry { + kind: HookOutputEntryKind::Feedback, + text: "do not run that".to_string(), + }, + ] + ); + } + #[test] fn unsupported_permission_decision_fails_open() { let parsed = parse_completed(