Treat interrupted fork snapshots as closed

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Charles Cunningham
2026-03-23 11:55:11 -07:00
parent c67dacf1c0
commit a3426a1aba
2 changed files with 34 additions and 1 deletions

View File

@@ -26,6 +26,7 @@ use crate::shell_snapshot::ShellSnapshot;
use crate::skills::SkillsManager;
use crate::tasks::interrupted_turn_history_marker;
use codex_app_server_protocol::ThreadHistoryBuilder;
use codex_app_server_protocol::protocol::v2::TurnStatus;
use codex_protocol::ThreadId;
use codex_protocol::config_types::CollaborationModeMask;
#[cfg(test)]
@@ -936,9 +937,20 @@ fn snapshot_turn_state(history: &InitialHistory) -> SnapshotTurnState {
builder.handle_rollout_item(item);
}
if builder.has_active_turn() {
let active_turn_snapshot = builder.active_turn_snapshot();
if active_turn_snapshot
.as_ref()
.is_some_and(|turn| turn.status == TurnStatus::Interrupted)
{
return SnapshotTurnState {
ends_mid_turn: false,
active_turn_id: None,
};
}
return SnapshotTurnState {
ends_mid_turn: true,
active_turn_id: builder.active_turn_snapshot().map(|turn| turn.id),
active_turn_id: active_turn_snapshot.map(|turn| turn.id),
};
}

View File

@@ -255,6 +255,27 @@ fn interrupted_fork_snapshot_appends_interrupt_boundary() {
);
}
#[test]
fn interrupted_snapshot_is_not_mid_turn() {
let interrupted_history = InitialHistory::Forked(vec![
RolloutItem::ResponseItem(user_msg("hello")),
RolloutItem::ResponseItem(assistant_msg("partial")),
RolloutItem::ResponseItem(interrupted_turn_history_marker()),
RolloutItem::EventMsg(EventMsg::TurnAborted(TurnAbortedEvent {
turn_id: Some("turn-1".to_string()),
reason: TurnAbortReason::Interrupted,
})),
]);
assert_eq!(
snapshot_turn_state(&interrupted_history),
SnapshotTurnState {
ends_mid_turn: false,
active_turn_id: None,
},
);
}
#[tokio::test]
async fn interrupted_fork_snapshot_preserves_persisted_turn_id() {
let temp_dir = tempdir().expect("tempdir");