use alloc::collections::BTreeMap;
use serde::{Deserialize, Serialize, de::DeserializeOwned};
use serde_json::Value;
pub const CODEX_VERSION: &str = "0.167.0";
pub trait Request: Serialize {
const METHOD: &'static str;
type Response: DeserializeOwned;
}
pub trait Notification: DeserializeOwned {
const METHOD: &'static str;
}
pub trait ServerRequest: DeserializeOwned {
const METHOD: &'static str;
type Response: Serialize;
}
impl Request for InitializeParams {
const METHOD: &'static str = "initialize";
type Response = InitializeResponse;
}
impl Request for ThreadStartParams {
const METHOD: &'static str = "thread/start";
type Response = ThreadStartResponse;
}
impl Request for ThreadResumeParams {
const METHOD: &'static str = "thread/resume";
type Response = ThreadResumeResponse;
}
impl Request for TurnStartParams {
const METHOD: &'static str = "turn/start";
type Response = TurnStartResponse;
}
impl Request for TurnInterruptParams {
const METHOD: &'static str = "turn/interrupt";
type Response = TurnInterruptResponse;
}
impl Notification for ErrorNotification {
const METHOD: &'static str = "error";
}
impl Notification for ThreadStartedNotification {
const METHOD: &'static str = "thread/started";
}
impl Notification for TurnStartedNotification {
const METHOD: &'static str = "turn/started";
}
impl Notification for TurnCompletedNotification {
const METHOD: &'static str = "turn/completed";
}
impl Notification for ItemStartedNotification {
const METHOD: &'static str = "item/started";
}
impl Notification for ItemCompletedNotification {
const METHOD: &'static str = "item/completed";
}
impl Notification for AgentMessageDeltaNotification {
const METHOD: &'static str = "item/agentMessage/delta";
}
impl Notification for ThreadTokenUsageUpdatedNotification {
const METHOD: &'static str = "thread/tokenUsage/updated";
}
impl Notification for AccountRateLimitsUpdatedNotification {
const METHOD: &'static str = "account/rateLimits/updated";
}
impl ServerRequest for CommandExecutionRequestApprovalParams {
const METHOD: &'static str = "item/commandExecution/requestApproval";
type Response = CommandExecutionRequestApprovalResponse;
}
impl ServerRequest for FileChangeRequestApprovalParams {
const METHOD: &'static str = "item/fileChange/requestApproval";
type Response = FileChangeRequestApprovalResponse;
}
impl ServerRequest for McpServerElicitationRequestParams {
const METHOD: &'static str = "mcpServer/elicitation/request";
type Response = McpServerElicitationRequestResponse;
}
pub type AbsolutePathBuf = String;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AccountRateLimitsUpdatedNotification {
#[serde(rename = "rateLimits")]
pub rate_limits: RateLimitSnapshot,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct AddPatchChangeKind {}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum AgentMessageDelivery {
#[serde(rename = "async")]
Async,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct AgentMessageDeltaNotification {
pub delta: String,
#[serde(rename = "itemId")]
pub item_id: String,
#[serde(rename = "threadId")]
pub thread_id: String,
#[serde(rename = "turnId")]
pub turn_id: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct AgentMessageThreadItem {
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub delivery: Option<AgentMessageDelivery>,
pub id: String,
#[serde(rename = "memoryCitation")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub memory_citation: Option<MemoryCitation>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phase: Option<MessagePhase>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub questions: Option<Vec<AsyncUserInputQuestion>>,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
pub text: String,
}
pub type AgentPath = String;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ApprovalsReviewer {
#[serde(rename = "user")]
User,
#[serde(rename = "auto_review")]
AutoReview,
#[serde(rename = "guardian_subagent")]
GuardianSubagent,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum AskForApproval {
#[serde(rename = "untrusted")]
Untrusted,
#[serde(rename = "on-request")]
OnRequest,
#[serde(rename = "never")]
Never,
#[serde(rename = "granular")]
Granular(AskForApprovalGranular),
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct AskForApprovalGranular {
pub mcp_elicitations: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub request_permissions: Option<bool>,
pub rules: bool,
pub sandbox_approval: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub skill_approval: Option<bool>,
}
pub type AsyncUserInputQuestion = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct AudioUserInput {
#[serde(rename = "fileId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ClientInfo {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
pub version: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum CodexErrorInfo {
#[serde(rename = "contextWindowExceeded")]
ContextWindowExceeded,
#[serde(rename = "sessionBudgetExceeded")]
SessionBudgetExceeded,
#[serde(rename = "usageLimitExceeded")]
UsageLimitExceeded,
#[serde(rename = "rateLimitExceeded")]
RateLimitExceeded,
#[serde(rename = "flexUnavailable")]
FlexUnavailable,
#[serde(rename = "serverOverloaded")]
ServerOverloaded,
#[serde(rename = "modelNotFound")]
ModelNotFound,
#[serde(rename = "policyCapacityUnavailable")]
PolicyCapacityUnavailable,
#[serde(rename = "cyberPolicy")]
CyberPolicy,
#[serde(rename = "misalignmentPolicyViolation")]
MisalignmentPolicyViolation,
#[serde(rename = "tooManyDenials")]
TooManyDenials,
#[serde(rename = "internalServerError")]
InternalServerError,
#[serde(rename = "unauthorized")]
Unauthorized,
#[serde(rename = "badRequest")]
BadRequest,
#[serde(rename = "threadRollbackFailed")]
ThreadRollbackFailed,
#[serde(rename = "sandboxError")]
SandboxError,
#[serde(rename = "other")]
Other,
#[serde(rename = "httpConnectionFailed")]
HttpConnectionFailed(CodexErrorInfoHttpConnectionFailed),
#[serde(rename = "responseStreamConnectionFailed")]
ResponseStreamConnectionFailed(CodexErrorInfoResponseStreamConnectionFailed),
#[serde(rename = "responseStreamDisconnected")]
ResponseStreamDisconnected(CodexErrorInfoResponseStreamDisconnected),
#[serde(rename = "responseTooManyFailedAttempts")]
ResponseTooManyFailedAttempts(CodexErrorInfoResponseTooManyFailedAttempts),
#[serde(rename = "activeTurnNotSteerable")]
ActiveTurnNotSteerable(CodexErrorInfoActiveTurnNotSteerable),
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CodexErrorInfoActiveTurnNotSteerable {
#[serde(rename = "turnKind")]
pub turn_kind: NonSteerableTurnKind,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct CodexErrorInfoHttpConnectionFailed {
#[serde(rename = "httpStatusCode")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub http_status_code: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct CodexErrorInfoResponseStreamConnectionFailed {
#[serde(rename = "httpStatusCode")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub http_status_code: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct CodexErrorInfoResponseStreamDisconnected {
#[serde(rename = "httpStatusCode")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub http_status_code: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct CodexErrorInfoResponseTooManyFailedAttempts {
#[serde(rename = "httpStatusCode")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub http_status_code: Option<u64>,
}
pub type CollabAgentState = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum CollabAgentTool {
#[serde(rename = "spawnAgent")]
SpawnAgent,
#[serde(rename = "sendInput")]
SendInput,
#[serde(rename = "resumeAgent")]
ResumeAgent,
#[serde(rename = "wait")]
Wait,
#[serde(rename = "closeAgent")]
CloseAgent,
#[serde(rename = "sendMessage")]
SendMessage,
#[serde(rename = "followupTask")]
FollowupTask,
#[serde(rename = "interruptAgent")]
InterruptAgent,
#[serde(rename = "listAgents")]
ListAgents,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum CollabAgentToolCallStatus {
#[serde(rename = "inProgress")]
InProgress,
#[serde(rename = "completed")]
Completed,
#[serde(rename = "failed")]
Failed,
#[serde(rename = "interrupted")]
Interrupted,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CollabAgentToolCallThreadItem {
#[serde(rename = "agentsStates")]
pub agents_states: BTreeMap<String, CollabAgentState>,
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompt: Option<String>,
#[serde(rename = "reasoningEffort")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
#[serde(rename = "receiverThreadIds")]
pub receiver_thread_ids: Vec<String>,
#[serde(rename = "senderThreadId")]
pub sender_thread_id: String,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
pub status: CollabAgentToolCallStatus,
pub tool: CollabAgentTool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CollaborationMode {
pub mode: ModeKind,
pub settings: Settings,
}
pub type CommandAction = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum CommandExecutionApprovalDecision {
#[serde(rename = "accept")]
Accept,
#[serde(rename = "acceptForSession")]
AcceptForSession,
#[serde(rename = "acceptWithExecpolicyAmendment")]
AcceptWithExecpolicyAmendment(CommandExecutionApprovalDecisionAcceptWithExecpolicyAmendment),
#[serde(rename = "applyNetworkPolicyAmendment")]
ApplyNetworkPolicyAmendment(CommandExecutionApprovalDecisionApplyNetworkPolicyAmendment),
#[serde(rename = "decline")]
Decline,
#[serde(rename = "cancel")]
Cancel,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct CommandExecutionApprovalDecisionAcceptWithExecpolicyAmendment {
pub execpolicy_amendment: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct CommandExecutionApprovalDecisionApplyNetworkPolicyAmendment {
pub network_policy_amendment: NetworkPolicyAmendment,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum CommandExecutionApprovalKind {
#[serde(rename = "command")]
Command,
#[serde(rename = "writeStdin")]
WriteStdin,
#[serde(rename = "humanCommand")]
HumanCommand,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct CommandExecutionRequestApprovalParams {
#[serde(rename = "approvalId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approval_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub command: Option<String>,
#[serde(rename = "commandActions")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub command_actions: Option<Vec<CommandAction>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cwd: Option<LegacyAppPathString>,
#[serde(rename = "environmentId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub environment_id: Option<String>,
#[serde(rename = "itemId")]
pub item_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kind: Option<CommandExecutionApprovalKind>,
#[serde(rename = "networkApprovalContext")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub network_approval_context: Option<NetworkApprovalContext>,
#[serde(rename = "proposedExecpolicyAmendment")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub proposed_execpolicy_amendment: Option<Vec<String>>,
#[serde(rename = "proposedNetworkPolicyAmendments")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub proposed_network_policy_amendments: Option<Vec<NetworkPolicyAmendment>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
#[serde(rename = "startedAtMs")]
pub started_at_ms: i64,
#[serde(rename = "threadId")]
pub thread_id: String,
#[serde(rename = "turnId")]
pub turn_id: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CommandExecutionRequestApprovalResponse {
pub decision: CommandExecutionApprovalDecision,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum CommandExecutionSource {
#[serde(rename = "agent")]
Agent,
#[serde(rename = "userShell")]
UserShell,
#[serde(rename = "unifiedExecStartup")]
UnifiedExecStartup,
#[serde(rename = "unifiedExecInteraction")]
UnifiedExecInteraction,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum CommandExecutionStatus {
#[serde(rename = "inProgress")]
InProgress,
#[serde(rename = "completed")]
Completed,
#[serde(rename = "failed")]
Failed,
#[serde(rename = "declined")]
Declined,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CommandExecutionThreadItem {
#[serde(rename = "aggregatedOutput")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub aggregated_output: Option<String>,
pub command: String,
#[serde(rename = "commandActions")]
pub command_actions: Vec<CommandAction>,
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub cwd: LegacyAppPathString,
#[serde(rename = "durationMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub duration_ms: Option<i64>,
#[serde(rename = "exitCode")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exit_code: Option<i64>,
pub id: String,
#[serde(rename = "pluginId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub plugin_id: Option<String>,
#[serde(rename = "processId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub process_id: Option<String>,
#[serde(rename = "scriptPath")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub script_path: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source: Option<CommandExecutionSource>,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
pub status: CommandExecutionStatus,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ContextCompactionThreadItem {
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub id: String,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct CreditsSnapshot {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub balance: Option<String>,
#[serde(rename = "hasCredits")]
pub has_credits: bool,
pub unlimited: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct DeletePatchChangeKind {}
pub type DynamicToolCallOutputContentItem = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum DynamicToolCallStatus {
#[serde(rename = "inProgress")]
InProgress,
#[serde(rename = "completed")]
Completed,
#[serde(rename = "failed")]
Failed,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DynamicToolCallThreadItem {
pub arguments: Value,
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
#[serde(rename = "contentItems")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_items: Option<Vec<DynamicToolCallOutputContentItem>>,
#[serde(rename = "durationMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub duration_ms: Option<i64>,
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
pub status: DynamicToolCallStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub success: Option<bool>,
pub tool: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct EnteredReviewModeThreadItem {
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub id: String,
pub review: String,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ErrorNotification {
pub error: TurnError,
#[serde(rename = "threadId")]
pub thread_id: String,
#[serde(rename = "turnId")]
pub turn_id: String,
#[serde(rename = "willRetry")]
pub will_retry: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ExitedReviewModeThreadItem {
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub id: String,
pub review: String,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum FileChangeApprovalDecision {
#[serde(rename = "accept")]
Accept,
#[serde(rename = "acceptForSession")]
AcceptForSession,
#[serde(rename = "decline")]
Decline,
#[serde(rename = "cancel")]
Cancel,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct FileChangeRequestApprovalParams {
#[serde(rename = "grantRoot")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub grant_root: Option<String>,
#[serde(rename = "itemId")]
pub item_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
#[serde(rename = "startedAtMs")]
pub started_at_ms: i64,
#[serde(rename = "threadId")]
pub thread_id: String,
#[serde(rename = "turnId")]
pub turn_id: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FileChangeRequestApprovalResponse {
pub decision: FileChangeApprovalDecision,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FileChangeThreadItem {
pub changes: Vec<FileUpdateChange>,
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub id: String,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
pub status: PatchApplyStatus,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FileUpdateChange {
pub diff: String,
pub kind: PatchChangeKind,
pub path: String,
}
pub type FunctionCallOutputBody = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FunctionCallOutputThreadItem {
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub id: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
pub output: FunctionCallOutputBody,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
}
pub type GitInfo = Value;
pub type HookPromptFragment = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct HookPromptThreadItem {
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub fragments: Vec<HookPromptFragment>,
pub id: String,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ImageDetail {
#[serde(rename = "auto")]
Auto,
#[serde(rename = "low")]
Low,
#[serde(rename = "high")]
High,
#[serde(rename = "original")]
Original,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ImageGenerationFailure {
#[serde(rename = "usageLimitExceeded")]
UsageLimitExceeded(UsageLimitExceededImageGenerationFailure),
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ImageGenerationInputImage {
pub path: AbsolutePathBuf,
pub sha256: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ImageGenerationThreadItem {
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub failure: Option<ImageGenerationFailure>,
#[serde(rename = "fileId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(rename = "generationId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub generation_id: Option<String>,
pub id: String,
#[serde(rename = "inputImages")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub input_images: Option<Vec<ImageGenerationInputImage>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub result: Option<String>,
#[serde(rename = "revisedPrompt")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub revised_prompt: Option<String>,
#[serde(rename = "savedPath")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub saved_path: Option<AbsolutePathBuf>,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
pub status: String,
#[serde(rename = "transparentBackground")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub transparent_background: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ImageUserInput {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub detail: Option<ImageDetail>,
#[serde(rename = "fileId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ImageViewThreadItem {
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub id: String,
pub path: LegacyAppPathString,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct InitializeCapabilities {
#[serde(rename = "experimentalApi")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub experimental_api: Option<bool>,
#[serde(rename = "explicitGatewayOauth")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub explicit_gateway_oauth: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extensions: Option<BTreeMap<String, Value>>,
#[serde(rename = "mcpServerOpenaiFormElicitation")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mcp_server_openai_form_elicitation: Option<bool>,
#[serde(rename = "optOutNotificationMethods")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub opt_out_notification_methods: Option<Vec<String>>,
#[serde(rename = "requestAttestation")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub request_attestation: Option<bool>,
#[serde(rename = "requiredHumanApproval")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub required_human_approval: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InitializeParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub capabilities: Option<InitializeCapabilities>,
#[serde(rename = "clientInfo")]
pub client_info: ClientInfo,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InitializeResponse {
#[serde(rename = "codexHome")]
pub codex_home: AbsolutePathBuf,
#[serde(rename = "platformFamily")]
pub platform_family: String,
#[serde(rename = "platformOs")]
pub platform_os: String,
#[serde(rename = "userAgent")]
pub user_agent: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ItemCompletedNotification {
#[serde(rename = "completedAtMs")]
pub completed_at_ms: i64,
pub item: ThreadItem,
#[serde(rename = "threadId")]
pub thread_id: String,
#[serde(rename = "turnId")]
pub turn_id: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ItemStartedNotification {
pub item: ThreadItem,
#[serde(rename = "startedAtMs")]
pub started_at_ms: i64,
#[serde(rename = "threadId")]
pub thread_id: String,
#[serde(rename = "turnId")]
pub turn_id: String,
}
pub type LegacyAppPathString = String;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct LocalAudioUserInput {
pub path: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct LocalImageUserInput {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub detail: Option<ImageDetail>,
pub path: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum McpAppDisplayMode {
#[serde(rename = "inline")]
Inline,
#[serde(rename = "fullscreen")]
Fullscreen,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct McpAppUi {
#[serde(rename = "preferredModelDisplayMode")]
pub preferred_model_display_mode: McpAppDisplayMode,
#[serde(rename = "resourceUri")]
pub resource_uri: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum McpServerElicitationAction {
#[serde(rename = "accept")]
Accept,
#[serde(rename = "decline")]
Decline,
#[serde(rename = "cancel")]
Cancel,
#[serde(untagged)]
Unknown(Value),
}
pub type McpServerElicitationRequestParams = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct McpServerElicitationRequestResponse {
#[serde(rename = "_meta")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub meta: Option<Value>,
pub action: McpServerElicitationAction,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content: Option<Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct McpToolCallAppContext {
#[serde(rename = "actionName")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub action_name: Option<String>,
#[serde(rename = "appName")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub app_name: Option<String>,
#[serde(rename = "connectorId")]
pub connector_id: String,
#[serde(rename = "linkId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub link_id: Option<String>,
#[serde(rename = "resourceUri")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resource_uri: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct McpToolCallError {
pub message: String,
}
pub type McpToolCallResult = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum McpToolCallStatus {
#[serde(rename = "inProgress")]
InProgress,
#[serde(rename = "completed")]
Completed,
#[serde(rename = "failed")]
Failed,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct McpToolCallThreadItem {
#[serde(rename = "appContext")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub app_context: Option<McpToolCallAppContext>,
pub arguments: Value,
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
#[serde(rename = "durationMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub duration_ms: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<McpToolCallError>,
pub id: String,
#[serde(rename = "mcpAppResourceUri")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mcp_app_resource_uri: Option<String>,
#[serde(rename = "mcpAppUi")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mcp_app_ui: Option<McpAppUi>,
#[serde(rename = "pluginId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub plugin_id: Option<String>,
#[serde(rename = "readOnlyHint")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub read_only_hint: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub result: Option<McpToolCallResult>,
pub server: String,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
pub status: McpToolCallStatus,
pub tool: String,
}
pub type MemoryCitation = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct MentionUserInput {
pub name: String,
pub path: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum MessagePhase {
#[serde(rename = "commentary")]
Commentary,
#[serde(rename = "partial_answer")]
PartialAnswer,
#[serde(rename = "final_answer")]
FinalAnswer,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct MisalignmentErrorDetails {
#[serde(rename = "detailedExplanation")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub detailed_explanation: Option<String>,
#[serde(rename = "errorType")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error_type: Option<String>,
#[serde(rename = "reviewTarget")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub review_target: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub steer: Option<MisalignmentSteer>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct MisalignmentSteer {
pub message: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ModeKind {
#[serde(rename = "plan")]
Plan,
#[serde(rename = "default")]
Default,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NetworkApprovalContext {
pub host: String,
pub protocol: NetworkApprovalProtocol,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum NetworkApprovalProtocol {
#[serde(rename = "http")]
Http,
#[serde(rename = "https")]
Https,
#[serde(rename = "socks5Tcp")]
Socks5Tcp,
#[serde(rename = "socks5Udp")]
Socks5Udp,
#[serde(untagged)]
Unknown(Value),
}
pub type NetworkPolicyAmendment = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum NonSteerableTurnKind {
#[serde(rename = "review")]
Review,
#[serde(rename = "compact")]
Compact,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum PatchApplyStatus {
#[serde(rename = "inProgress")]
InProgress,
#[serde(rename = "completed")]
Completed,
#[serde(rename = "failed")]
Failed,
#[serde(rename = "declined")]
Declined,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum PatchChangeKind {
#[serde(rename = "add")]
Add(AddPatchChangeKind),
#[serde(rename = "delete")]
Delete(DeletePatchChangeKind),
#[serde(rename = "update")]
Update(UpdatePatchChangeKind),
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Personality {
#[serde(rename = "none")]
None,
#[serde(rename = "friendly")]
Friendly,
#[serde(rename = "pragmatic")]
Pragmatic,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct PlanThreadItem {
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub id: String,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
pub text: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum PlanType {
#[serde(rename = "free")]
Free,
#[serde(rename = "go")]
Go,
#[serde(rename = "plus")]
Plus,
#[serde(rename = "pro")]
Pro,
#[serde(rename = "prolite")]
Prolite,
#[serde(rename = "promax")]
Promax,
#[serde(rename = "team")]
Team,
#[serde(rename = "self_serve_business_prolite")]
SelfServeBusinessProlite,
#[serde(rename = "self_serve_business_usage_based")]
SelfServeBusinessUsageBased,
#[serde(rename = "business")]
Business,
#[serde(rename = "ent26")]
Ent26,
#[serde(rename = "enterprise_cbp_automation")]
EnterpriseCbpAutomation,
#[serde(rename = "enterprise_cbp_usage_based")]
EnterpriseCbpUsageBased,
#[serde(rename = "enterprise")]
Enterprise,
#[serde(rename = "edu")]
Edu,
#[serde(rename = "edu_plus")]
EduPlus,
#[serde(rename = "edu_pro")]
EduPro,
#[serde(rename = "sci")]
Sci,
#[serde(rename = "sci_plus")]
SciPlus,
#[serde(rename = "unknown")]
Unknown,
#[serde(untagged)]
UnknownValue(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum RateLimitReachedType {
#[serde(rename = "rate_limit_reached")]
RateLimitReached,
#[serde(rename = "workspace_owner_credits_depleted")]
WorkspaceOwnerCreditsDepleted,
#[serde(rename = "workspace_member_credits_depleted")]
WorkspaceMemberCreditsDepleted,
#[serde(rename = "workspace_owner_usage_limit_reached")]
WorkspaceOwnerUsageLimitReached,
#[serde(rename = "workspace_member_usage_limit_reached")]
WorkspaceMemberUsageLimitReached,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct RateLimitSnapshot {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub credits: Option<CreditsSnapshot>,
#[serde(rename = "individualLimit")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub individual_limit: Option<SpendControlLimitSnapshot>,
#[serde(rename = "limitId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limit_id: Option<String>,
#[serde(rename = "limitName")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limit_name: Option<String>,
#[serde(rename = "normalModelSlug")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub normal_model_slug: Option<String>,
#[serde(rename = "planType")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub plan_type: Option<PlanType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub primary: Option<RateLimitWindow>,
#[serde(rename = "rateLimitReachedType")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rate_limit_reached_type: Option<RateLimitReachedType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub secondary: Option<RateLimitWindow>,
#[serde(rename = "spendControlReached")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub spend_control_reached: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct RateLimitWindow {
#[serde(rename = "resetsAt")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resets_at: Option<i64>,
#[serde(rename = "usedPercent")]
pub used_percent: i64,
#[serde(rename = "windowDurationMins")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub window_duration_mins: Option<i64>,
}
pub type ReasoningEffort = String;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ReasoningSummary {
#[serde(rename = "auto")]
Auto,
#[serde(rename = "concise")]
Concise,
#[serde(rename = "detailed")]
Detailed,
#[serde(rename = "none")]
None,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ReasoningThreadItem {
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content: Option<Vec<String>>,
pub id: String,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub summary: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum SandboxMode {
#[serde(rename = "read-only")]
ReadOnly,
#[serde(rename = "workspace-write")]
WorkspaceWrite,
#[serde(rename = "danger-full-access")]
DangerFullAccess,
#[serde(untagged)]
Unknown(Value),
}
pub type SandboxPolicy = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum SessionSource {
#[serde(rename = "cli")]
Cli,
#[serde(rename = "vscode")]
Vscode,
#[serde(rename = "exec")]
Exec,
#[serde(rename = "appServer")]
AppServer,
#[serde(rename = "unknown")]
Unknown,
#[serde(rename = "custom")]
Custom(String),
#[serde(rename = "subAgent")]
SubAgent(SubAgentSource),
#[serde(untagged)]
UnknownValue(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct Settings {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub developer_instructions: Option<String>,
pub model: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct SkillUserInput {
pub name: String,
pub path: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct SleepThreadItem {
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
#[serde(rename = "durationMs")]
pub duration_ms: u64,
pub id: String,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct SpendControlLimitSnapshot {
pub limit: String,
#[serde(rename = "remainingPercent")]
pub remaining_percent: i64,
#[serde(rename = "resetsAt")]
pub resets_at: i64,
pub used: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum SubAgentActivityKind {
#[serde(rename = "started")]
Started,
#[serde(rename = "interacted")]
Interacted,
#[serde(rename = "interrupted")]
Interrupted,
#[serde(rename = "completed")]
Completed,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SubAgentActivityThreadItem {
#[serde(rename = "agentPath")]
pub agent_path: String,
#[serde(rename = "agentThreadId")]
pub agent_thread_id: String,
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub id: String,
pub kind: SubAgentActivityKind,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(rename = "reasoningEffort")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum SubAgentSource {
#[serde(rename = "review")]
Review,
#[serde(rename = "compact")]
Compact,
#[serde(rename = "memory_consolidation")]
MemoryConsolidation,
#[serde(rename = "thread_spawn")]
ThreadSpawn(SubAgentSourceThreadSpawn),
#[serde(rename = "other")]
Other(String),
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SubAgentSourceThreadSpawn {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_nickname: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_path: Option<AgentPath>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_role: Option<String>,
pub depth: i64,
pub parent_thread_id: ThreadId,
}
pub type TextElement = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct TextUserInput {
pub text: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub text_elements: Option<Vec<TextElement>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Thread {
#[serde(rename = "agentNickname")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_nickname: Option<String>,
#[serde(rename = "agentRole")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_role: Option<String>,
#[serde(rename = "cliVersion")]
pub cli_version: String,
#[serde(rename = "createdAt")]
pub created_at: i64,
pub cwd: AbsolutePathBuf,
pub ephemeral: bool,
#[serde(rename = "forkedFromId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub forked_from_id: Option<String>,
#[serde(rename = "gitInfo")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub git_info: Option<GitInfo>,
#[serde(rename = "historyMode")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub history_mode: Option<ThreadHistoryMode>,
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(rename = "modelProvider")]
pub model_provider: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub originator: Option<String>,
#[serde(rename = "parentThreadId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_thread_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
pub preview: String,
#[serde(rename = "projectId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub project_id: Option<String>,
#[serde(rename = "reasoningEffort")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
#[serde(rename = "recencyAt")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub recency_at: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub section: Option<ThreadSection>,
#[serde(rename = "sectionEnteredAt")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub section_entered_at: Option<i64>,
#[serde(rename = "sessionId")]
pub session_id: String,
pub source: SessionSource,
pub status: ThreadStatus,
#[serde(rename = "threadSource")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub thread_source: Option<ThreadSource>,
pub turns: Vec<Turn>,
#[serde(rename = "updatedAt")]
pub updated_at: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ThreadHistoryMode {
#[serde(rename = "legacy")]
Legacy,
#[serde(rename = "paginated")]
Paginated,
#[serde(untagged)]
Unknown(Value),
}
pub type ThreadId = String;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ThreadItem {
#[serde(rename = "userMessage")]
UserMessage(UserMessageThreadItem),
#[serde(rename = "hookPrompt")]
HookPrompt(HookPromptThreadItem),
#[serde(rename = "agentMessage")]
AgentMessage(AgentMessageThreadItem),
#[serde(rename = "functionCallOutput")]
FunctionCallOutput(FunctionCallOutputThreadItem),
#[serde(rename = "plan")]
Plan(PlanThreadItem),
#[serde(rename = "reasoning")]
Reasoning(ReasoningThreadItem),
#[serde(rename = "commandExecution")]
CommandExecution(CommandExecutionThreadItem),
#[serde(rename = "fileChange")]
FileChange(FileChangeThreadItem),
#[serde(rename = "mcpToolCall")]
McpToolCall(McpToolCallThreadItem),
#[serde(rename = "dynamicToolCall")]
DynamicToolCall(DynamicToolCallThreadItem),
#[serde(rename = "collabAgentToolCall")]
CollabAgentToolCall(CollabAgentToolCallThreadItem),
#[serde(rename = "subAgentActivity")]
SubAgentActivity(SubAgentActivityThreadItem),
#[serde(rename = "webSearch")]
WebSearch(WebSearchThreadItem),
#[serde(rename = "imageView")]
ImageView(ImageViewThreadItem),
#[serde(rename = "sleep")]
Sleep(SleepThreadItem),
#[serde(rename = "imageGeneration")]
ImageGeneration(ImageGenerationThreadItem),
#[serde(rename = "enteredReviewMode")]
EnteredReviewMode(EnteredReviewModeThreadItem),
#[serde(rename = "exitedReviewMode")]
ExitedReviewMode(ExitedReviewModeThreadItem),
#[serde(rename = "contextCompaction")]
ContextCompaction(ContextCompactionThreadItem),
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ThreadResumeParams {
#[serde(rename = "approvalPolicy")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approval_policy: Option<AskForApproval>,
#[serde(rename = "approvalsReviewer")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approvals_reviewer: Option<ApprovalsReviewer>,
#[serde(rename = "baseInstructions")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_instructions: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub config: Option<BTreeMap<String, Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cwd: Option<String>,
#[serde(rename = "developerInstructions")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub developer_instructions: Option<String>,
#[serde(rename = "excludeTurns")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exclude_turns: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(rename = "modelProvider")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model_provider: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub personality: Option<Personality>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sandbox: Option<SandboxMode>,
#[serde(rename = "serviceTier")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub service_tier: Option<String>,
#[serde(rename = "threadId")]
pub thread_id: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ThreadResumeResponse {
#[serde(rename = "approvalPolicy")]
pub approval_policy: AskForApproval,
#[serde(rename = "approvalsReviewer")]
pub approvals_reviewer: ApprovalsReviewer,
#[serde(rename = "collaborationMode")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub collaboration_mode: Option<CollaborationMode>,
pub cwd: AbsolutePathBuf,
#[serde(rename = "disabledPluginIds")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub disabled_plugin_ids: Option<Vec<String>>,
#[serde(rename = "instructionSources")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instruction_sources: Option<Vec<LegacyAppPathString>>,
#[serde(rename = "itemsBackwardsCursor")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub items_backwards_cursor: Option<String>,
pub model: String,
#[serde(rename = "modelProvider")]
pub model_provider: String,
#[serde(rename = "reasoningEffort")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
pub sandbox: SandboxPolicy,
#[serde(rename = "serviceTier")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub service_tier: Option<String>,
pub thread: Thread,
#[serde(rename = "turnsBackwardsCursor")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub turns_backwards_cursor: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ThreadSection {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub appearance: Option<ThreadSectionAppearance>,
pub id: String,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ThreadSectionAppearance {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub color: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub icon: Option<String>,
}
pub type ThreadSource = String;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ThreadStartParams {
#[serde(rename = "approvalPolicy")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approval_policy: Option<AskForApproval>,
#[serde(rename = "approvalsReviewer")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approvals_reviewer: Option<ApprovalsReviewer>,
#[serde(rename = "baseInstructions")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_instructions: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub config: Option<BTreeMap<String, Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cwd: Option<String>,
#[serde(rename = "developerInstructions")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub developer_instructions: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ephemeral: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(rename = "modelProvider")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model_provider: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub personality: Option<Personality>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sandbox: Option<SandboxMode>,
#[serde(rename = "serviceName")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub service_name: Option<String>,
#[serde(rename = "serviceTier")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub service_tier: Option<String>,
#[serde(rename = "sessionStartSource")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub session_start_source: Option<ThreadStartSource>,
#[serde(rename = "threadSource")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub thread_source: Option<ThreadSource>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ThreadStartResponse {
#[serde(rename = "approvalPolicy")]
pub approval_policy: AskForApproval,
#[serde(rename = "approvalsReviewer")]
pub approvals_reviewer: ApprovalsReviewer,
pub cwd: AbsolutePathBuf,
#[serde(rename = "disabledPluginIds")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub disabled_plugin_ids: Option<Vec<String>>,
#[serde(rename = "instructionSources")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instruction_sources: Option<Vec<LegacyAppPathString>>,
pub model: String,
#[serde(rename = "modelProvider")]
pub model_provider: String,
#[serde(rename = "reasoningEffort")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
pub sandbox: SandboxPolicy,
#[serde(rename = "serviceTier")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub service_tier: Option<String>,
pub thread: Thread,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ThreadStartSource {
#[serde(rename = "startup")]
Startup,
#[serde(rename = "clear")]
Clear,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ThreadStartedNotification {
pub thread: Thread,
}
pub type ThreadStatus = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ThreadTokenUsage {
pub last: TokenUsageBreakdown,
#[serde(rename = "modelContextWindow")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model_context_window: Option<i64>,
pub total: TokenUsageBreakdown,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ThreadTokenUsageUpdatedNotification {
#[serde(rename = "threadId")]
pub thread_id: String,
#[serde(rename = "tokenUsage")]
pub token_usage: ThreadTokenUsage,
#[serde(rename = "turnId")]
pub turn_id: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct TokenUsageBreakdown {
#[serde(rename = "cacheWriteInputTokens")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cache_write_input_tokens: Option<i64>,
#[serde(rename = "cachedInputTokens")]
pub cached_input_tokens: i64,
#[serde(rename = "inputTokens")]
pub input_tokens: i64,
#[serde(rename = "outputTokens")]
pub output_tokens: i64,
#[serde(rename = "reasoningOutputTokens")]
pub reasoning_output_tokens: i64,
#[serde(rename = "totalTokens")]
pub total_tokens: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Turn {
#[serde(rename = "completedAt")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at: Option<i64>,
#[serde(rename = "durationMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub duration_ms: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<TurnError>,
pub id: String,
pub items: Vec<ThreadItem>,
#[serde(rename = "itemsView")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub items_view: Option<TurnItemsView>,
#[serde(rename = "rootTurnId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub root_turn_id: Option<String>,
#[serde(rename = "startedAt")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at: Option<i64>,
pub status: TurnStatus,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TurnCompletedNotification {
#[serde(rename = "threadId")]
pub thread_id: String,
pub turn: Turn,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct TurnError {
#[serde(rename = "additionalDetails")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub additional_details: Option<String>,
#[serde(rename = "codexErrorInfo")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub codex_error_info: Option<CodexErrorInfo>,
pub message: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub misalignment: Option<MisalignmentErrorDetails>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct TurnInterruptParams {
#[serde(rename = "threadId")]
pub thread_id: String,
#[serde(rename = "turnId")]
pub turn_id: String,
}
pub type TurnInterruptResponse = BTreeMap<String, Value>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum TurnItemsView {
#[serde(rename = "notLoaded")]
NotLoaded,
#[serde(rename = "summary")]
Summary,
#[serde(rename = "full")]
Full,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct TurnStartParams {
#[serde(rename = "approvalPolicy")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approval_policy: Option<AskForApproval>,
#[serde(rename = "approvalsReviewer")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approvals_reviewer: Option<ApprovalsReviewer>,
#[serde(rename = "clientUserMessageId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_user_message_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cwd: Option<String>,
#[serde(rename = "disabledPluginIds")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub disabled_plugin_ids: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub effort: Option<ReasoningEffort>,
pub input: Vec<UserInput>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(rename = "outputSchema")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub output_schema: Option<Value>,
#[serde(rename = "parentTurnId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_turn_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub personality: Option<Personality>,
#[serde(rename = "rootTurnId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub root_turn_id: Option<String>,
#[serde(rename = "sandboxPolicy")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sandbox_policy: Option<SandboxPolicy>,
#[serde(rename = "serviceTier")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub service_tier: Option<String>,
#[serde(rename = "serviceTierForTurn")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub service_tier_for_turn: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub summary: Option<ReasoningSummary>,
#[serde(rename = "threadId")]
pub thread_id: String,
#[serde(rename = "toolOutput")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tool_output: Option<TurnToolOutput>,
#[serde(rename = "turnTrigger")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub turn_trigger: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TurnStartResponse {
pub turn: Turn,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TurnStartedNotification {
#[serde(rename = "threadId")]
pub thread_id: String,
pub turn: Turn,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum TurnStatus {
#[serde(rename = "completed")]
Completed,
#[serde(rename = "interrupted")]
Interrupted,
#[serde(rename = "failed")]
Failed,
#[serde(rename = "inProgress")]
InProgress,
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TurnToolOutput {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
pub output: FunctionCallOutputBody,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub retain: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct UpdatePatchChangeKind {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub move_path: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct UsageLimitExceededImageGenerationFailure {
#[serde(rename = "limitId")]
pub limit_id: String,
#[serde(rename = "resetsAt")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resets_at: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum UserInput {
#[serde(rename = "text")]
Text(TextUserInput),
#[serde(rename = "image")]
Image(ImageUserInput),
#[serde(rename = "localImage")]
LocalImage(LocalImageUserInput),
#[serde(rename = "audio")]
Audio(AudioUserInput),
#[serde(rename = "localAudio")]
LocalAudio(LocalAudioUserInput),
#[serde(rename = "skill")]
Skill(SkillUserInput),
#[serde(rename = "mention")]
Mention(MentionUserInput),
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct UserMessageThreadItem {
#[serde(rename = "clientId")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_id: Option<String>,
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub content: Vec<UserInput>,
pub id: String,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
}
pub type WebSearchAction = Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct WebSearchThreadItem {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub action: Option<WebSearchAction>,
#[serde(rename = "completedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_ms: Option<i64>,
pub id: String,
pub query: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub results: Option<Vec<Value>>,
#[serde(rename = "startedAtMs")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at_ms: Option<i64>,
}