Summarize a session: compute diffs and update session summary. This mirrors the TS `SessionSummary.summarize` which runs both `summarizeSession` and `summarizeMessage` in parallel.
(
input: &SummarizeInput,
messages: &[MessageWithParts],
worktree: &std::path::Path,
bus: Option<&Bus>,
)
| 201 | /// This mirrors the TS `SessionSummary.summarize` which runs both |
| 202 | /// `summarizeSession` and `summarizeMessage` in parallel. |
| 203 | pub async fn summarize( |
| 204 | input: &SummarizeInput, |
| 205 | messages: &[MessageWithParts], |
| 206 | worktree: &std::path::Path, |
| 207 | bus: Option<&Bus>, |
| 208 | ) -> SessionSummaryData { |
| 209 | let diffs = clean_diffs(compute_diff(messages, worktree)); |
| 210 | |
| 211 | let summary = SessionSummaryData { |
| 212 | additions: diffs.iter().map(|d| d.additions).sum(), |
| 213 | deletions: diffs.iter().map(|d| d.deletions).sum(), |
| 214 | files: diffs.len() as u64, |
| 215 | diffs: diffs.clone(), |
| 216 | }; |
| 217 | |
| 218 | // Publish diff event if bus is available |
| 219 | if let Some(bus) = bus { |
| 220 | let diff_event = opencode_core::bus::define_event("session.diff"); |
| 221 | let diff_data = serde_json::json!({ |
| 222 | "sessionID": input.session_id, |
| 223 | "diff": diffs, |
| 224 | }); |
| 225 | bus.publish(&diff_event, diff_data).await; |
| 226 | } |
| 227 | |
| 228 | summary |
| 229 | } |
| 230 | |
| 231 | fn session_diff_storage_key(session_id: &str) -> String { |
| 232 | format!("{}{}", SESSION_DIFF_STORAGE_KEY_PREFIX, session_id) |
no test coverage detected