(&mut self)
| 2070 | } |
| 2071 | |
| 2072 | fn handle_open_timeline(&mut self) { |
| 2073 | let Some(session_id) = self.current_session_id() else { |
| 2074 | self.alert_dialog |
| 2075 | .set_message("No active session for timeline."); |
| 2076 | self.alert_dialog.open(); |
| 2077 | return; |
| 2078 | }; |
| 2079 | let session_ctx = self.context.session.read(); |
| 2080 | let entries = session_ctx |
| 2081 | .messages |
| 2082 | .get(&session_id) |
| 2083 | .map(|msgs| { |
| 2084 | msgs.iter() |
| 2085 | .map(|m| { |
| 2086 | let role = match m.role { |
| 2087 | MessageRole::User => "user", |
| 2088 | MessageRole::Assistant => "assistant", |
| 2089 | MessageRole::System => "system", |
| 2090 | }; |
| 2091 | let preview = m |
| 2092 | .content |
| 2093 | .chars() |
| 2094 | .take(60) |
| 2095 | .collect::<String>() |
| 2096 | .replace('\n', " "); |
| 2097 | TimelineEntry { |
| 2098 | message_id: m.id.clone(), |
| 2099 | role: role.to_string(), |
| 2100 | preview, |
| 2101 | timestamp: m.created_at.format("%H:%M:%S").to_string(), |
| 2102 | } |
| 2103 | }) |
| 2104 | .collect::<Vec<_>>() |
| 2105 | }) |
| 2106 | .unwrap_or_default(); |
| 2107 | drop(session_ctx); |
| 2108 | self.timeline_dialog.open(entries); |
| 2109 | } |
| 2110 | |
| 2111 | fn handle_fork_session(&mut self) { |
| 2112 | let Some(session_id) = self.current_session_id() else { |
no test coverage detected