Codex Handbook
app-server-protocol/src/protocol/v2/hook.rs 155 lines
use super::shared::v2_enum_from_core;use codex_protocol::protocol::HookEventName as CoreHookEventName;use codex_protocol::protocol::HookExecutionMode as CoreHookExecutionMode;use codex_protocol::protocol::HookHandlerType as CoreHookHandlerType;use codex_protocol::protocol::HookOutputEntry as CoreHookOutputEntry;use codex_protocol::protocol::HookOutputEntryKind as CoreHookOutputEntryKind;use codex_protocol::protocol::HookRunStatus as CoreHookRunStatus;use codex_protocol::protocol::HookRunSummary as CoreHookRunSummary;use codex_protocol::protocol::HookScope as CoreHookScope;use codex_protocol::protocol::HookSource as CoreHookSource;use codex_protocol::protocol::HookTrustStatus as CoreHookTrustStatus;use codex_utils_absolute_path::AbsolutePathBuf;use schemars::JsonSchema;use serde::Deserialize;use serde::Serialize;use ts_rs::TS;v2_enum_from_core!(    pub enum HookEventName from CoreHookEventName {        PreToolUse, PermissionRequest, PostToolUse, PreCompact, PostCompact, SessionStart, UserPromptSubmit, SubagentStart, SubagentStop, Stop    });v2_enum_from_core!(    pub enum HookHandlerType from CoreHookHandlerType {        Command, Prompt, Agent    });v2_enum_from_core!(    pub enum HookExecutionMode from CoreHookExecutionMode {        Sync, Async    });v2_enum_from_core!(    pub enum HookScope from CoreHookScope {        Thread, Turn    });v2_enum_from_core!(    pub enum HookSource from CoreHookSource {        System,        User,        Project,        Mdm,        SessionFlags,        Plugin,        CloudRequirements,        CloudManagedConfig,        LegacyManagedConfigFile,        LegacyManagedConfigMdm,        Unknown,    });v2_enum_from_core!(    pub enum HookTrustStatus from CoreHookTrustStatus {        Managed, Untrusted, Trusted, Modified    });fn default_hook_source() -> HookSource {    HookSource::Unknown}v2_enum_from_core!(    pub enum HookRunStatus from CoreHookRunStatus {        Running, Completed, Failed, Blocked, Stopped    });v2_enum_from_core!(    pub enum HookOutputEntryKind from CoreHookOutputEntryKind {        Warning, Stop, Feedback, Context, Error    });#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]#[ts(export_to = "v2/")]pub struct HookOutputEntry {    pub kind: HookOutputEntryKind,    pub text: String,}impl From<CoreHookOutputEntry> for HookOutputEntry {    fn from(value: CoreHookOutputEntry) -> Self {        Self {            kind: value.kind.into(),            text: value.text,        }    }}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]#[ts(export_to = "v2/")]pub struct HookRunSummary {    pub id: String,    pub event_name: HookEventName,    pub handler_type: HookHandlerType,    pub execution_mode: HookExecutionMode,    pub scope: HookScope,    pub source_path: AbsolutePathBuf,    #[serde(default = "default_hook_source")]    pub source: HookSource,    pub display_order: i64,    pub status: HookRunStatus,    pub status_message: Option<String>,    pub started_at: i64,    pub completed_at: Option<i64>,    pub duration_ms: Option<i64>,    pub entries: Vec<HookOutputEntry>,}impl From<CoreHookRunSummary> for HookRunSummary {    fn from(value: CoreHookRunSummary) -> Self {        Self {            id: value.id,            event_name: value.event_name.into(),            handler_type: value.handler_type.into(),            execution_mode: value.execution_mode.into(),            scope: value.scope.into(),            source_path: value.source_path,            source: value.source.into(),            display_order: value.display_order,            status: value.status.into(),            status_message: value.status_message,            started_at: value.started_at,            completed_at: value.completed_at,            duration_ms: value.duration_ms,            entries: value.entries.into_iter().map(Into::into).collect(),        }    }}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]#[ts(export_to = "v2/")]pub struct HookStartedNotification {    pub thread_id: String,    pub turn_id: Option<String>,    pub run: HookRunSummary,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]#[ts(export_to = "v2/")]pub struct HookCompletedNotification {    pub thread_id: String,    pub turn_id: Option<String>,    pub run: HookRunSummary,}