Skip to main content

codex_exec_server/
server.rs

1mod file_system_handler;
2mod handler;
3mod process_handler;
4mod processor;
5mod registry;
6mod session_registry;
7mod transport;
8
9pub(crate) use handler::ExecServerHandler;
10pub(crate) use processor::ConnectionProcessor;
11pub use transport::DEFAULT_LISTEN_URL;
12pub use transport::ExecServerListenUrlParseError;
13
14use crate::ExecServerRuntimePaths;
15use crate::ExecServerTelemetry;
16
17pub async fn run_main(
18    listen_url: &str,
19    runtime_paths: ExecServerRuntimePaths,
20) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
21    run_main_with_telemetry(listen_url, runtime_paths, ExecServerTelemetry::default()).await
22}
23
24#[tracing::instrument(
25    name = "codex.exec_server",
26    skip_all,
27    fields(otel.kind = "internal")
28)]
29pub async fn run_main_with_telemetry(
30    listen_url: &str,
31    runtime_paths: ExecServerRuntimePaths,
32    telemetry: ExecServerTelemetry,
33) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
34    transport::run_transport(listen_url, runtime_paths, telemetry).await
35}
36
37#[cfg(test)]
38mod tests {
39    use opentelemetry::trace::TracerProvider as _;
40    use opentelemetry_sdk::trace::InMemorySpanExporter;
41    use opentelemetry_sdk::trace::SdkTracerProvider;
42    use tracing::instrument::WithSubscriber;
43    use tracing_subscriber::prelude::*;
44
45    use super::run_main_with_telemetry;
46    use crate::ExecServerRuntimePaths;
47    use crate::ExecServerTelemetry;
48
49    #[tokio::test]
50    async fn telemetry_entrypoint_emits_root_span() {
51        let exporter = InMemorySpanExporter::default();
52        let provider = SdkTracerProvider::builder()
53            .with_simple_exporter(exporter.clone())
54            .build();
55        let subscriber = tracing_subscriber::registry()
56            .with(tracing_opentelemetry::layer().with_tracer(provider.tracer("exec-server-test")));
57
58        async {
59            tracing::callsite::rebuild_interest_cache();
60            run_main_with_telemetry(
61                "invalid",
62                ExecServerRuntimePaths::new(
63                    std::env::current_exe().expect("current executable"),
64                    /*codex_linux_sandbox_exe*/ None,
65                )
66                .expect("runtime paths"),
67                ExecServerTelemetry::default(),
68            )
69            .await
70            .expect_err("invalid listen URL should fail");
71        }
72        .with_subscriber(subscriber)
73        .await;
74
75        provider.force_flush().expect("flush traces");
76        let spans = exporter.get_finished_spans().expect("span export");
77        assert!(
78            spans.iter().any(|span| span.name == "codex.exec_server"),
79            "root exec-server span missing: {spans:?}"
80        );
81    }
82}