use crate::events::AppServerRpcTransport; use crate::events::CodexRuntimeMetadata; use codex_app_server_protocol::ClientRequest; use codex_app_server_protocol::ClientResponse; use codex_app_server_protocol::InitializeParams; use codex_app_server_protocol::RequestId; use codex_app_server_protocol::ServerNotification; use codex_plugin::PluginTelemetryMetadata; use codex_protocol::protocol::SkillScope; use codex_protocol::protocol::SubAgentSource; use serde::Serialize; use std::path::PathBuf; #[derive(Clone)] pub struct TrackEventsContext { pub model_slug: String, pub thread_id: String, pub turn_id: String, } pub fn build_track_events_context( model_slug: String, thread_id: String, turn_id: String, ) -> TrackEventsContext { TrackEventsContext { model_slug, thread_id, turn_id, } } #[derive(Clone, Debug)] pub struct SkillInvocation { pub skill_name: String, pub skill_scope: SkillScope, pub skill_path: PathBuf, pub invocation_type: InvocationType, } #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "lowercase")] pub enum InvocationType { Explicit, Implicit, } pub struct AppInvocation { pub connector_id: Option, pub app_name: Option, pub invocation_type: Option, } #[derive(Clone)] pub struct SubAgentThreadStartedInput { pub thread_id: String, pub product_client_id: String, pub client_name: String, pub client_version: String, pub model: String, pub ephemeral: bool, pub subagent_source: SubAgentSource, pub created_at: u64, } #[allow(dead_code)] pub(crate) enum AnalyticsFact { Initialize { connection_id: u64, params: InitializeParams, product_client_id: String, runtime: CodexRuntimeMetadata, rpc_transport: AppServerRpcTransport, }, Request { connection_id: u64, request_id: RequestId, request: Box, }, Response { connection_id: u64, response: Box, }, Notification(Box), // Facts that do not naturally exist on the app-server protocol surface, or // would require non-trivial protocol reshaping on this branch. Custom(CustomAnalyticsFact), } pub(crate) enum CustomAnalyticsFact { SubAgentThreadStarted(SubAgentThreadStartedInput), SkillInvoked(SkillInvokedInput), AppMentioned(AppMentionedInput), AppUsed(AppUsedInput), PluginUsed(PluginUsedInput), PluginStateChanged(PluginStateChangedInput), } pub(crate) struct SkillInvokedInput { pub tracking: TrackEventsContext, pub invocations: Vec, } pub(crate) struct AppMentionedInput { pub tracking: TrackEventsContext, pub mentions: Vec, } pub(crate) struct AppUsedInput { pub tracking: TrackEventsContext, pub app: AppInvocation, } pub(crate) struct PluginUsedInput { pub tracking: TrackEventsContext, pub plugin: PluginTelemetryMetadata, } pub(crate) struct PluginStateChangedInput { pub plugin: PluginTelemetryMetadata, pub state: PluginState, } #[derive(Clone, Copy)] pub(crate) enum PluginState { Installed, Uninstalled, Enabled, Disabled, }