diff --git a/codex-rs/analytics/src/analytics_client.rs b/codex-rs/analytics/src/analytics_client.rs index 1bccea915c..f42059a622 100644 --- a/codex-rs/analytics/src/analytics_client.rs +++ b/codex-rs/analytics/src/analytics_client.rs @@ -38,6 +38,23 @@ pub struct CodexThreadInitializedEvent { pub created_at: u64, } +#[derive(Clone)] +pub struct CodexThreadInitializedInput { + pub thread_id: String, + pub model: String, + pub created_at: u64, + pub thread_context: CodexThreadContext, +} + +#[derive(Clone)] +pub struct CodexThreadContext { + pub ephemeral: bool, + pub session_source: SessionSource, + pub initialization_mode: InitializationMode, + pub subagent_source: Option, + pub parent_thread_id: Option, +} + #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "snake_case")] pub enum InitializationMode { @@ -80,7 +97,7 @@ pub struct AppInvocation { } pub enum AnalyticsInput { - ThreadInitialized(ThreadInitializedInput), + ThreadInitialized(CodexThreadInitializedInput), SkillInvoked(SkillInvokedInput), AppMentioned(AppMentionedInput), AppUsed(AppUsedInput), @@ -88,10 +105,6 @@ pub enum AnalyticsInput { PluginStateChanged(PluginStateChangedInput), } -pub struct ThreadInitializedInput { - pub thread_event: CodexThreadInitializedEvent, -} - pub struct SkillInvokedInput { pub tracking: TrackEventsContext, pub invocations: Vec, @@ -228,10 +241,8 @@ impl AnalyticsEventsClient { })); } - pub fn track_thread_initialized(&self, thread_event: CodexThreadInitializedEvent) { - self.record(AnalyticsInput::ThreadInitialized(ThreadInitializedInput { - thread_event, - })); + pub fn track_thread_initialized(&self, input: CodexThreadInitializedInput) { + self.record(AnalyticsInput::ThreadInitialized(input)); } pub fn track_app_mentioned(&self, tracking: TrackEventsContext, mentions: Vec) { @@ -446,19 +457,29 @@ impl AnalyticsReducer { fn ingest_thread_initialized( &mut self, - input: ThreadInitializedInput, + input: CodexThreadInitializedInput, out: &mut Vec, ) { + let event = CodexThreadInitializedEvent { + thread_id: input.thread_id, + model: input.model, + ephemeral: input.thread_context.ephemeral, + session_source: input.thread_context.session_source, + initialization_mode: input.thread_context.initialization_mode, + subagent_source: input.thread_context.subagent_source, + parent_thread_id: input.thread_context.parent_thread_id, + created_at: input.created_at, + }; self.threads.insert( - input.thread_event.thread_id.clone(), + event.thread_id.clone(), ThreadState { - _initialized_event: input.thread_event.clone(), + _initialized_event: event.clone(), }, ); out.push(TrackEventRequest::ThreadInitialized( CodexThreadInitializedEventRequest { event_type: "codex_thread_initialized", - event_params: codex_thread_initialized_event_params(input.thread_event), + event_params: codex_thread_initialized_event_params(event), }, )); } diff --git a/codex-rs/analytics/src/lib.rs b/codex-rs/analytics/src/lib.rs index 63455c0616..4ce20a0079 100644 --- a/codex-rs/analytics/src/lib.rs +++ b/codex-rs/analytics/src/lib.rs @@ -6,7 +6,9 @@ pub use analytics_client::AnalyticsReducer; pub use analytics_client::AppInvocation; pub use analytics_client::AppMentionedInput; pub use analytics_client::AppUsedInput; +pub use analytics_client::CodexThreadContext; pub use analytics_client::CodexThreadInitializedEvent; +pub use analytics_client::CodexThreadInitializedInput; pub use analytics_client::InitializationMode; pub use analytics_client::InvocationType; pub use analytics_client::PluginState; @@ -14,6 +16,5 @@ pub use analytics_client::PluginStateChangedInput; pub use analytics_client::PluginUsedInput; pub use analytics_client::SkillInvocation; pub use analytics_client::SkillInvokedInput; -pub use analytics_client::ThreadInitializedInput; pub use analytics_client::TrackEventsContext; pub use analytics_client::build_track_events_context; diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index e3bf4049ff..d333ab7cc9 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -350,7 +350,8 @@ use crate::util::backoff; use crate::windows_sandbox::WindowsSandboxLevelExt; use codex_analytics::AnalyticsEventsClient; use codex_analytics::AppInvocation; -use codex_analytics::CodexThreadInitializedEvent; +use codex_analytics::CodexThreadContext; +use codex_analytics::CodexThreadInitializedInput; use codex_analytics::InitializationMode; use codex_analytics::InvocationType; use codex_analytics::build_track_events_context; @@ -670,23 +671,25 @@ impl Codex { session .services .analytics_events_client - .track_thread_initialized(CodexThreadInitializedEvent { + .track_thread_initialized(CodexThreadInitializedInput { thread_id: thread_id.to_string(), model: thread_initialized_configuration .collaboration_mode .model() .to_string(), - ephemeral: thread_initialized_configuration - .original_config_do_not_use - .ephemeral, - initialization_mode, - subagent_source: session_source_subagent_source(&thread_session_source), - parent_thread_id: session_source_parent_thread_id(&thread_session_source), - session_source: thread_session_source, created_at: SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap_or_default() .as_secs(), + thread_context: CodexThreadContext { + ephemeral: thread_initialized_configuration + .original_config_do_not_use + .ephemeral, + session_source: thread_session_source, + initialization_mode, + subagent_source: session_source_subagent_source(&thread_session_source), + parent_thread_id: session_source_parent_thread_id(&thread_session_source), + }, }); // This task will run until Op::Shutdown is received.