MCPcopy Index your code
hub / github.com/ChrisFeldmeier/OpenCodeRust / loop_inner

Method loop_inner

crates/opencode-session/src/prompt.rs:937–1366  ·  view source on GitHub ↗
(
        session_id: String,
        token: CancellationToken,
        provider: Arc<dyn Provider>,
        model_id: String,
        provider_id: String,
        session: &mut Session,
        agent

Source from the content-addressed store, hash-verified

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 }

Callers

nothing calls this directly

Calls 15

should_compactFunction · 0.85
trigger_compactionFunction · 0.85
trigger_collectFunction · 0.85
newFunction · 0.85
was_plan_agentFunction · 0.85
insert_remindersFunction · 0.85
apply_cachingFunction · 0.85
merge_tool_definitionsFunction · 0.85
createFunction · 0.85
summarize_sessionFunction · 0.85

Tested by

no test coverage detected