# generated by datamodel-codegen:
#   filename:  codex_app_server_protocol.v2.schemas.json

from __future__ import annotations
from pydantic import BaseModel, ConfigDict, Field, RootModel
from typing import Annotated, Any, Literal
from enum import Enum


class CodexAppServerProtocolV2(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class AbsolutePathBuf(RootModel[str]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[
        str,
        Field(
            description="A path that is guaranteed to be absolute and normalized (though it is not guaranteed to be canonicalized or exist on the filesystem).\n\nIMPORTANT: When deserializing an `AbsolutePathBuf`, a base path must be set using [AbsolutePathBufGuard::new]. If no base path is set, the deserialization will fail unless the path being deserialized is already absolute."
        ),
    ]


class ApiKeyAccount(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["apiKey"], Field(title="ApiKeyAccountType")]


class AmazonBedrockAccount(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["amazonBedrock"], Field(title="AmazonBedrockAccountType")]


class AccountLoginCompletedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    error: str | None = None
    login_id: Annotated[str | None, Field(alias="loginId")] = None
    success: bool


class AdditionalWritableRootActivePermissionProfileModification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: AbsolutePathBuf
    type: Annotated[
        Literal["additionalWritableRoot"],
        Field(title="AdditionalWritableRootActivePermissionProfileModificationType"),
    ]


class ActivePermissionProfileModification(
    RootModel[AdditionalWritableRootActivePermissionProfileModification]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: AdditionalWritableRootActivePermissionProfileModification


class AddCreditsNudgeCreditType(Enum):
    credits = "credits"
    usage_limit = "usage_limit"


class AddCreditsNudgeEmailStatus(Enum):
    sent = "sent"
    cooldown_active = "cooldown_active"


class AdditionalNetworkPermissions(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    enabled: bool | None = None


class AgentMessageDeltaNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    delta: str
    item_id: Annotated[str, Field(alias="itemId")]
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class AgentPath(RootModel[str]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: str


class AnalyticsConfig(BaseModel):
    model_config = ConfigDict(
        extra="allow",
        populate_by_name=True,
    )
    enabled: bool | None = None


class AppBranding(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    category: str | None = None
    developer: str | None = None
    is_discoverable_app: Annotated[bool, Field(alias="isDiscoverableApp")]
    privacy_policy: Annotated[str | None, Field(alias="privacyPolicy")] = None
    terms_of_service: Annotated[str | None, Field(alias="termsOfService")] = None
    website: str | None = None


class AppReview(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    status: str


class AppScreenshot(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    file_id: Annotated[str | None, Field(alias="fileId")] = None
    url: str | None = None
    user_prompt: Annotated[str, Field(alias="userPrompt")]


class AppSummary(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    description: str | None = None
    id: str
    install_url: Annotated[str | None, Field(alias="installUrl")] = None
    name: str
    needs_auth: Annotated[bool, Field(alias="needsAuth")]


class AppToolApproval(Enum):
    auto = "auto"
    prompt = "prompt"
    approve = "approve"


class AppToolConfig(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    approval_mode: AppToolApproval | None = None
    enabled: bool | None = None


class AppToolsConfig(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class ApprovalsReviewer(Enum):
    user = "user"
    auto_review = "auto_review"
    guardian_subagent = "guardian_subagent"


class AppsDefaultConfig(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    destructive_enabled: bool | None = True
    enabled: bool | None = True
    open_world_enabled: bool | None = True


class AppsListParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cursor: Annotated[
        str | None, Field(description="Opaque pagination cursor returned by a previous call.")
    ] = None
    force_refetch: Annotated[
        bool | None,
        Field(
            alias="forceRefetch",
            description="When true, bypass app caches and fetch the latest data from sources.",
        ),
    ] = None
    limit: Annotated[
        int | None,
        Field(description="Optional page size; defaults to a reasonable server-side value.", ge=0),
    ] = None
    thread_id: Annotated[
        str | None,
        Field(
            alias="threadId",
            description="Optional thread id used to evaluate app feature gating from that thread's config.",
        ),
    ] = None


class AskForApprovalValue(Enum):
    untrusted = "untrusted"
    on_failure = "on-failure"
    on_request = "on-request"
    never = "never"


class Granular(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    mcp_elicitations: bool
    request_permissions: bool | None = False
    rules: bool
    sandbox_approval: bool
    skill_approval: bool | None = False


class GranularAskForApproval(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    granular: Granular


class AskForApproval(RootModel[AskForApprovalValue | GranularAskForApproval]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: AskForApprovalValue | GranularAskForApproval


class AuthMode(Enum):
    apikey = "apikey"
    chatgpt = "chatgpt"
    chatgpt_auth_tokens = "chatgptAuthTokens"
    agent_identity = "agentIdentity"


class AutoReviewDecisionSource(RootModel[Literal["agent"]]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[
        Literal["agent"],
        Field(
            description="[UNSTABLE] Source that produced a terminal approval auto-review decision."
        ),
    ]


class ByteRange(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    end: Annotated[int, Field(ge=0)]
    start: Annotated[int, Field(ge=0)]


class CancelLoginAccountParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    login_id: Annotated[str, Field(alias="loginId")]


class CancelLoginAccountStatus(Enum):
    canceled = "canceled"
    not_found = "notFound"


class ClientInfo(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    name: str
    title: str | None = None
    version: str


class CodexErrorInfoValue(Enum):
    context_window_exceeded = "contextWindowExceeded"
    usage_limit_exceeded = "usageLimitExceeded"
    server_overloaded = "serverOverloaded"
    cyber_policy = "cyberPolicy"
    internal_server_error = "internalServerError"
    unauthorized = "unauthorized"
    bad_request = "badRequest"
    thread_rollback_failed = "threadRollbackFailed"
    sandbox_error = "sandboxError"
    other = "other"


class HttpConnectionFailed(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    http_status_code: Annotated[int | None, Field(alias="httpStatusCode", ge=0)] = None


class HttpConnectionFailedCodexErrorInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    http_connection_failed: Annotated[HttpConnectionFailed, Field(alias="httpConnectionFailed")]


class ResponseStreamConnectionFailed(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    http_status_code: Annotated[int | None, Field(alias="httpStatusCode", ge=0)] = None


class ResponseStreamConnectionFailedCodexErrorInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    response_stream_connection_failed: Annotated[
        ResponseStreamConnectionFailed, Field(alias="responseStreamConnectionFailed")
    ]


class ResponseStreamDisconnected(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    http_status_code: Annotated[int | None, Field(alias="httpStatusCode", ge=0)] = None


class ResponseStreamDisconnectedCodexErrorInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    response_stream_disconnected: Annotated[
        ResponseStreamDisconnected, Field(alias="responseStreamDisconnected")
    ]


class ResponseTooManyFailedAttempts(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    http_status_code: Annotated[int | None, Field(alias="httpStatusCode", ge=0)] = None


class ResponseTooManyFailedAttemptsCodexErrorInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    response_too_many_failed_attempts: Annotated[
        ResponseTooManyFailedAttempts, Field(alias="responseTooManyFailedAttempts")
    ]


class CollabAgentStatus(Enum):
    pending_init = "pendingInit"
    running = "running"
    interrupted = "interrupted"
    completed = "completed"
    errored = "errored"
    shutdown = "shutdown"
    not_found = "notFound"


class CollabAgentTool(Enum):
    spawn_agent = "spawnAgent"
    send_input = "sendInput"
    resume_agent = "resumeAgent"
    wait = "wait"
    close_agent = "closeAgent"


class CollabAgentToolCallStatus(Enum):
    in_progress = "inProgress"
    completed = "completed"
    failed = "failed"


class ReadCommandAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    command: str
    name: str
    path: AbsolutePathBuf
    type: Annotated[Literal["read"], Field(title="ReadCommandActionType")]


class ListFilesCommandAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    command: str
    path: str | None = None
    type: Annotated[Literal["listFiles"], Field(title="ListFilesCommandActionType")]


class SearchCommandAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    command: str
    path: str | None = None
    query: str | None = None
    type: Annotated[Literal["search"], Field(title="SearchCommandActionType")]


class UnknownCommandAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    command: str
    type: Annotated[Literal["unknown"], Field(title="UnknownCommandActionType")]


class CommandAction(
    RootModel[
        ReadCommandAction | ListFilesCommandAction | SearchCommandAction | UnknownCommandAction
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: ReadCommandAction | ListFilesCommandAction | SearchCommandAction | UnknownCommandAction


class CommandExecOutputStream(Enum):
    stdout = "stdout"
    stderr = "stderr"


class CommandExecResizeResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class CommandExecResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    exit_code: Annotated[int, Field(alias="exitCode", description="Process exit code.")]
    stderr: Annotated[
        str,
        Field(
            description="Buffered stderr capture.\n\nEmpty when stderr was streamed via `command/exec/outputDelta`."
        ),
    ]
    stdout: Annotated[
        str,
        Field(
            description="Buffered stdout capture.\n\nEmpty when stdout was streamed via `command/exec/outputDelta`."
        ),
    ]


class CommandExecTerminalSize(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cols: Annotated[int, Field(description="Terminal width in character cells.", ge=0)]
    rows: Annotated[int, Field(description="Terminal height in character cells.", ge=0)]


class CommandExecTerminateParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    process_id: Annotated[
        str,
        Field(
            alias="processId",
            description="Client-supplied, connection-scoped `processId` from the original `command/exec` request.",
        ),
    ]


class CommandExecTerminateResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class CommandExecWriteParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    close_stdin: Annotated[
        bool | None,
        Field(
            alias="closeStdin", description="Close stdin after writing `deltaBase64`, if present."
        ),
    ] = None
    delta_base64: Annotated[
        str | None,
        Field(alias="deltaBase64", description="Optional base64-encoded stdin bytes to write."),
    ] = None
    process_id: Annotated[
        str,
        Field(
            alias="processId",
            description="Client-supplied, connection-scoped `processId` from the original `command/exec` request.",
        ),
    ]


class CommandExecWriteResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class CommandExecutionOutputDeltaNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    delta: str
    item_id: Annotated[str, Field(alias="itemId")]
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class CommandExecutionSource(Enum):
    agent = "agent"
    user_shell = "userShell"
    unified_exec_startup = "unifiedExecStartup"
    unified_exec_interaction = "unifiedExecInteraction"


class CommandExecutionStatus(Enum):
    in_progress = "inProgress"
    completed = "completed"
    failed = "failed"
    declined = "declined"


class CommandMigration(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    name: str


class MdmConfigLayerSource(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    domain: str
    key: str
    type: Annotated[Literal["mdm"], Field(title="MdmConfigLayerSourceType")]


class SystemConfigLayerSource(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    file: Annotated[
        AbsolutePathBuf,
        Field(
            description="This is the path to the system config.toml file, though it is not guaranteed to exist."
        ),
    ]
    type: Annotated[Literal["system"], Field(title="SystemConfigLayerSourceType")]


class UserConfigLayerSource(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    file: Annotated[
        AbsolutePathBuf,
        Field(
            description="This is the path to the user's config.toml file, though it is not guaranteed to exist."
        ),
    ]
    type: Annotated[Literal["user"], Field(title="UserConfigLayerSourceType")]


class ProjectConfigLayerSource(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    dot_codex_folder: Annotated[AbsolutePathBuf, Field(alias="dotCodexFolder")]
    type: Annotated[Literal["project"], Field(title="ProjectConfigLayerSourceType")]


class SessionFlagsConfigLayerSource(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["sessionFlags"], Field(title="SessionFlagsConfigLayerSourceType")]


class LegacyManagedConfigTomlFromFileConfigLayerSource(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    file: AbsolutePathBuf
    type: Annotated[
        Literal["legacyManagedConfigTomlFromFile"],
        Field(title="LegacyManagedConfigTomlFromFileConfigLayerSourceType"),
    ]


class LegacyManagedConfigTomlFromMdmConfigLayerSource(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[
        Literal["legacyManagedConfigTomlFromMdm"],
        Field(title="LegacyManagedConfigTomlFromMdmConfigLayerSourceType"),
    ]


class ConfigLayerSource(
    RootModel[
        MdmConfigLayerSource
        | SystemConfigLayerSource
        | UserConfigLayerSource
        | ProjectConfigLayerSource
        | SessionFlagsConfigLayerSource
        | LegacyManagedConfigTomlFromFileConfigLayerSource
        | LegacyManagedConfigTomlFromMdmConfigLayerSource
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: (
        MdmConfigLayerSource
        | SystemConfigLayerSource
        | UserConfigLayerSource
        | ProjectConfigLayerSource
        | SessionFlagsConfigLayerSource
        | LegacyManagedConfigTomlFromFileConfigLayerSource
        | LegacyManagedConfigTomlFromMdmConfigLayerSource
    )


class ConfigReadParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwd: Annotated[
        str | None,
        Field(
            description="Optional working directory to resolve project config layers. If specified, return the effective config as seen from that directory (i.e., including any project layers between `cwd` and the project/repo root)."
        ),
    ] = None
    include_layers: Annotated[bool | None, Field(alias="includeLayers")] = False


class CommandConfiguredHookHandler(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    async_: Annotated[bool, Field(alias="async")]
    command: str
    status_message: Annotated[str | None, Field(alias="statusMessage")] = None
    timeout_sec: Annotated[int | None, Field(alias="timeoutSec", ge=0)] = None
    type: Annotated[Literal["command"], Field(title="CommandConfiguredHookHandlerType")]


class PromptConfiguredHookHandler(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["prompt"], Field(title="PromptConfiguredHookHandlerType")]


class AgentConfiguredHookHandler(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["agent"], Field(title="AgentConfiguredHookHandlerType")]


class ConfiguredHookHandler(
    RootModel[
        CommandConfiguredHookHandler | PromptConfiguredHookHandler | AgentConfiguredHookHandler
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: CommandConfiguredHookHandler | PromptConfiguredHookHandler | AgentConfiguredHookHandler


class ConfiguredHookMatcherGroup(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    hooks: list[ConfiguredHookHandler]
    matcher: str | None = None


class InputTextContentItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    text: str
    type: Annotated[Literal["input_text"], Field(title="InputTextContentItemType")]


class OutputTextContentItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    text: str
    type: Annotated[Literal["output_text"], Field(title="OutputTextContentItemType")]


class ContextCompactedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class CreditsSnapshot(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    balance: str | None = None
    has_credits: Annotated[bool, Field(alias="hasCredits")]
    unlimited: bool


class DeprecationNoticeNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    details: Annotated[
        str | None,
        Field(description="Optional extra guidance, such as migration steps or rationale."),
    ] = None
    summary: Annotated[str, Field(description="Concise summary of what is deprecated.")]


class InputTextDynamicToolCallOutputContentItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    text: str
    type: Annotated[
        Literal["inputText"], Field(title="InputTextDynamicToolCallOutputContentItemType")
    ]


class InputImageDynamicToolCallOutputContentItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    image_url: Annotated[str, Field(alias="imageUrl")]
    type: Annotated[
        Literal["inputImage"], Field(title="InputImageDynamicToolCallOutputContentItemType")
    ]


class DynamicToolCallOutputContentItem(
    RootModel[
        InputTextDynamicToolCallOutputContentItem | InputImageDynamicToolCallOutputContentItem
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: InputTextDynamicToolCallOutputContentItem | InputImageDynamicToolCallOutputContentItem


class DynamicToolCallStatus(Enum):
    in_progress = "inProgress"
    completed = "completed"
    failed = "failed"


class DynamicToolSpec(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    defer_loading: Annotated[bool | None, Field(alias="deferLoading")] = None
    description: str
    input_schema: Annotated[Any, Field(alias="inputSchema")]
    name: str
    namespace: str | None = None


class ExperimentalFeatureEnablementSetParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    enablement: Annotated[
        dict[str, bool],
        Field(
            description="Process-wide runtime feature enablement keyed by canonical feature name.\n\nOnly named features are updated. Omitted features are left unchanged. Send an empty map for a no-op."
        ),
    ]


class ExperimentalFeatureEnablementSetResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    enablement: Annotated[
        dict[str, bool], Field(description="Feature enablement entries updated by this request.")
    ]


class ExperimentalFeatureListParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cursor: Annotated[
        str | None, Field(description="Opaque pagination cursor returned by a previous call.")
    ] = None
    limit: Annotated[
        int | None,
        Field(description="Optional page size; defaults to a reasonable server-side value.", ge=0),
    ] = None


class ExperimentalFeatureStage(Enum):
    beta = "beta"
    under_development = "underDevelopment"
    stable = "stable"
    deprecated = "deprecated"
    removed = "removed"


class ExternalAgentConfigDetectParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwds: Annotated[
        list[str] | None,
        Field(description="Zero or more working directories to include for repo-scoped detection."),
    ] = None
    include_home: Annotated[
        bool | None,
        Field(
            alias="includeHome",
            description="If true, include detection under the user's home (~/.claude, ~/.codex, etc.).",
        ),
    ] = None


class ExternalAgentConfigImportCompletedNotification(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class ExternalAgentConfigImportResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class ExternalAgentConfigMigrationItemType(Enum):
    agents_md = "AGENTS_MD"
    config = "CONFIG"
    skills = "SKILLS"
    plugins = "PLUGINS"
    mcp_server_config = "MCP_SERVER_CONFIG"
    subagents = "SUBAGENTS"
    hooks = "HOOKS"
    commands = "COMMANDS"
    sessions = "SESSIONS"


class FeedbackUploadParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    classification: str
    extra_log_files: Annotated[list[str] | None, Field(alias="extraLogFiles")] = None
    include_logs: Annotated[bool, Field(alias="includeLogs")]
    reason: str | None = None
    tags: dict[str, Any] | None = None
    thread_id: Annotated[str | None, Field(alias="threadId")] = None


class FeedbackUploadResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]


class FileChangeOutputDeltaNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    delta: str
    item_id: Annotated[str, Field(alias="itemId")]
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class FileSystemAccessMode(Enum):
    read = "read"
    write = "write"
    none = "none"


class PathFileSystemPath(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: AbsolutePathBuf
    type: Annotated[Literal["path"], Field(title="PathFileSystemPathType")]


class GlobPatternFileSystemPath(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    pattern: str
    type: Annotated[Literal["glob_pattern"], Field(title="GlobPatternFileSystemPathType")]


class RootFileSystemSpecialPath(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    kind: Literal["root"]


class MinimalFileSystemSpecialPath(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    kind: Literal["minimal"]


class KindFileSystemSpecialPath(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    kind: Literal["project_roots"]
    subpath: str | None = None


class TmpdirFileSystemSpecialPath(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    kind: Literal["tmpdir"]


class SlashTmpFileSystemSpecialPath(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    kind: Literal["slash_tmp"]


class FileSystemSpecialPath1(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    kind: Literal["unknown"]
    path: str
    subpath: str | None = None


class FileSystemSpecialPath(
    RootModel[
        RootFileSystemSpecialPath
        | MinimalFileSystemSpecialPath
        | KindFileSystemSpecialPath
        | TmpdirFileSystemSpecialPath
        | SlashTmpFileSystemSpecialPath
        | FileSystemSpecialPath1
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: (
        RootFileSystemSpecialPath
        | MinimalFileSystemSpecialPath
        | KindFileSystemSpecialPath
        | TmpdirFileSystemSpecialPath
        | SlashTmpFileSystemSpecialPath
        | FileSystemSpecialPath1
    )


class ForcedLoginMethod(Enum):
    chatgpt = "chatgpt"
    api = "api"


class FsChangedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    changed_paths: Annotated[
        list[AbsolutePathBuf],
        Field(
            alias="changedPaths", description="File or directory paths associated with this event."
        ),
    ]
    watch_id: Annotated[
        str,
        Field(alias="watchId", description="Watch identifier previously provided to `fs/watch`."),
    ]


class FsCopyParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    destination_path: Annotated[
        AbsolutePathBuf, Field(alias="destinationPath", description="Absolute destination path.")
    ]
    recursive: Annotated[
        bool | None, Field(description="Required for directory copies; ignored for file copies.")
    ] = None
    source_path: Annotated[
        AbsolutePathBuf, Field(alias="sourcePath", description="Absolute source path.")
    ]


class FsCopyResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class FsCreateDirectoryParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: Annotated[AbsolutePathBuf, Field(description="Absolute directory path to create.")]
    recursive: Annotated[
        bool | None,
        Field(description="Whether parent directories should also be created. Defaults to `true`."),
    ] = None


class FsCreateDirectoryResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class FsGetMetadataParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: Annotated[AbsolutePathBuf, Field(description="Absolute path to inspect.")]


class FsGetMetadataResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    created_at_ms: Annotated[
        int,
        Field(
            alias="createdAtMs",
            description="File creation time in Unix milliseconds when available, otherwise `0`.",
        ),
    ]
    is_directory: Annotated[
        bool, Field(alias="isDirectory", description="Whether the path resolves to a directory.")
    ]
    is_file: Annotated[
        bool, Field(alias="isFile", description="Whether the path resolves to a regular file.")
    ]
    is_symlink: Annotated[
        bool, Field(alias="isSymlink", description="Whether the path itself is a symbolic link.")
    ]
    modified_at_ms: Annotated[
        int,
        Field(
            alias="modifiedAtMs",
            description="File modification time in Unix milliseconds when available, otherwise `0`.",
        ),
    ]


class FsReadDirectoryEntry(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    file_name: Annotated[
        str,
        Field(
            alias="fileName",
            description="Direct child entry name only, not an absolute or relative path.",
        ),
    ]
    is_directory: Annotated[
        bool, Field(alias="isDirectory", description="Whether this entry resolves to a directory.")
    ]
    is_file: Annotated[
        bool, Field(alias="isFile", description="Whether this entry resolves to a regular file.")
    ]


class FsReadDirectoryParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: Annotated[AbsolutePathBuf, Field(description="Absolute directory path to read.")]


class FsReadDirectoryResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    entries: Annotated[
        list[FsReadDirectoryEntry],
        Field(description="Direct child entries in the requested directory."),
    ]


class FsReadFileParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: Annotated[AbsolutePathBuf, Field(description="Absolute path to read.")]


class FsReadFileResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data_base64: Annotated[
        str, Field(alias="dataBase64", description="File contents encoded as base64.")
    ]


class FsRemoveParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    force: Annotated[
        bool | None,
        Field(description="Whether missing paths should be ignored. Defaults to `true`."),
    ] = None
    path: Annotated[AbsolutePathBuf, Field(description="Absolute path to remove.")]
    recursive: Annotated[
        bool | None,
        Field(description="Whether directory removal should recurse. Defaults to `true`."),
    ] = None


class FsRemoveResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class FsUnwatchParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    watch_id: Annotated[
        str,
        Field(alias="watchId", description="Watch identifier previously provided to `fs/watch`."),
    ]


class FsUnwatchResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class FsWatchParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: Annotated[AbsolutePathBuf, Field(description="Absolute file or directory path to watch.")]
    watch_id: Annotated[
        str,
        Field(
            alias="watchId",
            description="Connection-scoped watch identifier used for `fs/unwatch` and `fs/changed`.",
        ),
    ]


class FsWatchResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: Annotated[
        AbsolutePathBuf, Field(description="Canonicalized path associated with the watch.")
    ]


class FsWriteFileParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data_base64: Annotated[
        str, Field(alias="dataBase64", description="File contents encoded as base64.")
    ]
    path: Annotated[AbsolutePathBuf, Field(description="Absolute path to write.")]


class FsWriteFileResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class InputTextFunctionCallOutputContentItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    text: str
    type: Annotated[
        Literal["input_text"], Field(title="InputTextFunctionCallOutputContentItemType")
    ]


class FuzzyFileSearchMatchType(Enum):
    file = "file"
    directory = "directory"


class FuzzyFileSearchParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cancellation_token: Annotated[str | None, Field(alias="cancellationToken")] = None
    query: str
    roots: list[str]


class Indice(RootModel[int]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[int, Field(ge=0)]


class FuzzyFileSearchResult(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    file_name: str
    indices: list[Indice] | None = None
    match_type: FuzzyFileSearchMatchType
    path: str
    root: str
    score: Annotated[int, Field(ge=0)]


class FuzzyFileSearchSessionCompletedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    session_id: Annotated[str, Field(alias="sessionId")]


class FuzzyFileSearchSessionUpdatedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    files: list[FuzzyFileSearchResult]
    query: str
    session_id: Annotated[str, Field(alias="sessionId")]


class GetAccountParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    refresh_token: Annotated[
        bool | None,
        Field(
            alias="refreshToken",
            description="When `true`, requests a proactive token refresh before returning.\n\nIn managed auth mode this triggers the normal refresh-token flow. In external auth mode this flag is ignored. Clients should refresh tokens themselves and call `account/login/start` with `chatgptAuthTokens`.",
        ),
    ] = False


class GitInfo(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    branch: str | None = None
    origin_url: Annotated[str | None, Field(alias="originUrl")] = None
    sha: str | None = None


class ApplyPatchGuardianApprovalReviewAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwd: AbsolutePathBuf
    files: list[AbsolutePathBuf]
    type: Annotated[
        Literal["applyPatch"], Field(title="ApplyPatchGuardianApprovalReviewActionType")
    ]


class McpToolCallGuardianApprovalReviewAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    connector_id: Annotated[str | None, Field(alias="connectorId")] = None
    connector_name: Annotated[str | None, Field(alias="connectorName")] = None
    server: str
    tool_name: Annotated[str, Field(alias="toolName")]
    tool_title: Annotated[str | None, Field(alias="toolTitle")] = None
    type: Annotated[
        Literal["mcpToolCall"], Field(title="McpToolCallGuardianApprovalReviewActionType")
    ]


class GuardianApprovalReviewStatus(Enum):
    in_progress = "inProgress"
    approved = "approved"
    denied = "denied"
    timed_out = "timedOut"
    aborted = "aborted"


class GuardianCommandSource(Enum):
    shell = "shell"
    unified_exec = "unifiedExec"


class GuardianRiskLevel(Enum):
    low = "low"
    medium = "medium"
    high = "high"
    critical = "critical"


class GuardianUserAuthorization(Enum):
    unknown = "unknown"
    low = "low"
    medium = "medium"
    high = "high"


class GuardianWarningNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    message: Annotated[str, Field(description="Concise guardian warning message for the user.")]
    thread_id: Annotated[
        str, Field(alias="threadId", description="Thread target for the guardian warning.")
    ]


class HookErrorInfo(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    message: str
    path: str


class HookEventName(Enum):
    pre_tool_use = "preToolUse"
    permission_request = "permissionRequest"
    post_tool_use = "postToolUse"
    pre_compact = "preCompact"
    post_compact = "postCompact"
    session_start = "sessionStart"
    user_prompt_submit = "userPromptSubmit"
    stop = "stop"


class HookExecutionMode(Enum):
    sync = "sync"
    async_ = "async"


class HookHandlerType(Enum):
    command = "command"
    prompt = "prompt"
    agent = "agent"


class HookMigration(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    name: str


class HookOutputEntryKind(Enum):
    warning = "warning"
    stop = "stop"
    feedback = "feedback"
    context = "context"
    error = "error"


class HookPromptFragment(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    hook_run_id: Annotated[str, Field(alias="hookRunId")]
    text: str


class HookRunStatus(Enum):
    running = "running"
    completed = "completed"
    failed = "failed"
    blocked = "blocked"
    stopped = "stopped"


class HookScope(Enum):
    thread = "thread"
    turn = "turn"


class HookSource(Enum):
    system = "system"
    user = "user"
    project = "project"
    mdm = "mdm"
    session_flags = "sessionFlags"
    plugin = "plugin"
    cloud_requirements = "cloudRequirements"
    legacy_managed_config_file = "legacyManagedConfigFile"
    legacy_managed_config_mdm = "legacyManagedConfigMdm"
    unknown = "unknown"


class HookTrustStatus(Enum):
    managed = "managed"
    untrusted = "untrusted"
    trusted = "trusted"
    modified = "modified"


class HooksListParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwds: Annotated[
        list[str] | None,
        Field(description="When empty, defaults to the current session working directory."),
    ] = None


class ImageDetail(Enum):
    auto = "auto"
    low = "low"
    high = "high"
    original = "original"


class InitializeCapabilities(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    experimental_api: Annotated[
        bool | None,
        Field(
            alias="experimentalApi",
            description="Opt into receiving experimental API methods and fields.",
        ),
    ] = False
    opt_out_notification_methods: Annotated[
        list[str] | None,
        Field(
            alias="optOutNotificationMethods",
            description="Exact notification method names that should be suppressed for this connection (for example `thread/started`).",
        ),
    ] = None
    request_attestation: Annotated[
        bool | None,
        Field(
            alias="requestAttestation",
            description="Opt into `attestation/generate` requests for upstream `x-oai-attestation`.",
        ),
    ] = False


class InitializeParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    capabilities: InitializeCapabilities | None = None
    client_info: Annotated[ClientInfo, Field(alias="clientInfo")]


class InputModality(Enum):
    text = "text"
    image = "image"


class ExecLocalShellAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    command: list[str]
    env: dict[str, Any] | None = None
    timeout_ms: Annotated[int | None, Field(ge=0)] = None
    type: Annotated[Literal["exec"], Field(title="ExecLocalShellActionType")]
    user: str | None = None
    working_directory: str | None = None


class LocalShellAction(RootModel[ExecLocalShellAction]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: ExecLocalShellAction


class LocalShellStatus(Enum):
    completed = "completed"
    in_progress = "in_progress"
    incomplete = "incomplete"


class ApiKeyLoginAccountParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    api_key: Annotated[str, Field(alias="apiKey")]
    type: Annotated[Literal["apiKey"], Field(title="ApiKeyv2::LoginAccountParamsType")]


class ChatgptLoginAccountParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    codex_streamlined_login: Annotated[bool | None, Field(alias="codexStreamlinedLogin")] = None
    type: Annotated[Literal["chatgpt"], Field(title="Chatgptv2::LoginAccountParamsType")]


class ChatgptDeviceCodeLoginAccountParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[
        Literal["chatgptDeviceCode"], Field(title="ChatgptDeviceCodev2::LoginAccountParamsType")
    ]


class ChatgptAuthTokensLoginAccountParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    access_token: Annotated[
        str,
        Field(
            alias="accessToken",
            description="Access token (JWT) supplied by the client. This token is used for backend API requests and email extraction.",
        ),
    ]
    chatgpt_account_id: Annotated[
        str,
        Field(
            alias="chatgptAccountId",
            description="Workspace/account identifier supplied by the client.",
        ),
    ]
    chatgpt_plan_type: Annotated[
        str | None,
        Field(
            alias="chatgptPlanType",
            description="Optional plan type supplied by the client.\n\nWhen `null`, Codex attempts to derive the plan type from access-token claims. If unavailable, the plan defaults to `unknown`.",
        ),
    ] = None
    type: Annotated[
        Literal["chatgptAuthTokens"], Field(title="ChatgptAuthTokensv2::LoginAccountParamsType")
    ]


class LoginAccountParams(
    RootModel[
        ApiKeyLoginAccountParams
        | ChatgptLoginAccountParams
        | ChatgptDeviceCodeLoginAccountParams
        | ChatgptAuthTokensLoginAccountParams
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[
        ApiKeyLoginAccountParams
        | ChatgptLoginAccountParams
        | ChatgptDeviceCodeLoginAccountParams
        | ChatgptAuthTokensLoginAccountParams,
        Field(title="LoginAccountParams"),
    ]


class ApiKeyLoginAccountResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["apiKey"], Field(title="ApiKeyv2::LoginAccountResponseType")]


class ChatgptLoginAccountResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    auth_url: Annotated[
        str,
        Field(
            alias="authUrl",
            description="URL the client should open in a browser to initiate the OAuth flow.",
        ),
    ]
    login_id: Annotated[str, Field(alias="loginId")]
    type: Annotated[Literal["chatgpt"], Field(title="Chatgptv2::LoginAccountResponseType")]


class ChatgptDeviceCodeLoginAccountResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    login_id: Annotated[str, Field(alias="loginId")]
    type: Annotated[
        Literal["chatgptDeviceCode"], Field(title="ChatgptDeviceCodev2::LoginAccountResponseType")
    ]
    user_code: Annotated[
        str,
        Field(alias="userCode", description="One-time code the user must enter after signing in."),
    ]
    verification_url: Annotated[
        str,
        Field(
            alias="verificationUrl",
            description="URL the client should open in a browser to complete device code authorization.",
        ),
    ]


class ChatgptAuthTokensLoginAccountResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[
        Literal["chatgptAuthTokens"], Field(title="ChatgptAuthTokensv2::LoginAccountResponseType")
    ]


class LoginAccountResponse(
    RootModel[
        ApiKeyLoginAccountResponse
        | ChatgptLoginAccountResponse
        | ChatgptDeviceCodeLoginAccountResponse
        | ChatgptAuthTokensLoginAccountResponse
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[
        ApiKeyLoginAccountResponse
        | ChatgptLoginAccountResponse
        | ChatgptDeviceCodeLoginAccountResponse
        | ChatgptAuthTokensLoginAccountResponse,
        Field(title="LoginAccountResponse"),
    ]


class LogoutAccountResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class ManagedHooksRequirements(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    permission_request: Annotated[
        list[ConfiguredHookMatcherGroup], Field(alias="PermissionRequest")
    ]
    post_compact: Annotated[list[ConfiguredHookMatcherGroup], Field(alias="PostCompact")]
    post_tool_use: Annotated[list[ConfiguredHookMatcherGroup], Field(alias="PostToolUse")]
    pre_compact: Annotated[list[ConfiguredHookMatcherGroup], Field(alias="PreCompact")]
    pre_tool_use: Annotated[list[ConfiguredHookMatcherGroup], Field(alias="PreToolUse")]
    session_start: Annotated[list[ConfiguredHookMatcherGroup], Field(alias="SessionStart")]
    stop: Annotated[list[ConfiguredHookMatcherGroup], Field(alias="Stop")]
    user_prompt_submit: Annotated[list[ConfiguredHookMatcherGroup], Field(alias="UserPromptSubmit")]
    managed_dir: Annotated[str | None, Field(alias="managedDir")] = None
    windows_managed_dir: Annotated[str | None, Field(alias="windowsManagedDir")] = None


class MarketplaceAddParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    ref_name: Annotated[str | None, Field(alias="refName")] = None
    source: str
    sparse_paths: Annotated[list[str] | None, Field(alias="sparsePaths")] = None


class MarketplaceAddResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    already_added: Annotated[bool, Field(alias="alreadyAdded")]
    installed_root: Annotated[AbsolutePathBuf, Field(alias="installedRoot")]
    marketplace_name: Annotated[str, Field(alias="marketplaceName")]


class MarketplaceInterface(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    display_name: Annotated[str | None, Field(alias="displayName")] = None


class MarketplaceLoadErrorInfo(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    marketplace_path: Annotated[AbsolutePathBuf, Field(alias="marketplacePath")]
    message: str


class MarketplaceRemoveParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    marketplace_name: Annotated[str, Field(alias="marketplaceName")]


class MarketplaceRemoveResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    installed_root: Annotated[AbsolutePathBuf | None, Field(alias="installedRoot")] = None
    marketplace_name: Annotated[str, Field(alias="marketplaceName")]


class MarketplaceUpgradeErrorInfo(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    marketplace_name: Annotated[str, Field(alias="marketplaceName")]
    message: str


class MarketplaceUpgradeParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    marketplace_name: Annotated[str | None, Field(alias="marketplaceName")] = None


class MarketplaceUpgradeResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    errors: list[MarketplaceUpgradeErrorInfo]
    selected_marketplaces: Annotated[list[str], Field(alias="selectedMarketplaces")]
    upgraded_roots: Annotated[list[AbsolutePathBuf], Field(alias="upgradedRoots")]


class McpAuthStatus(Enum):
    unsupported = "unsupported"
    not_logged_in = "notLoggedIn"
    bearer_token = "bearerToken"
    o_auth = "oAuth"


class McpResourceReadParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    server: str
    thread_id: Annotated[str | None, Field(alias="threadId")] = None
    uri: str


class McpServerMigration(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    name: str


class McpServerOauthLoginCompletedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    error: str | None = None
    name: str
    success: bool


class McpServerOauthLoginParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    name: str
    scopes: list[str] | None = None
    timeout_secs: Annotated[int | None, Field(alias="timeoutSecs")] = None


class McpServerOauthLoginResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    authorization_url: Annotated[str, Field(alias="authorizationUrl")]


class McpServerRefreshResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class McpServerStartupState(Enum):
    starting = "starting"
    ready = "ready"
    failed = "failed"
    cancelled = "cancelled"


class McpServerStatusDetail(Enum):
    full = "full"
    tools_and_auth_only = "toolsAndAuthOnly"


class McpServerStatusUpdatedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    error: str | None = None
    name: str
    status: McpServerStartupState


class McpServerToolCallParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    field_meta: Annotated[Any | None, Field(alias="_meta")] = None
    arguments: Any | None = None
    server: str
    thread_id: Annotated[str, Field(alias="threadId")]
    tool: str


class McpServerToolCallResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    field_meta: Annotated[Any | None, Field(alias="_meta")] = None
    content: list
    is_error: Annotated[bool | None, Field(alias="isError")] = None
    structured_content: Annotated[Any | None, Field(alias="structuredContent")] = None


class McpToolCallError(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    message: str


class McpToolCallProgressNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    item_id: Annotated[str, Field(alias="itemId")]
    message: str
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class McpToolCallResult(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    field_meta: Annotated[Any | None, Field(alias="_meta")] = None
    content: list
    structured_content: Annotated[Any | None, Field(alias="structuredContent")] = None


class McpToolCallStatus(Enum):
    in_progress = "inProgress"
    completed = "completed"
    failed = "failed"


class MemoryCitationEntry(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    line_end: Annotated[int, Field(alias="lineEnd", ge=0)]
    line_start: Annotated[int, Field(alias="lineStart", ge=0)]
    note: str
    path: str


class MergeStrategy(Enum):
    replace = "replace"
    upsert = "upsert"


class MessagePhase(Enum):
    commentary = "commentary"
    final_answer = "final_answer"


class ModeKind(Enum):
    plan = "plan"
    default = "default"


class ModelAvailabilityNux(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    message: str


class ModelListParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cursor: Annotated[
        str | None, Field(description="Opaque pagination cursor returned by a previous call.")
    ] = None
    include_hidden: Annotated[
        bool | None,
        Field(
            alias="includeHidden",
            description="When true, include models that are hidden from the default picker list.",
        ),
    ] = None
    limit: Annotated[
        int | None,
        Field(description="Optional page size; defaults to a reasonable server-side value.", ge=0),
    ] = None


class ModelProviderCapabilitiesReadParams(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class ModelProviderCapabilitiesReadResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    image_generation: Annotated[bool, Field(alias="imageGeneration")]
    namespace_tools: Annotated[bool, Field(alias="namespaceTools")]
    web_search: Annotated[bool, Field(alias="webSearch")]


class ModelRerouteReason(RootModel[Literal["highRiskCyberActivity"]]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Literal["highRiskCyberActivity"]


class ModelReroutedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    from_model: Annotated[str, Field(alias="fromModel")]
    reason: ModelRerouteReason
    thread_id: Annotated[str, Field(alias="threadId")]
    to_model: Annotated[str, Field(alias="toModel")]
    turn_id: Annotated[str, Field(alias="turnId")]


class ModelServiceTier(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    description: str
    id: str
    name: str


class ModelUpgradeInfo(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    migration_markdown: Annotated[str | None, Field(alias="migrationMarkdown")] = None
    model: str
    model_link: Annotated[str | None, Field(alias="modelLink")] = None
    upgrade_copy: Annotated[str | None, Field(alias="upgradeCopy")] = None


class ModelVerification(RootModel[Literal["trustedAccessForCyber"]]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Literal["trustedAccessForCyber"]


class ModelVerificationNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]
    verifications: list[ModelVerification]


class NetworkAccess(Enum):
    restricted = "restricted"
    enabled = "enabled"


class NetworkApprovalProtocol(Enum):
    http = "http"
    https = "https"
    socks5_tcp = "socks5Tcp"
    socks5_udp = "socks5Udp"


class NetworkDomainPermission(Enum):
    allow = "allow"
    deny = "deny"


class NetworkRequirements(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    allow_local_binding: Annotated[bool | None, Field(alias="allowLocalBinding")] = None
    allow_unix_sockets: Annotated[
        list[str] | None,
        Field(
            alias="allowUnixSockets",
            description="Legacy compatibility view derived from `unix_sockets`.",
        ),
    ] = None
    allow_upstream_proxy: Annotated[bool | None, Field(alias="allowUpstreamProxy")] = None
    allowed_domains: Annotated[
        list[str] | None,
        Field(
            alias="allowedDomains", description="Legacy compatibility view derived from `domains`."
        ),
    ] = None
    dangerously_allow_all_unix_sockets: Annotated[
        bool | None, Field(alias="dangerouslyAllowAllUnixSockets")
    ] = None
    dangerously_allow_non_loopback_proxy: Annotated[
        bool | None, Field(alias="dangerouslyAllowNonLoopbackProxy")
    ] = None
    denied_domains: Annotated[
        list[str] | None,
        Field(
            alias="deniedDomains", description="Legacy compatibility view derived from `domains`."
        ),
    ] = None
    domains: Annotated[
        dict[str, Any] | None,
        Field(description="Canonical network permission map for `experimental_network`."),
    ] = None
    enabled: bool | None = None
    http_port: Annotated[int | None, Field(alias="httpPort", ge=0)] = None
    managed_allowed_domains_only: Annotated[
        bool | None,
        Field(
            alias="managedAllowedDomainsOnly",
            description="When true, only managed allowlist entries are respected while managed network enforcement is active.",
        ),
    ] = None
    socks_port: Annotated[int | None, Field(alias="socksPort", ge=0)] = None
    unix_sockets: Annotated[
        dict[str, Any] | None,
        Field(
            alias="unixSockets",
            description="Canonical unix socket permission map for `experimental_network`.",
        ),
    ] = None


class NetworkUnixSocketPermission(Enum):
    allow = "allow"
    none = "none"


class NonSteerableTurnKind(Enum):
    review = "review"
    compact = "compact"


class PatchApplyStatus(Enum):
    in_progress = "inProgress"
    completed = "completed"
    failed = "failed"
    declined = "declined"


class AddPatchChangeKind(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["add"], Field(title="AddPatchChangeKindType")]


class DeletePatchChangeKind(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["delete"], Field(title="DeletePatchChangeKindType")]


class UpdatePatchChangeKind(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    move_path: str | None = None
    type: Annotated[Literal["update"], Field(title="UpdatePatchChangeKindType")]


class PatchChangeKind(
    RootModel[AddPatchChangeKind | DeletePatchChangeKind | UpdatePatchChangeKind]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: AddPatchChangeKind | DeletePatchChangeKind | UpdatePatchChangeKind


class DisabledPermissionProfile(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["disabled"], Field(title="DisabledPermissionProfileType")]


class UnrestrictedPermissionProfileFileSystemPermissions(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[
        Literal["unrestricted"],
        Field(title="UnrestrictedPermissionProfileFileSystemPermissionsType"),
    ]


class AdditionalWritableRootPermissionProfileModificationParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: AbsolutePathBuf
    type: Annotated[
        Literal["additionalWritableRoot"],
        Field(title="AdditionalWritableRootPermissionProfileModificationParamsType"),
    ]


class PermissionProfileModificationParams(
    RootModel[AdditionalWritableRootPermissionProfileModificationParams]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: AdditionalWritableRootPermissionProfileModificationParams


class PermissionProfileNetworkPermissions(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    enabled: bool


class ProfilePermissionProfileSelectionParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: str
    modifications: list[PermissionProfileModificationParams] | None = None
    type: Annotated[Literal["profile"], Field(title="ProfilePermissionProfileSelectionParamsType")]


class PermissionProfileSelectionParams(RootModel[ProfilePermissionProfileSelectionParams]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: ProfilePermissionProfileSelectionParams


class Personality(Enum):
    none = "none"
    friendly = "friendly"
    pragmatic = "pragmatic"


class PlanDeltaNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    delta: str
    item_id: Annotated[str, Field(alias="itemId")]
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class PlanType(Enum):
    free = "free"
    go = "go"
    plus = "plus"
    pro = "pro"
    prolite = "prolite"
    team = "team"
    self_serve_business_usage_based = "self_serve_business_usage_based"
    business = "business"
    enterprise_cbp_usage_based = "enterprise_cbp_usage_based"
    enterprise = "enterprise"
    edu = "edu"
    unknown = "unknown"


class PluginAuthPolicy(Enum):
    on_install = "ON_INSTALL"
    on_use = "ON_USE"


class PluginAvailability(Enum):
    disabled_by_admin = "DISABLED_BY_ADMIN"
    available = "AVAILABLE"


class PluginHookSummary(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    event_name: Annotated[HookEventName, Field(alias="eventName")]
    key: str


class PluginInstallParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    marketplace_path: Annotated[AbsolutePathBuf | None, Field(alias="marketplacePath")] = None
    plugin_name: Annotated[str, Field(alias="pluginName")]
    remote_marketplace_name: Annotated[str | None, Field(alias="remoteMarketplaceName")] = None


class PluginInstallPolicy(Enum):
    not_available = "NOT_AVAILABLE"
    available = "AVAILABLE"
    installed_by_default = "INSTALLED_BY_DEFAULT"


class PluginInstallResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    apps_needing_auth: Annotated[list[AppSummary], Field(alias="appsNeedingAuth")]
    auth_policy: Annotated[PluginAuthPolicy, Field(alias="authPolicy")]


class PluginInterface(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    brand_color: Annotated[str | None, Field(alias="brandColor")] = None
    capabilities: list[str]
    category: str | None = None
    composer_icon: Annotated[
        AbsolutePathBuf | None,
        Field(
            alias="composerIcon",
            description="Local composer icon path, resolved from the installed plugin package.",
        ),
    ] = None
    composer_icon_url: Annotated[
        str | None,
        Field(
            alias="composerIconUrl", description="Remote composer icon URL from the plugin catalog."
        ),
    ] = None
    default_prompt: Annotated[
        list[str] | None,
        Field(
            alias="defaultPrompt",
            description="Starter prompts for the plugin. Capped at 3 entries with a maximum of 128 characters per entry.",
        ),
    ] = None
    developer_name: Annotated[str | None, Field(alias="developerName")] = None
    display_name: Annotated[str | None, Field(alias="displayName")] = None
    logo: Annotated[
        AbsolutePathBuf | None,
        Field(description="Local logo path, resolved from the installed plugin package."),
    ] = None
    logo_url: Annotated[
        str | None, Field(alias="logoUrl", description="Remote logo URL from the plugin catalog.")
    ] = None
    long_description: Annotated[str | None, Field(alias="longDescription")] = None
    privacy_policy_url: Annotated[str | None, Field(alias="privacyPolicyUrl")] = None
    screenshot_urls: Annotated[
        list[str],
        Field(
            alias="screenshotUrls", description="Remote screenshot URLs from the plugin catalog."
        ),
    ]
    screenshots: Annotated[
        list[AbsolutePathBuf],
        Field(description="Local screenshot paths, resolved from the installed plugin package."),
    ]
    short_description: Annotated[str | None, Field(alias="shortDescription")] = None
    terms_of_service_url: Annotated[str | None, Field(alias="termsOfServiceUrl")] = None
    website_url: Annotated[str | None, Field(alias="websiteUrl")] = None


class PluginListMarketplaceKind(Enum):
    local = "local"
    workspace_directory = "workspace-directory"
    shared_with_me = "shared-with-me"


class PluginListParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwds: Annotated[
        list[AbsolutePathBuf] | None,
        Field(
            description="Optional working directories used to discover repo marketplaces. When omitted, only home-scoped marketplaces and the official curated marketplace are considered."
        ),
    ] = None
    marketplace_kinds: Annotated[
        list[PluginListMarketplaceKind] | None,
        Field(
            alias="marketplaceKinds",
            description="Optional marketplace kind filter. When omitted, only local marketplaces are queried, plus the default remote catalog when enabled by feature flag.",
        ),
    ] = None


class PluginReadParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    marketplace_path: Annotated[AbsolutePathBuf | None, Field(alias="marketplacePath")] = None
    plugin_name: Annotated[str, Field(alias="pluginName")]
    remote_marketplace_name: Annotated[str | None, Field(alias="remoteMarketplaceName")] = None


class PluginShareDeleteParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    remote_plugin_id: Annotated[str, Field(alias="remotePluginId")]


class PluginShareDeleteResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class PluginShareDiscoverability(Enum):
    listed = "LISTED"
    unlisted = "UNLISTED"
    private = "PRIVATE"


class PluginShareListParams(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class PluginSharePrincipalRole(Enum):
    reader = "reader"
    editor = "editor"
    owner = "owner"


class PluginSharePrincipalType(Enum):
    user = "user"
    group = "group"
    workspace = "workspace"


class PluginShareSaveResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    remote_plugin_id: Annotated[str, Field(alias="remotePluginId")]
    share_url: Annotated[str, Field(alias="shareUrl")]


class PluginShareTargetRole(Enum):
    reader = "reader"
    editor = "editor"


class PluginShareUpdateDiscoverability(Enum):
    unlisted = "UNLISTED"
    private = "PRIVATE"


class PluginSkillReadParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    remote_marketplace_name: Annotated[str, Field(alias="remoteMarketplaceName")]
    remote_plugin_id: Annotated[str, Field(alias="remotePluginId")]
    skill_name: Annotated[str, Field(alias="skillName")]


class PluginSkillReadResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    contents: str | None = None


class LocalPluginSource(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: AbsolutePathBuf
    type: Annotated[Literal["local"], Field(title="LocalPluginSourceType")]


class GitPluginSource(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: str | None = None
    ref_name: Annotated[str | None, Field(alias="refName")] = None
    sha: str | None = None
    type: Annotated[Literal["git"], Field(title="GitPluginSourceType")]
    url: str


class RemotePluginSource(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["remote"], Field(title="RemotePluginSourceType")]


class PluginSource(RootModel[LocalPluginSource | GitPluginSource | RemotePluginSource]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: LocalPluginSource | GitPluginSource | RemotePluginSource


class PluginUninstallParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    plugin_id: Annotated[str, Field(alias="pluginId")]


class PluginUninstallResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class PluginsMigration(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    marketplace_name: Annotated[str, Field(alias="marketplaceName")]
    plugin_names: Annotated[list[str], Field(alias="pluginNames")]


class ProcessExitedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    exit_code: Annotated[int, Field(alias="exitCode", description="Process exit code.")]
    process_handle: Annotated[
        str,
        Field(
            alias="processHandle",
            description="Client-supplied, connection-scoped `processHandle` from `process/spawn`.",
        ),
    ]
    stderr: Annotated[
        str,
        Field(
            description="Buffered stderr capture.\n\nEmpty when stderr was streamed via `process/outputDelta`."
        ),
    ]
    stderr_cap_reached: Annotated[
        bool,
        Field(
            alias="stderrCapReached",
            description="Whether stderr reached `outputBytesCap`.\n\nIn streaming mode, stderr is empty and cap state is also reported on the final stderr `process/outputDelta` notification.",
        ),
    ]
    stdout: Annotated[
        str,
        Field(
            description="Buffered stdout capture.\n\nEmpty when stdout was streamed via `process/outputDelta`."
        ),
    ]
    stdout_cap_reached: Annotated[
        bool,
        Field(
            alias="stdoutCapReached",
            description="Whether stdout reached `outputBytesCap`.\n\nIn streaming mode, stdout is empty and cap state is also reported on the final stdout `process/outputDelta` notification.",
        ),
    ]


class ProcessOutputStream(Enum):
    stdout = "stdout"
    stderr = "stderr"


class ProcessTerminalSize(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cols: Annotated[int, Field(description="Terminal width in character cells.", ge=0)]
    rows: Annotated[int, Field(description="Terminal height in character cells.", ge=0)]


class RateLimitReachedType(Enum):
    rate_limit_reached = "rate_limit_reached"
    workspace_owner_credits_depleted = "workspace_owner_credits_depleted"
    workspace_member_credits_depleted = "workspace_member_credits_depleted"
    workspace_owner_usage_limit_reached = "workspace_owner_usage_limit_reached"
    workspace_member_usage_limit_reached = "workspace_member_usage_limit_reached"


class RateLimitWindow(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    resets_at: Annotated[int | None, Field(alias="resetsAt")] = None
    used_percent: Annotated[int, Field(alias="usedPercent")]
    window_duration_mins: Annotated[int | None, Field(alias="windowDurationMins")] = None


class RealtimeConversationVersion(Enum):
    v1 = "v1"
    v2 = "v2"


class RealtimeOutputModality(Enum):
    text = "text"
    audio = "audio"


class RealtimeVoice(Enum):
    alloy = "alloy"
    arbor = "arbor"
    ash = "ash"
    ballad = "ballad"
    breeze = "breeze"
    cedar = "cedar"
    coral = "coral"
    cove = "cove"
    echo = "echo"
    ember = "ember"
    juniper = "juniper"
    maple = "maple"
    marin = "marin"
    sage = "sage"
    shimmer = "shimmer"
    sol = "sol"
    spruce = "spruce"
    vale = "vale"
    verse = "verse"


class RealtimeVoicesList(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    default_v1: Annotated[RealtimeVoice, Field(alias="defaultV1")]
    default_v2: Annotated[RealtimeVoice, Field(alias="defaultV2")]
    v1: list[RealtimeVoice]
    v2: list[RealtimeVoice]


class ReasoningEffort(Enum):
    none = "none"
    minimal = "minimal"
    low = "low"
    medium = "medium"
    high = "high"
    xhigh = "xhigh"


class ReasoningEffortOption(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    description: str
    reasoning_effort: Annotated[ReasoningEffort, Field(alias="reasoningEffort")]


class ReasoningTextReasoningItemContent(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    text: str
    type: Annotated[Literal["reasoning_text"], Field(title="ReasoningTextReasoningItemContentType")]


class TextReasoningItemContent(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    text: str
    type: Annotated[Literal["text"], Field(title="TextReasoningItemContentType")]


class ReasoningItemContent(RootModel[ReasoningTextReasoningItemContent | TextReasoningItemContent]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: ReasoningTextReasoningItemContent | TextReasoningItemContent


class SummaryTextReasoningItemReasoningSummary(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    text: str
    type: Annotated[
        Literal["summary_text"], Field(title="SummaryTextReasoningItemReasoningSummaryType")
    ]


class ReasoningItemReasoningSummary(RootModel[SummaryTextReasoningItemReasoningSummary]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: SummaryTextReasoningItemReasoningSummary


class ReasoningSummaryValue(Enum):
    auto = "auto"
    concise = "concise"
    detailed = "detailed"


class ReasoningSummary(RootModel[ReasoningSummaryValue | Literal["none"]]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[
        ReasoningSummaryValue | Literal["none"],
        Field(
            description="A summary of the reasoning performed by the model. This can be useful for debugging and understanding the model's reasoning process. See https://platform.openai.com/docs/guides/reasoning?api-mode=responses#reasoning-summaries"
        ),
    ]


class ReasoningSummaryPartAddedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    item_id: Annotated[str, Field(alias="itemId")]
    summary_index: Annotated[int, Field(alias="summaryIndex")]
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class ReasoningSummaryTextDeltaNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    delta: str
    item_id: Annotated[str, Field(alias="itemId")]
    summary_index: Annotated[int, Field(alias="summaryIndex")]
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class ReasoningTextDeltaNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    content_index: Annotated[int, Field(alias="contentIndex")]
    delta: str
    item_id: Annotated[str, Field(alias="itemId")]
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class RemoteControlConnectionStatus(Enum):
    disabled = "disabled"
    connecting = "connecting"
    connected = "connected"
    errored = "errored"


class RemoteControlStatusChangedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    environment_id: Annotated[str | None, Field(alias="environmentId")] = None
    installation_id: Annotated[str, Field(alias="installationId")]
    status: RemoteControlConnectionStatus


class RequestId(RootModel[str | int]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: str | int


class ResidencyRequirement(RootModel[Literal["us"]]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Literal["us"]


class Resource(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    field_meta: Annotated[Any | None, Field(alias="_meta")] = None
    annotations: Any | None = None
    description: str | None = None
    icons: list | None = None
    mime_type: Annotated[str | None, Field(alias="mimeType")] = None
    name: str
    size: int | None = None
    title: str | None = None
    uri: str


class ResourceContent1(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    field_meta: Annotated[Any | None, Field(alias="_meta")] = None
    mime_type: Annotated[str | None, Field(alias="mimeType")] = None
    text: str
    uri: Annotated[str, Field(description="The URI of this resource.")]


class ResourceContent2(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    field_meta: Annotated[Any | None, Field(alias="_meta")] = None
    blob: str
    mime_type: Annotated[str | None, Field(alias="mimeType")] = None
    uri: Annotated[str, Field(description="The URI of this resource.")]


class ResourceContent(RootModel[ResourceContent1 | ResourceContent2]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[
        ResourceContent1 | ResourceContent2,
        Field(description="Contents returned when reading a resource from an MCP server."),
    ]


class ResourceTemplate(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    annotations: Any | None = None
    description: str | None = None
    mime_type: Annotated[str | None, Field(alias="mimeType")] = None
    name: str
    title: str | None = None
    uri_template: Annotated[str, Field(alias="uriTemplate")]


class ReasoningResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    content: list[ReasoningItemContent] | None = None
    encrypted_content: str | None = None
    summary: list[ReasoningItemReasoningSummary]
    type: Annotated[Literal["reasoning"], Field(title="ReasoningResponseItemType")]


class LocalShellCallResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    action: LocalShellAction
    call_id: Annotated[str | None, Field(description="Set when using the Responses API.")] = None
    id: Annotated[
        str | None,
        Field(description="Legacy id field retained for compatibility with older payloads."),
    ] = None
    status: LocalShellStatus
    type: Annotated[Literal["local_shell_call"], Field(title="LocalShellCallResponseItemType")]


class FunctionCallResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    arguments: str
    call_id: str
    id: str | None = None
    name: str
    namespace: str | None = None
    type: Annotated[Literal["function_call"], Field(title="FunctionCallResponseItemType")]


class ToolSearchCallResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    arguments: Any
    call_id: str | None = None
    execution: str
    id: str | None = None
    status: str | None = None
    type: Annotated[Literal["tool_search_call"], Field(title="ToolSearchCallResponseItemType")]


class CustomToolCallResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    call_id: str
    id: str | None = None
    input: str
    name: str
    status: str | None = None
    type: Annotated[Literal["custom_tool_call"], Field(title="CustomToolCallResponseItemType")]


class ToolSearchOutputResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    call_id: str | None = None
    execution: str
    status: str
    tools: list
    type: Annotated[Literal["tool_search_output"], Field(title="ToolSearchOutputResponseItemType")]


class ImageGenerationCallResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: str
    result: str
    revised_prompt: str | None = None
    status: str
    type: Annotated[
        Literal["image_generation_call"], Field(title="ImageGenerationCallResponseItemType")
    ]


class CompactionResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    encrypted_content: str
    type: Annotated[Literal["compaction"], Field(title="CompactionResponseItemType")]


class ContextCompactionResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    encrypted_content: str | None = None
    type: Annotated[Literal["context_compaction"], Field(title="ContextCompactionResponseItemType")]


class OtherResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["other"], Field(title="OtherResponseItemType")]


class SearchResponsesApiWebSearchAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    queries: list[str] | None = None
    query: str | None = None
    type: Annotated[Literal["search"], Field(title="SearchResponsesApiWebSearchActionType")]


class OpenPageResponsesApiWebSearchAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["open_page"], Field(title="OpenPageResponsesApiWebSearchActionType")]
    url: str | None = None


class FindInPageResponsesApiWebSearchAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    pattern: str | None = None
    type: Annotated[
        Literal["find_in_page"], Field(title="FindInPageResponsesApiWebSearchActionType")
    ]
    url: str | None = None


class OtherResponsesApiWebSearchAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["other"], Field(title="OtherResponsesApiWebSearchActionType")]


class ResponsesApiWebSearchAction(
    RootModel[
        SearchResponsesApiWebSearchAction
        | OpenPageResponsesApiWebSearchAction
        | FindInPageResponsesApiWebSearchAction
        | OtherResponsesApiWebSearchAction
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: (
        SearchResponsesApiWebSearchAction
        | OpenPageResponsesApiWebSearchAction
        | FindInPageResponsesApiWebSearchAction
        | OtherResponsesApiWebSearchAction
    )


class ReviewDelivery(Enum):
    inline = "inline"
    detached = "detached"


class UncommittedChangesReviewTarget(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[
        Literal["uncommittedChanges"], Field(title="UncommittedChangesReviewTargetType")
    ]


class BaseBranchReviewTarget(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    branch: str
    type: Annotated[Literal["baseBranch"], Field(title="BaseBranchReviewTargetType")]


class CommitReviewTarget(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    sha: str
    title: Annotated[
        str | None,
        Field(description="Optional human-readable label (e.g., commit subject) for UIs."),
    ] = None
    type: Annotated[Literal["commit"], Field(title="CommitReviewTargetType")]


class CustomReviewTarget(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    instructions: str
    type: Annotated[Literal["custom"], Field(title="CustomReviewTargetType")]


class ReviewTarget(
    RootModel[
        UncommittedChangesReviewTarget
        | BaseBranchReviewTarget
        | CommitReviewTarget
        | CustomReviewTarget
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: (
        UncommittedChangesReviewTarget
        | BaseBranchReviewTarget
        | CommitReviewTarget
        | CustomReviewTarget
    )


class SandboxMode(Enum):
    read_only = "read-only"
    workspace_write = "workspace-write"
    danger_full_access = "danger-full-access"


class DangerFullAccessSandboxPolicy(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["dangerFullAccess"], Field(title="DangerFullAccessSandboxPolicyType")]


class ReadOnlySandboxPolicy(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    network_access: Annotated[bool | None, Field(alias="networkAccess")] = False
    type: Annotated[Literal["readOnly"], Field(title="ReadOnlySandboxPolicyType")]


class ExternalSandboxSandboxPolicy(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    network_access: Annotated[NetworkAccess | None, Field(alias="networkAccess")] = "restricted"
    type: Annotated[Literal["externalSandbox"], Field(title="ExternalSandboxSandboxPolicyType")]


class WorkspaceWriteSandboxPolicy(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    exclude_slash_tmp: Annotated[bool | None, Field(alias="excludeSlashTmp")] = False
    exclude_tmpdir_env_var: Annotated[bool | None, Field(alias="excludeTmpdirEnvVar")] = False
    network_access: Annotated[bool | None, Field(alias="networkAccess")] = False
    type: Annotated[Literal["workspaceWrite"], Field(title="WorkspaceWriteSandboxPolicyType")]
    writable_roots: Annotated[list[AbsolutePathBuf] | None, Field(alias="writableRoots")] = []


class SandboxPolicy(
    RootModel[
        DangerFullAccessSandboxPolicy
        | ReadOnlySandboxPolicy
        | ExternalSandboxSandboxPolicy
        | WorkspaceWriteSandboxPolicy
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: (
        DangerFullAccessSandboxPolicy
        | ReadOnlySandboxPolicy
        | ExternalSandboxSandboxPolicy
        | WorkspaceWriteSandboxPolicy
    )


class SandboxWorkspaceWrite(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    exclude_slash_tmp: bool | None = False
    exclude_tmpdir_env_var: bool | None = False
    network_access: bool | None = False
    writable_roots: list[str] | None = []


class SendAddCreditsNudgeEmailParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    credit_type: Annotated[AddCreditsNudgeCreditType, Field(alias="creditType")]


class SendAddCreditsNudgeEmailResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    status: AddCreditsNudgeEmailStatus


class ItemAgentMessageDeltaServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["item/agentMessage/delta"], Field(title="Item/agentMessage/deltaNotificationMethod")
    ]
    params: AgentMessageDeltaNotification


class ItemPlanDeltaServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["item/plan/delta"], Field(title="Item/plan/deltaNotificationMethod")]
    params: PlanDeltaNotification


class ProcessExitedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["process/exited"], Field(title="Process/exitedNotificationMethod")]
    params: ProcessExitedNotification


class ItemCommandExecutionOutputDeltaServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["item/commandExecution/outputDelta"],
        Field(title="Item/commandExecution/outputDeltaNotificationMethod"),
    ]
    params: CommandExecutionOutputDeltaNotification


class ItemFileChangeOutputDeltaServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["item/fileChange/outputDelta"],
        Field(title="Item/fileChange/outputDeltaNotificationMethod"),
    ]
    params: FileChangeOutputDeltaNotification


class ItemMcpToolCallProgressServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["item/mcpToolCall/progress"],
        Field(title="Item/mcpToolCall/progressNotificationMethod"),
    ]
    params: McpToolCallProgressNotification


class McpServerOauthLoginCompletedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["mcpServer/oauthLogin/completed"],
        Field(title="McpServer/oauthLogin/completedNotificationMethod"),
    ]
    params: McpServerOauthLoginCompletedNotification


class McpServerStartupStatusUpdatedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["mcpServer/startupStatus/updated"],
        Field(title="McpServer/startupStatus/updatedNotificationMethod"),
    ]
    params: McpServerStatusUpdatedNotification


class RemoteControlStatusChangedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["remoteControl/status/changed"],
        Field(title="RemoteControl/status/changedNotificationMethod"),
    ]
    params: RemoteControlStatusChangedNotification


class ExternalAgentConfigImportCompletedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["externalAgentConfig/import/completed"],
        Field(title="ExternalAgentConfig/import/completedNotificationMethod"),
    ]
    params: ExternalAgentConfigImportCompletedNotification


class FsChangedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["fs/changed"], Field(title="Fs/changedNotificationMethod")]
    params: FsChangedNotification


class ItemReasoningSummaryTextDeltaServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["item/reasoning/summaryTextDelta"],
        Field(title="Item/reasoning/summaryTextDeltaNotificationMethod"),
    ]
    params: ReasoningSummaryTextDeltaNotification


class ItemReasoningSummaryPartAddedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["item/reasoning/summaryPartAdded"],
        Field(title="Item/reasoning/summaryPartAddedNotificationMethod"),
    ]
    params: ReasoningSummaryPartAddedNotification


class ItemReasoningTextDeltaServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["item/reasoning/textDelta"],
        Field(title="Item/reasoning/textDeltaNotificationMethod"),
    ]
    params: ReasoningTextDeltaNotification


class ThreadCompactedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/compacted"], Field(title="Thread/compactedNotificationMethod")
    ]
    params: ContextCompactedNotification


class ModelReroutedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["model/rerouted"], Field(title="Model/reroutedNotificationMethod")]
    params: ModelReroutedNotification


class ModelVerificationServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["model/verification"], Field(title="Model/verificationNotificationMethod")
    ]
    params: ModelVerificationNotification


class GuardianWarningServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["guardianWarning"], Field(title="GuardianWarningNotificationMethod")]
    params: GuardianWarningNotification


class DeprecationNoticeServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["deprecationNotice"], Field(title="DeprecationNoticeNotificationMethod")
    ]
    params: DeprecationNoticeNotification


class FuzzyFileSearchSessionUpdatedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["fuzzyFileSearch/sessionUpdated"],
        Field(title="FuzzyFileSearch/sessionUpdatedNotificationMethod"),
    ]
    params: FuzzyFileSearchSessionUpdatedNotification


class FuzzyFileSearchSessionCompletedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["fuzzyFileSearch/sessionCompleted"],
        Field(title="FuzzyFileSearch/sessionCompletedNotificationMethod"),
    ]
    params: FuzzyFileSearchSessionCompletedNotification


class AccountLoginCompletedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["account/login/completed"], Field(title="Account/login/completedNotificationMethod")
    ]
    params: AccountLoginCompletedNotification


class ServerRequestResolvedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    request_id: Annotated[RequestId, Field(alias="requestId")]
    thread_id: Annotated[str, Field(alias="threadId")]


class SessionMigration(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwd: str
    path: str
    title: str | None = None


class SessionSourceValue(Enum):
    cli = "cli"
    vscode = "vscode"
    exec = "exec"
    app_server = "appServer"
    unknown = "unknown"


class CustomSessionSource(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    custom: str


class Settings(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    developer_instructions: str | None = None
    model: str
    reasoning_effort: ReasoningEffort | None = None


class SkillErrorInfo(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    message: str
    path: str


class SkillInterface(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    brand_color: Annotated[str | None, Field(alias="brandColor")] = None
    default_prompt: Annotated[str | None, Field(alias="defaultPrompt")] = None
    display_name: Annotated[str | None, Field(alias="displayName")] = None
    icon_large: Annotated[AbsolutePathBuf | None, Field(alias="iconLarge")] = None
    icon_small: Annotated[AbsolutePathBuf | None, Field(alias="iconSmall")] = None
    short_description: Annotated[str | None, Field(alias="shortDescription")] = None


class SkillScope(Enum):
    user = "user"
    repo = "repo"
    system = "system"
    admin = "admin"


class SkillSummary(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    description: str
    enabled: bool
    interface: SkillInterface | None = None
    name: str
    path: AbsolutePathBuf | None = None
    short_description: Annotated[str | None, Field(alias="shortDescription")] = None


class SkillToolDependency(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    command: str | None = None
    description: str | None = None
    transport: str | None = None
    type: str
    url: str | None = None
    value: str


class SkillsChangedNotification(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class SkillsConfigWriteParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    enabled: bool
    name: Annotated[str | None, Field(description="Name-based selector.")] = None
    path: Annotated[AbsolutePathBuf | None, Field(description="Path-based selector.")] = None


class SkillsConfigWriteResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    effective_enabled: Annotated[bool, Field(alias="effectiveEnabled")]


class SkillsListParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwds: Annotated[
        list[str] | None,
        Field(description="When empty, defaults to the current session working directory."),
    ] = None
    force_reload: Annotated[
        bool | None,
        Field(
            alias="forceReload",
            description="When true, bypass the skills cache and re-scan skills from disk.",
        ),
    ] = None


class SortDirection(Enum):
    asc = "asc"
    desc = "desc"


class SubAgentSourceValue(Enum):
    review = "review"
    compact = "compact"
    memory_consolidation = "memory_consolidation"


class OtherSubAgentSource(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    other: str


class SubagentMigration(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    name: str


class TerminalInteractionNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    item_id: Annotated[str, Field(alias="itemId")]
    process_id: Annotated[str, Field(alias="processId")]
    stdin: str
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class TextElement(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    byte_range: Annotated[
        ByteRange,
        Field(
            alias="byteRange",
            description="Byte range in the parent `text` buffer that this element occupies.",
        ),
    ]
    placeholder: Annotated[
        str | None,
        Field(
            description="Optional human-readable placeholder for the element, displayed in the UI."
        ),
    ] = None


class TextPosition(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    column: Annotated[
        int, Field(description="1-based column number (in Unicode scalar values).", ge=0)
    ]
    line: Annotated[int, Field(description="1-based line number.", ge=0)]


class TextRange(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    end: TextPosition
    start: TextPosition


class ThreadActiveFlag(Enum):
    waiting_on_approval = "waitingOnApproval"
    waiting_on_user_input = "waitingOnUserInput"


class ThreadApproveGuardianDeniedActionParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    event: Annotated[
        Any, Field(description="Serialized `codex_protocol::protocol::GuardianAssessmentEvent`.")
    ]
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadApproveGuardianDeniedActionResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class ThreadArchiveParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadArchiveResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class ThreadArchivedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadClosedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadCompactStartParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadCompactStartResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class ThreadGoalClearedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadGoalStatus(Enum):
    active = "active"
    paused = "paused"
    budget_limited = "budgetLimited"
    complete = "complete"


class ThreadId(RootModel[str]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: str


class ThreadInjectItemsParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    items: Annotated[
        list,
        Field(
            description="Raw Responses API items to append to the thread's model-visible history."
        ),
    ]
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadInjectItemsResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class HookPromptThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    fragments: list[HookPromptFragment]
    id: str
    type: Annotated[Literal["hookPrompt"], Field(title="HookPromptThreadItemType")]


class PlanThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: str
    text: str
    type: Annotated[Literal["plan"], Field(title="PlanThreadItemType")]


class ReasoningThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    content: list[str] | None = []
    id: str
    summary: list[str] | None = []
    type: Annotated[Literal["reasoning"], Field(title="ReasoningThreadItemType")]


class CommandExecutionThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    aggregated_output: Annotated[
        str | None,
        Field(
            alias="aggregatedOutput",
            description="The command's output, aggregated from stdout and stderr.",
        ),
    ] = None
    command: Annotated[str, Field(description="The command to be executed.")]
    command_actions: Annotated[
        list[CommandAction],
        Field(
            alias="commandActions",
            description="A best-effort parsing of the command to understand the action(s) it will perform. This returns a list of CommandAction objects because a single shell command may be composed of many commands piped together.",
        ),
    ]
    cwd: Annotated[AbsolutePathBuf, Field(description="The command's working directory.")]
    duration_ms: Annotated[
        int | None,
        Field(
            alias="durationMs", description="The duration of the command execution in milliseconds."
        ),
    ] = None
    exit_code: Annotated[
        int | None, Field(alias="exitCode", description="The command's exit code.")
    ] = None
    id: str
    process_id: Annotated[
        str | None,
        Field(
            alias="processId",
            description="Identifier for the underlying PTY process (when available).",
        ),
    ] = None
    source: CommandExecutionSource | None = "agent"
    status: CommandExecutionStatus
    type: Annotated[Literal["commandExecution"], Field(title="CommandExecutionThreadItemType")]


class McpToolCallThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    arguments: Any
    duration_ms: Annotated[
        int | None,
        Field(alias="durationMs", description="The duration of the MCP tool call in milliseconds."),
    ] = None
    error: McpToolCallError | None = None
    id: str
    mcp_app_resource_uri: Annotated[str | None, Field(alias="mcpAppResourceUri")] = None
    result: McpToolCallResult | None = None
    server: str
    status: McpToolCallStatus
    tool: str
    type: Annotated[Literal["mcpToolCall"], Field(title="McpToolCallThreadItemType")]


class DynamicToolCallThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    arguments: Any
    content_items: Annotated[
        list[DynamicToolCallOutputContentItem] | None, Field(alias="contentItems")
    ] = None
    duration_ms: Annotated[
        int | None,
        Field(
            alias="durationMs", description="The duration of the dynamic tool call in milliseconds."
        ),
    ] = None
    id: str
    namespace: str | None = None
    status: DynamicToolCallStatus
    success: bool | None = None
    tool: str
    type: Annotated[Literal["dynamicToolCall"], Field(title="DynamicToolCallThreadItemType")]


class ImageViewThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: str
    path: AbsolutePathBuf
    type: Annotated[Literal["imageView"], Field(title="ImageViewThreadItemType")]


class ImageGenerationThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: str
    result: str
    revised_prompt: Annotated[str | None, Field(alias="revisedPrompt")] = None
    saved_path: Annotated[AbsolutePathBuf | None, Field(alias="savedPath")] = None
    status: str
    type: Annotated[Literal["imageGeneration"], Field(title="ImageGenerationThreadItemType")]


class EnteredReviewModeThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: str
    review: str
    type: Annotated[Literal["enteredReviewMode"], Field(title="EnteredReviewModeThreadItemType")]


class ExitedReviewModeThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: str
    review: str
    type: Annotated[Literal["exitedReviewMode"], Field(title="ExitedReviewModeThreadItemType")]


class ContextCompactionThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: str
    type: Annotated[Literal["contextCompaction"], Field(title="ContextCompactionThreadItemType")]


class ThreadListCwdFilter(RootModel[str | list[str]]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: str | list[str]


class ThreadLoadedListParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cursor: Annotated[
        str | None, Field(description="Opaque pagination cursor returned by a previous call.")
    ] = None
    limit: Annotated[
        int | None, Field(description="Optional page size; defaults to no limit.", ge=0)
    ] = None


class ThreadLoadedListResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data: Annotated[
        list[str], Field(description="Thread ids for sessions currently loaded in memory.")
    ]
    next_cursor: Annotated[
        str | None,
        Field(
            alias="nextCursor",
            description="Opaque cursor to pass to the next call to continue after the last item. if None, there are no more items to return.",
        ),
    ] = None


class ThreadMemoryMode(Enum):
    enabled = "enabled"
    disabled = "disabled"


class ThreadMetadataGitInfoUpdateParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    branch: Annotated[
        str | None,
        Field(
            description="Omit to leave the stored branch unchanged, set to `null` to clear it, or provide a non-empty string to replace it."
        ),
    ] = None
    origin_url: Annotated[
        str | None,
        Field(
            alias="originUrl",
            description="Omit to leave the stored origin URL unchanged, set to `null` to clear it, or provide a non-empty string to replace it.",
        ),
    ] = None
    sha: Annotated[
        str | None,
        Field(
            description="Omit to leave the stored commit unchanged, set to `null` to clear it, or provide a non-empty string to replace it."
        ),
    ] = None


class ThreadMetadataUpdateParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    git_info: Annotated[
        ThreadMetadataGitInfoUpdateParams | None,
        Field(
            alias="gitInfo",
            description="Patch the stored Git metadata for this thread. Omit a field to leave it unchanged, set it to `null` to clear it, or provide a string to replace the stored value.",
        ),
    ] = None
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadNameUpdatedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]
    thread_name: Annotated[str | None, Field(alias="threadName")] = None


class ThreadReadParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    include_turns: Annotated[
        bool | None,
        Field(
            alias="includeTurns",
            description="When true, include turns and their items from rollout history.",
        ),
    ] = False
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadRealtimeAudioChunk(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data: str
    item_id: Annotated[str | None, Field(alias="itemId")] = None
    num_channels: Annotated[int, Field(alias="numChannels", ge=0)]
    sample_rate: Annotated[int, Field(alias="sampleRate", ge=0)]
    samples_per_channel: Annotated[int | None, Field(alias="samplesPerChannel", ge=0)] = None


class ThreadRealtimeClosedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    reason: str | None = None
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadRealtimeErrorNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    message: str
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadRealtimeItemAddedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    item: Any
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadRealtimeOutputAudioDeltaNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    audio: ThreadRealtimeAudioChunk
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadRealtimeSdpNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    sdp: str
    thread_id: Annotated[str, Field(alias="threadId")]


class WebsocketThreadRealtimeStartTransport(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["websocket"], Field(title="WebsocketThreadRealtimeStartTransportType")]


class WebrtcThreadRealtimeStartTransport(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    sdp: Annotated[
        str,
        Field(
            description="SDP offer generated by a WebRTC RTCPeerConnection after configuring audio and the realtime events data channel."
        ),
    ]
    type: Annotated[Literal["webrtc"], Field(title="WebrtcThreadRealtimeStartTransportType")]


class ThreadRealtimeStartTransport(
    RootModel[WebsocketThreadRealtimeStartTransport | WebrtcThreadRealtimeStartTransport]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[
        WebsocketThreadRealtimeStartTransport | WebrtcThreadRealtimeStartTransport,
        Field(description="EXPERIMENTAL - transport used by thread realtime."),
    ]


class ThreadRealtimeStartedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    realtime_session_id: Annotated[str | None, Field(alias="realtimeSessionId")] = None
    thread_id: Annotated[str, Field(alias="threadId")]
    version: RealtimeConversationVersion


class ThreadRealtimeTranscriptDeltaNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    delta: Annotated[str, Field(description="Live transcript delta from the realtime event.")]
    role: str
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadRealtimeTranscriptDoneNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    role: str
    text: Annotated[str, Field(description="Final complete text for the transcript part.")]
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadResumeParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    approval_policy: Annotated[AskForApproval | None, Field(alias="approvalPolicy")] = None
    approvals_reviewer: Annotated[
        ApprovalsReviewer | None,
        Field(
            alias="approvalsReviewer",
            description="Override where approval requests are routed for review on this thread and subsequent turns.",
        ),
    ] = None
    base_instructions: Annotated[str | None, Field(alias="baseInstructions")] = None
    config: dict[str, Any] | None = None
    cwd: str | None = None
    developer_instructions: Annotated[str | None, Field(alias="developerInstructions")] = None
    model: Annotated[
        str | None, Field(description="Configuration overrides for the resumed thread, if any.")
    ] = None
    model_provider: Annotated[str | None, Field(alias="modelProvider")] = None
    personality: Personality | None = None
    sandbox: SandboxMode | None = None
    service_tier: Annotated[str | None, Field(alias="serviceTier")] = None
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadRollbackParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    num_turns: Annotated[
        int,
        Field(
            alias="numTurns",
            description="The number of turns to drop from the end of the thread. Must be >= 1.\n\nThis only modifies the thread's history and does not revert local file changes that have been made by the agent. Clients are responsible for reverting these changes.",
            ge=0,
        ),
    ]
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadSetNameParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    name: str
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadSetNameResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class ThreadShellCommandParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    command: Annotated[
        str,
        Field(
            description="Shell command string evaluated by the thread's configured shell. Unlike `command/exec`, this intentionally preserves shell syntax such as pipes, redirects, and quoting. This runs unsandboxed with full access rather than inheriting the thread sandbox policy."
        ),
    ]
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadShellCommandResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class ThreadSortKey(Enum):
    created_at = "created_at"
    updated_at = "updated_at"


class ThreadSource(Enum):
    user = "user"
    subagent = "subagent"
    memory_consolidation = "memory_consolidation"


class ThreadSourceKind(Enum):
    cli = "cli"
    vscode = "vscode"
    exec = "exec"
    app_server = "appServer"
    sub_agent = "subAgent"
    sub_agent_review = "subAgentReview"
    sub_agent_compact = "subAgentCompact"
    sub_agent_thread_spawn = "subAgentThreadSpawn"
    sub_agent_other = "subAgentOther"
    unknown = "unknown"


class ThreadStartSource(Enum):
    startup = "startup"
    clear = "clear"


class NotLoadedThreadStatus(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["notLoaded"], Field(title="NotLoadedThreadStatusType")]


class IdleThreadStatus(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["idle"], Field(title="IdleThreadStatusType")]


class SystemErrorThreadStatus(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["systemError"], Field(title="SystemErrorThreadStatusType")]


class ActiveThreadStatus(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    active_flags: Annotated[list[ThreadActiveFlag], Field(alias="activeFlags")]
    type: Annotated[Literal["active"], Field(title="ActiveThreadStatusType")]


class ThreadStatus(
    RootModel[
        NotLoadedThreadStatus | IdleThreadStatus | SystemErrorThreadStatus | ActiveThreadStatus
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: NotLoadedThreadStatus | IdleThreadStatus | SystemErrorThreadStatus | ActiveThreadStatus


class ThreadStatusChangedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    status: ThreadStatus
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadUnarchiveParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadUnarchivedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadUnsubscribeParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadUnsubscribeStatus(Enum):
    not_loaded = "notLoaded"
    not_subscribed = "notSubscribed"
    unsubscribed = "unsubscribed"


class TokenUsageBreakdown(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cached_input_tokens: Annotated[int, Field(alias="cachedInputTokens")]
    input_tokens: Annotated[int, Field(alias="inputTokens")]
    output_tokens: Annotated[int, Field(alias="outputTokens")]
    reasoning_output_tokens: Annotated[int, Field(alias="reasoningOutputTokens")]
    total_tokens: Annotated[int, Field(alias="totalTokens")]


class Tool(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    field_meta: Annotated[Any | None, Field(alias="_meta")] = None
    annotations: Any | None = None
    description: str | None = None
    icons: list | None = None
    input_schema: Annotated[Any, Field(alias="inputSchema")]
    name: str
    output_schema: Annotated[Any | None, Field(alias="outputSchema")] = None
    title: str | None = None


class TurnDiffUpdatedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    diff: str
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class TurnEnvironmentParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwd: AbsolutePathBuf
    environment_id: Annotated[str, Field(alias="environmentId")]


class TurnInterruptParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class TurnInterruptResponse(BaseModel):
    pass
    model_config = ConfigDict(
        populate_by_name=True,
    )


class TurnItemsView(Enum):
    not_loaded = "notLoaded"
    summary = "summary"
    full = "full"


class TurnPlanStepStatus(Enum):
    pending = "pending"
    in_progress = "inProgress"
    completed = "completed"


class TurnStatus(Enum):
    completed = "completed"
    interrupted = "interrupted"
    failed = "failed"
    in_progress = "inProgress"


class TurnSteerResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    turn_id: Annotated[str, Field(alias="turnId")]


class TextUserInput(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    text: str
    text_elements: Annotated[
        list[TextElement] | None,
        Field(
            description="UI-defined spans within `text` used to render or persist special elements."
        ),
    ] = []
    type: Annotated[Literal["text"], Field(title="TextUserInputType")]


class ImageUserInput(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["image"], Field(title="ImageUserInputType")]
    url: str


class LocalImageUserInput(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    path: str
    type: Annotated[Literal["localImage"], Field(title="LocalImageUserInputType")]


class SkillUserInput(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    name: str
    path: str
    type: Annotated[Literal["skill"], Field(title="SkillUserInputType")]


class MentionUserInput(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    name: str
    path: str
    type: Annotated[Literal["mention"], Field(title="MentionUserInputType")]


class UserInput(
    RootModel[
        TextUserInput | ImageUserInput | LocalImageUserInput | SkillUserInput | MentionUserInput
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: TextUserInput | ImageUserInput | LocalImageUserInput | SkillUserInput | MentionUserInput


class Verbosity(Enum):
    low = "low"
    medium = "medium"
    high = "high"


class WarningNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    message: Annotated[str, Field(description="Concise warning message for the user.")]
    thread_id: Annotated[
        str | None,
        Field(
            alias="threadId",
            description="Optional thread target when the warning applies to a specific thread.",
        ),
    ] = None


class SearchWebSearchAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    queries: list[str] | None = None
    query: str | None = None
    type: Annotated[Literal["search"], Field(title="SearchWebSearchActionType")]


class OpenPageWebSearchAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["openPage"], Field(title="OpenPageWebSearchActionType")]
    url: str | None = None


class FindInPageWebSearchAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    pattern: str | None = None
    type: Annotated[Literal["findInPage"], Field(title="FindInPageWebSearchActionType")]
    url: str | None = None


class OtherWebSearchAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["other"], Field(title="OtherWebSearchActionType")]


class WebSearchAction(
    RootModel[
        SearchWebSearchAction
        | OpenPageWebSearchAction
        | FindInPageWebSearchAction
        | OtherWebSearchAction
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: (
        SearchWebSearchAction
        | OpenPageWebSearchAction
        | FindInPageWebSearchAction
        | OtherWebSearchAction
    )


class WebSearchContextSize(Enum):
    low = "low"
    medium = "medium"
    high = "high"


class WebSearchLocation(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    city: str | None = None
    country: str | None = None
    region: str | None = None
    timezone: str | None = None


class WebSearchMode(Enum):
    disabled = "disabled"
    cached = "cached"
    live = "live"


class WebSearchToolConfig(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    allowed_domains: list[str] | None = None
    context_size: WebSearchContextSize | None = None
    location: WebSearchLocation | None = None


class WindowsSandboxReadiness(Enum):
    ready = "ready"
    not_configured = "notConfigured"
    update_required = "updateRequired"


class WindowsSandboxReadinessResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    status: WindowsSandboxReadiness


class WindowsSandboxSetupMode(Enum):
    elevated = "elevated"
    unelevated = "unelevated"


class WindowsSandboxSetupStartParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwd: AbsolutePathBuf | None = None
    mode: WindowsSandboxSetupMode


class WindowsSandboxSetupStartResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    started: bool


class WindowsWorldWritableWarningNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    extra_count: Annotated[int, Field(alias="extraCount", ge=0)]
    failed_scan: Annotated[bool, Field(alias="failedScan")]
    sample_paths: Annotated[list[str], Field(alias="samplePaths")]


class WriteStatus(Enum):
    ok = "ok"
    ok_overridden = "okOverridden"


class ChatgptAccount(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    email: str
    plan_type: Annotated[PlanType, Field(alias="planType")]
    type: Annotated[Literal["chatgpt"], Field(title="ChatgptAccountType")]


class Account(RootModel[ApiKeyAccount | ChatgptAccount | AmazonBedrockAccount]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: ApiKeyAccount | ChatgptAccount | AmazonBedrockAccount


class AccountUpdatedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    auth_mode: Annotated[AuthMode | None, Field(alias="authMode")] = None
    plan_type: Annotated[PlanType | None, Field(alias="planType")] = None


class ActivePermissionProfile(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    extends: Annotated[
        str | None,
        Field(
            description="Parent profile identifier once permissions profiles support inheritance. This is currently always `null`."
        ),
    ] = None
    id: Annotated[
        str,
        Field(
            description="Identifier from `default_permissions` or the implicit built-in default, such as `:workspace` or a user-defined `[permissions.<id>]` profile."
        ),
    ]
    modifications: Annotated[
        list[ActivePermissionProfileModification] | None,
        Field(
            description="Bounded user-requested modifications applied on top of the named profile, if any."
        ),
    ] = []


class AppConfig(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    default_tools_approval_mode: AppToolApproval | None = None
    default_tools_enabled: bool | None = None
    destructive_enabled: bool | None = None
    enabled: bool | None = True
    open_world_enabled: bool | None = None
    tools: AppToolsConfig | None = None


class AppMetadata(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    categories: list[str] | None = None
    developer: str | None = None
    first_party_requires_install: Annotated[
        bool | None, Field(alias="firstPartyRequiresInstall")
    ] = None
    first_party_type: Annotated[str | None, Field(alias="firstPartyType")] = None
    review: AppReview | None = None
    screenshots: list[AppScreenshot] | None = None
    seo_description: Annotated[str | None, Field(alias="seoDescription")] = None
    show_in_composer_when_unlinked: Annotated[
        bool | None, Field(alias="showInComposerWhenUnlinked")
    ] = None
    sub_categories: Annotated[list[str] | None, Field(alias="subCategories")] = None
    version: str | None = None
    version_id: Annotated[str | None, Field(alias="versionId")] = None
    version_notes: Annotated[str | None, Field(alias="versionNotes")] = None


class AppsConfig(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    field_default: Annotated[AppsDefaultConfig | None, Field(alias="_default")] = None


class CancelLoginAccountResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    status: CancelLoginAccountStatus


class InitializeRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["initialize"], Field(title="InitializeRequestMethod")]
    params: InitializeParams


class ThreadResumeRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["thread/resume"], Field(title="Thread/resumeRequestMethod")]
    params: ThreadResumeParams


class ThreadArchiveRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["thread/archive"], Field(title="Thread/archiveRequestMethod")]
    params: ThreadArchiveParams


class ThreadUnsubscribeRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["thread/unsubscribe"], Field(title="Thread/unsubscribeRequestMethod")]
    params: ThreadUnsubscribeParams


class ThreadNameSetRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["thread/name/set"], Field(title="Thread/name/setRequestMethod")]
    params: ThreadSetNameParams


class ThreadMetadataUpdateRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["thread/metadata/update"], Field(title="Thread/metadata/updateRequestMethod")
    ]
    params: ThreadMetadataUpdateParams


class ThreadUnarchiveRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["thread/unarchive"], Field(title="Thread/unarchiveRequestMethod")]
    params: ThreadUnarchiveParams


class ThreadCompactStartRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["thread/compact/start"], Field(title="Thread/compact/startRequestMethod")
    ]
    params: ThreadCompactStartParams


class ThreadShellCommandRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["thread/shellCommand"], Field(title="Thread/shellCommandRequestMethod")
    ]
    params: ThreadShellCommandParams


class ThreadApproveGuardianDeniedActionRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["thread/approveGuardianDeniedAction"],
        Field(title="Thread/approveGuardianDeniedActionRequestMethod"),
    ]
    params: ThreadApproveGuardianDeniedActionParams


class ThreadRollbackRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["thread/rollback"], Field(title="Thread/rollbackRequestMethod")]
    params: ThreadRollbackParams


class ThreadLoadedListRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["thread/loaded/list"], Field(title="Thread/loaded/listRequestMethod")]
    params: ThreadLoadedListParams


class ThreadReadRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["thread/read"], Field(title="Thread/readRequestMethod")]
    params: ThreadReadParams


class ThreadInjectItemsRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["thread/inject_items"], Field(title="Thread/injectItemsRequestMethod")
    ]
    params: ThreadInjectItemsParams


class SkillsListRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["skills/list"], Field(title="Skills/listRequestMethod")]
    params: SkillsListParams


class HooksListRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["hooks/list"], Field(title="Hooks/listRequestMethod")]
    params: HooksListParams


class MarketplaceAddRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["marketplace/add"], Field(title="Marketplace/addRequestMethod")]
    params: MarketplaceAddParams


class MarketplaceRemoveRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["marketplace/remove"], Field(title="Marketplace/removeRequestMethod")]
    params: MarketplaceRemoveParams


class MarketplaceUpgradeRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["marketplace/upgrade"], Field(title="Marketplace/upgradeRequestMethod")
    ]
    params: MarketplaceUpgradeParams


class PluginListRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["plugin/list"], Field(title="Plugin/listRequestMethod")]
    params: PluginListParams


class PluginReadRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["plugin/read"], Field(title="Plugin/readRequestMethod")]
    params: PluginReadParams


class PluginSkillReadRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["plugin/skill/read"], Field(title="Plugin/skill/readRequestMethod")]
    params: PluginSkillReadParams


class PluginShareListRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["plugin/share/list"], Field(title="Plugin/share/listRequestMethod")]
    params: PluginShareListParams


class PluginShareDeleteRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["plugin/share/delete"], Field(title="Plugin/share/deleteRequestMethod")
    ]
    params: PluginShareDeleteParams


class AppListRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["app/list"], Field(title="App/listRequestMethod")]
    params: AppsListParams


class FsReadFileRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["fs/readFile"], Field(title="Fs/readFileRequestMethod")]
    params: FsReadFileParams


class FsWriteFileRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["fs/writeFile"], Field(title="Fs/writeFileRequestMethod")]
    params: FsWriteFileParams


class FsCreateDirectoryRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["fs/createDirectory"], Field(title="Fs/createDirectoryRequestMethod")]
    params: FsCreateDirectoryParams


class FsGetMetadataRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["fs/getMetadata"], Field(title="Fs/getMetadataRequestMethod")]
    params: FsGetMetadataParams


class FsReadDirectoryRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["fs/readDirectory"], Field(title="Fs/readDirectoryRequestMethod")]
    params: FsReadDirectoryParams


class FsRemoveRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["fs/remove"], Field(title="Fs/removeRequestMethod")]
    params: FsRemoveParams


class FsCopyRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["fs/copy"], Field(title="Fs/copyRequestMethod")]
    params: FsCopyParams


class FsWatchRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["fs/watch"], Field(title="Fs/watchRequestMethod")]
    params: FsWatchParams


class FsUnwatchRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["fs/unwatch"], Field(title="Fs/unwatchRequestMethod")]
    params: FsUnwatchParams


class SkillsConfigWriteRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["skills/config/write"], Field(title="Skills/config/writeRequestMethod")
    ]
    params: SkillsConfigWriteParams


class PluginInstallRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["plugin/install"], Field(title="Plugin/installRequestMethod")]
    params: PluginInstallParams


class PluginUninstallRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["plugin/uninstall"], Field(title="Plugin/uninstallRequestMethod")]
    params: PluginUninstallParams


class TurnInterruptRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["turn/interrupt"], Field(title="Turn/interruptRequestMethod")]
    params: TurnInterruptParams


class ModelListRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["model/list"], Field(title="Model/listRequestMethod")]
    params: ModelListParams


class ModelProviderCapabilitiesReadRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["modelProvider/capabilities/read"],
        Field(title="ModelProvider/capabilities/readRequestMethod"),
    ]
    params: ModelProviderCapabilitiesReadParams


class ExperimentalFeatureListRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["experimentalFeature/list"], Field(title="ExperimentalFeature/listRequestMethod")
    ]
    params: ExperimentalFeatureListParams


class ExperimentalFeatureEnablementSetRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["experimentalFeature/enablement/set"],
        Field(title="ExperimentalFeature/enablement/setRequestMethod"),
    ]
    params: ExperimentalFeatureEnablementSetParams


class McpServerOauthLoginRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["mcpServer/oauth/login"], Field(title="McpServer/oauth/loginRequestMethod")
    ]
    params: McpServerOauthLoginParams


class ConfigMcpServerReloadRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["config/mcpServer/reload"], Field(title="Config/mcpServer/reloadRequestMethod")
    ]
    params: None = None


class McpServerResourceReadRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["mcpServer/resource/read"], Field(title="McpServer/resource/readRequestMethod")
    ]
    params: McpResourceReadParams


class McpServerToolCallRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["mcpServer/tool/call"], Field(title="McpServer/tool/callRequestMethod")
    ]
    params: McpServerToolCallParams


class WindowsSandboxSetupStartRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["windowsSandbox/setupStart"], Field(title="WindowsSandbox/setupStartRequestMethod")
    ]
    params: WindowsSandboxSetupStartParams


class WindowsSandboxReadinessRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["windowsSandbox/readiness"], Field(title="WindowsSandbox/readinessRequestMethod")
    ]
    params: None = None


class AccountLoginStartRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["account/login/start"], Field(title="Account/login/startRequestMethod")
    ]
    params: LoginAccountParams


class AccountLoginCancelRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["account/login/cancel"], Field(title="Account/login/cancelRequestMethod")
    ]
    params: CancelLoginAccountParams


class AccountLogoutRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["account/logout"], Field(title="Account/logoutRequestMethod")]
    params: None = None


class AccountRateLimitsReadRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["account/rateLimits/read"], Field(title="Account/rateLimits/readRequestMethod")
    ]
    params: None = None


class AccountSendAddCreditsNudgeEmailRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["account/sendAddCreditsNudgeEmail"],
        Field(title="Account/sendAddCreditsNudgeEmailRequestMethod"),
    ]
    params: SendAddCreditsNudgeEmailParams


class FeedbackUploadRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["feedback/upload"], Field(title="Feedback/uploadRequestMethod")]
    params: FeedbackUploadParams


class CommandExecWriteRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["command/exec/write"], Field(title="Command/exec/writeRequestMethod")]
    params: CommandExecWriteParams


class CommandExecTerminateRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["command/exec/terminate"], Field(title="Command/exec/terminateRequestMethod")
    ]
    params: CommandExecTerminateParams


class ConfigReadRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["config/read"], Field(title="Config/readRequestMethod")]
    params: ConfigReadParams


class ExternalAgentConfigDetectRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["externalAgentConfig/detect"],
        Field(title="ExternalAgentConfig/detectRequestMethod"),
    ]
    params: ExternalAgentConfigDetectParams


class ConfigRequirementsReadRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["configRequirements/read"], Field(title="ConfigRequirements/readRequestMethod")
    ]
    params: None = None


class AccountReadRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["account/read"], Field(title="Account/readRequestMethod")]
    params: GetAccountParams


class FuzzyFileSearchRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["fuzzyFileSearch"], Field(title="FuzzyFileSearchRequestMethod")]
    params: FuzzyFileSearchParams


class ActiveTurnNotSteerable(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    turn_kind: Annotated[NonSteerableTurnKind, Field(alias="turnKind")]


class ActiveTurnNotSteerableCodexErrorInfo(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    active_turn_not_steerable: Annotated[
        ActiveTurnNotSteerable, Field(alias="activeTurnNotSteerable")
    ]


class CodexErrorInfo(
    RootModel[
        CodexErrorInfoValue
        | HttpConnectionFailedCodexErrorInfo
        | ResponseStreamConnectionFailedCodexErrorInfo
        | ResponseStreamDisconnectedCodexErrorInfo
        | ResponseTooManyFailedAttemptsCodexErrorInfo
        | ActiveTurnNotSteerableCodexErrorInfo
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[
        CodexErrorInfoValue
        | HttpConnectionFailedCodexErrorInfo
        | ResponseStreamConnectionFailedCodexErrorInfo
        | ResponseStreamDisconnectedCodexErrorInfo
        | ResponseTooManyFailedAttemptsCodexErrorInfo
        | ActiveTurnNotSteerableCodexErrorInfo,
        Field(
            description="This translation layer make sure that we expose codex error code in camel case.\n\nWhen an upstream HTTP status is available (for example, from the Responses API or a provider), it is forwarded in `httpStatusCode` on the relevant `codexErrorInfo` variant."
        ),
    ]


class CollabAgentState(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    message: str | None = None
    status: CollabAgentStatus


class CollaborationMode(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    mode: ModeKind
    settings: Settings


class CollaborationModeMask(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    mode: ModeKind | None = None
    model: str | None = None
    name: str
    reasoning_effort: ReasoningEffort | None = None


class CommandExecOutputDeltaNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cap_reached: Annotated[
        bool,
        Field(
            alias="capReached",
            description="`true` on the final streamed chunk for a stream when `outputBytesCap` truncated later output on that stream.",
        ),
    ]
    delta_base64: Annotated[
        str, Field(alias="deltaBase64", description="Base64-encoded output bytes.")
    ]
    process_id: Annotated[
        str,
        Field(
            alias="processId",
            description="Client-supplied, connection-scoped `processId` from the original `command/exec` request.",
        ),
    ]
    stream: Annotated[CommandExecOutputStream, Field(description="Output stream for this chunk.")]


class CommandExecParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    command: Annotated[
        list[str], Field(description="Command argv vector. Empty arrays are rejected.")
    ]
    cwd: Annotated[
        str | None, Field(description="Optional working directory. Defaults to the server cwd.")
    ] = None
    disable_output_cap: Annotated[
        bool | None,
        Field(
            alias="disableOutputCap",
            description="Disable stdout/stderr capture truncation for this request.\n\nCannot be combined with `outputBytesCap`.",
        ),
    ] = None
    disable_timeout: Annotated[
        bool | None,
        Field(
            alias="disableTimeout",
            description="Disable the timeout entirely for this request.\n\nCannot be combined with `timeoutMs`.",
        ),
    ] = None
    env: Annotated[
        dict[str, Any] | None,
        Field(
            description="Optional environment overrides merged into the server-computed environment.\n\nMatching names override inherited values. Set a key to `null` to unset an inherited variable."
        ),
    ] = None
    output_bytes_cap: Annotated[
        int | None,
        Field(
            alias="outputBytesCap",
            description="Optional per-stream stdout/stderr capture cap in bytes.\n\nWhen omitted, the server default applies. Cannot be combined with `disableOutputCap`.",
            ge=0,
        ),
    ] = None
    process_id: Annotated[
        str | None,
        Field(
            alias="processId",
            description="Optional client-supplied, connection-scoped process id.\n\nRequired for `tty`, `streamStdin`, `streamStdoutStderr`, and follow-up `command/exec/write`, `command/exec/resize`, and `command/exec/terminate` calls. When omitted, buffered execution gets an internal id that is not exposed to the client.",
        ),
    ] = None
    sandbox_policy: Annotated[
        SandboxPolicy | None,
        Field(
            alias="sandboxPolicy",
            description="Optional sandbox policy for this command.\n\nUses the same shape as thread/turn execution sandbox configuration and defaults to the user's configured policy when omitted. Cannot be combined with `permissionProfile`.",
        ),
    ] = None
    size: Annotated[
        CommandExecTerminalSize | None,
        Field(
            description="Optional initial PTY size in character cells. Only valid when `tty` is true."
        ),
    ] = None
    stream_stdin: Annotated[
        bool | None,
        Field(
            alias="streamStdin",
            description="Allow follow-up `command/exec/write` requests to write stdin bytes.\n\nRequires a client-supplied `processId`.",
        ),
    ] = None
    stream_stdout_stderr: Annotated[
        bool | None,
        Field(
            alias="streamStdoutStderr",
            description="Stream stdout/stderr via `command/exec/outputDelta` notifications.\n\nStreamed bytes are not duplicated into the final response and require a client-supplied `processId`.",
        ),
    ] = None
    timeout_ms: Annotated[
        int | None,
        Field(
            alias="timeoutMs",
            description="Optional timeout in milliseconds.\n\nWhen omitted, the server default applies. Cannot be combined with `disableTimeout`.",
        ),
    ] = None
    tty: Annotated[
        bool | None,
        Field(
            description="Enable PTY mode.\n\nThis implies `streamStdin` and `streamStdoutStderr`."
        ),
    ] = None


class CommandExecResizeParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    process_id: Annotated[
        str,
        Field(
            alias="processId",
            description="Client-supplied, connection-scoped `processId` from the original `command/exec` request.",
        ),
    ]
    size: Annotated[CommandExecTerminalSize, Field(description="New PTY size in character cells.")]


class ConfigEdit(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    key_path: Annotated[str, Field(alias="keyPath")]
    merge_strategy: Annotated[MergeStrategy, Field(alias="mergeStrategy")]
    value: Any


class ConfigLayer(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    config: Any
    disabled_reason: Annotated[str | None, Field(alias="disabledReason")] = None
    name: ConfigLayerSource
    version: str


class ConfigLayerMetadata(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    name: ConfigLayerSource
    version: str


class ConfigRequirements(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    allowed_approval_policies: Annotated[
        list[AskForApproval] | None, Field(alias="allowedApprovalPolicies")
    ] = None
    allowed_sandbox_modes: Annotated[
        list[SandboxMode] | None, Field(alias="allowedSandboxModes")
    ] = None
    allowed_web_search_modes: Annotated[
        list[WebSearchMode] | None, Field(alias="allowedWebSearchModes")
    ] = None
    enforce_residency: Annotated[ResidencyRequirement | None, Field(alias="enforceResidency")] = (
        None
    )
    feature_requirements: Annotated[dict[str, Any] | None, Field(alias="featureRequirements")] = (
        None
    )


class ConfigRequirementsReadResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    requirements: Annotated[
        ConfigRequirements | None,
        Field(
            description="Null if no requirements are configured (e.g. no requirements.toml/MDM entries)."
        ),
    ] = None


class ConfigValueWriteParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    expected_version: Annotated[str | None, Field(alias="expectedVersion")] = None
    file_path: Annotated[
        str | None,
        Field(
            alias="filePath",
            description="Path to the config file to write; defaults to the user's `config.toml` when omitted.",
        ),
    ] = None
    key_path: Annotated[str, Field(alias="keyPath")]
    merge_strategy: Annotated[MergeStrategy, Field(alias="mergeStrategy")]
    value: Any


class ConfigWarningNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    details: Annotated[
        str | None, Field(description="Optional extra guidance or error details.")
    ] = None
    path: Annotated[
        str | None,
        Field(description="Optional path to the config file that triggered the warning."),
    ] = None
    range: Annotated[
        TextRange | None,
        Field(description="Optional range for the error location inside the config file."),
    ] = None
    summary: Annotated[str, Field(description="Concise summary of the warning.")]


class InputImageContentItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    detail: ImageDetail | None = None
    image_url: str
    type: Annotated[Literal["input_image"], Field(title="InputImageContentItemType")]


class ContentItem(RootModel[InputTextContentItem | InputImageContentItem | OutputTextContentItem]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: InputTextContentItem | InputImageContentItem | OutputTextContentItem


class ExperimentalFeature(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    announcement: Annotated[
        str | None,
        Field(
            description="Announcement copy shown to users when the feature is introduced. Null when this feature is not in beta."
        ),
    ] = None
    default_enabled: Annotated[
        bool,
        Field(alias="defaultEnabled", description="Whether this feature is enabled by default."),
    ]
    description: Annotated[
        str | None,
        Field(
            description="Short summary describing what the feature does. Null when this feature is not in beta."
        ),
    ] = None
    display_name: Annotated[
        str | None,
        Field(
            alias="displayName",
            description="User-facing display name shown in the experimental features UI. Null when this feature is not in beta.",
        ),
    ] = None
    enabled: Annotated[
        bool, Field(description="Whether this feature is currently enabled in the loaded config.")
    ]
    name: Annotated[str, Field(description="Stable key used in config.toml and CLI flag toggles.")]
    stage: Annotated[
        ExperimentalFeatureStage, Field(description="Lifecycle stage of this feature flag.")
    ]


class ExperimentalFeatureListResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data: list[ExperimentalFeature]
    next_cursor: Annotated[
        str | None,
        Field(
            alias="nextCursor",
            description="Opaque cursor to pass to the next call to continue after the last item. If None, there are no more items to return.",
        ),
    ] = None


class SpecialFileSystemPath(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    type: Annotated[Literal["special"], Field(title="SpecialFileSystemPathType")]
    value: FileSystemSpecialPath


class FileSystemPath(
    RootModel[PathFileSystemPath | GlobPatternFileSystemPath | SpecialFileSystemPath]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: PathFileSystemPath | GlobPatternFileSystemPath | SpecialFileSystemPath


class FileSystemSandboxEntry(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    access: FileSystemAccessMode
    path: FileSystemPath


class FileUpdateChange(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    diff: str
    kind: PatchChangeKind
    path: str


class InputImageFunctionCallOutputContentItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    detail: ImageDetail | None = None
    image_url: str
    type: Annotated[
        Literal["input_image"], Field(title="InputImageFunctionCallOutputContentItemType")
    ]


class FunctionCallOutputContentItem(
    RootModel[InputTextFunctionCallOutputContentItem | InputImageFunctionCallOutputContentItem]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[
        InputTextFunctionCallOutputContentItem | InputImageFunctionCallOutputContentItem,
        Field(
            description="Responses API compatible content items that can be returned by a tool call. This is a subset of ContentItem with the types we support as function call outputs."
        ),
    ]


class GetAccountResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    account: Account | None = None
    requires_openai_auth: Annotated[bool, Field(alias="requiresOpenaiAuth")]


class GuardianApprovalReview(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    rationale: str | None = None
    risk_level: Annotated[GuardianRiskLevel | None, Field(alias="riskLevel")] = None
    status: GuardianApprovalReviewStatus
    user_authorization: Annotated[
        GuardianUserAuthorization | None, Field(alias="userAuthorization")
    ] = None


class CommandGuardianApprovalReviewAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    command: str
    cwd: AbsolutePathBuf
    source: GuardianCommandSource
    type: Annotated[Literal["command"], Field(title="CommandGuardianApprovalReviewActionType")]


class ExecveGuardianApprovalReviewAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    argv: list[str]
    cwd: AbsolutePathBuf
    program: str
    source: GuardianCommandSource
    type: Annotated[Literal["execve"], Field(title="ExecveGuardianApprovalReviewActionType")]


class NetworkAccessGuardianApprovalReviewAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    host: str
    port: Annotated[int, Field(ge=0)]
    protocol: NetworkApprovalProtocol
    target: str
    type: Annotated[
        Literal["networkAccess"], Field(title="NetworkAccessGuardianApprovalReviewActionType")
    ]


class HookMetadata(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    command: str | None = None
    current_hash: Annotated[str, Field(alias="currentHash")]
    display_order: Annotated[int, Field(alias="displayOrder")]
    enabled: bool
    event_name: Annotated[HookEventName, Field(alias="eventName")]
    handler_type: Annotated[HookHandlerType, Field(alias="handlerType")]
    is_managed: Annotated[bool, Field(alias="isManaged")]
    key: str
    matcher: str | None = None
    plugin_id: Annotated[str | None, Field(alias="pluginId")] = None
    source: HookSource
    source_path: Annotated[AbsolutePathBuf, Field(alias="sourcePath")]
    status_message: Annotated[str | None, Field(alias="statusMessage")] = None
    timeout_sec: Annotated[int, Field(alias="timeoutSec", ge=0)]
    trust_status: Annotated[HookTrustStatus, Field(alias="trustStatus")]


class HookOutputEntry(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    kind: HookOutputEntryKind
    text: str


class HookRunSummary(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    completed_at: Annotated[int | None, Field(alias="completedAt")] = None
    display_order: Annotated[int, Field(alias="displayOrder")]
    duration_ms: Annotated[int | None, Field(alias="durationMs")] = None
    entries: list[HookOutputEntry]
    event_name: Annotated[HookEventName, Field(alias="eventName")]
    execution_mode: Annotated[HookExecutionMode, Field(alias="executionMode")]
    handler_type: Annotated[HookHandlerType, Field(alias="handlerType")]
    id: str
    scope: HookScope
    source: HookSource | None = "unknown"
    source_path: Annotated[AbsolutePathBuf, Field(alias="sourcePath")]
    started_at: Annotated[int, Field(alias="startedAt")]
    status: HookRunStatus
    status_message: Annotated[str | None, Field(alias="statusMessage")] = None


class HookStartedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    run: HookRunSummary
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str | None, Field(alias="turnId")] = None


class HooksListEntry(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwd: str
    errors: list[HookErrorInfo]
    hooks: list[HookMetadata]
    warnings: list[str]


class HooksListResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data: list[HooksListEntry]


class ListMcpServerStatusParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cursor: Annotated[
        str | None, Field(description="Opaque pagination cursor returned by a previous call.")
    ] = None
    detail: Annotated[
        McpServerStatusDetail | None,
        Field(
            description="Controls how much MCP inventory data to fetch for each server. Defaults to `Full` when omitted."
        ),
    ] = None
    limit: Annotated[
        int | None,
        Field(description="Optional page size; defaults to a server-defined value.", ge=0),
    ] = None


class McpResourceReadResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    contents: list[ResourceContent]


class McpServerStatus(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    auth_status: Annotated[McpAuthStatus, Field(alias="authStatus")]
    name: str
    resource_templates: Annotated[list[ResourceTemplate], Field(alias="resourceTemplates")]
    resources: list[Resource]
    tools: dict[str, Tool]


class MemoryCitation(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    entries: list[MemoryCitationEntry]
    thread_ids: Annotated[list[str], Field(alias="threadIds")]


class MigrationDetails(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    commands: list[CommandMigration] | None = []
    hooks: list[HookMigration] | None = []
    mcp_servers: Annotated[list[McpServerMigration] | None, Field(alias="mcpServers")] = []
    plugins: list[PluginsMigration] | None = []
    sessions: list[SessionMigration] | None = []
    subagents: list[SubagentMigration] | None = []


class Model(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    additional_speed_tiers: Annotated[
        list[str] | None,
        Field(alias="additionalSpeedTiers", description="Deprecated: use `serviceTiers` instead."),
    ] = []
    availability_nux: Annotated[ModelAvailabilityNux | None, Field(alias="availabilityNux")] = None
    default_reasoning_effort: Annotated[ReasoningEffort, Field(alias="defaultReasoningEffort")]
    description: str
    display_name: Annotated[str, Field(alias="displayName")]
    hidden: bool
    id: str
    input_modalities: Annotated[list[InputModality] | None, Field(alias="inputModalities")] = [
        "text",
        "image",
    ]
    is_default: Annotated[bool, Field(alias="isDefault")]
    model: str
    service_tiers: Annotated[list[ModelServiceTier] | None, Field(alias="serviceTiers")] = []
    supported_reasoning_efforts: Annotated[
        list[ReasoningEffortOption], Field(alias="supportedReasoningEfforts")
    ]
    supports_personality: Annotated[bool | None, Field(alias="supportsPersonality")] = False
    upgrade: str | None = None
    upgrade_info: Annotated[ModelUpgradeInfo | None, Field(alias="upgradeInfo")] = None


class ModelListResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data: list[Model]
    next_cursor: Annotated[
        str | None,
        Field(
            alias="nextCursor",
            description="Opaque cursor to pass to the next call to continue after the last item. If None, there are no more items to return.",
        ),
    ] = None


class OverriddenMetadata(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    effective_value: Annotated[Any, Field(alias="effectiveValue")]
    message: str
    overriding_layer: Annotated[ConfigLayerMetadata, Field(alias="overridingLayer")]


class ExternalPermissionProfile(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    network: PermissionProfileNetworkPermissions
    type: Annotated[Literal["external"], Field(title="ExternalPermissionProfileType")]


class RestrictedPermissionProfileFileSystemPermissions(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    entries: list[FileSystemSandboxEntry]
    glob_scan_max_depth: Annotated[int | None, Field(alias="globScanMaxDepth", ge=1)] = None
    type: Annotated[
        Literal["restricted"], Field(title="RestrictedPermissionProfileFileSystemPermissionsType")
    ]


class PermissionProfileFileSystemPermissions(
    RootModel[
        RestrictedPermissionProfileFileSystemPermissions
        | UnrestrictedPermissionProfileFileSystemPermissions
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: (
        RestrictedPermissionProfileFileSystemPermissions
        | UnrestrictedPermissionProfileFileSystemPermissions
    )


class PluginSharePrincipal(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    name: str
    principal_id: Annotated[str, Field(alias="principalId")]
    principal_type: Annotated[PluginSharePrincipalType, Field(alias="principalType")]
    role: PluginSharePrincipalRole


class PluginShareTarget(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    principal_id: Annotated[str, Field(alias="principalId")]
    principal_type: Annotated[PluginSharePrincipalType, Field(alias="principalType")]
    role: PluginShareTargetRole


class PluginShareUpdateTargetsParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    discoverability: PluginShareUpdateDiscoverability
    remote_plugin_id: Annotated[str, Field(alias="remotePluginId")]
    share_targets: Annotated[list[PluginShareTarget], Field(alias="shareTargets")]


class PluginShareUpdateTargetsResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    discoverability: PluginShareDiscoverability
    principals: list[PluginSharePrincipal]


class ProcessOutputDeltaNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cap_reached: Annotated[
        bool,
        Field(
            alias="capReached",
            description="True on the final streamed chunk for this stream when output was truncated by `outputBytesCap`.",
        ),
    ]
    delta_base64: Annotated[
        str, Field(alias="deltaBase64", description="Base64-encoded output bytes.")
    ]
    process_handle: Annotated[
        str,
        Field(
            alias="processHandle",
            description="Client-supplied, connection-scoped `processHandle` from `process/spawn`.",
        ),
    ]
    stream: Annotated[
        ProcessOutputStream, Field(description="Output stream this chunk belongs to.")
    ]


class RateLimitSnapshot(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    credits: CreditsSnapshot | None = None
    limit_id: Annotated[str | None, Field(alias="limitId")] = None
    limit_name: Annotated[str | None, Field(alias="limitName")] = None
    plan_type: Annotated[PlanType | None, Field(alias="planType")] = None
    primary: RateLimitWindow | None = None
    rate_limit_reached_type: Annotated[
        RateLimitReachedType | None, Field(alias="rateLimitReachedType")
    ] = None
    secondary: RateLimitWindow | None = None


class MessageResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    content: list[ContentItem]
    id: str | None = None
    phase: MessagePhase | None = None
    role: str
    type: Annotated[Literal["message"], Field(title="MessageResponseItemType")]


class WebSearchCallResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    action: ResponsesApiWebSearchAction | None = None
    id: str | None = None
    status: str | None = None
    type: Annotated[Literal["web_search_call"], Field(title="WebSearchCallResponseItemType")]


class ReviewStartParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    delivery: Annotated[
        ReviewDelivery | None,
        Field(
            description="Where to run the review: inline (default) on the current thread or detached on a new thread (returned in `reviewThreadId`)."
        ),
    ] = None
    target: ReviewTarget
    thread_id: Annotated[str, Field(alias="threadId")]


class ThreadStatusChangedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/status/changed"], Field(title="Thread/status/changedNotificationMethod")
    ]
    params: ThreadStatusChangedNotification


class ThreadArchivedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["thread/archived"], Field(title="Thread/archivedNotificationMethod")]
    params: ThreadArchivedNotification


class ThreadUnarchivedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/unarchived"], Field(title="Thread/unarchivedNotificationMethod")
    ]
    params: ThreadUnarchivedNotification


class ThreadClosedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["thread/closed"], Field(title="Thread/closedNotificationMethod")]
    params: ThreadClosedNotification


class SkillsChangedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["skills/changed"], Field(title="Skills/changedNotificationMethod")]
    params: SkillsChangedNotification


class ThreadNameUpdatedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/name/updated"], Field(title="Thread/name/updatedNotificationMethod")
    ]
    params: ThreadNameUpdatedNotification


class ThreadGoalClearedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/goal/cleared"], Field(title="Thread/goal/clearedNotificationMethod")
    ]
    params: ThreadGoalClearedNotification


class HookStartedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["hook/started"], Field(title="Hook/startedNotificationMethod")]
    params: HookStartedNotification


class TurnDiffUpdatedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["turn/diff/updated"], Field(title="Turn/diff/updatedNotificationMethod")
    ]
    params: TurnDiffUpdatedNotification


class CommandExecOutputDeltaServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["command/exec/outputDelta"],
        Field(title="Command/exec/outputDeltaNotificationMethod"),
    ]
    params: CommandExecOutputDeltaNotification


class ProcessOutputDeltaServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["process/outputDelta"], Field(title="Process/outputDeltaNotificationMethod")
    ]
    params: ProcessOutputDeltaNotification


class ItemCommandExecutionTerminalInteractionServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["item/commandExecution/terminalInteraction"],
        Field(title="Item/commandExecution/terminalInteractionNotificationMethod"),
    ]
    params: TerminalInteractionNotification


class ServerRequestResolvedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["serverRequest/resolved"], Field(title="ServerRequest/resolvedNotificationMethod")
    ]
    params: ServerRequestResolvedNotification


class AccountUpdatedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["account/updated"], Field(title="Account/updatedNotificationMethod")]
    params: AccountUpdatedNotification


class WarningServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["warning"], Field(title="WarningNotificationMethod")]
    params: WarningNotification


class ConfigWarningServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["configWarning"], Field(title="ConfigWarningNotificationMethod")]
    params: ConfigWarningNotification


class ThreadRealtimeStartedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/realtime/started"], Field(title="Thread/realtime/startedNotificationMethod")
    ]
    params: ThreadRealtimeStartedNotification


class ThreadRealtimeItemAddedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/realtime/itemAdded"],
        Field(title="Thread/realtime/itemAddedNotificationMethod"),
    ]
    params: ThreadRealtimeItemAddedNotification


class ThreadRealtimeTranscriptDeltaServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/realtime/transcript/delta"],
        Field(title="Thread/realtime/transcript/deltaNotificationMethod"),
    ]
    params: ThreadRealtimeTranscriptDeltaNotification


class ThreadRealtimeTranscriptDoneServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/realtime/transcript/done"],
        Field(title="Thread/realtime/transcript/doneNotificationMethod"),
    ]
    params: ThreadRealtimeTranscriptDoneNotification


class ThreadRealtimeOutputAudioDeltaServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/realtime/outputAudio/delta"],
        Field(title="Thread/realtime/outputAudio/deltaNotificationMethod"),
    ]
    params: ThreadRealtimeOutputAudioDeltaNotification


class ThreadRealtimeSdpServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/realtime/sdp"], Field(title="Thread/realtime/sdpNotificationMethod")
    ]
    params: ThreadRealtimeSdpNotification


class ThreadRealtimeErrorServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/realtime/error"], Field(title="Thread/realtime/errorNotificationMethod")
    ]
    params: ThreadRealtimeErrorNotification


class ThreadRealtimeClosedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/realtime/closed"], Field(title="Thread/realtime/closedNotificationMethod")
    ]
    params: ThreadRealtimeClosedNotification


class WindowsWorldWritableWarningServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["windows/worldWritableWarning"],
        Field(title="Windows/worldWritableWarningNotificationMethod"),
    ]
    params: WindowsWorldWritableWarningNotification


class SkillDependencies(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    tools: list[SkillToolDependency]


class SkillMetadata(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    dependencies: SkillDependencies | None = None
    description: str
    enabled: bool
    interface: SkillInterface | None = None
    name: str
    path: AbsolutePathBuf
    scope: SkillScope
    short_description: Annotated[
        str | None,
        Field(
            alias="shortDescription",
            description="Legacy short_description from SKILL.md. Prefer SKILL.json interface.short_description.",
        ),
    ] = None


class SkillsListEntry(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwd: str
    errors: list[SkillErrorInfo]
    skills: list[SkillMetadata]


class SkillsListResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data: list[SkillsListEntry]


class ThreadSpawn(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    agent_nickname: str | None = None
    agent_path: AgentPath | None = None
    agent_role: str | None = None
    depth: int
    parent_thread_id: ThreadId


class ThreadSpawnSubAgentSource(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    thread_spawn: ThreadSpawn


class SubAgentSource(
    RootModel[SubAgentSourceValue | ThreadSpawnSubAgentSource | OtherSubAgentSource]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: SubAgentSourceValue | ThreadSpawnSubAgentSource | OtherSubAgentSource


class ThreadForkParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    approval_policy: Annotated[AskForApproval | None, Field(alias="approvalPolicy")] = None
    approvals_reviewer: Annotated[
        ApprovalsReviewer | None,
        Field(
            alias="approvalsReviewer",
            description="Override where approval requests are routed for review on this thread and subsequent turns.",
        ),
    ] = None
    base_instructions: Annotated[str | None, Field(alias="baseInstructions")] = None
    config: dict[str, Any] | None = None
    cwd: str | None = None
    developer_instructions: Annotated[str | None, Field(alias="developerInstructions")] = None
    ephemeral: bool | None = None
    model: Annotated[
        str | None, Field(description="Configuration overrides for the forked thread, if any.")
    ] = None
    model_provider: Annotated[str | None, Field(alias="modelProvider")] = None
    sandbox: SandboxMode | None = None
    service_tier: Annotated[str | None, Field(alias="serviceTier")] = None
    thread_id: Annotated[str, Field(alias="threadId")]
    thread_source: Annotated[
        ThreadSource | None,
        Field(
            alias="threadSource",
            description="Optional client-supplied analytics source classification for this forked thread.",
        ),
    ] = None


class ThreadGoal(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    created_at: Annotated[int, Field(alias="createdAt")]
    objective: str
    status: ThreadGoalStatus
    thread_id: Annotated[str, Field(alias="threadId")]
    time_used_seconds: Annotated[int, Field(alias="timeUsedSeconds")]
    token_budget: Annotated[int | None, Field(alias="tokenBudget")] = None
    tokens_used: Annotated[int, Field(alias="tokensUsed")]
    updated_at: Annotated[int, Field(alias="updatedAt")]


class ThreadGoalUpdatedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    goal: ThreadGoal
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str | None, Field(alias="turnId")] = None


class UserMessageThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    content: list[UserInput]
    id: str
    type: Annotated[Literal["userMessage"], Field(title="UserMessageThreadItemType")]


class AgentMessageThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: str
    memory_citation: Annotated[MemoryCitation | None, Field(alias="memoryCitation")] = None
    phase: MessagePhase | None = None
    text: str
    type: Annotated[Literal["agentMessage"], Field(title="AgentMessageThreadItemType")]


class FileChangeThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    changes: list[FileUpdateChange]
    id: str
    status: PatchApplyStatus
    type: Annotated[Literal["fileChange"], Field(title="FileChangeThreadItemType")]


class CollabAgentToolCallThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    agents_states: Annotated[
        dict[str, CollabAgentState],
        Field(
            alias="agentsStates",
            description="Last known status of the target agents, when available.",
        ),
    ]
    id: Annotated[str, Field(description="Unique identifier for this collab tool call.")]
    model: Annotated[
        str | None, Field(description="Model requested for the spawned agent, when applicable.")
    ] = None
    prompt: Annotated[
        str | None,
        Field(description="Prompt text sent as part of the collab tool call, when available."),
    ] = None
    reasoning_effort: Annotated[
        ReasoningEffort | None,
        Field(
            alias="reasoningEffort",
            description="Reasoning effort requested for the spawned agent, when applicable.",
        ),
    ] = None
    receiver_thread_ids: Annotated[
        list[str],
        Field(
            alias="receiverThreadIds",
            description="Thread ID of the receiving agent, when applicable. In case of spawn operation, this corresponds to the newly spawned agent.",
        ),
    ]
    sender_thread_id: Annotated[
        str,
        Field(
            alias="senderThreadId", description="Thread ID of the agent issuing the collab request."
        ),
    ]
    status: Annotated[
        CollabAgentToolCallStatus, Field(description="Current status of the collab tool call.")
    ]
    tool: Annotated[CollabAgentTool, Field(description="Name of the collab tool that was invoked.")]
    type: Annotated[
        Literal["collabAgentToolCall"], Field(title="CollabAgentToolCallThreadItemType")
    ]


class WebSearchThreadItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    action: WebSearchAction | None = None
    id: str
    query: str
    type: Annotated[Literal["webSearch"], Field(title="WebSearchThreadItemType")]


class ThreadItem(
    RootModel[
        UserMessageThreadItem
        | HookPromptThreadItem
        | AgentMessageThreadItem
        | PlanThreadItem
        | ReasoningThreadItem
        | CommandExecutionThreadItem
        | FileChangeThreadItem
        | McpToolCallThreadItem
        | DynamicToolCallThreadItem
        | CollabAgentToolCallThreadItem
        | WebSearchThreadItem
        | ImageViewThreadItem
        | ImageGenerationThreadItem
        | EnteredReviewModeThreadItem
        | ExitedReviewModeThreadItem
        | ContextCompactionThreadItem
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: (
        UserMessageThreadItem
        | HookPromptThreadItem
        | AgentMessageThreadItem
        | PlanThreadItem
        | ReasoningThreadItem
        | CommandExecutionThreadItem
        | FileChangeThreadItem
        | McpToolCallThreadItem
        | DynamicToolCallThreadItem
        | CollabAgentToolCallThreadItem
        | WebSearchThreadItem
        | ImageViewThreadItem
        | ImageGenerationThreadItem
        | EnteredReviewModeThreadItem
        | ExitedReviewModeThreadItem
        | ContextCompactionThreadItem
    )


class ThreadListParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    archived: Annotated[
        bool | None,
        Field(
            description="Optional archived filter; when set to true, only archived threads are returned. If false or null, only non-archived threads are returned."
        ),
    ] = None
    cursor: Annotated[
        str | None, Field(description="Opaque pagination cursor returned by a previous call.")
    ] = None
    cwd: Annotated[
        ThreadListCwdFilter | None,
        Field(
            description="Optional cwd filter or filters; when set, only threads whose session cwd exactly matches one of these paths are returned."
        ),
    ] = None
    limit: Annotated[
        int | None,
        Field(description="Optional page size; defaults to a reasonable server-side value.", ge=0),
    ] = None
    model_providers: Annotated[
        list[str] | None,
        Field(
            alias="modelProviders",
            description="Optional provider filter; when set, only sessions recorded under these providers are returned. When present but empty, includes all providers.",
        ),
    ] = None
    search_term: Annotated[
        str | None,
        Field(
            alias="searchTerm",
            description="Optional substring filter for the extracted thread title.",
        ),
    ] = None
    sort_direction: Annotated[
        SortDirection | None,
        Field(
            alias="sortDirection",
            description="Optional sort direction; defaults to descending (newest first).",
        ),
    ] = None
    sort_key: Annotated[
        ThreadSortKey | None,
        Field(alias="sortKey", description="Optional sort key; defaults to created_at."),
    ] = None
    source_kinds: Annotated[
        list[ThreadSourceKind] | None,
        Field(
            alias="sourceKinds",
            description="Optional source filter; when set, only sessions from these source kinds are returned. When omitted or empty, defaults to interactive sources.",
        ),
    ] = None
    use_state_db_only: Annotated[
        bool | None,
        Field(
            alias="useStateDbOnly",
            description="If true, return from the state DB without scanning JSONL rollouts to repair thread metadata. Omitted or false preserves scan-and-repair behavior.",
        ),
    ] = None


class ThreadStartParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    approval_policy: Annotated[AskForApproval | None, Field(alias="approvalPolicy")] = None
    approvals_reviewer: Annotated[
        ApprovalsReviewer | None,
        Field(
            alias="approvalsReviewer",
            description="Override where approval requests are routed for review on this thread and subsequent turns.",
        ),
    ] = None
    base_instructions: Annotated[str | None, Field(alias="baseInstructions")] = None
    config: dict[str, Any] | None = None
    cwd: str | None = None
    developer_instructions: Annotated[str | None, Field(alias="developerInstructions")] = None
    ephemeral: bool | None = None
    model: str | None = None
    model_provider: Annotated[str | None, Field(alias="modelProvider")] = None
    personality: Personality | None = None
    sandbox: SandboxMode | None = None
    service_name: Annotated[str | None, Field(alias="serviceName")] = None
    service_tier: Annotated[str | None, Field(alias="serviceTier")] = None
    session_start_source: Annotated[ThreadStartSource | None, Field(alias="sessionStartSource")] = (
        None
    )
    thread_source: Annotated[
        ThreadSource | None,
        Field(
            alias="threadSource",
            description="Optional client-supplied analytics source classification for this thread.",
        ),
    ] = None


class ThreadTokenUsage(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    last: TokenUsageBreakdown
    model_context_window: Annotated[int | None, Field(alias="modelContextWindow")] = None
    total: TokenUsageBreakdown


class ThreadTokenUsageUpdatedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]
    token_usage: Annotated[ThreadTokenUsage, Field(alias="tokenUsage")]
    turn_id: Annotated[str, Field(alias="turnId")]


class ThreadUnsubscribeResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    status: ThreadUnsubscribeStatus


class ToolsV2(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    view_image: bool | None = None
    web_search: WebSearchToolConfig | None = None


class TurnError(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    additional_details: Annotated[str | None, Field(alias="additionalDetails")] = None
    codex_error_info: Annotated[CodexErrorInfo | None, Field(alias="codexErrorInfo")] = None
    message: str


class TurnPlanStep(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    status: TurnPlanStepStatus
    step: str


class TurnPlanUpdatedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    explanation: str | None = None
    plan: list[TurnPlanStep]
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class TurnStartParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    approval_policy: Annotated[
        AskForApproval | None,
        Field(
            alias="approvalPolicy",
            description="Override the approval policy for this turn and subsequent turns.",
        ),
    ] = None
    approvals_reviewer: Annotated[
        ApprovalsReviewer | None,
        Field(
            alias="approvalsReviewer",
            description="Override where approval requests are routed for review on this turn and subsequent turns.",
        ),
    ] = None
    cwd: Annotated[
        str | None,
        Field(description="Override the working directory for this turn and subsequent turns."),
    ] = None
    effort: Annotated[
        ReasoningEffort | None,
        Field(description="Override the reasoning effort for this turn and subsequent turns."),
    ] = None
    input: list[UserInput]
    model: Annotated[
        str | None, Field(description="Override the model for this turn and subsequent turns.")
    ] = None
    output_schema: Annotated[
        Any | None,
        Field(
            alias="outputSchema",
            description="Optional JSON Schema used to constrain the final assistant message for this turn.",
        ),
    ] = None
    personality: Annotated[
        Personality | None,
        Field(description="Override the personality for this turn and subsequent turns."),
    ] = None
    sandbox_policy: Annotated[
        SandboxPolicy | None,
        Field(
            alias="sandboxPolicy",
            description="Override the sandbox policy for this turn and subsequent turns.",
        ),
    ] = None
    service_tier: Annotated[
        str | None,
        Field(
            alias="serviceTier",
            description="Override the service tier for this turn and subsequent turns.",
        ),
    ] = None
    summary: Annotated[
        ReasoningSummary | None,
        Field(description="Override the reasoning summary for this turn and subsequent turns."),
    ] = None
    thread_id: Annotated[str, Field(alias="threadId")]


class TurnSteerParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    expected_turn_id: Annotated[
        str,
        Field(
            alias="expectedTurnId",
            description="Required active turn id precondition. The request fails when it does not match the currently active turn.",
        ),
    ]
    input: list[UserInput]
    thread_id: Annotated[str, Field(alias="threadId")]


class WindowsSandboxSetupCompletedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    error: str | None = None
    mode: WindowsSandboxSetupMode
    success: bool


class AccountRateLimitsUpdatedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    rate_limits: Annotated[RateLimitSnapshot, Field(alias="rateLimits")]


class AdditionalFileSystemPermissions(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    entries: list[FileSystemSandboxEntry] | None = None
    glob_scan_max_depth: Annotated[int | None, Field(alias="globScanMaxDepth", ge=1)] = None
    read: Annotated[
        list[AbsolutePathBuf] | None,
        Field(description="This will be removed in favor of `entries`."),
    ] = None
    write: Annotated[
        list[AbsolutePathBuf] | None,
        Field(description="This will be removed in favor of `entries`."),
    ] = None


class AppInfo(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    app_metadata: Annotated[AppMetadata | None, Field(alias="appMetadata")] = None
    branding: AppBranding | None = None
    description: str | None = None
    distribution_channel: Annotated[str | None, Field(alias="distributionChannel")] = None
    id: str
    install_url: Annotated[str | None, Field(alias="installUrl")] = None
    is_accessible: Annotated[bool | None, Field(alias="isAccessible")] = False
    is_enabled: Annotated[
        bool | None,
        Field(
            alias="isEnabled",
            description="Whether this app is enabled in config.toml. Example: ```toml [apps.bad_app] enabled = false ```",
        ),
    ] = True
    labels: dict[str, Any] | None = None
    logo_url: Annotated[str | None, Field(alias="logoUrl")] = None
    logo_url_dark: Annotated[str | None, Field(alias="logoUrlDark")] = None
    name: str
    plugin_display_names: Annotated[list[str] | None, Field(alias="pluginDisplayNames")] = []


class AppListUpdatedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data: list[AppInfo]


class AppsListResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data: list[AppInfo]
    next_cursor: Annotated[
        str | None,
        Field(
            alias="nextCursor",
            description="Opaque cursor to pass to the next call to continue after the last item. If None, there are no more items to return.",
        ),
    ] = None


class ThreadStartRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["thread/start"], Field(title="Thread/startRequestMethod")]
    params: ThreadStartParams


class ThreadForkRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["thread/fork"], Field(title="Thread/forkRequestMethod")]
    params: ThreadForkParams


class ThreadListRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["thread/list"], Field(title="Thread/listRequestMethod")]
    params: ThreadListParams


class PluginShareUpdateTargetsRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["plugin/share/updateTargets"],
        Field(title="Plugin/share/updateTargetsRequestMethod"),
    ]
    params: PluginShareUpdateTargetsParams


class TurnStartRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["turn/start"], Field(title="Turn/startRequestMethod")]
    params: TurnStartParams


class TurnSteerRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["turn/steer"], Field(title="Turn/steerRequestMethod")]
    params: TurnSteerParams


class ReviewStartRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["review/start"], Field(title="Review/startRequestMethod")]
    params: ReviewStartParams


class McpServerStatusListRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["mcpServerStatus/list"], Field(title="McpServerStatus/listRequestMethod")
    ]
    params: ListMcpServerStatusParams


class CommandExecRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["command/exec"], Field(title="Command/execRequestMethod")]
    params: CommandExecParams


class CommandExecResizeRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["command/exec/resize"], Field(title="Command/exec/resizeRequestMethod")
    ]
    params: CommandExecResizeParams


class ConfigValueWriteRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["config/value/write"], Field(title="Config/value/writeRequestMethod")]
    params: ConfigValueWriteParams


class ConfigBatchWriteParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    edits: list[ConfigEdit]
    expected_version: Annotated[str | None, Field(alias="expectedVersion")] = None
    file_path: Annotated[
        str | None,
        Field(
            alias="filePath",
            description="Path to the config file to write; defaults to the user's `config.toml` when omitted.",
        ),
    ] = None
    reload_user_config: Annotated[
        bool | None,
        Field(
            alias="reloadUserConfig",
            description="When true, hot-reload the updated user config into all loaded threads after writing.",
        ),
    ] = None


class ConfigWriteResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    file_path: Annotated[
        AbsolutePathBuf,
        Field(alias="filePath", description="Canonical path to the config file that was written."),
    ]
    overridden_metadata: Annotated[OverriddenMetadata | None, Field(alias="overriddenMetadata")] = (
        None
    )
    status: WriteStatus
    version: str


class ErrorNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    error: TurnError
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]
    will_retry: Annotated[bool, Field(alias="willRetry")]


class ExternalAgentConfigMigrationItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    cwd: Annotated[
        str | None,
        Field(
            description="Null or empty means home-scoped migration; non-empty means repo-scoped migration."
        ),
    ] = None
    description: str
    details: MigrationDetails | None = None
    item_type: Annotated[ExternalAgentConfigMigrationItemType, Field(alias="itemType")]


class FileChangePatchUpdatedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    changes: list[FileUpdateChange]
    item_id: Annotated[str, Field(alias="itemId")]
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class FunctionCallOutputBody(RootModel[str | list[FunctionCallOutputContentItem]]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: str | list[FunctionCallOutputContentItem]


class GetAccountRateLimitsResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    rate_limits: Annotated[
        RateLimitSnapshot,
        Field(
            alias="rateLimits",
            description="Backward-compatible single-bucket view; mirrors the historical payload.",
        ),
    ]
    rate_limits_by_limit_id: Annotated[
        dict[str, Any] | None,
        Field(
            alias="rateLimitsByLimitId",
            description="Multi-bucket view keyed by metered `limit_id` (for example, `codex`).",
        ),
    ] = None


class HookCompletedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    run: HookRunSummary
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str | None, Field(alias="turnId")] = None


class ItemCompletedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    completed_at_ms: Annotated[
        int,
        Field(
            alias="completedAtMs",
            description="Unix timestamp (in milliseconds) when this item lifecycle completed.",
        ),
    ]
    item: ThreadItem
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class ItemStartedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    item: ThreadItem
    started_at_ms: Annotated[
        int,
        Field(
            alias="startedAtMs",
            description="Unix timestamp (in milliseconds) when this item lifecycle started.",
        ),
    ]
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class ListMcpServerStatusResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data: list[McpServerStatus]
    next_cursor: Annotated[
        str | None,
        Field(
            alias="nextCursor",
            description="Opaque cursor to pass to the next call to continue after the last item. If None, there are no more items to return.",
        ),
    ] = None


class ManagedPermissionProfile(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    file_system: Annotated[PermissionProfileFileSystemPermissions, Field(alias="fileSystem")]
    network: PermissionProfileNetworkPermissions
    type: Annotated[Literal["managed"], Field(title="ManagedPermissionProfileType")]


class PermissionProfile(
    RootModel[ManagedPermissionProfile | DisabledPermissionProfile | ExternalPermissionProfile]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: ManagedPermissionProfile | DisabledPermissionProfile | ExternalPermissionProfile


class PluginShareContext(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    creator_account_user_id: Annotated[str | None, Field(alias="creatorAccountUserId")] = None
    creator_name: Annotated[str | None, Field(alias="creatorName")] = None
    discoverability: PluginShareDiscoverability | None = None
    remote_plugin_id: Annotated[str, Field(alias="remotePluginId")]
    share_principals: Annotated[
        list[PluginSharePrincipal] | None, Field(alias="sharePrincipals")
    ] = None
    share_url: Annotated[str | None, Field(alias="shareUrl")] = None


class PluginShareSaveParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    discoverability: PluginShareDiscoverability | None = None
    plugin_path: Annotated[AbsolutePathBuf, Field(alias="pluginPath")]
    remote_plugin_id: Annotated[str | None, Field(alias="remotePluginId")] = None
    share_targets: Annotated[list[PluginShareTarget] | None, Field(alias="shareTargets")] = None


class PluginSummary(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    auth_policy: Annotated[PluginAuthPolicy, Field(alias="authPolicy")]
    availability: Annotated[
        PluginAvailability | None,
        Field(description="Availability state for installing and using the plugin."),
    ] = "AVAILABLE"
    enabled: bool
    id: str
    install_policy: Annotated[PluginInstallPolicy, Field(alias="installPolicy")]
    installed: bool
    interface: PluginInterface | None = None
    keywords: list[str] | None = []
    name: str
    share_context: Annotated[
        PluginShareContext | None,
        Field(
            alias="shareContext",
            description="Remote sharing context associated with this plugin when available.",
        ),
    ] = None
    source: PluginSource


class ProfileV2(BaseModel):
    model_config = ConfigDict(
        extra="allow",
        populate_by_name=True,
    )
    approval_policy: AskForApproval | None = None
    approvals_reviewer: Annotated[
        ApprovalsReviewer | None,
        Field(
            description="[UNSTABLE] Optional profile-level override for where approval requests are routed for review. If omitted, the enclosing config default is used."
        ),
    ] = None
    chatgpt_base_url: str | None = None
    model: str | None = None
    model_provider: str | None = None
    model_reasoning_effort: ReasoningEffort | None = None
    model_reasoning_summary: ReasoningSummary | None = None
    model_verbosity: Verbosity | None = None
    service_tier: str | None = None
    tools: ToolsV2 | None = None
    web_search: WebSearchMode | None = None


class RequestPermissionProfile(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    file_system: Annotated[AdditionalFileSystemPermissions | None, Field(alias="fileSystem")] = None
    network: AdditionalNetworkPermissions | None = None


class FunctionCallOutputResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    call_id: str
    output: FunctionCallOutputBody
    type: Annotated[
        Literal["function_call_output"], Field(title="FunctionCallOutputResponseItemType")
    ]


class CustomToolCallOutputResponseItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    call_id: str
    name: str | None = None
    output: FunctionCallOutputBody
    type: Annotated[
        Literal["custom_tool_call_output"], Field(title="CustomToolCallOutputResponseItemType")
    ]


class ResponseItem(
    RootModel[
        MessageResponseItem
        | ReasoningResponseItem
        | LocalShellCallResponseItem
        | FunctionCallResponseItem
        | ToolSearchCallResponseItem
        | FunctionCallOutputResponseItem
        | CustomToolCallResponseItem
        | CustomToolCallOutputResponseItem
        | ToolSearchOutputResponseItem
        | WebSearchCallResponseItem
        | ImageGenerationCallResponseItem
        | CompactionResponseItem
        | ContextCompactionResponseItem
        | OtherResponseItem
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: (
        MessageResponseItem
        | ReasoningResponseItem
        | LocalShellCallResponseItem
        | FunctionCallResponseItem
        | ToolSearchCallResponseItem
        | FunctionCallOutputResponseItem
        | CustomToolCallResponseItem
        | CustomToolCallOutputResponseItem
        | ToolSearchOutputResponseItem
        | WebSearchCallResponseItem
        | ImageGenerationCallResponseItem
        | CompactionResponseItem
        | ContextCompactionResponseItem
        | OtherResponseItem
    )


class ErrorServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["error"], Field(title="ErrorNotificationMethod")]
    params: ErrorNotification


class ThreadGoalUpdatedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/goal/updated"], Field(title="Thread/goal/updatedNotificationMethod")
    ]
    params: ThreadGoalUpdatedNotification


class ThreadTokenUsageUpdatedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["thread/tokenUsage/updated"],
        Field(title="Thread/tokenUsage/updatedNotificationMethod"),
    ]
    params: ThreadTokenUsageUpdatedNotification


class HookCompletedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["hook/completed"], Field(title="Hook/completedNotificationMethod")]
    params: HookCompletedNotification


class TurnPlanUpdatedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["turn/plan/updated"], Field(title="Turn/plan/updatedNotificationMethod")
    ]
    params: TurnPlanUpdatedNotification


class ItemStartedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["item/started"], Field(title="Item/startedNotificationMethod")]
    params: ItemStartedNotification


class ItemCompletedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["item/completed"], Field(title="Item/completedNotificationMethod")]
    params: ItemCompletedNotification


class ItemFileChangePatchUpdatedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["item/fileChange/patchUpdated"],
        Field(title="Item/fileChange/patchUpdatedNotificationMethod"),
    ]
    params: FileChangePatchUpdatedNotification


class AccountRateLimitsUpdatedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["account/rateLimits/updated"],
        Field(title="Account/rateLimits/updatedNotificationMethod"),
    ]
    params: AccountRateLimitsUpdatedNotification


class AppListUpdatedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["app/list/updated"], Field(title="App/list/updatedNotificationMethod")
    ]
    params: AppListUpdatedNotification


class WindowsSandboxSetupCompletedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["windowsSandbox/setupCompleted"],
        Field(title="WindowsSandbox/setupCompletedNotificationMethod"),
    ]
    params: WindowsSandboxSetupCompletedNotification


class SubAgentSessionSource(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
        populate_by_name=True,
    )
    sub_agent: Annotated[SubAgentSource, Field(alias="subAgent")]


class SessionSource(RootModel[SessionSourceValue | CustomSessionSource | SubAgentSessionSource]):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: SessionSourceValue | CustomSessionSource | SubAgentSessionSource


class Turn(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    completed_at: Annotated[
        int | None,
        Field(
            alias="completedAt", description="Unix timestamp (in seconds) when the turn completed."
        ),
    ] = None
    duration_ms: Annotated[
        int | None,
        Field(
            alias="durationMs",
            description="Duration between turn start and completion in milliseconds, if known.",
        ),
    ] = None
    error: Annotated[
        TurnError | None, Field(description="Only populated when the Turn's status is failed.")
    ] = None
    id: str
    items: Annotated[
        list[ThreadItem], Field(description="Thread items currently included in this turn payload.")
    ]
    items_view: Annotated[
        TurnItemsView | None,
        Field(
            alias="itemsView",
            description="Describes how much of `items` has been loaded for this turn.",
        ),
    ] = "full"
    started_at: Annotated[
        int | None,
        Field(alias="startedAt", description="Unix timestamp (in seconds) when the turn started."),
    ] = None
    status: TurnStatus


class TurnCompletedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]
    turn: Turn


class TurnStartResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    turn: Turn


class TurnStartedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread_id: Annotated[str, Field(alias="threadId")]
    turn: Turn


class PluginShareSaveRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["plugin/share/save"], Field(title="Plugin/share/saveRequestMethod")]
    params: PluginShareSaveParams


class ConfigBatchWriteRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[Literal["config/batchWrite"], Field(title="Config/batchWriteRequestMethod")]
    params: ConfigBatchWriteParams


class Config(BaseModel):
    model_config = ConfigDict(
        extra="allow",
        populate_by_name=True,
    )
    analytics: AnalyticsConfig | None = None
    approval_policy: AskForApproval | None = None
    approvals_reviewer: Annotated[
        ApprovalsReviewer | None,
        Field(
            description="[UNSTABLE] Optional default for where approval requests are routed for review."
        ),
    ] = None
    compact_prompt: str | None = None
    developer_instructions: str | None = None
    forced_chatgpt_workspace_id: str | None = None
    forced_login_method: ForcedLoginMethod | None = None
    instructions: str | None = None
    model: str | None = None
    model_auto_compact_token_limit: int | None = None
    model_context_window: int | None = None
    model_provider: str | None = None
    model_reasoning_effort: ReasoningEffort | None = None
    model_reasoning_summary: ReasoningSummary | None = None
    model_verbosity: Verbosity | None = None
    profile: str | None = None
    profiles: dict[str, ProfileV2] | None = {}
    review_model: str | None = None
    sandbox_mode: SandboxMode | None = None
    sandbox_workspace_write: SandboxWorkspaceWrite | None = None
    service_tier: str | None = None
    tools: ToolsV2 | None = None
    web_search: WebSearchMode | None = None


class ConfigReadResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    config: Config
    layers: list[ConfigLayer] | None = None
    origins: dict[str, ConfigLayerMetadata]


class ExternalAgentConfigDetectResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    items: list[ExternalAgentConfigMigrationItem]


class ExternalAgentConfigImportParams(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    migration_items: Annotated[
        list[ExternalAgentConfigMigrationItem], Field(alias="migrationItems")
    ]


class RequestPermissionsGuardianApprovalReviewAction(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    permissions: RequestPermissionProfile
    reason: str | None = None
    type: Annotated[
        Literal["requestPermissions"],
        Field(title="RequestPermissionsGuardianApprovalReviewActionType"),
    ]


class GuardianApprovalReviewAction(
    RootModel[
        CommandGuardianApprovalReviewAction
        | ExecveGuardianApprovalReviewAction
        | ApplyPatchGuardianApprovalReviewAction
        | NetworkAccessGuardianApprovalReviewAction
        | McpToolCallGuardianApprovalReviewAction
        | RequestPermissionsGuardianApprovalReviewAction
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: (
        CommandGuardianApprovalReviewAction
        | ExecveGuardianApprovalReviewAction
        | ApplyPatchGuardianApprovalReviewAction
        | NetworkAccessGuardianApprovalReviewAction
        | McpToolCallGuardianApprovalReviewAction
        | RequestPermissionsGuardianApprovalReviewAction
    )


class ItemGuardianApprovalReviewCompletedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    action: GuardianApprovalReviewAction
    completed_at_ms: Annotated[
        int,
        Field(
            alias="completedAtMs",
            description="Unix timestamp (in milliseconds) when this review completed.",
        ),
    ]
    decision_source: Annotated[AutoReviewDecisionSource, Field(alias="decisionSource")]
    review: GuardianApprovalReview
    review_id: Annotated[
        str, Field(alias="reviewId", description="Stable identifier for this review.")
    ]
    started_at_ms: Annotated[
        int,
        Field(
            alias="startedAtMs",
            description="Unix timestamp (in milliseconds) when this review started.",
        ),
    ]
    target_item_id: Annotated[
        str | None,
        Field(
            alias="targetItemId",
            description="Identifier for the reviewed item or tool call when one exists.\n\nIn most cases, one review maps to one target item. The exceptions are - execve reviews, where a single command may contain multiple execve calls to review (only possible when using the shell_zsh_fork feature) - network policy reviews, where there is no target item\n\nA network call is triggered by a CommandExecution item, so having a target_item_id set to the CommandExecution item would be misleading because the review is about the network call, not the command execution. Therefore, target_item_id is set to None for network policy reviews.",
        ),
    ] = None
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class ItemGuardianApprovalReviewStartedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    action: GuardianApprovalReviewAction
    review: GuardianApprovalReview
    review_id: Annotated[
        str, Field(alias="reviewId", description="Stable identifier for this review.")
    ]
    started_at_ms: Annotated[
        int,
        Field(
            alias="startedAtMs",
            description="Unix timestamp (in milliseconds) when this review started.",
        ),
    ]
    target_item_id: Annotated[
        str | None,
        Field(
            alias="targetItemId",
            description="Identifier for the reviewed item or tool call when one exists.\n\nIn most cases, one review maps to one target item. The exceptions are - execve reviews, where a single command may contain multiple execve calls to review (only possible when using the shell_zsh_fork feature) - network policy reviews, where there is no target item\n\nA network call is triggered by a CommandExecution item, so having a target_item_id set to the CommandExecution item would be misleading because the review is about the network call, not the command execution. Therefore, target_item_id is set to None for network policy reviews.",
        ),
    ] = None
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class PluginDetail(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    apps: list[AppSummary]
    description: str | None = None
    hooks: list[PluginHookSummary]
    marketplace_name: Annotated[str, Field(alias="marketplaceName")]
    marketplace_path: Annotated[AbsolutePathBuf | None, Field(alias="marketplacePath")] = None
    mcp_servers: Annotated[list[str], Field(alias="mcpServers")]
    skills: list[SkillSummary]
    summary: PluginSummary


class PluginMarketplaceEntry(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    interface: MarketplaceInterface | None = None
    name: str
    path: Annotated[
        AbsolutePathBuf | None,
        Field(
            description="Local marketplace file path when the marketplace is backed by a local file. Remote-only catalog marketplaces do not have a local path."
        ),
    ] = None
    plugins: list[PluginSummary]


class PluginReadResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    plugin: PluginDetail


class PluginShareListItem(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    local_plugin_path: Annotated[AbsolutePathBuf | None, Field(alias="localPluginPath")] = None
    plugin: PluginSummary


class PluginShareListResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    data: list[PluginShareListItem]


class RawResponseItemCompletedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    item: ResponseItem
    thread_id: Annotated[str, Field(alias="threadId")]
    turn_id: Annotated[str, Field(alias="turnId")]


class ReviewStartResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    review_thread_id: Annotated[
        str,
        Field(
            alias="reviewThreadId",
            description="Identifies the thread where the review runs.\n\nFor inline reviews, this is the original thread id. For detached reviews, this is the id of the new review thread.",
        ),
    ]
    turn: Turn


class TurnStartedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["turn/started"], Field(title="Turn/startedNotificationMethod")]
    params: TurnStartedNotification


class TurnCompletedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["turn/completed"], Field(title="Turn/completedNotificationMethod")]
    params: TurnCompletedNotification


class ItemAutoApprovalReviewStartedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["item/autoApprovalReview/started"],
        Field(title="Item/autoApprovalReview/startedNotificationMethod"),
    ]
    params: ItemGuardianApprovalReviewStartedNotification


class ItemAutoApprovalReviewCompletedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[
        Literal["item/autoApprovalReview/completed"],
        Field(title="Item/autoApprovalReview/completedNotificationMethod"),
    ]
    params: ItemGuardianApprovalReviewCompletedNotification


class Thread(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    agent_nickname: Annotated[
        str | None,
        Field(
            alias="agentNickname",
            description="Optional random unique nickname assigned to an AgentControl-spawned sub-agent.",
        ),
    ] = None
    agent_role: Annotated[
        str | None,
        Field(
            alias="agentRole",
            description="Optional role (agent_role) assigned to an AgentControl-spawned sub-agent.",
        ),
    ] = None
    cli_version: Annotated[
        str, Field(alias="cliVersion", description="Version of the CLI that created the thread.")
    ]
    created_at: Annotated[
        int,
        Field(
            alias="createdAt",
            description="Unix timestamp (in seconds) when the thread was created.",
        ),
    ]
    cwd: Annotated[AbsolutePathBuf, Field(description="Working directory captured for the thread.")]
    ephemeral: Annotated[
        bool,
        Field(
            description="Whether the thread is ephemeral and should not be materialized on disk."
        ),
    ]
    forked_from_id: Annotated[
        str | None,
        Field(
            alias="forkedFromId",
            description="Source thread id when this thread was created by forking another thread.",
        ),
    ] = None
    git_info: Annotated[
        GitInfo | None,
        Field(
            alias="gitInfo",
            description="Optional Git metadata captured when the thread was created.",
        ),
    ] = None
    id: str
    model_provider: Annotated[
        str,
        Field(
            alias="modelProvider",
            description="Model provider used for this thread (for example, 'openai').",
        ),
    ]
    name: Annotated[str | None, Field(description="Optional user-facing thread title.")] = None
    path: Annotated[str | None, Field(description="[UNSTABLE] Path to the thread on disk.")] = None
    preview: Annotated[
        str, Field(description="Usually the first user message in the thread, if available.")
    ]
    session_id: Annotated[
        str,
        Field(
            alias="sessionId",
            description="Session id shared by threads that belong to the same session tree.",
        ),
    ]
    source: Annotated[
        SessionSource,
        Field(
            description="Origin of the thread (CLI, VSCode, codex exec, codex app-server, etc.)."
        ),
    ]
    status: Annotated[ThreadStatus, Field(description="Current runtime status for the thread.")]
    thread_source: Annotated[
        ThreadSource | None,
        Field(
            alias="threadSource",
            description="Optional analytics source classification for this thread.",
        ),
    ] = None
    turns: Annotated[
        list[Turn],
        Field(
            description="Only populated on `thread/resume`, `thread/rollback`, `thread/fork`, and `thread/read` (when `includeTurns` is true) responses. For all other responses and notifications returning a Thread, the turns field will be an empty list."
        ),
    ]
    updated_at: Annotated[
        int,
        Field(
            alias="updatedAt",
            description="Unix timestamp (in seconds) when the thread was last updated.",
        ),
    ]


class ThreadForkResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    approval_policy: Annotated[AskForApproval, Field(alias="approvalPolicy")]
    approvals_reviewer: Annotated[
        ApprovalsReviewer,
        Field(
            alias="approvalsReviewer",
            description="Reviewer currently used for approval requests on this thread.",
        ),
    ]
    cwd: AbsolutePathBuf
    instruction_sources: Annotated[
        list[AbsolutePathBuf] | None,
        Field(
            alias="instructionSources",
            description="Instruction source files currently loaded for this thread.",
        ),
    ] = []
    model: str
    model_provider: Annotated[str, Field(alias="modelProvider")]
    reasoning_effort: Annotated[ReasoningEffort | None, Field(alias="reasoningEffort")] = None
    sandbox: Annotated[
        SandboxPolicy,
        Field(
            description="Legacy sandbox policy retained for compatibility. Experimental clients should prefer `permissionProfile` when they need exact runtime permissions."
        ),
    ]
    service_tier: Annotated[str | None, Field(alias="serviceTier")] = None
    thread: Thread


class ThreadListResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    backwards_cursor: Annotated[
        str | None,
        Field(
            alias="backwardsCursor",
            description="Opaque cursor to pass as `cursor` when reversing `sortDirection`. This is only populated when the page contains at least one thread. Use it with the opposite `sortDirection`; for timestamp sorts it anchors at the start of the page timestamp so same-second updates are not skipped.",
        ),
    ] = None
    data: list[Thread]
    next_cursor: Annotated[
        str | None,
        Field(
            alias="nextCursor",
            description="Opaque cursor to pass to the next call to continue after the last item. if None, there are no more items to return.",
        ),
    ] = None


class ThreadMetadataUpdateResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread: Thread


class ThreadReadResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread: Thread


class ThreadResumeResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    approval_policy: Annotated[AskForApproval, Field(alias="approvalPolicy")]
    approvals_reviewer: Annotated[
        ApprovalsReviewer,
        Field(
            alias="approvalsReviewer",
            description="Reviewer currently used for approval requests on this thread.",
        ),
    ]
    cwd: AbsolutePathBuf
    instruction_sources: Annotated[
        list[AbsolutePathBuf] | None,
        Field(
            alias="instructionSources",
            description="Instruction source files currently loaded for this thread.",
        ),
    ] = []
    model: str
    model_provider: Annotated[str, Field(alias="modelProvider")]
    reasoning_effort: Annotated[ReasoningEffort | None, Field(alias="reasoningEffort")] = None
    sandbox: Annotated[
        SandboxPolicy,
        Field(
            description="Legacy sandbox policy retained for compatibility. Experimental clients should prefer `permissionProfile` when they need exact runtime permissions."
        ),
    ]
    service_tier: Annotated[str | None, Field(alias="serviceTier")] = None
    thread: Thread


class ThreadRollbackResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread: Annotated[
        Thread,
        Field(
            description="The updated thread after applying the rollback, with `turns` populated.\n\nThe ThreadItems stored in each Turn are lossy since we explicitly do not persist all agent interactions, such as command executions. This is the same behavior as `thread/resume`."
        ),
    ]


class ThreadStartResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    approval_policy: Annotated[AskForApproval, Field(alias="approvalPolicy")]
    approvals_reviewer: Annotated[
        ApprovalsReviewer,
        Field(
            alias="approvalsReviewer",
            description="Reviewer currently used for approval requests on this thread.",
        ),
    ]
    cwd: AbsolutePathBuf
    instruction_sources: Annotated[
        list[AbsolutePathBuf] | None,
        Field(
            alias="instructionSources",
            description="Instruction source files currently loaded for this thread.",
        ),
    ] = []
    model: str
    model_provider: Annotated[str, Field(alias="modelProvider")]
    reasoning_effort: Annotated[ReasoningEffort | None, Field(alias="reasoningEffort")] = None
    sandbox: Annotated[
        SandboxPolicy,
        Field(
            description="Legacy sandbox policy retained for compatibility. Experimental clients should prefer `permissionProfile` when they need exact runtime permissions."
        ),
    ]
    service_tier: Annotated[str | None, Field(alias="serviceTier")] = None
    thread: Thread


class ThreadStartedNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread: Thread


class ThreadUnarchiveResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    thread: Thread


class ExternalAgentConfigImportRequest(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    id: RequestId
    method: Annotated[
        Literal["externalAgentConfig/import"],
        Field(title="ExternalAgentConfig/importRequestMethod"),
    ]
    params: ExternalAgentConfigImportParams


class ClientRequest(
    RootModel[
        InitializeRequest
        | ThreadStartRequest
        | ThreadResumeRequest
        | ThreadForkRequest
        | ThreadArchiveRequest
        | ThreadUnsubscribeRequest
        | ThreadNameSetRequest
        | ThreadMetadataUpdateRequest
        | ThreadUnarchiveRequest
        | ThreadCompactStartRequest
        | ThreadShellCommandRequest
        | ThreadApproveGuardianDeniedActionRequest
        | ThreadRollbackRequest
        | ThreadListRequest
        | ThreadLoadedListRequest
        | ThreadReadRequest
        | ThreadInjectItemsRequest
        | SkillsListRequest
        | HooksListRequest
        | MarketplaceAddRequest
        | MarketplaceRemoveRequest
        | MarketplaceUpgradeRequest
        | PluginListRequest
        | PluginReadRequest
        | PluginSkillReadRequest
        | PluginShareSaveRequest
        | PluginShareUpdateTargetsRequest
        | PluginShareListRequest
        | PluginShareDeleteRequest
        | AppListRequest
        | FsReadFileRequest
        | FsWriteFileRequest
        | FsCreateDirectoryRequest
        | FsGetMetadataRequest
        | FsReadDirectoryRequest
        | FsRemoveRequest
        | FsCopyRequest
        | FsWatchRequest
        | FsUnwatchRequest
        | SkillsConfigWriteRequest
        | PluginInstallRequest
        | PluginUninstallRequest
        | TurnStartRequest
        | TurnSteerRequest
        | TurnInterruptRequest
        | ReviewStartRequest
        | ModelListRequest
        | ModelProviderCapabilitiesReadRequest
        | ExperimentalFeatureListRequest
        | ExperimentalFeatureEnablementSetRequest
        | McpServerOauthLoginRequest
        | ConfigMcpServerReloadRequest
        | McpServerStatusListRequest
        | McpServerResourceReadRequest
        | McpServerToolCallRequest
        | WindowsSandboxSetupStartRequest
        | WindowsSandboxReadinessRequest
        | AccountLoginStartRequest
        | AccountLoginCancelRequest
        | AccountLogoutRequest
        | AccountRateLimitsReadRequest
        | AccountSendAddCreditsNudgeEmailRequest
        | FeedbackUploadRequest
        | CommandExecRequest
        | CommandExecWriteRequest
        | CommandExecTerminateRequest
        | CommandExecResizeRequest
        | ConfigReadRequest
        | ExternalAgentConfigDetectRequest
        | ExternalAgentConfigImportRequest
        | ConfigValueWriteRequest
        | ConfigBatchWriteRequest
        | ConfigRequirementsReadRequest
        | AccountReadRequest
        | FuzzyFileSearchRequest
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[
        InitializeRequest
        | ThreadStartRequest
        | ThreadResumeRequest
        | ThreadForkRequest
        | ThreadArchiveRequest
        | ThreadUnsubscribeRequest
        | ThreadNameSetRequest
        | ThreadMetadataUpdateRequest
        | ThreadUnarchiveRequest
        | ThreadCompactStartRequest
        | ThreadShellCommandRequest
        | ThreadApproveGuardianDeniedActionRequest
        | ThreadRollbackRequest
        | ThreadListRequest
        | ThreadLoadedListRequest
        | ThreadReadRequest
        | ThreadInjectItemsRequest
        | SkillsListRequest
        | HooksListRequest
        | MarketplaceAddRequest
        | MarketplaceRemoveRequest
        | MarketplaceUpgradeRequest
        | PluginListRequest
        | PluginReadRequest
        | PluginSkillReadRequest
        | PluginShareSaveRequest
        | PluginShareUpdateTargetsRequest
        | PluginShareListRequest
        | PluginShareDeleteRequest
        | AppListRequest
        | FsReadFileRequest
        | FsWriteFileRequest
        | FsCreateDirectoryRequest
        | FsGetMetadataRequest
        | FsReadDirectoryRequest
        | FsRemoveRequest
        | FsCopyRequest
        | FsWatchRequest
        | FsUnwatchRequest
        | SkillsConfigWriteRequest
        | PluginInstallRequest
        | PluginUninstallRequest
        | TurnStartRequest
        | TurnSteerRequest
        | TurnInterruptRequest
        | ReviewStartRequest
        | ModelListRequest
        | ModelProviderCapabilitiesReadRequest
        | ExperimentalFeatureListRequest
        | ExperimentalFeatureEnablementSetRequest
        | McpServerOauthLoginRequest
        | ConfigMcpServerReloadRequest
        | McpServerStatusListRequest
        | McpServerResourceReadRequest
        | McpServerToolCallRequest
        | WindowsSandboxSetupStartRequest
        | WindowsSandboxReadinessRequest
        | AccountLoginStartRequest
        | AccountLoginCancelRequest
        | AccountLogoutRequest
        | AccountRateLimitsReadRequest
        | AccountSendAddCreditsNudgeEmailRequest
        | FeedbackUploadRequest
        | CommandExecRequest
        | CommandExecWriteRequest
        | CommandExecTerminateRequest
        | CommandExecResizeRequest
        | ConfigReadRequest
        | ExternalAgentConfigDetectRequest
        | ExternalAgentConfigImportRequest
        | ConfigValueWriteRequest
        | ConfigBatchWriteRequest
        | ConfigRequirementsReadRequest
        | AccountReadRequest
        | FuzzyFileSearchRequest,
        Field(description="Request from the client to the server.", title="ClientRequest"),
    ]


class PluginListResponse(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    featured_plugin_ids: Annotated[list[str] | None, Field(alias="featuredPluginIds")] = []
    marketplace_load_errors: Annotated[
        list[MarketplaceLoadErrorInfo] | None, Field(alias="marketplaceLoadErrors")
    ] = []
    marketplaces: list[PluginMarketplaceEntry]


class ThreadStartedServerNotification(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    method: Annotated[Literal["thread/started"], Field(title="Thread/startedNotificationMethod")]
    params: ThreadStartedNotification


class ServerNotification(
    RootModel[
        ErrorServerNotification
        | ThreadStartedServerNotification
        | ThreadStatusChangedServerNotification
        | ThreadArchivedServerNotification
        | ThreadUnarchivedServerNotification
        | ThreadClosedServerNotification
        | SkillsChangedServerNotification
        | ThreadNameUpdatedServerNotification
        | ThreadGoalUpdatedServerNotification
        | ThreadGoalClearedServerNotification
        | ThreadTokenUsageUpdatedServerNotification
        | TurnStartedServerNotification
        | HookStartedServerNotification
        | TurnCompletedServerNotification
        | HookCompletedServerNotification
        | TurnDiffUpdatedServerNotification
        | TurnPlanUpdatedServerNotification
        | ItemStartedServerNotification
        | ItemAutoApprovalReviewStartedServerNotification
        | ItemAutoApprovalReviewCompletedServerNotification
        | ItemCompletedServerNotification
        | ItemAgentMessageDeltaServerNotification
        | ItemPlanDeltaServerNotification
        | CommandExecOutputDeltaServerNotification
        | ProcessOutputDeltaServerNotification
        | ProcessExitedServerNotification
        | ItemCommandExecutionOutputDeltaServerNotification
        | ItemCommandExecutionTerminalInteractionServerNotification
        | ItemFileChangeOutputDeltaServerNotification
        | ItemFileChangePatchUpdatedServerNotification
        | ServerRequestResolvedServerNotification
        | ItemMcpToolCallProgressServerNotification
        | McpServerOauthLoginCompletedServerNotification
        | McpServerStartupStatusUpdatedServerNotification
        | AccountUpdatedServerNotification
        | AccountRateLimitsUpdatedServerNotification
        | AppListUpdatedServerNotification
        | RemoteControlStatusChangedServerNotification
        | ExternalAgentConfigImportCompletedServerNotification
        | FsChangedServerNotification
        | ItemReasoningSummaryTextDeltaServerNotification
        | ItemReasoningSummaryPartAddedServerNotification
        | ItemReasoningTextDeltaServerNotification
        | ThreadCompactedServerNotification
        | ModelReroutedServerNotification
        | ModelVerificationServerNotification
        | WarningServerNotification
        | GuardianWarningServerNotification
        | DeprecationNoticeServerNotification
        | ConfigWarningServerNotification
        | FuzzyFileSearchSessionUpdatedServerNotification
        | FuzzyFileSearchSessionCompletedServerNotification
        | ThreadRealtimeStartedServerNotification
        | ThreadRealtimeItemAddedServerNotification
        | ThreadRealtimeTranscriptDeltaServerNotification
        | ThreadRealtimeTranscriptDoneServerNotification
        | ThreadRealtimeOutputAudioDeltaServerNotification
        | ThreadRealtimeSdpServerNotification
        | ThreadRealtimeErrorServerNotification
        | ThreadRealtimeClosedServerNotification
        | WindowsWorldWritableWarningServerNotification
        | WindowsSandboxSetupCompletedServerNotification
        | AccountLoginCompletedServerNotification
    ]
):
    model_config = ConfigDict(
        populate_by_name=True,
    )
    root: Annotated[
        ErrorServerNotification
        | ThreadStartedServerNotification
        | ThreadStatusChangedServerNotification
        | ThreadArchivedServerNotification
        | ThreadUnarchivedServerNotification
        | ThreadClosedServerNotification
        | SkillsChangedServerNotification
        | ThreadNameUpdatedServerNotification
        | ThreadGoalUpdatedServerNotification
        | ThreadGoalClearedServerNotification
        | ThreadTokenUsageUpdatedServerNotification
        | TurnStartedServerNotification
        | HookStartedServerNotification
        | TurnCompletedServerNotification
        | HookCompletedServerNotification
        | TurnDiffUpdatedServerNotification
        | TurnPlanUpdatedServerNotification
        | ItemStartedServerNotification
        | ItemAutoApprovalReviewStartedServerNotification
        | ItemAutoApprovalReviewCompletedServerNotification
        | ItemCompletedServerNotification
        | ItemAgentMessageDeltaServerNotification
        | ItemPlanDeltaServerNotification
        | CommandExecOutputDeltaServerNotification
        | ProcessOutputDeltaServerNotification
        | ProcessExitedServerNotification
        | ItemCommandExecutionOutputDeltaServerNotification
        | ItemCommandExecutionTerminalInteractionServerNotification
        | ItemFileChangeOutputDeltaServerNotification
        | ItemFileChangePatchUpdatedServerNotification
        | ServerRequestResolvedServerNotification
        | ItemMcpToolCallProgressServerNotification
        | McpServerOauthLoginCompletedServerNotification
        | McpServerStartupStatusUpdatedServerNotification
        | AccountUpdatedServerNotification
        | AccountRateLimitsUpdatedServerNotification
        | AppListUpdatedServerNotification
        | RemoteControlStatusChangedServerNotification
        | ExternalAgentConfigImportCompletedServerNotification
        | FsChangedServerNotification
        | ItemReasoningSummaryTextDeltaServerNotification
        | ItemReasoningSummaryPartAddedServerNotification
        | ItemReasoningTextDeltaServerNotification
        | ThreadCompactedServerNotification
        | ModelReroutedServerNotification
        | ModelVerificationServerNotification
        | WarningServerNotification
        | GuardianWarningServerNotification
        | DeprecationNoticeServerNotification
        | ConfigWarningServerNotification
        | FuzzyFileSearchSessionUpdatedServerNotification
        | FuzzyFileSearchSessionCompletedServerNotification
        | ThreadRealtimeStartedServerNotification
        | ThreadRealtimeItemAddedServerNotification
        | ThreadRealtimeTranscriptDeltaServerNotification
        | ThreadRealtimeTranscriptDoneServerNotification
        | ThreadRealtimeOutputAudioDeltaServerNotification
        | ThreadRealtimeSdpServerNotification
        | ThreadRealtimeErrorServerNotification
        | ThreadRealtimeClosedServerNotification
        | WindowsWorldWritableWarningServerNotification
        | WindowsSandboxSetupCompletedServerNotification
        | AccountLoginCompletedServerNotification,
        Field(
            description="Notification sent from the server to the client.",
            title="ServerNotification",
        ),
    ]
