| 307 | } |
| 308 | |
| 309 | pub fn codex_subagent_start_log_line( |
| 310 | event_json: &str, |
| 311 | count: Option<u64>, |
| 312 | emitted_context: bool, |
| 313 | ) -> String { |
| 314 | let parsed = serde_json::from_str::<Value>(event_json).unwrap_or(Value::Null); |
| 315 | let agent_type = parsed |
| 316 | .get("agent_type") |
| 317 | .or_else(|| parsed.get("subagent_type")) |
| 318 | .and_then(Value::as_str) |
| 319 | .filter(|value| !value.is_empty()) |
| 320 | .unwrap_or("unknown"); |
| 321 | let session_id = event_session_id(&parsed).unwrap_or_else(|| "unknown".to_string()); |
| 322 | let count = count.map_or_else(|| "#?".to_string(), |value| format!("#{value}")); |
| 323 | format!( |
| 324 | "tracedecay Codex SubagentStart {count}: session_id={session_id} agent_type={agent_type} additional_context={emitted_context}" |
| 325 | ) |
| 326 | } |
| 327 | |
| 328 | fn read_codex_subagent_start_counts(path: &Path) -> BTreeMap<String, u64> { |
| 329 | std::fs::read_to_string(path) |