Attach the finished turn's summed usage to the most recent assistant message of the batch (the reply the turn's `token_count` events report on), merging additively when that message already carries usage.
(messages: &mut [SessionMessageRecord], turn_usage: &mut CodexTurnUsage)
| 948 | /// message of the batch (the reply the turn's `token_count` events report |
| 949 | /// on), merging additively when that message already carries usage. |
| 950 | fn flush_turn_usage(messages: &mut [SessionMessageRecord], turn_usage: &mut CodexTurnUsage) { |
| 951 | let Some(usage) = turn_usage.take() else { |
| 952 | return; |
| 953 | }; |
| 954 | let Some(message) = messages |
| 955 | .iter_mut() |
| 956 | .rev() |
| 957 | .find(|message| message.role == "assistant") |
| 958 | else { |
| 959 | return; |
| 960 | }; |
| 961 | let mut metadata = message |
| 962 | .metadata_json |
| 963 | .as_deref() |
| 964 | .and_then(|raw| serde_json::from_str::<Value>(raw).ok()) |
| 965 | .and_then(|value| value.as_object().cloned()) |
| 966 | .unwrap_or_default(); |
| 967 | match metadata.get_mut("usage") { |
| 968 | Some(existing) => merge_usage_counters(existing, &usage), |
| 969 | None => { |
| 970 | metadata.insert("usage".to_string(), usage); |
| 971 | } |
| 972 | } |
| 973 | if let Ok(serialized) = serde_json::to_string(&Value::Object(metadata)) { |
| 974 | message.metadata_json = Some(serialized); |
| 975 | } |
| 976 | } |
no test coverage detected