(
session_id: String,
token: CancellationToken,
provider: Arc<dyn Provider>,
model_id: String,
provider_id: String,
session: &mut Session,
agent
| 935 | } |
| 936 | |
| 937 | async fn loop_inner( |
| 938 | session_id: String, |
| 939 | token: CancellationToken, |
| 940 | provider: Arc<dyn Provider>, |
| 941 | model_id: String, |
| 942 | provider_id: String, |
| 943 | session: &mut Session, |
| 944 | agent_name: Option<&str>, |
| 945 | system_prompt: Option<String>, |
| 946 | tools: Vec<ToolDefinition>, |
| 947 | agent_params: &AgentParams, |
| 948 | update_hook: Option<SessionUpdateHook>, |
| 949 | ) -> anyhow::Result<()> { |
| 950 | let mut step = 0u32; |
| 951 | let provider_type = ProviderType::from_provider_id(&provider_id); |
| 952 | let mut post_first_step_ran = false; |
| 953 | |
| 954 | loop { |
| 955 | if token.is_cancelled() { |
| 956 | tracing::info!("Prompt loop cancelled for session {}", session_id); |
| 957 | break; |
| 958 | } |
| 959 | |
| 960 | let mut filtered_messages = Self::filter_compacted_messages(&session.messages); |
| 961 | |
| 962 | let last_user = filtered_messages |
| 963 | .iter() |
| 964 | .rev() |
| 965 | .find(|m| matches!(m.role, MessageRole::User)); |
| 966 | |
| 967 | let last_assistant = filtered_messages |
| 968 | .iter() |
| 969 | .rev() |
| 970 | .find(|m| matches!(m.role, MessageRole::Assistant)); |
| 971 | |
| 972 | let last_user = match last_user { |
| 973 | Some(m) => m, |
| 974 | None => return Err(anyhow::anyhow!("No user message found")), |
| 975 | }; |
| 976 | |
| 977 | if Self::process_pending_subtasks(session, provider.clone(), &model_id, &provider_id) |
| 978 | .await? |
| 979 | { |
| 980 | tracing::info!("Processed pending subtask parts for session {}", session_id); |
| 981 | continue; |
| 982 | } |
| 983 | |
| 984 | if let Some(ref assistant) = last_assistant { |
| 985 | let has_finish = assistant.parts.iter().any(|p| match &p.part_type { |
| 986 | PartType::Text { text, .. } => !text.is_empty(), |
| 987 | _ => false, |
| 988 | }); |
| 989 | |
| 990 | if has_finish && last_user.id < assistant.id { |
| 991 | tracing::info!("Prompt loop complete for session {}", session_id); |
| 992 | break; |
| 993 | } |
| 994 | } |
nothing calls this directly
no test coverage detected