(&self)
| 386 | } |
| 387 | |
| 388 | async fn prepare_session(&self) -> Result<String> { |
| 389 | let resume_id = self.session_options.resume.as_deref(); |
| 390 | let workspace = self |
| 391 | .workspace_path |
| 392 | .clone() |
| 393 | .or_else(|| std::env::current_dir().ok()) |
| 394 | .unwrap_or_else(|| PathBuf::from(".")); |
| 395 | |
| 396 | let resolved_resume = if self.session_options.continue_last || resume_id == Some("last") { |
| 397 | let sessions = self.agent.coordinator().list_sessions(&workspace).await?; |
| 398 | Some( |
| 399 | sessions |
| 400 | .first() |
| 401 | .map(|session| session.session_id.clone()) |
| 402 | .ok_or_else(|| anyhow::anyhow!("No history sessions for current project"))?, |
| 403 | ) |
| 404 | } else { |
| 405 | resume_id.map(ToString::to_string) |
| 406 | }; |
| 407 | |
| 408 | if self.session_options.fork_session { |
| 409 | let source_session_id = resolved_resume |
| 410 | .clone() |
| 411 | .or_else(|| self.session_options.session_id.clone()) |
| 412 | .ok_or_else(|| { |
| 413 | anyhow::anyhow!("--fork-session requires --continue, --resume, or --session") |
| 414 | })?; |
| 415 | let (_session, turns) = self |
| 416 | .agent |
| 417 | .coordinator() |
| 418 | .restore_session_view(&workspace, &source_session_id) |
| 419 | .await?; |
| 420 | let source_turn_id = turns |
| 421 | .last() |
| 422 | .map(|turn| turn.turn_id.clone()) |
| 423 | .ok_or_else(|| anyhow::anyhow!("Session has no persisted turns to fork"))?; |
| 424 | let path_manager = bitfun_core::infrastructure::try_get_path_manager_arc() |
| 425 | .map_err(|error| anyhow::anyhow!(error.to_string()))?; |
| 426 | let persistence_manager = |
| 427 | bitfun_core::agentic::persistence::PersistenceManager::new(path_manager) |
| 428 | .map_err(|error| anyhow::anyhow!(error.to_string()))?; |
| 429 | let result = persistence_manager |
| 430 | .branch_session( |
| 431 | &workspace, |
| 432 | &bitfun_core::agentic::persistence::session_branch::SessionBranchRequest { |
| 433 | source_session_id: source_session_id.clone(), |
| 434 | source_turn_id, |
| 435 | }, |
| 436 | ) |
| 437 | .await?; |
| 438 | self.agent.restore_session(&result.session_id).await?; |
| 439 | return Ok(result.session_id); |
| 440 | } |
| 441 | |
| 442 | if let Some(session_id) = resolved_resume.as_deref() { |
| 443 | self.agent.restore_session(session_id).await?; |
| 444 | return Ok(session_id.to_string()); |
| 445 | } |
no test coverage detected