mirror of
https://github.com/openai/codex.git
synced 2026-09-20 12:47:38 +00:00
Adds the app-server v2 goal API on top of the persisted goal state from PR 1. ## Why Clients need a stable app-server surface for reading and controlling materialized thread goals before the model tools and TUI can use them. Goal changes also need to be observable by app-server clients, including clients that resume an existing thread. ## What changed - Added v2 `thread/goal/get`, `thread/goal/set`, and `thread/goal/clear` RPCs for materialized threads. - Added `thread/goal/updated` and `thread/goal/cleared` notifications so clients can keep local goal state in sync. - Added resume/snapshot wiring so reconnecting clients see the current goal state for a thread. - Added app-server handlers that reconcile persisted rollout state before direct goal mutations. - Updated the app-server README plus generated JSON and TypeScript schema fixtures for the new API surface. ## Verification - Added app-server v2 coverage for goal get/set/clear behavior, notification emission, resume snapshots, and non-local thread-store interactions.
29 lines
1.1 KiB
Rust
29 lines
1.1 KiB
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) => match ev.reason {
|
|
codex_protocol::protocol::TurnAbortReason::Interrupted
|
|
| codex_protocol::protocol::TurnAbortReason::BudgetLimited => {
|
|
Some(AgentStatus::Interrupted)
|
|
}
|
|
_ => 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 | AgentStatus::Interrupted
|
|
)
|
|
}
|