Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions crates/protocol/src/fleet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1126,6 +1126,12 @@ pub struct FleetReceipt {
/// existed) deserializable.
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resolved_route: Option<FleetResolvedRoute>,
/// Saved exec session id holding the worker's full transcript, when the
/// worker persisted one on completion (the exec stream's
/// `session_capture.saved_session_id`). Callers resolve the final
/// assistant reply via `GET /v1/sessions/{id}`.
#[serde(default, skip_serializing_if = "Option::is_none")]
pub saved_session_id: Option<String>,
/// Effective worker authority for this task (#3211).
#[serde(default, skip_serializing_if = "Option::is_none")]
pub effective_permissions: Option<FleetEffectivePermissions>,
Expand Down Expand Up @@ -1493,6 +1499,7 @@ mod tests {
notes: None,
}),
resolved_route: None,
saved_session_id: None,
effective_permissions: None,
};
let json = serde_json::to_string(&receipt).unwrap();
Expand Down Expand Up @@ -1521,6 +1528,7 @@ mod tests {
notes: Some("manual verification required".to_string()),
}),
resolved_route: None,
saved_session_id: None,
effective_permissions: None,
};

Expand Down Expand Up @@ -1689,6 +1697,7 @@ mod tests {
model_source: Some("task.model".to_string()),
source: "resolver".to_string(),
}),
saved_session_id: None,
effective_permissions: Some(FleetEffectivePermissions {
write: true,
network: true,
Expand Down
12 changes: 11 additions & 1 deletion crates/tui/src/exec_agent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -937,6 +937,7 @@ pub(crate) async fn run_exec_agent(
if let Some(id) = saved_session_id.as_ref() {
emit_exec_stream_event(&ExecStreamEvent::SessionCapture {
content: exec_stream_session_ref(id),
saved_session_id: id.clone(),
})?;
}
// Resolved output ceiling and its provenance, surfaced so a
Expand All @@ -954,6 +955,12 @@ pub(crate) async fn run_exec_agent(
&latest_model,
)
.as_str();
// The deliverable is the final assistant reply of the
// session, not the cumulative stream output: a
// multi-step turn streams pre-tool commentary first,
// and that commentary is not part of the answer.
let final_answer = exec_stream_final_answer_text(&latest_messages)
.unwrap_or_else(|| summary.output.trim().to_string());
emit_exec_stream_event(&ExecStreamEvent::Metadata {
meta: Box::new(ExecStreamMeta {
receipt_kind: "terminal",
Expand Down Expand Up @@ -988,7 +995,10 @@ pub(crate) async fn run_exec_agent(
&latest_messages,
latest_system_prompt.as_ref(),
),
visible_final_answer_chars: summary.output.chars().count(),
visible_final_answer_chars: final_answer.chars().count(),
visible_final_answer_excerpt: exec_stream_final_answer_excerpt(
&final_answer,
),
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
resume_command: saved_session_id
.as_deref()
.map(exec_stream_resume_hint)
Expand Down
1 change: 1 addition & 0 deletions crates/tui/src/fleet/alerts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -715,6 +715,7 @@ mod tests {
notes: Some("regex scorer could not be compiled".to_string()),
}),
resolved_route: None,
saved_session_id: None,
effective_permissions: None,
};

Expand Down
1 change: 1 addition & 0 deletions crates/tui/src/fleet/control.rs
Original file line number Diff line number Diff line change
Expand Up @@ -753,6 +753,7 @@ mod tests {
model_source: None,
source: "resolver".to_string(),
}),
saved_session_id: None,
effective_permissions: None,
}
}
Expand Down
Loading
Loading