2025-09-09 16:52:33 -07:00
|
|
|
use crate::protocol::EventMsg;
|
2025-09-10 10:17:24 -07:00
|
|
|
use crate::protocol::RolloutItem;
|
2025-09-03 10:37:07 -07:00
|
|
|
use codex_protocol::models::ResponseItem;
|
|
|
|
|
|
2025-09-09 16:52:33 -07:00
|
|
|
/// Whether a rollout `item` should be persisted in rollout files.
|
|
|
|
|
#[inline]
|
|
|
|
|
pub(crate) fn is_persisted_response_item(item: &RolloutItem) -> bool {
|
|
|
|
|
match item {
|
|
|
|
|
RolloutItem::ResponseItem(item) => should_persist_response_item(item),
|
|
|
|
|
RolloutItem::EventMsg(ev) => should_persist_event_msg(ev),
|
2025-09-11 11:08:51 -07:00
|
|
|
// Persist Codex executive markers so we can analyze flows (e.g., compaction, API turns).
|
|
|
|
|
RolloutItem::Compacted(_) | RolloutItem::TurnContext(_) | RolloutItem::SessionMeta(_) => {
|
|
|
|
|
true
|
|
|
|
|
}
|
2025-09-09 16:52:33 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-03 10:37:07 -07:00
|
|
|
/// Whether a `ResponseItem` should be persisted in rollout files.
|
|
|
|
|
#[inline]
|
2025-09-09 16:52:33 -07:00
|
|
|
pub(crate) fn should_persist_response_item(item: &ResponseItem) -> bool {
|
2025-09-03 10:37:07 -07:00
|
|
|
match item {
|
|
|
|
|
ResponseItem::Message { .. }
|
|
|
|
|
| ResponseItem::Reasoning { .. }
|
|
|
|
|
| ResponseItem::LocalShellCall { .. }
|
|
|
|
|
| ResponseItem::FunctionCall { .. }
|
|
|
|
|
| ResponseItem::FunctionCallOutput { .. }
|
|
|
|
|
| ResponseItem::CustomToolCall { .. }
|
|
|
|
|
| ResponseItem::CustomToolCallOutput { .. } => true,
|
|
|
|
|
ResponseItem::WebSearchCall { .. } | ResponseItem::Other => false,
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-09-09 16:52:33 -07:00
|
|
|
|
|
|
|
|
/// Whether an `EventMsg` should be persisted in rollout files.
|
|
|
|
|
#[inline]
|
|
|
|
|
pub(crate) fn should_persist_event_msg(ev: &EventMsg) -> bool {
|
|
|
|
|
match ev {
|
|
|
|
|
EventMsg::UserMessage(_)
|
|
|
|
|
| EventMsg::AgentMessage(_)
|
|
|
|
|
| EventMsg::AgentReasoning(_)
|
|
|
|
|
| EventMsg::AgentReasoningRawContent(_)
|
Review Mode (Core) (#3401)
## 📝 Review Mode -- Core
This PR introduces the Core implementation for Review mode:
- New op `Op::Review { prompt: String }:` spawns a child review task
with isolated context, a review‑specific system prompt, and a
`Config.review_model`.
- `EnteredReviewMode`: emitted when the child review session starts.
Every event from this point onwards reflects the review session.
- `ExitedReviewMode(Option<ReviewOutputEvent>)`: emitted when the review
finishes or is interrupted, with optional structured findings:
```json
{
"findings": [
{
"title": "<≤ 80 chars, imperative>",
"body": "<valid Markdown explaining *why* this is a problem; cite files/lines/functions>",
"confidence_score": <float 0.0-1.0>,
"priority": <int 0-3>,
"code_location": {
"absolute_file_path": "<file path>",
"line_range": {"start": <int>, "end": <int>}
}
}
],
"overall_correctness": "patch is correct" | "patch is incorrect",
"overall_explanation": "<1-3 sentence explanation justifying the overall_correctness verdict>",
"overall_confidence_score": <float 0.0-1.0>
}
```
## Questions
### Why separate out its own message history?
We want the review thread to match the training of our review models as
much as possible -- that means using a custom prompt, removing user
instructions, and starting a clean chat history.
We also want to make sure the review thread doesn't leak into the parent
thread.
### Why do this as a mode, vs. sub-agents?
1. We want review to be a synchronous task, so it's fine for now to do a
bespoke implementation.
2. We're still unclear about the final structure for sub-agents. We'd
prefer to land this quickly and then refactor into sub-agents without
rushing that implementation.
2025-09-12 16:25:10 -07:00
|
|
|
| EventMsg::TokenCount(_)
|
|
|
|
|
| EventMsg::EnteredReviewMode(_)
|
|
|
|
|
| EventMsg::ExitedReviewMode(_) => true,
|
2025-09-09 16:52:33 -07:00
|
|
|
EventMsg::Error(_)
|
|
|
|
|
| EventMsg::TaskStarted(_)
|
|
|
|
|
| EventMsg::TaskComplete(_)
|
|
|
|
|
| EventMsg::AgentMessageDelta(_)
|
|
|
|
|
| EventMsg::AgentReasoningDelta(_)
|
|
|
|
|
| EventMsg::AgentReasoningRawContentDelta(_)
|
|
|
|
|
| EventMsg::AgentReasoningSectionBreak(_)
|
|
|
|
|
| EventMsg::SessionConfigured(_)
|
|
|
|
|
| EventMsg::McpToolCallBegin(_)
|
|
|
|
|
| EventMsg::McpToolCallEnd(_)
|
|
|
|
|
| EventMsg::WebSearchBegin(_)
|
|
|
|
|
| EventMsg::WebSearchEnd(_)
|
|
|
|
|
| EventMsg::ExecCommandBegin(_)
|
|
|
|
|
| EventMsg::ExecCommandOutputDelta(_)
|
|
|
|
|
| EventMsg::ExecCommandEnd(_)
|
|
|
|
|
| EventMsg::ExecApprovalRequest(_)
|
|
|
|
|
| EventMsg::ApplyPatchApprovalRequest(_)
|
|
|
|
|
| EventMsg::BackgroundEvent(_)
|
|
|
|
|
| EventMsg::StreamError(_)
|
|
|
|
|
| EventMsg::PatchApplyBegin(_)
|
|
|
|
|
| EventMsg::PatchApplyEnd(_)
|
|
|
|
|
| EventMsg::TurnDiff(_)
|
|
|
|
|
| EventMsg::GetHistoryEntryResponse(_)
|
|
|
|
|
| EventMsg::McpListToolsResponse(_)
|
|
|
|
|
| EventMsg::ListCustomPromptsResponse(_)
|
|
|
|
|
| EventMsg::PlanUpdate(_)
|
|
|
|
|
| EventMsg::TurnAborted(_)
|
|
|
|
|
| EventMsg::ShutdownComplete
|
2025-09-10 17:42:54 -07:00
|
|
|
| EventMsg::ConversationPath(_) => false,
|
2025-09-09 16:52:33 -07:00
|
|
|
}
|
|
|
|
|
}
|