(&self)
| 195 | } |
| 196 | |
| 197 | pub async fn sync_sessions_to_storage(&self) -> anyhow::Result<()> { |
| 198 | let (Some(session_repo), Some(message_repo)) = (&self.session_repo, &self.message_repo) |
| 199 | else { |
| 200 | return Ok(()); |
| 201 | }; |
| 202 | |
| 203 | let snapshot: Vec<opencode_session::Session> = { |
| 204 | let manager = self.sessions.lock().await; |
| 205 | manager.list().into_iter().cloned().collect() |
| 206 | }; |
| 207 | |
| 208 | let snapshot_ids: HashSet<String> = snapshot.iter().map(|s| s.id.clone()).collect(); |
| 209 | let persisted = session_repo.list(None, 100_000).await?; |
| 210 | |
| 211 | for stale in persisted { |
| 212 | if !snapshot_ids.contains(&stale.id) { |
| 213 | message_repo.delete_for_session(&stale.id).await?; |
| 214 | session_repo.delete(&stale.id).await?; |
| 215 | } |
| 216 | } |
| 217 | |
| 218 | for session in snapshot { |
| 219 | let mut stored_session: opencode_types::Session = |
| 220 | serde_json::from_value(serde_json::to_value(&session)?)?; |
| 221 | let stored_messages: Vec<opencode_types::SessionMessage> = |
| 222 | stored_session.messages.clone(); |
| 223 | stored_session.messages.clear(); |
| 224 | |
| 225 | if session_repo.get(&stored_session.id).await?.is_some() { |
| 226 | session_repo.update(&stored_session).await?; |
| 227 | } else { |
| 228 | session_repo.create(&stored_session).await?; |
| 229 | } |
| 230 | |
| 231 | message_repo.delete_for_session(&stored_session.id).await?; |
| 232 | for message in stored_messages { |
| 233 | message_repo.create(&message).await?; |
| 234 | } |
| 235 | } |
| 236 | |
| 237 | Ok(()) |
| 238 | } |
| 239 | } |
| 240 | |
| 241 | /// Convert opencode_config::ProviderConfig map to bootstrap ConfigProvider map. |
no test coverage detected