mirror of
https://github.com/openai/codex.git
synced 2026-04-24 22:54:54 +00:00
Add implementation for the `wait` tool. For this we consider all status different from `PendingInit` and `Running` as terminal. The `wait` tool call will return either after a given timeout or when the tool reaches a non-terminal status. A few points to note: * The usage of a channel is preferred to prevent some races (just looping on `get_status()` could "miss" a terminal status) * The order of operations is very important, we need to first subscribe and then check the last known status to prevent race conditions * If the channel gets dropped, we return an error on purpose
20 lines
866 B
Rust
20 lines
866 B
Rust
use codex_protocol::protocol::AgentStatus;
|
|
use codex_protocol::protocol::EventMsg;
|
|
|
|
/// Derive the next agent status from a single emitted event.
|
|
/// Returns `None` when the event does not affect status tracking.
|
|
pub(crate) fn agent_status_from_event(msg: &EventMsg) -> Option<AgentStatus> {
|
|
match msg {
|
|
EventMsg::TurnStarted(_) => Some(AgentStatus::Running),
|
|
EventMsg::TurnComplete(ev) => Some(AgentStatus::Completed(ev.last_agent_message.clone())),
|
|
EventMsg::TurnAborted(ev) => Some(AgentStatus::Errored(format!("{:?}", ev.reason))),
|
|
EventMsg::Error(ev) => Some(AgentStatus::Errored(ev.message.clone())),
|
|
EventMsg::ShutdownComplete => Some(AgentStatus::Shutdown),
|
|
_ => None,
|
|
}
|
|
}
|
|
|
|
pub(crate) fn is_final(status: &AgentStatus) -> bool {
|
|
!matches!(status, AgentStatus::PendingInit | AgentStatus::Running)
|
|
}
|