diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 4aa569b4..97cf1c7f 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -1263,7 +1263,7 @@ impl Runtime { .await; self.hooks .emit(HookEvent::GenericEventFrame { - frame: error_frame.clone(), + frame: Box::new(error_frame.clone()), }) .await; return Ok(json!({ @@ -1300,7 +1300,7 @@ impl Runtime { if let Some(frame) = maybe_approval_frame { self.hooks .emit(HookEvent::GenericEventFrame { - frame: frame.clone(), + frame: Box::new(frame.clone()), }) .await; events.push(event_frame_payload(&frame)); @@ -1324,7 +1324,7 @@ impl Runtime { }; self.hooks .emit(HookEvent::GenericEventFrame { - frame: start_frame.clone(), + frame: Box::new(start_frame.clone()), }) .await; self.hooks @@ -1348,7 +1348,7 @@ impl Runtime { }; self.hooks .emit(HookEvent::GenericEventFrame { - frame: result_frame.clone(), + frame: Box::new(result_frame.clone()), }) .await; self.hooks @@ -1380,7 +1380,7 @@ impl Runtime { }; self.hooks .emit(HookEvent::GenericEventFrame { - frame: error_frame.clone(), + frame: Box::new(error_frame.clone()), }) .await; self.hooks @@ -1426,18 +1426,18 @@ impl Runtime { }; self.hooks .emit(HookEvent::GenericEventFrame { - frame: EventFrame::McpStartupUpdate { + frame: Box::new(EventFrame::McpStartupUpdate { update: codewhale_protocol::McpStartupUpdateEvent { server_name: update.server_name, status, }, - }, + }), }) .await; } self.hooks .emit(HookEvent::GenericEventFrame { - frame: EventFrame::McpStartupComplete { + frame: Box::new(EventFrame::McpStartupComplete { summary: codewhale_protocol::McpStartupCompleteEvent { ready: summary.ready.clone(), failed: summary @@ -1450,7 +1450,7 @@ impl Runtime { .collect(), cancelled: summary.cancelled.clone(), }, - }, + }), }) .await; summary diff --git a/crates/hooks/src/lib.rs b/crates/hooks/src/lib.rs index d28525be..872d6c9c 100644 --- a/crates/hooks/src/lib.rs +++ b/crates/hooks/src/lib.rs @@ -73,7 +73,7 @@ pub enum HookEvent { /// mapping it to a more specific variant. GenericEventFrame { /// The raw event frame to forward. - frame: EventFrame, + frame: Box, }, } @@ -334,6 +334,21 @@ mod tests { assert_eq!(encoded["payload"]["exit_code"], 0); } + #[test] + fn generic_event_frame_serialization_is_unchanged_by_boxing() { + let event = HookEvent::GenericEventFrame { + frame: Box::new(EventFrame::ResponseStart { + response_id: "resp-1".to_string(), + }), + }; + + let encoded = event.to_json(); + + assert_eq!(encoded["type"], "generic_event_frame"); + assert_eq!(encoded["frame"]["event"], "response_start"); + assert_eq!(encoded["frame"]["response_id"], "resp-1"); + } + #[tokio::test] async fn jsonl_sink_creates_parent_dir_and_appends_events() { let root = unique_temp_dir("jsonl_sink");