use std::collections::HashMap;use std::path::PathBuf;use codex_protocol::ThreadId;use codex_protocol::config_types::ForcedLoginMethod;use codex_protocol::config_types::ReasoningSummary;use codex_protocol::config_types::SandboxMode;use codex_protocol::config_types::Verbosity;use codex_protocol::openai_models::ReasoningEffort;use codex_protocol::parse_command::ParsedCommand;use codex_protocol::protocol::AskForApproval;use codex_protocol::protocol::FileChange;pub use codex_protocol::protocol::GitSha;use codex_protocol::protocol::ReviewDecision;use codex_protocol::protocol::SandboxPolicy;use codex_protocol::protocol::SessionSource;use codex_protocol::protocol::TurnAbortReason;use codex_utils_absolute_path::AbsolutePathBuf;use schemars::JsonSchema;use serde::Deserialize;use serde::Serialize;use ts_rs::TS;use crate::protocol::common::AuthMode;use crate::protocol::v2::ForcedChatgptWorkspaceIds;#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct InitializeParams { pub client_info: ClientInfo, #[serde(skip_serializing_if = "Option::is_none")] pub capabilities: Option<InitializeCapabilities>,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct ClientInfo { pub name: String, pub title: Option<String>, pub version: String,}/// Client-declared capabilities negotiated during initialize.#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Default, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct InitializeCapabilities { /// Opt into receiving experimental API methods and fields. #[serde(default)] pub experimental_api: bool, /// Opt into `attestation/generate` requests for upstream `x-oai-attestation`. #[serde(default)] pub request_attestation: bool, /// Exact notification method names that should be suppressed for this /// connection (for example `thread/started`). #[ts(optional = nullable)] pub opt_out_notification_methods: Option<Vec<String>>,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct InitializeResponse { pub user_agent: String, /// Absolute path to the server's $CODEX_HOME directory. pub codex_home: AbsolutePathBuf, /// Platform family for the running app-server target, for example /// `"unix"` or `"windows"`. pub platform_family: String, /// Operating system for the running app-server target, for example /// `"macos"`, `"linux"`, or `"windows"`. pub platform_os: String,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(untagged)]pub enum GetConversationSummaryParams { RolloutPath { #[serde(rename = "rolloutPath")] rollout_path: PathBuf, }, ThreadId { #[serde(rename = "conversationId")] conversation_id: ThreadId, },}#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct GetConversationSummaryResponse { pub summary: ConversationSummary,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct ConversationSummary { pub conversation_id: ThreadId, pub path: PathBuf, pub preview: String, pub timestamp: Option<String>, pub updated_at: Option<String>, pub model_provider: String, pub cwd: PathBuf, pub cli_version: String, pub source: SessionSource, pub git_info: Option<ConversationGitInfo>,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "snake_case")]pub struct ConversationGitInfo { pub sha: Option<String>, pub branch: Option<String>, pub origin_url: Option<String>,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct LoginApiKeyParams { pub api_key: String,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct GitDiffToRemoteResponse { pub sha: GitSha, pub diff: String,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct ApplyPatchApprovalParams { pub conversation_id: ThreadId, /// Use to correlate this with [codex_protocol::protocol::PatchApplyBeginEvent] /// and [codex_protocol::protocol::PatchApplyEndEvent]. pub call_id: String, pub file_changes: HashMap<PathBuf, FileChange>, /// Optional explanatory reason (e.g. request for extra write access). pub reason: Option<String>, /// When set, the agent is asking the user to allow writes under this root /// for the remainder of the session (unclear if this is honored today). pub grant_root: Option<PathBuf>,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct ApplyPatchApprovalResponse { pub decision: ReviewDecision,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct ExecCommandApprovalParams { pub conversation_id: ThreadId, /// Use to correlate this with [codex_protocol::protocol::ExecCommandBeginEvent] /// and [codex_protocol::protocol::ExecCommandEndEvent]. pub call_id: String, /// Identifier for this specific approval callback. pub approval_id: Option<String>, pub command: Vec<String>, pub cwd: PathBuf, pub reason: Option<String>, pub parsed_cmd: Vec<ParsedCommand>,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]pub struct ExecCommandApprovalResponse { pub decision: ReviewDecision,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct GitDiffToRemoteParams { pub cwd: PathBuf,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct GetAuthStatusParams { pub include_token: Option<bool>, pub refresh_token: Option<bool>,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct ExecOneOffCommandParams { pub command: Vec<String>, pub timeout_ms: Option<u64>, pub cwd: Option<PathBuf>, pub sandbox_policy: Option<SandboxPolicy>,}#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct GetAuthStatusResponse { pub auth_method: Option<AuthMode>, pub auth_token: Option<String>, pub requires_openai_auth: Option<bool>,}#[derive(Deserialize, Debug, Clone, PartialEq, Serialize, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct UserSavedConfig { pub approval_policy: Option<AskForApproval>, pub sandbox_mode: Option<SandboxMode>, pub sandbox_settings: Option<SandboxSettings>, pub forced_chatgpt_workspace_id: Option<ForcedChatgptWorkspaceIds>, pub forced_login_method: Option<ForcedLoginMethod>, pub model: Option<String>, pub model_reasoning_effort: Option<ReasoningEffort>, pub model_reasoning_summary: Option<ReasoningSummary>, pub model_verbosity: Option<Verbosity>, pub tools: Option<Tools>,}#[derive(Deserialize, Debug, Clone, PartialEq, Serialize, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct Tools { pub web_search: Option<bool>,}#[derive(Deserialize, Debug, Clone, PartialEq, Serialize, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct SandboxSettings { #[serde(default)] pub writable_roots: Vec<AbsolutePathBuf>, pub network_access: Option<bool>, pub exclude_tmpdir_env_var: Option<bool>, pub exclude_slash_tmp: Option<bool>,}#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema, TS)]#[serde(rename_all = "camelCase")]pub struct InterruptConversationResponse { pub abort_reason: TurnAbortReason,}