turn start and complete

This commit is contained in:
Roy Han
2026-03-25 23:13:22 -07:00
parent ce5991d844
commit 5a449cd2d0
4 changed files with 174 additions and 55 deletions

View File

@@ -147,7 +147,8 @@ pub struct AppInvocation {
pub enum AnalyticsInput {
CodexThreadInitialized(CodexThreadInitializedInput),
TurnEvent(TurnEventInput),
TurnStarted(TurnStartedInput),
TurnCompleted(TurnCompletedInput),
SkillInvoked(SkillInvokedInput),
AppMentioned(AppMentionedInput),
AppUsed(AppUsedInput),
@@ -155,10 +156,15 @@ pub enum AnalyticsInput {
PluginStateChanged(PluginStateChangedInput),
}
pub struct TurnEventInput {
pub struct TurnStartedInput {
pub tracking: TrackEventsContext,
pub turn_event: CodexTurnEvent,
}
pub struct TurnCompletedInput {
pub turn_id: String,
}
pub struct SkillInvokedInput {
pub tracking: TrackEventsContext,
pub invocations: Vec<SkillInvocation>,
@@ -195,12 +201,17 @@ pub enum PluginState {
#[derive(Default)]
pub struct AnalyticsReducer {
threads: HashMap<String, ThreadState>,
turns: HashMap<String, TurnState>,
}
struct ThreadState {
_initialized_input: CodexThreadInitializedInput,
}
struct TurnState {
started_input: TurnStartedInput,
}
#[derive(Clone)]
pub(crate) struct AnalyticsEventsQueue {
sender: mpsc::Sender<AnalyticsInput>,
@@ -326,13 +337,19 @@ impl AnalyticsEventsClient {
}));
}
pub fn track_turn_event(&self, tracking: TrackEventsContext, turn_event: CodexTurnEvent) {
self.record(AnalyticsInput::TurnEvent(TurnEventInput {
pub fn track_turn_started(&self, tracking: TrackEventsContext, turn_event: CodexTurnEvent) {
self.record(AnalyticsInput::TurnStarted(TurnStartedInput {
tracking,
turn_event,
}));
}
pub fn track_turn_completed(&self, turn_id: String) {
self.record(AnalyticsInput::TurnCompleted(TurnCompletedInput {
turn_id,
}));
}
pub fn track_plugin_installed(&self, plugin: PluginTelemetryMetadata) {
self.record(AnalyticsInput::PluginStateChanged(
PluginStateChangedInput {
@@ -545,8 +562,11 @@ impl AnalyticsReducer {
AnalyticsInput::CodexThreadInitialized(input) => {
self.ingest_thread_initialized(input, out);
}
AnalyticsInput::TurnEvent(input) => {
self.ingest_turn_event(input, out);
AnalyticsInput::TurnStarted(input) => {
self.ingest_turn_started(input);
}
AnalyticsInput::TurnCompleted(input) => {
self.ingest_turn_completed(input, out);
}
AnalyticsInput::SkillInvoked(input) => {
self.ingest_skill_invoked(input, out).await;
@@ -582,11 +602,27 @@ impl AnalyticsReducer {
));
}
fn ingest_turn_event(&mut self, input: TurnEventInput, out: &mut Vec<TrackEventRequest>) {
let TurnEventInput {
fn ingest_turn_started(&mut self, input: TurnStartedInput) {
self.turns.insert(
input.tracking.turn_id.clone(),
TurnState {
started_input: input,
},
);
}
fn ingest_turn_completed(
&mut self,
input: TurnCompletedInput,
out: &mut Vec<TrackEventRequest>,
) {
let Some(TurnState { started_input }) = self.turns.remove(&input.turn_id) else {
return;
};
let TurnStartedInput {
tracking,
turn_event,
} = input;
} = started_input;
out.push(TrackEventRequest::TurnEvent(Box::new(
CodexTurnEventRequest {
event_type: "codex_turn_event",