codex_exec_server/
server.rs1mod 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 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}