mirror of
https://github.com/openai/codex.git
synced 2026-04-29 00:55:38 +00:00
This PR completes the conversion of non-interactive `codex exec` to use app server rather than directly using core events and methods. ### Summary - move `codex-exec` off exec-owned `AuthManager` and `ThreadManager` state - route exec bootstrap, resume, and auth refresh through existing app-server paths - replace legacy `codex/event/*` decoding in exec with typed app-server notification handling - update human and JSONL exec output adapters to translate existing app-server notifications only - clean up "app server client" layer by eliminating support for legacy notifications; this is no longer needed - remove exposure of `authManager` and `threadManager` from "app server client" layer ### Testing - `exec` has pretty extensive unit and integration tests already, and these all pass - In addition, I asked Codex to put together a comprehensive manual set of tests to cover all of the `codex exec` functionality (including command-line options), and it successfully generated and ran these tests
49 lines
1.5 KiB
Rust
49 lines
1.5 KiB
Rust
use std::path::Path;
|
|
|
|
use codex_app_server_protocol::ServerNotification;
|
|
use codex_core::config::Config;
|
|
use codex_protocol::protocol::SessionConfiguredEvent;
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
pub enum CodexStatus {
|
|
Running,
|
|
InitiateShutdown,
|
|
}
|
|
|
|
pub(crate) trait EventProcessor {
|
|
/// Print summary of effective configuration and user prompt.
|
|
fn print_config_summary(
|
|
&mut self,
|
|
config: &Config,
|
|
prompt: &str,
|
|
session_configured: &SessionConfiguredEvent,
|
|
);
|
|
|
|
/// Handle a single typed app-server notification emitted by the agent.
|
|
fn process_server_notification(&mut self, notification: ServerNotification) -> CodexStatus;
|
|
|
|
/// Handle a local exec warning that is not represented as an app-server notification.
|
|
fn process_warning(&mut self, message: String) -> CodexStatus;
|
|
|
|
fn print_final_output(&mut self) {}
|
|
}
|
|
|
|
pub(crate) fn handle_last_message(last_agent_message: Option<&str>, output_file: &Path) {
|
|
let message = last_agent_message.unwrap_or_default();
|
|
write_last_message_file(message, Some(output_file));
|
|
if last_agent_message.is_none() {
|
|
eprintln!(
|
|
"Warning: no last agent message; wrote empty content to {}",
|
|
output_file.display()
|
|
);
|
|
}
|
|
}
|
|
|
|
fn write_last_message_file(contents: &str, last_message_path: Option<&Path>) {
|
|
if let Some(path) = last_message_path
|
|
&& let Err(e) = std::fs::write(path, contents)
|
|
{
|
|
eprintln!("Failed to write last message file {path:?}: {e}");
|
|
}
|
|
}
|