| 216 | } |
| 217 | |
| 218 | fn parse_event(&self, hook_type: HookType, input: &[u8]) -> AgentResult<TurnEvent> { |
| 219 | if input.is_empty() { |
| 220 | return Err(AgentError::HookInputEmpty { |
| 221 | agent: self.name().to_string(), |
| 222 | hook_type: hook_type.as_str().to_string(), |
| 223 | }); |
| 224 | } |
| 225 | |
| 226 | // Preserve raw JSON for debugging and downstream use |
| 227 | let raw_json: serde_json::Value = |
| 228 | serde_json::from_slice(input).map_err(|e| AgentError::HookParseFailed { |
| 229 | agent: self.name().to_string(), |
| 230 | hook_type: hook_type.as_str().to_string(), |
| 231 | reason: e.to_string(), |
| 232 | })?; |
| 233 | |
| 234 | match hook_type { |
| 235 | HookType::TurnStart => { |
| 236 | let parsed: PromptSubmitInput = |
| 237 | serde_json::from_value(raw_json.clone()).map_err(|e| { |
| 238 | AgentError::HookParseFailed { |
| 239 | agent: self.name().to_string(), |
| 240 | hook_type: hook_type.as_str().to_string(), |
| 241 | reason: e.to_string(), |
| 242 | } |
| 243 | })?; |
| 244 | |
| 245 | let mut event = |
| 246 | TurnEvent::new(Self::extract_session_id(parsed.session_id), hook_type) |
| 247 | .with_raw_json(raw_json); |
| 248 | |
| 249 | if let Some(prompt) = parsed.prompt { |
| 250 | event = event.with_prompt(prompt); |
| 251 | } |
| 252 | |
| 253 | // Store model in raw_json for the orchestrator |
| 254 | if let Some(model) = parsed.model { |
| 255 | if let Some(ref mut raw) = event.raw_json { |
| 256 | if let Some(obj) = raw.as_object_mut() { |
| 257 | obj.insert("model".to_string(), serde_json::Value::String(model)); |
| 258 | } |
| 259 | } |
| 260 | } |
| 261 | |
| 262 | Ok(event) |
| 263 | } |
| 264 | |
| 265 | HookType::TurnEnd => { |
| 266 | let parsed: AgentStopInput = |
| 267 | serde_json::from_value(raw_json.clone()).map_err(|e| { |
| 268 | AgentError::HookParseFailed { |
| 269 | agent: self.name().to_string(), |
| 270 | hook_type: hook_type.as_str().to_string(), |
| 271 | reason: e.to_string(), |
| 272 | } |
| 273 | })?; |
| 274 | |
| 275 | let mut event = |