https://github.com/openai/codex/pull/922 did this for the `SessionConfigured` enum variant, and I think it is generally helpful to be able to work with the values as each enum variant as their own type, so this converts the remaining variants and updates all of the callsites. Added a simple unit test to verify that the JSON-serialized version of `Event` does not have any unexpected nesting.
38 lines
1.2 KiB
Rust
38 lines
1.2 KiB
Rust
use std::sync::Arc;
|
|
|
|
use crate::Codex;
|
|
use crate::config::Config;
|
|
use crate::protocol::Event;
|
|
use crate::protocol::EventMsg;
|
|
use crate::util::notify_on_sigint;
|
|
use tokio::sync::Notify;
|
|
|
|
/// Spawn a new [`Codex`] and initialize the session.
|
|
///
|
|
/// Returns the wrapped [`Codex`] **and** the `SessionInitialized` event that
|
|
/// is received as a response to the initial `ConfigureSession` submission so
|
|
/// that callers can surface the information to the UI.
|
|
pub async fn init_codex(config: Config) -> anyhow::Result<(Codex, Event, Arc<Notify>)> {
|
|
let ctrl_c = notify_on_sigint();
|
|
let (codex, init_id) = Codex::spawn(config, ctrl_c.clone()).await?;
|
|
|
|
// The first event must be `SessionInitialized`. Validate and forward it to
|
|
// the caller so that they can display it in the conversation history.
|
|
let event = codex.next_event().await?;
|
|
if event.id != init_id
|
|
|| !matches!(
|
|
&event,
|
|
Event {
|
|
id: _id,
|
|
msg: EventMsg::SessionConfigured(_),
|
|
}
|
|
)
|
|
{
|
|
return Err(anyhow::anyhow!(
|
|
"expected SessionInitialized but got {event:?}"
|
|
));
|
|
}
|
|
|
|
Ok((codex, event, ctrl_c))
|
|
}
|