(&mut self)
| 2109 | } |
| 2110 | |
| 2111 | fn handle_fork_session(&mut self) { |
| 2112 | let Some(session_id) = self.current_session_id() else { |
| 2113 | self.alert_dialog.set_message("No active session to fork."); |
| 2114 | self.alert_dialog.open(); |
| 2115 | return; |
| 2116 | }; |
| 2117 | let session_ctx = self.context.session.read(); |
| 2118 | let entries = session_ctx |
| 2119 | .messages |
| 2120 | .get(&session_id) |
| 2121 | .map(|msgs| { |
| 2122 | msgs.iter() |
| 2123 | .map(|m| { |
| 2124 | let role = match m.role { |
| 2125 | MessageRole::User => "user", |
| 2126 | MessageRole::Assistant => "assistant", |
| 2127 | MessageRole::System => "system", |
| 2128 | }; |
| 2129 | let preview = m |
| 2130 | .content |
| 2131 | .chars() |
| 2132 | .take(60) |
| 2133 | .collect::<String>() |
| 2134 | .replace('\n', " "); |
| 2135 | ForkEntry { |
| 2136 | message_id: m.id.clone(), |
| 2137 | role: role.to_string(), |
| 2138 | preview, |
| 2139 | timestamp: m.created_at.format("%H:%M:%S").to_string(), |
| 2140 | } |
| 2141 | }) |
| 2142 | .collect::<Vec<_>>() |
| 2143 | }) |
| 2144 | .unwrap_or_default(); |
| 2145 | drop(session_ctx); |
| 2146 | self.fork_dialog.open(session_id, entries); |
| 2147 | } |
| 2148 | |
| 2149 | fn build_session_transcript(&self, session_id: &str) -> Option<String> { |
| 2150 | let session_ctx = self.context.session.read(); |
no test coverage detected