diff --git a/.github/workflows/python-sdk-release.yml b/.github/workflows/python-sdk-release.yml index e67927b5ac..16834a62fc 100644 --- a/.github/workflows/python-sdk-release.yml +++ b/.github/workflows/python-sdk-release.yml @@ -38,10 +38,10 @@ jobs: from pathlib import Path sdk_version = os.environ["GITHUB_REF_NAME"].removeprefix("python-v") - if not re.fullmatch(r"[0-9]+\.[0-9]+\.[0-9]+b[0-9]+", sdk_version): + if not re.fullmatch(r"[0-9]+\.[0-9]+\.[0-9]+(?:b[0-9]+)?", sdk_version): raise SystemExit( - "Python SDK release tags must identify a beta release, " - "for example python-v0.1.0b1." + "Python SDK release tags must identify a stable or beta release, " + "for example python-v0.147.0 or python-v0.1.0b1." ) pyproject = tomllib.loads(Path("sdk/python/pyproject.toml").read_text()) @@ -56,6 +56,11 @@ jobs: f"Expected exactly one pinned {prefix} dependency, found {runtime_versions}" ) + if "b" not in sdk_version and sdk_version != runtime_versions[0]: + raise SystemExit( + f"Stable SDK version {sdk_version} must match pinned runtime {runtime_versions[0]}." + ) + with Path(os.environ["GITHUB_OUTPUT"]).open("a") as output: print(f"runtime_version={runtime_versions[0]}", file=output) print(f"sdk_version={sdk_version}", file=output) diff --git a/sdk/python/pyproject.toml b/sdk/python/pyproject.toml index a6ff55ee74..88bf8bac48 100644 --- a/sdk/python/pyproject.toml +++ b/sdk/python/pyproject.toml @@ -16,7 +16,7 @@ classifiers = [ "Intended Audience :: Developers", "Topic :: Software Development :: Libraries :: Python Modules", ] -dependencies = ["pydantic>=2.12", "openai-codex-cli-bin==0.144.4"] +dependencies = ["pydantic>=2.12", "openai-codex-cli-bin==0.147.0"] [project.urls] Homepage = "https://github.com/openai/codex" @@ -65,10 +65,10 @@ combine-as-imports = true [tool.uv] exclude-newer = "7 days" -exclude-newer-package = { openai-codex-cli-bin = "2026-07-15T01:00:00Z" } +exclude-newer-package = { openai-codex-cli-bin = "2026-08-19T00:00:00Z" } index-strategy = "first-index" [tool.uv.pip] exclude-newer = "7 days" -exclude-newer-package = { openai-codex-cli-bin = "2026-07-15T01:00:00Z" } +exclude-newer-package = { openai-codex-cli-bin = "2026-08-19T00:00:00Z" } index-strategy = "first-index" diff --git a/sdk/python/src/openai_codex/api.py b/sdk/python/src/openai_codex/api.py index 6fc9a8243d..00a3d364fa 100644 --- a/sdk/python/src/openai_codex/api.py +++ b/sdk/python/src/openai_codex/api.py @@ -178,6 +178,7 @@ class Codex: limit: int | None = None, model_providers: list[str] | None = None, search_term: str | None = None, + section_id: str | None = None, sort_direction: SortDirection | None = None, sort_key: ThreadSortKey | None = None, source_kinds: list[ThreadSourceKind] | None = None, @@ -191,6 +192,7 @@ class Codex: limit=limit, model_providers=model_providers, search_term=search_term, + section_id=section_id, sort_direction=sort_direction, sort_key=sort_key, source_kinds=source_kinds, @@ -419,6 +421,7 @@ class AsyncCodex: limit: int | None = None, model_providers: list[str] | None = None, search_term: str | None = None, + section_id: str | None = None, sort_direction: SortDirection | None = None, sort_key: ThreadSortKey | None = None, source_kinds: list[ThreadSourceKind] | None = None, @@ -433,6 +436,7 @@ class AsyncCodex: limit=limit, model_providers=model_providers, search_term=search_term, + section_id=section_id, sort_direction=sort_direction, sort_key=sort_key, source_kinds=source_kinds, diff --git a/sdk/python/src/openai_codex/generated/notification_registry.py b/sdk/python/src/openai_codex/generated/notification_registry.py index 25b47b7724..037be5d199 100644 --- a/sdk/python/src/openai_codex/generated/notification_registry.py +++ b/sdk/python/src/openai_codex/generated/notification_registry.py @@ -15,6 +15,7 @@ from .v2_all import CommandExecutionOutputDeltaNotification from .v2_all import ConfigWarningNotification from .v2_all import ContextCompactedNotification from .v2_all import DeprecationNoticeNotification +from .v2_all import EnvironmentConnectionNotification from .v2_all import ErrorNotification from .v2_all import ExternalAgentConfigImportCompletedNotification from .v2_all import ExternalAgentConfigImportProgressNotification @@ -119,6 +120,8 @@ NOTIFICATION_MODELS: dict[str, type[BaseModel]] = { "thread/closed": ThreadClosedNotification, "thread/compacted": ContextCompactedNotification, "thread/deleted": ThreadDeletedNotification, + "thread/environment/connected": EnvironmentConnectionNotification, + "thread/environment/disconnected": EnvironmentConnectionNotification, "thread/goal/cleared": ThreadGoalClearedNotification, "thread/goal/updated": ThreadGoalUpdatedNotification, "thread/name/updated": ThreadNameUpdatedNotification, diff --git a/sdk/python/src/openai_codex/generated/v2_all.py b/sdk/python/src/openai_codex/generated/v2_all.py index 43f32cad08..46ea852562 100644 --- a/sdk/python/src/openai_codex/generated/v2_all.py +++ b/sdk/python/src/openai_codex/generated/v2_all.py @@ -33,13 +33,14 @@ class ApiKeyAccount(BaseModel): type: Annotated[Literal["apiKey"], Field(title="ApiKeyAccountType")] -class AccountLoginCompletedNotification(BaseModel): +class AmazonBedrockAccount(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - error: str | None = None - login_id: Annotated[str | None, Field(alias="loginId")] = None - success: bool + type: Annotated[Literal["amazonBedrock"], Field(title="AmazonBedrockAccountType")] + uses_codex_managed_credentials: Annotated[ + bool | None, Field(alias="usesCodexManagedCredentials") + ] = False class AccountTokenUsageDailyBucket(BaseModel): @@ -145,11 +146,6 @@ class AgentPath(RootModel[str]): root: str -class AmazonBedrockCredentialSource(Enum): - codex_managed = "codexManaged" - aws_managed = "awsManaged" - - class AnalyticsConfig(BaseModel): model_config = ConfigDict( extra="allow", @@ -217,6 +213,18 @@ class AppToolConfig(BaseModel): enabled: bool | None = None +class AppToolSummary(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + description: str + disabled_reason: Annotated[str | None, Field(alias="disabledReason")] = None + is_enabled: Annotated[bool | None, Field(alias="isEnabled")] = True + is_read_only: Annotated[bool | None, Field(alias="isReadOnly")] = False + name: str + title: str | None = None + + class AppToolsConfig(BaseModel): pass model_config = ConfigDict( @@ -241,6 +249,26 @@ class AppsDefaultConfig(BaseModel): open_world_enabled: bool | None = True +class AppsInstalledParams(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + force_refresh: Annotated[ + bool | None, + Field( + alias="forceRefresh", + description="When true and Apps are permitted, refresh and publish the hosted connector runtime tool snapshot first.", + ), + ] = None + thread_id: Annotated[ + str | None, + Field( + alias="threadId", + description="Optional loaded thread id used to evaluate effective app configuration.", + ), + ] = None + + class AppsListParams(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -268,6 +296,26 @@ class AppsListParams(BaseModel): ] = None +class AppsReadParams(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + app_ids: Annotated[ + list[str], + Field( + alias="appIds", + description="App ids to read. The server accepts at most 100 ids and deduplicates repeated ids while preserving their first-request order.", + ), + ] + include_tools: Annotated[ + bool | None, + Field( + alias="includeTools", + description="When true, include display-only public tool summaries in the returned metadata.", + ), + ] = None + + class AskForApprovalValue(Enum): untrusted = "untrusted" on_request = "on-request" @@ -327,6 +375,13 @@ class AutoReviewDecisionSource(RootModel[Literal["agent"]]): ] +class BrowserUseRequirements(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + disable_auto_review: Annotated[bool | None, Field(alias="disableAutoReview")] = None + + class ByteRange(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -457,6 +512,12 @@ class ResponseTooManyFailedAttemptsCodexErrorInfo(BaseModel): ] +class CodexResponseHandoffMode(Enum): + thinking = "thinking" + commentary = "commentary" + bem_tags = "bemTags" + + class CollabAgentStatus(Enum): pending_init = "pendingInit" running = "running" @@ -481,16 +542,6 @@ class CollabAgentToolCallStatus(Enum): 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, @@ -518,17 +569,6 @@ class UnknownCommandAction(BaseModel): 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" @@ -793,6 +833,14 @@ class CommandConfiguredHookHandler(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + additional_context_limit: Annotated[ + int | None, + Field( + alias="additionalContextLimit", + description="Approximate token threshold for spilling this hook's `additionalContext` to disk. `null` uses 2,500 tokens; `0` disables spilling for this hook. The threshold is evaluated against the original context; a spilled preview also includes recovery metadata.", + ge=0, + ), + ] = None async_: Annotated[bool, Field(alias="async")] command: str command_windows: Annotated[str | None, Field(alias="commandWindows")] = None @@ -834,6 +882,21 @@ class ConfiguredHookMatcherGroup(BaseModel): matcher: str | None = None +class ConnectorMetadata(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + description: str | None = None + distribution_channel: Annotated[str | None, Field(alias="distributionChannel")] = None + icon_url: Annotated[str | None, Field(alias="iconUrl")] = None + icon_url_dark: Annotated[str | None, Field(alias="iconUrlDark")] = None + id: str + install_url: Annotated[str | None, Field(alias="installUrl")] = None + name: str + plugin_display_names: Annotated[list[str] | None, Field(alias="pluginDisplayNames")] = [] + tool_summaries: Annotated[list[AppToolSummary] | None, Field(alias="toolSummaries")] = None + + class ConsumeAccountRateLimitResetCreditOutcome(Enum): reset = "reset" nothing_to_reset = "nothingToReset" @@ -876,6 +939,14 @@ class InputTextContentItem(BaseModel): type: Annotated[Literal["input_text"], Field(title="InputTextContentItemType")] +class InputAudioContentItem(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + audio_url: str + type: Annotated[Literal["input_audio"], Field(title="InputAudioContentItemType")] + + class OutputTextContentItem(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -918,6 +989,13 @@ class DeprecationNoticeNotification(BaseModel): summary: Annotated[str, Field(description="Concise summary of what is deprecated.")] +class DesktopOnboardingEntrypoint(RootModel[Literal["life_sciences"]]): + model_config = ConfigDict( + populate_by_name=True, + ) + root: Literal["life_sciences"] + + class InputTextDynamicToolCallOutputContentItem(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -938,15 +1016,31 @@ class InputImageDynamicToolCallOutputContentItem(BaseModel): ] +class InputAudioDynamicToolCallOutputContentItem(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + audio_url: Annotated[str, Field(alias="audioUrl")] + type: Annotated[ + Literal["inputAudio"], Field(title="InputAudioDynamicToolCallOutputContentItemType") + ] + + class DynamicToolCallOutputContentItem( RootModel[ - InputTextDynamicToolCallOutputContentItem | InputImageDynamicToolCallOutputContentItem + InputTextDynamicToolCallOutputContentItem + | InputImageDynamicToolCallOutputContentItem + | InputAudioDynamicToolCallOutputContentItem ] ): model_config = ConfigDict( populate_by_name=True, ) - root: InputTextDynamicToolCallOutputContentItem | InputImageDynamicToolCallOutputContentItem + root: ( + InputTextDynamicToolCallOutputContentItem + | InputImageDynamicToolCallOutputContentItem + | InputAudioDynamicToolCallOutputContentItem + ) class DynamicToolCallStatus(Enum): @@ -1001,6 +1095,14 @@ class DynamicToolSpec(RootModel[FunctionDynamicToolSpec | NamespaceDynamicToolSp root: FunctionDynamicToolSpec | NamespaceDynamicToolSpec +class EnvironmentConnectionNotification(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + environment_id: Annotated[str, Field(alias="environmentId")] + thread_id: Annotated[str, Field(alias="threadId")] + + class ExperimentalFeatureEnablementSetParams(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -1065,6 +1167,42 @@ class ExternalAgentConfigDetectParams(BaseModel): description="If true, include detection under the user's home directory.", ), ] = None + max_session_age_days: Annotated[ + int | None, + Field( + alias="maxSessionAgeDays", + description="Maximum age in days for detected sessions. Missing values use the default limit.", + ge=0, + ), + ] = None + max_sessions: Annotated[ + int | None, + Field( + alias="maxSessions", + description="Maximum number of sessions to detect. Missing values use the default limit.", + ge=0, + ), + ] = None + migration_source: Annotated[ + str | None, + Field( + alias="migrationSource", + description="Optional migration-source selector. Missing or unrecognized values use the default source.", + ), + ] = None + source: Annotated[ + str | None, + Field( + description="Deprecated field retained for compatibility. This field is ignored; use `migrationSource` to select the migration source." + ), + ] = None + + +class ExternalAgentConfigImportHistoryRecordResponse(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + import_id: Annotated[str, Field(alias="importId")] class ExternalAgentConfigImportResponse(BaseModel): @@ -1083,9 +1221,29 @@ class ExternalAgentConfigMigrationItemType(Enum): subagents = "SUBAGENTS" hooks = "HOOKS" commands = "COMMANDS" + memory = "MEMORY" sessions = "SESSIONS" +class ExternalAgentDetectedConnectorSource(Enum): + remote_mcp_servers_config = "remoteMcpServersConfig" + session_tool_use = "sessionToolUse" + + +class ExternalAgentImportedConnectorSource(RootModel[Literal["remoteMcpServersConfig"]]): + model_config = ConfigDict( + populate_by_name=True, + ) + root: Literal["remoteMcpServersConfig"] + + +class FeedbackRequirements(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + enabled: bool | None = None + + class FeedbackUploadParams(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -1143,14 +1301,6 @@ class MinimalFileSystemSpecialPath(BaseModel): 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, @@ -1165,38 +1315,6 @@ class SlashTmpFileSystemSpecialPath(BaseModel): 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 ForcedChatgptWorkspaceIds(RootModel[str | list[str]]): model_config = ConfigDict( populate_by_name=True, @@ -1447,6 +1565,16 @@ class InputTextFunctionCallOutputContentItem(BaseModel): ] +class InputAudioFunctionCallOutputContentItem(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + audio_url: str + type: Annotated[ + Literal["input_audio"], Field(title="InputAudioFunctionCallOutputContentItemType") + ] + + class EncryptedContentFunctionCallOutputContentItem(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -1616,6 +1744,7 @@ class HookEventName(Enum): pre_compact = "preCompact" post_compact = "postCompact" session_start = "sessionStart" + session_end = "sessionEnd" user_prompt_submit = "userPromptSubmit" subagent_start = "subagentStart" subagent_stop = "subagentStop" @@ -1718,11 +1847,15 @@ class InitializeCapabilities(BaseModel): description="Opt into receiving experimental API methods and fields.", ), ] = False + extensions: Annotated[ + dict[str, Any] | None, + Field(description="MCP extension settings declared by the app-server client."), + ] = None mcp_server_openai_form_elicitation: Annotated[ bool | None, Field( alias="mcpServerOpenaiFormElicitation", - description="Allow downstream MCP servers to request OpenAI extended form elicitations.", + description="Legacy opt-in for the `openai/form` MCP extension.\n\nNew clients should declare `openai/form` in [`Self::extensions`].", ), ] = None opt_out_notification_methods: Annotated[ @@ -1752,6 +1885,33 @@ class InitializeParams(BaseModel): class InputModality(Enum): text = "text" image = "image" + audio = "audio" + + +class InstalledApp(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + callable: Annotated[ + bool, + Field( + description="Whether the connector is enabled and has a non-synthetic, model-visible tool allowed by effective MCP and app/tool policy in the committed runtime snapshot." + ), + ] + enabled: Annotated[ + bool, + Field( + description="Effective enabled state after applying global, workspace, local, and managed configuration at read time." + ), + ] + id: str + runtime_name: Annotated[ + str | None, + Field( + alias="runtimeName", + description="Best-effort name carried by the runtime tool catalog. Canonical app metadata remains owned by `app/read`.", + ), + ] = None class InternalChatMessageMetadataPassthrough(BaseModel): @@ -1840,6 +2000,17 @@ class ChatgptAuthTokensLoginAccountParams(BaseModel): ] +class AmazonBedrockLoginAccountParams(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + api_key: Annotated[str, Field(alias="apiKey")] + region: str + type: Annotated[ + Literal["amazonBedrock"], Field(title="AmazonBedrockv2::LoginAccountParamsType") + ] + + class ApiKeyLoginAccountResponse(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -1892,12 +2063,22 @@ class ChatgptAuthTokensLoginAccountResponse(BaseModel): ] +class AmazonBedrockLoginAccountResponse(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + type: Annotated[ + Literal["amazonBedrock"], Field(title="AmazonBedrockv2::LoginAccountResponseType") + ] + + class LoginAccountResponse( RootModel[ ApiKeyLoginAccountResponse | ChatgptLoginAccountResponse | ChatgptDeviceCodeLoginAccountResponse | ChatgptAuthTokensLoginAccountResponse + | AmazonBedrockLoginAccountResponse ] ): model_config = ConfigDict( @@ -1907,7 +2088,8 @@ class LoginAccountResponse( ApiKeyLoginAccountResponse | ChatgptLoginAccountResponse | ChatgptDeviceCodeLoginAccountResponse - | ChatgptAuthTokensLoginAccountResponse, + | ChatgptAuthTokensLoginAccountResponse + | AmazonBedrockLoginAccountResponse, Field(title="LoginAccountResponse"), ] @@ -1935,6 +2117,7 @@ class ManagedHooksRequirements(BaseModel): 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_end: Annotated[list[ConfiguredHookMatcherGroup] | None, Field(alias="SessionEnd")] = [] session_start: Annotated[list[ConfiguredHookMatcherGroup], Field(alias="SessionStart")] stop: Annotated[list[ConfiguredHookMatcherGroup], Field(alias="Stop")] subagent_start: Annotated[list[ConfiguredHookMatcherGroup], Field(alias="SubagentStart")] @@ -2017,6 +2200,7 @@ class MarketplaceUpgradeResponse(BaseModel): class McpAuthStatus(Enum): + unknown = "unknown" unsupported = "unsupported" not_logged_in = "notLoggedIn" bearer_token = "bearerToken" @@ -2147,7 +2331,6 @@ class McpToolCallAppContext(BaseModel): connector_id: Annotated[str, Field(alias="connectorId")] link_id: Annotated[str | None, Field(alias="linkId")] = None resource_uri: Annotated[str | None, Field(alias="resourceUri")] = None - template_id: Annotated[str | None, Field(alias="templateId")] = None class McpToolCallError(BaseModel): @@ -2460,6 +2643,13 @@ class PatchChangeKind( root: AddPatchChangeKind | DeletePatchChangeKind | UpdatePatchChangeKind +class PathUri(RootModel[str]): + model_config = ConfigDict( + populate_by_name=True, + ) + root: str + + class PermissionProfileListParams(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -2512,8 +2702,11 @@ class PlanType(str, Enum): pro = "pro" prolite = "prolite" team = "team" + self_serve_business_prolite = "self_serve_business_prolite" self_serve_business_usage_based = "self_serve_business_usage_based" business = "business" + ent26 = "ent26" + enterprise_cbp_automation = "enterprise_cbp_automation" enterprise_cbp_usage_based = "enterprise_cbp_usage_based" enterprise = "enterprise" edu = "edu" @@ -2539,6 +2732,13 @@ class PluginAvailability(Enum): available = "AVAILABLE" +class PluginDisabledReason(Enum): + disabled_by_admin = "disabled_by_admin" + plan_not_eligible = "plan_not_eligible" + required_app_unavailable = "required_app_unavailable" + unknown = "unknown" + + class PluginHookSummary(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -2676,6 +2876,13 @@ class PluginListParams(BaseModel): description="Optional working directories used to discover repo marketplaces. When omitted, only home-scoped marketplaces and the official curated marketplace are considered." ), ] = None + force_refetch: Annotated[ + bool | None, + Field( + alias="forceRefetch", + description="Whether the client requests a fresh remote plugin catalog fetch.", + ), + ] = None marketplace_kinds: Annotated[ list[PluginListMarketplaceKind] | None, Field( @@ -2694,6 +2901,12 @@ class PluginReadParams(BaseModel): remote_marketplace_name: Annotated[str | None, Field(alias="remoteMarketplaceName")] = None +class PluginSearchScope(Enum): + global_ = "global" + workspace = "workspace" + personal = "personal" + + class PluginShareCheckoutParams(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -2757,6 +2970,7 @@ class PluginShareSaveResponse(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + can_publish_to_workspace: Annotated[bool | None, Field(alias="canPublishToWorkspace")] = None remote_plugin_id: Annotated[str, Field(alias="remotePluginId")] share_url: Annotated[str, Field(alias="shareUrl")] @@ -2769,6 +2983,7 @@ class PluginShareTargetRole(Enum): class PluginShareUpdateDiscoverability(Enum): unlisted = "UNLISTED" private = "PRIVATE" + listed = "LISTED" class PluginSkillReadParams(BaseModel): @@ -2946,6 +3161,7 @@ class RateLimitWindow(BaseModel): class RealtimeConversationVersion(Enum): v1 = "v1" v2 = "v2" + v3 = "v3" class RealtimeOutputModality(Enum): @@ -3248,6 +3464,7 @@ class FunctionCallResponseItem(BaseModel): ) arguments: str call_id: str + encrypted_function_args: list[str] | None = None id: str | None = None internal_chat_message_metadata_passthrough: InternalChatMessageMetadataPassthrough | None = None name: str @@ -3527,6 +3744,32 @@ class SandboxWorkspaceWrite(BaseModel): writable_roots: list[str] | None = [] +class DailyScheduledTaskSchedule(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + time: str + type: Annotated[Literal["daily"], Field(title="DailyScheduledTaskScheduleType")] + + +class WeekdaysScheduledTaskSchedule(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + time: str + type: Annotated[Literal["weekdays"], Field(title="WeekdaysScheduledTaskScheduleType")] + + +class ScheduledTaskWeekday(Enum): + mo = "MO" + tu = "TU" + we = "WE" + th = "TH" + fr = "FR" + sa = "SA" + su = "SU" + + class SelectedCapabilityRoot(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -3553,10 +3796,53 @@ class SendAddCreditsNudgeEmailResponse(BaseModel): status: AddCreditsNudgeEmailStatus +class ThreadEnvironmentConnectedServerNotification(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None + method: Annotated[ + Literal["thread/environment/connected"], + Field(title="Thread/environment/connectedNotificationMethod"), + ] + params: EnvironmentConnectionNotification + + +class ThreadEnvironmentDisconnectedServerNotification(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None + method: Annotated[ + Literal["thread/environment/disconnected"], + Field(title="Thread/environment/disconnectedNotificationMethod"), + ] + params: EnvironmentConnectionNotification + + class ItemAgentMessageDeltaServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["item/agentMessage/delta"], Field(title="Item/agentMessage/deltaNotificationMethod") ] @@ -3567,6 +3853,13 @@ class ItemPlanDeltaServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["item/plan/delta"], Field(title="Item/plan/deltaNotificationMethod")] params: PlanDeltaNotification @@ -3575,6 +3868,13 @@ class ProcessExitedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["process/exited"], Field(title="Process/exitedNotificationMethod")] params: ProcessExitedNotification @@ -3583,6 +3883,13 @@ class ItemCommandExecutionOutputDeltaServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["item/commandExecution/outputDelta"], Field(title="Item/commandExecution/outputDeltaNotificationMethod"), @@ -3594,6 +3901,13 @@ class ItemFileChangeOutputDeltaServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["item/fileChange/outputDelta"], Field(title="Item/fileChange/outputDeltaNotificationMethod"), @@ -3605,6 +3919,13 @@ class ItemMcpToolCallProgressServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["item/mcpToolCall/progress"], Field(title="Item/mcpToolCall/progressNotificationMethod"), @@ -3616,6 +3937,13 @@ class McpServerOauthLoginCompletedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["mcpServer/oauthLogin/completed"], Field(title="McpServer/oauthLogin/completedNotificationMethod"), @@ -3627,6 +3955,13 @@ class McpServerStartupStatusUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["mcpServer/startupStatus/updated"], Field(title="McpServer/startupStatus/updatedNotificationMethod"), @@ -3638,6 +3973,13 @@ class RemoteControlStatusChangedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["remoteControl/status/changed"], Field(title="RemoteControl/status/changedNotificationMethod"), @@ -3649,6 +3991,13 @@ class FsChangedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["fs/changed"], Field(title="Fs/changedNotificationMethod")] params: FsChangedNotification @@ -3657,6 +4006,13 @@ class ItemReasoningSummaryTextDeltaServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["item/reasoning/summaryTextDelta"], Field(title="Item/reasoning/summaryTextDeltaNotificationMethod"), @@ -3668,6 +4024,13 @@ class ItemReasoningSummaryPartAddedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["item/reasoning/summaryPartAdded"], Field(title="Item/reasoning/summaryPartAddedNotificationMethod"), @@ -3679,6 +4042,13 @@ class ItemReasoningTextDeltaServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["item/reasoning/textDelta"], Field(title="Item/reasoning/textDeltaNotificationMethod"), @@ -3690,6 +4060,13 @@ class ThreadCompactedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/compacted"], Field(title="Thread/compactedNotificationMethod") ] @@ -3700,6 +4077,13 @@ class ModelReroutedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["model/rerouted"], Field(title="Model/reroutedNotificationMethod")] params: ModelReroutedNotification @@ -3708,6 +4092,13 @@ class ModelVerificationServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["model/verification"], Field(title="Model/verificationNotificationMethod") ] @@ -3718,6 +4109,13 @@ class ModelSafetyBufferingUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["model/safetyBuffering/updated"], Field(title="Model/safetyBuffering/updatedNotificationMethod"), @@ -3729,6 +4127,13 @@ class GuardianWarningServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["guardianWarning"], Field(title="GuardianWarningNotificationMethod")] params: GuardianWarningNotification @@ -3737,6 +4142,13 @@ class DeprecationNoticeServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["deprecationNotice"], Field(title="DeprecationNoticeNotificationMethod") ] @@ -3747,6 +4159,13 @@ class FuzzyFileSearchSessionUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["fuzzyFileSearch/sessionUpdated"], Field(title="FuzzyFileSearch/sessionUpdatedNotificationMethod"), @@ -3758,6 +4177,13 @@ class FuzzyFileSearchSessionCompletedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["fuzzyFileSearch/sessionCompleted"], Field(title="FuzzyFileSearch/sessionCompletedNotificationMethod"), @@ -3765,16 +4191,6 @@ class FuzzyFileSearchSessionCompletedServerNotification(BaseModel): 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, @@ -3833,7 +4249,15 @@ class SkillInterface(BaseModel): 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_large_url: Annotated[ + str | None, + Field(alias="iconLargeUrl", description="Remote large icon URL from the plugin catalog."), + ] = None icon_small: Annotated[AbsolutePathBuf | None, Field(alias="iconSmall")] = None + icon_small_url: Annotated[ + str | None, + Field(alias="iconSmallUrl", description="Remote small icon URL from the plugin catalog."), + ] = None short_description: Annotated[str | None, Field(alias="shortDescription")] = None @@ -4208,48 +4632,6 @@ class ReasoningThreadItem(BaseModel): 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[LegacyAppPathString, 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, @@ -4270,6 +4652,7 @@ class McpToolCallThreadItem(BaseModel): ), ] = None plugin_id: Annotated[str | None, Field(alias="pluginId")] = None + read_only_hint: Annotated[bool | None, Field(alias="readOnlyHint")] = None result: McpToolCallResult | None = None server: str status: McpToolCallStatus @@ -4337,6 +4720,7 @@ class ImageGenerationThreadItem(BaseModel): revised_prompt: Annotated[str | None, Field(alias="revisedPrompt")] = None saved_path: Annotated[AbsolutePathBuf | None, Field(alias="savedPath")] = None status: str + transparent_background: Annotated[bool | None, Field(alias="transparentBackground")] = None type: Annotated[Literal["imageGeneration"], Field(title="ImageGenerationThreadItemType")] @@ -4494,6 +4878,14 @@ class ThreadRealtimeErrorNotification(BaseModel): thread_id: Annotated[str, Field(alias="threadId")] +class ThreadRealtimeInitialItem(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + role: ConversationTextRole + text: str + + class ThreadRealtimeItemAddedNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -4618,6 +5010,137 @@ class ThreadRollbackParams(BaseModel): thread_id: Annotated[str, Field(alias="threadId")] +class ThreadSearchSortKey(Enum): + created_at = "created_at" + updated_at = "updated_at" + recency_at = "recency_at" + + +class ThreadSection(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + id: Annotated[ + str, + Field( + description="Opaque UUIDv7 identity that remains stable when the section is renamed." + ), + ] + name: Annotated[str, Field(description="The current user-visible section name.")] + + +class ThreadSectionCreateParams(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + name: Annotated[str, Field(description="The user-visible name of the section.")] + + +class ThreadSectionCreateResponse(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + section: ThreadSection + + +class ThreadSectionDeleteParams(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + section_id: Annotated[ + str, + Field( + alias="sectionId", + description="The stable, server-generated identity of the section to delete.", + ), + ] + + +class ThreadSectionDeleteResponse(BaseModel): + pass + model_config = ConfigDict( + populate_by_name=True, + ) + + +class ThreadSectionListParams(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="Maximum number of sections to return.", ge=0) + ] = None + + +class ThreadSectionListResponse(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + data: list[ThreadSection] + next_cursor: Annotated[ + str | None, + Field( + alias="nextCursor", + description="Opaque cursor for the next page, or `null` when no sections remain.", + ), + ] = None + + +class ThreadSectionMoveParams(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + before_thread_id: Annotated[ + str | None, + Field( + alias="beforeThreadId", + description="Existing thread to insert before; omission or null appends to the section.", + ), + ] = None + section_id: Annotated[ + str | None, + Field( + alias="sectionId", + description="Destination section, or `null` to remove the thread from its section.", + ), + ] = None + thread_id: Annotated[ + str, + Field(alias="threadId", description="Thread to move into, within, or out of a section."), + ] + + +class ThreadSectionMoveResponse(BaseModel): + pass + model_config = ConfigDict( + populate_by_name=True, + ) + + +class ThreadSectionUpdateParams(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + name: Annotated[str, Field(description="The updated user-visible name of the section.")] + section_id: Annotated[ + str, + Field( + alias="sectionId", + description="The stable, server-generated identity of the section to update.", + ), + ] + + +class ThreadSectionUpdateResponse(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + section: ThreadSection + + class ThreadSetNameParams(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -4657,6 +5180,7 @@ class ThreadSortKey(Enum): created_at = "created_at" updated_at = "updated_at" recency_at = "recency_at" + section_position = "section_position" class ThreadSource(str, Enum): @@ -4771,6 +5295,7 @@ class TokenUsageBreakdown(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + cache_write_input_tokens: Annotated[int | None, Field(alias="cacheWriteInputTokens")] = 0 cached_input_tokens: Annotated[int, Field(alias="cachedInputTokens")] input_tokens: Annotated[int, Field(alias="inputTokens")] output_tokens: Annotated[int, Field(alias="outputTokens")] @@ -4807,6 +5332,13 @@ class TurnEnvironmentParams(BaseModel): ) cwd: LegacyAppPathString environment_id: Annotated[str, Field(alias="environmentId")] + runtime_workspace_roots: Annotated[ + list[LegacyAppPathString] | None, + Field( + alias="runtimeWorkspaceRoots", + description="Environment-native runtime workspace roots. Omitted defaults to `cwd`.", + ), + ] = None class TurnInterruptParams(BaseModel): @@ -4891,6 +5423,22 @@ class LocalImageUserInput(BaseModel): type: Annotated[Literal["localImage"], Field(title="LocalImageUserInputType")] +class AudioUserInput(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + type: Annotated[Literal["audio"], Field(title="AudioUserInputType")] + url: str + + +class LocalAudioUserInput(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + path: str + type: Annotated[Literal["localAudio"], Field(title="LocalAudioUserInputType")] + + class SkillUserInput(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -4911,13 +5459,27 @@ class MentionUserInput(BaseModel): class UserInput( RootModel[ - TextUserInput | ImageUserInput | LocalImageUserInput | SkillUserInput | MentionUserInput + TextUserInput + | ImageUserInput + | LocalImageUserInput + | AudioUserInput + | LocalAudioUserInput + | SkillUserInput + | MentionUserInput ] ): model_config = ConfigDict( populate_by_name=True, ) - root: TextUserInput | ImageUserInput | LocalImageUserInput | SkillUserInput | MentionUserInput + root: ( + TextUserInput + | ImageUserInput + | LocalImageUserInput + | AudioUserInput + | LocalAudioUserInput + | SkillUserInput + | MentionUserInput + ) class Verbosity(Enum): @@ -5088,16 +5650,6 @@ class ChatgptAccount(BaseModel): type: Annotated[Literal["chatgpt"], Field(title="ChatgptAccountType")] -class AmazonBedrockAccount(BaseModel): - model_config = ConfigDict( - populate_by_name=True, - ) - credential_source: Annotated[ - AmazonBedrockCredentialSource | None, Field(alias="credentialSource") - ] = "awsManaged" - type: Annotated[Literal["amazonBedrock"], Field(title="AmazonBedrockAccountType")] - - class Account(RootModel[ApiKeyAccount | ChatgptAccount | AmazonBedrockAccount]): model_config = ConfigDict( populate_by_name=True, @@ -5105,6 +5657,18 @@ class Account(RootModel[ApiKeyAccount | ChatgptAccount | AmazonBedrockAccount]): root: ApiKeyAccount | ChatgptAccount | AmazonBedrockAccount +class AccountLoginCompletedNotification(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + error: str | None = None + login_id: Annotated[str | None, Field(alias="loginId")] = None + onboarding_entrypoint: Annotated[ + DesktopOnboardingEntrypoint | None, Field(alias="onboardingEntrypoint") + ] = None + success: bool + + class AccountUpdatedNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -5143,7 +5707,6 @@ class AppMetadata(BaseModel): 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 @@ -5178,6 +5741,21 @@ class AppsConfig(BaseModel): field_default: Annotated[AppsDefaultConfig | None, Field(alias="_default")] = None +class AppsInstalledResponse(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + apps: list[InstalledApp] + + +class AppsReadResponse(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + apps: list[ConnectorMetadata] + missing_app_ids: Annotated[list[str], Field(alias="missingAppIds")] + + class CancelLoginAccountResponse(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -5268,6 +5846,17 @@ class ThreadMetadataUpdateRequest(BaseModel): params: ThreadMetadataUpdateParams +class ThreadSectionMoveRequest(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + id: RequestId + method: Annotated[ + Literal["thread/section/move"], Field(title="Thread/section/moveRequestMethod") + ] + params: ThreadSectionMoveParams + + class ThreadUnarchiveRequest(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -5320,6 +5909,48 @@ class ThreadRollbackRequest(BaseModel): params: ThreadRollbackParams +class ThreadSectionListRequest(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + id: RequestId + method: Annotated[Literal["threadSection/list"], Field(title="ThreadSection/listRequestMethod")] + params: ThreadSectionListParams + + +class ThreadSectionCreateRequest(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + id: RequestId + method: Annotated[ + Literal["threadSection/create"], Field(title="ThreadSection/createRequestMethod") + ] + params: ThreadSectionCreateParams + + +class ThreadSectionUpdateRequest(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + id: RequestId + method: Annotated[ + Literal["threadSection/update"], Field(title="ThreadSection/updateRequestMethod") + ] + params: ThreadSectionUpdateParams + + +class ThreadSectionDeleteRequest(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + id: RequestId + method: Annotated[ + Literal["threadSection/delete"], Field(title="ThreadSection/deleteRequestMethod") + ] + params: ThreadSectionDeleteParams + + class ThreadLoadedListRequest(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -5474,6 +6105,15 @@ class PluginShareDeleteRequest(BaseModel): params: PluginShareDeleteParams +class AppReadRequest(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + id: RequestId + method: Annotated[Literal["app/read"], Field(title="App/readRequestMethod")] + params: AppsReadParams + + class AppListRequest(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -5483,6 +6123,15 @@ class AppListRequest(BaseModel): params: AppsListParams +class AppInstalledRequest(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + id: RequestId + method: Annotated[Literal["app/installed"], Field(title="App/installedRequestMethod")] + params: AppsInstalledParams + + class FsReadFileRequest(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -5959,6 +6608,27 @@ class CollaborationModeMask(BaseModel): reasoning_effort: ReasoningEffort | None = None +class ReadCommandAction(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + command: str + name: str + path: LegacyAppPathString + type: Annotated[Literal["read"], Field(title="ReadCommandActionType")] + + +class CommandAction( + RootModel[ + ReadCommandAction | ListFilesCommandAction | SearchCommandAction | UnknownCommandAction + ] +): + model_config = ConfigDict( + populate_by_name=True, + ) + root: ReadCommandAction | ListFilesCommandAction | SearchCommandAction | UnknownCommandAction + + class CommandExecOutputDeltaNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -6155,11 +6825,17 @@ class InputImageContentItem(BaseModel): type: Annotated[Literal["input_image"], Field(title="InputImageContentItemType")] -class ContentItem(RootModel[InputTextContentItem | InputImageContentItem | OutputTextContentItem]): +class ContentItem( + RootModel[ + InputTextContentItem | InputImageContentItem | InputAudioContentItem | OutputTextContentItem + ] +): model_config = ConfigDict( populate_by_name=True, ) - root: InputTextContentItem | InputImageContentItem | OutputTextContentItem + root: ( + InputTextContentItem | InputImageContentItem | InputAudioContentItem | OutputTextContentItem + ) class ExperimentalFeature(BaseModel): @@ -6212,6 +6888,19 @@ class ExperimentalFeatureListResponse(BaseModel): ] = None +class ExternalAgentConfigImportHistoryRecordSuccessParams(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + cwd: str | None = None + item_type: Annotated[ExternalAgentConfigMigrationItemType, Field(alias="itemType")] + source: str | None = None + target: str | None = None + title: Annotated[ + str | None, Field(description="Original title for an imported session, when available.") + ] = None + + class ExternalAgentConfigImportItemTypeFailure(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -6222,6 +6911,7 @@ class ExternalAgentConfigImportItemTypeFailure(BaseModel): item_type: Annotated[ExternalAgentConfigMigrationItemType, Field(alias="itemType")] message: str source: str | None = None + sub_error_type: Annotated[str | None, Field(alias="subErrorType")] = None class ExternalAgentConfigImportItemTypeSuccess(BaseModel): @@ -6232,6 +6922,10 @@ class ExternalAgentConfigImportItemTypeSuccess(BaseModel): item_type: Annotated[ExternalAgentConfigMigrationItemType, Field(alias="itemType")] source: str | None = None target: str | None = None + title: Annotated[ + str | None, + Field(description="Original title for an imported session; null for other item types."), + ] = None class ExternalAgentConfigImportTypeResult(BaseModel): @@ -6243,6 +6937,24 @@ class ExternalAgentConfigImportTypeResult(BaseModel): successes: list[ExternalAgentConfigImportItemTypeSuccess] +class ExternalAgentDetectedConnectorCandidate(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + name: str + session_count: Annotated[int, Field(alias="sessionCount", ge=0)] + source: ExternalAgentDetectedConnectorSource + + +class ExternalAgentImportedConnectorCandidate(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + name: str + session_count: Annotated[int, Field(alias="sessionCount", ge=0)] + source: ExternalAgentImportedConnectorSource + + class PathFileSystemPath(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -6251,29 +6963,44 @@ class PathFileSystemPath(BaseModel): type: Annotated[Literal["path"], Field(title="PathFileSystemPathType")] -class SpecialFileSystemPath(BaseModel): +class KindFileSystemSpecialPath(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - type: Annotated[Literal["special"], Field(title="SpecialFileSystemPathType")] - value: FileSystemSpecialPath + kind: Literal["project_roots"] + subpath: LegacyAppPathString | None = None -class FileSystemPath( - RootModel[PathFileSystemPath | GlobPatternFileSystemPath | SpecialFileSystemPath] +class FileSystemSpecialPath1(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + kind: Literal["unknown"] + path: str + subpath: LegacyAppPathString | None = None + + +class FileSystemSpecialPath( + RootModel[ + RootFileSystemSpecialPath + | MinimalFileSystemSpecialPath + | KindFileSystemSpecialPath + | TmpdirFileSystemSpecialPath + | SlashTmpFileSystemSpecialPath + | FileSystemSpecialPath1 + ] ): model_config = ConfigDict( populate_by_name=True, ) - root: PathFileSystemPath | GlobPatternFileSystemPath | SpecialFileSystemPath - - -class FileSystemSandboxEntry(BaseModel): - model_config = ConfigDict( - populate_by_name=True, + root: ( + RootFileSystemSpecialPath + | MinimalFileSystemSpecialPath + | KindFileSystemSpecialPath + | TmpdirFileSystemSpecialPath + | SlashTmpFileSystemSpecialPath + | FileSystemSpecialPath1 ) - access: FileSystemAccessMode - path: FileSystemPath class FileUpdateChange(BaseModel): @@ -6300,6 +7027,7 @@ class FunctionCallOutputContentItem( RootModel[ InputTextFunctionCallOutputContentItem | InputImageFunctionCallOutputContentItem + | InputAudioFunctionCallOutputContentItem | EncryptedContentFunctionCallOutputContentItem ] ): @@ -6309,6 +7037,7 @@ class FunctionCallOutputContentItem( root: Annotated[ InputTextFunctionCallOutputContentItem | InputImageFunctionCallOutputContentItem + | InputAudioFunctionCallOutputContentItem | EncryptedContentFunctionCallOutputContentItem, 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." @@ -6374,6 +7103,14 @@ class HookMetadata(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + additional_context_limit: Annotated[ + int | None, + Field( + alias="additionalContextLimit", + description="Configured `additionalContext` spill threshold. `null` uses 2,500 tokens; `0` disables spilling.", + ge=0, + ), + ] = None command: str | None = None current_hash: Annotated[str, Field(alias="currentHash")] display_order: Annotated[int, Field(alias="displayOrder")] @@ -6483,6 +7220,7 @@ class LoginAccountParams( | ChatgptLoginAccountParams | ChatgptDeviceCodeLoginAccountParams | ChatgptAuthTokensLoginAccountParams + | AmazonBedrockLoginAccountParams ] ): model_config = ConfigDict( @@ -6492,7 +7230,8 @@ class LoginAccountParams( ApiKeyLoginAccountParams | ChatgptLoginAccountParams | ChatgptDeviceCodeLoginAccountParams - | ChatgptAuthTokensLoginAccountParams, + | ChatgptAuthTokensLoginAccountParams + | AmazonBedrockLoginAccountParams, Field(title="LoginAccountParams"), ] @@ -6531,6 +7270,7 @@ class MigrationDetails(BaseModel): commands: list[CommandMigration] | None = [] hooks: list[HookMigration] | None = [] mcp_servers: Annotated[list[McpServerMigration] | None, Field(alias="mcpServers")] = [] + memory: list[str] | None = None plugins: list[PluginsMigration] | None = [] sessions: list[SessionMigration] | None = [] skills: list[SkillMigration] | None = [] @@ -6564,6 +7304,7 @@ class Model(BaseModel): ] is_default: Annotated[bool, Field(alias="isDefault")] model: str + model_specialty: Annotated[str | None, Field(alias="modelSpecialty")] = None service_tiers: Annotated[list[ModelServiceTier] | None, Field(alias="serviceTiers")] = [] supported_reasoning_efforts: Annotated[ list[ReasoningEffortOption], Field(alias="supportedReasoningEfforts") @@ -6746,6 +7487,23 @@ class RateLimitSnapshot(BaseModel): RateLimitReachedType | None, Field(alias="rateLimitReachedType") ] = None secondary: RateLimitWindow | None = None + spend_control_reached: Annotated[ + bool | None, + Field( + alias="spendControlReached", + description="Backend-reported spend-control state. `None` is unavailable, not a sparse-update recovery.", + ), + ] = None + + +class RawResponseCompletedNotification(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + response_id: Annotated[str, Field(alias="responseId")] + thread_id: Annotated[str, Field(alias="threadId")] + turn_id: Annotated[str, Field(alias="turnId")] + usage: TokenUsageBreakdown | None = None class MessageResponseItem(BaseModel): @@ -6785,10 +7543,64 @@ class ReviewStartParams(BaseModel): thread_id: Annotated[str, Field(alias="threadId")] +class HourlyScheduledTaskSchedule(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + days: list[ScheduledTaskWeekday] | None = None + interval_hours: Annotated[int, Field(alias="intervalHours", ge=0)] + type: Annotated[Literal["hourly"], Field(title="HourlyScheduledTaskScheduleType")] + + +class WeeklyScheduledTaskSchedule(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + days: list[ScheduledTaskWeekday] + time: str + type: Annotated[Literal["weekly"], Field(title="WeeklyScheduledTaskScheduleType")] + + +class ScheduledTaskSchedule( + RootModel[ + HourlyScheduledTaskSchedule + | DailyScheduledTaskSchedule + | WeekdaysScheduledTaskSchedule + | WeeklyScheduledTaskSchedule + ] +): + model_config = ConfigDict( + populate_by_name=True, + ) + root: ( + HourlyScheduledTaskSchedule + | DailyScheduledTaskSchedule + | WeekdaysScheduledTaskSchedule + | WeeklyScheduledTaskSchedule + ) + + +class ScheduledTaskSummary(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + key: str + name: str + prompt: str + schedule: ScheduledTaskSchedule + + class ThreadStatusChangedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/status/changed"], Field(title="Thread/status/changedNotificationMethod") ] @@ -6799,6 +7611,13 @@ class ThreadArchivedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["thread/archived"], Field(title="Thread/archivedNotificationMethod")] params: ThreadArchivedNotification @@ -6807,6 +7626,13 @@ class ThreadDeletedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["thread/deleted"], Field(title="Thread/deletedNotificationMethod")] params: ThreadDeletedNotification @@ -6815,6 +7641,13 @@ class ThreadUnarchivedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/unarchived"], Field(title="Thread/unarchivedNotificationMethod") ] @@ -6825,6 +7658,13 @@ class ThreadClosedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["thread/closed"], Field(title="Thread/closedNotificationMethod")] params: ThreadClosedNotification @@ -6833,6 +7673,13 @@ class SkillsChangedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["skills/changed"], Field(title="Skills/changedNotificationMethod")] params: SkillsChangedNotification @@ -6841,6 +7688,13 @@ class ThreadNameUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/name/updated"], Field(title="Thread/name/updatedNotificationMethod") ] @@ -6851,6 +7705,13 @@ class ThreadGoalClearedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/goal/cleared"], Field(title="Thread/goal/clearedNotificationMethod") ] @@ -6861,6 +7722,13 @@ class HookStartedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["hook/started"], Field(title="Hook/startedNotificationMethod")] params: HookStartedNotification @@ -6869,6 +7737,13 @@ class TurnDiffUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["turn/diff/updated"], Field(title="Turn/diff/updatedNotificationMethod") ] @@ -6879,6 +7754,13 @@ class CommandExecOutputDeltaServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["command/exec/outputDelta"], Field(title="Command/exec/outputDeltaNotificationMethod"), @@ -6890,6 +7772,13 @@ class ProcessOutputDeltaServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["process/outputDelta"], Field(title="Process/outputDeltaNotificationMethod") ] @@ -6900,6 +7789,13 @@ class ItemCommandExecutionTerminalInteractionServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["item/commandExecution/terminalInteraction"], Field(title="Item/commandExecution/terminalInteractionNotificationMethod"), @@ -6911,6 +7807,13 @@ class ServerRequestResolvedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["serverRequest/resolved"], Field(title="ServerRequest/resolvedNotificationMethod") ] @@ -6921,6 +7824,13 @@ class AccountUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["account/updated"], Field(title="Account/updatedNotificationMethod")] params: AccountUpdatedNotification @@ -6929,6 +7839,13 @@ class TurnModerationMetadataServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["turn/moderationMetadata"], Field(title="Turn/moderationMetadataNotificationMethod") ] @@ -6939,6 +7856,13 @@ class WarningServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["warning"], Field(title="WarningNotificationMethod")] params: WarningNotification @@ -6947,6 +7871,13 @@ class ConfigWarningServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["configWarning"], Field(title="ConfigWarningNotificationMethod")] params: ConfigWarningNotification @@ -6955,6 +7886,13 @@ class ThreadRealtimeStartedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/realtime/started"], Field(title="Thread/realtime/startedNotificationMethod") ] @@ -6965,6 +7903,13 @@ class ThreadRealtimeItemAddedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/realtime/itemAdded"], Field(title="Thread/realtime/itemAddedNotificationMethod"), @@ -6976,6 +7921,13 @@ class ThreadRealtimeTranscriptDeltaServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/realtime/transcript/delta"], Field(title="Thread/realtime/transcript/deltaNotificationMethod"), @@ -6987,6 +7939,13 @@ class ThreadRealtimeTranscriptDoneServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/realtime/transcript/done"], Field(title="Thread/realtime/transcript/doneNotificationMethod"), @@ -6998,6 +7957,13 @@ class ThreadRealtimeOutputAudioDeltaServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/realtime/outputAudio/delta"], Field(title="Thread/realtime/outputAudio/deltaNotificationMethod"), @@ -7009,6 +7975,13 @@ class ThreadRealtimeSdpServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/realtime/sdp"], Field(title="Thread/realtime/sdpNotificationMethod") ] @@ -7019,6 +7992,13 @@ class ThreadRealtimeErrorServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/realtime/error"], Field(title="Thread/realtime/errorNotificationMethod") ] @@ -7029,6 +8009,13 @@ class ThreadRealtimeClosedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/realtime/closed"], Field(title="Thread/realtime/closedNotificationMethod") ] @@ -7039,6 +8026,13 @@ class WindowsWorldWritableWarningServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["windows/worldWritableWarning"], Field(title="Windows/worldWritableWarningNotificationMethod"), @@ -7046,6 +8040,23 @@ class WindowsWorldWritableWarningServerNotification(BaseModel): params: WindowsWorldWritableWarningNotification +class AccountLoginCompletedServerNotification(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None + method: Annotated[ + Literal["account/login/completed"], Field(title="Account/login/completedNotificationMethod") + ] + params: AccountLoginCompletedNotification + + class SkillDependencies(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -7225,6 +8236,62 @@ class AgentMessageThreadItem(BaseModel): type: Annotated[Literal["agentMessage"], Field(title="AgentMessageThreadItemType")] +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[LegacyAppPathString, 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 + plugin_id: Annotated[ + str | None, + Field( + alias="pluginId", + description="Trusted first-party plugin id when this command resolves to one plugin script.", + ), + ] = None + process_id: Annotated[ + str | None, + Field( + alias="processId", + description="Identifier for the underlying PTY process (when available).", + ), + ] = None + script_path: Annotated[ + str | None, + Field( + alias="scriptPath", + description="Safe plugin-relative path when this command resolves to one plugin script.", + ), + ] = None + source: CommandExecutionSource | None = "agent" + status: CommandExecutionStatus + type: Annotated[Literal["commandExecution"], Field(title="CommandExecutionThreadItemType")] + + class FileChangeThreadItem(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -7290,6 +8357,12 @@ class WebSearchThreadItem(BaseModel): action: WebSearchAction | None = None id: str query: str + results: Annotated[ + list | None, + Field( + description="Structured search results returned out-of-band by standalone web search.\n\nThese stay as opaque JSON at the extension/app-server boundary so new result fields and result types can pass through without a Codex release." + ), + ] = None type: Annotated[Literal["webSearch"], Field(title="WebSearchThreadItemType")] @@ -7340,6 +8413,14 @@ class ThreadItem( ) +class ThreadItemEntry(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + item: ThreadItem + turn_id: Annotated[str, Field(alias="turnId", description="Turn containing this item.")] + + class ThreadListParams(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -7377,6 +8458,13 @@ class ThreadListParams(BaseModel): description="Optional substring filter for the extracted thread title.", ), ] = None + section_id: Annotated[ + str | None, + Field( + alias="sectionId", + description="Omit to include every section, set to `null` for unsectioned threads, or provide a section ID to return only threads in that section.", + ), + ] = None sort_direction: Annotated[ SortDirection | None, Field( @@ -7665,22 +8753,6 @@ class AccountRateLimitsUpdatedNotification(BaseModel): 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[LegacyAppPathString] | None, - Field(description="This will be removed in favor of `entries`."), - ] = None - write: Annotated[ - list[LegacyAppPathString] | None, - Field(description="This will be removed in favor of `entries`."), - ] = None - - class AppInfo(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -7907,7 +8979,7 @@ class ConfigBatchWriteParams(BaseModel): bool | None, Field( alias="reloadUserConfig", - description="When true, hot-reload the updated user config into all loaded threads after writing.", + description="When true, hot-reload updated runtime settings into loaded threads after writing. Session-static model, reasoning-effort, Plan-mode reasoning-effort, service-tier, and personality defaults are not reloaded.", ), ] = None @@ -7963,9 +9035,19 @@ class ExternalAgentConfigImportHistory(BaseModel): completed_at_ms: Annotated[int, Field(alias="completedAtMs")] failures: list[ExternalAgentConfigImportItemTypeFailure] import_id: Annotated[str, Field(alias="importId")] + provider_id: Annotated[str | None, Field(alias="providerId")] = None successes: list[ExternalAgentConfigImportItemTypeSuccess] +class ExternalAgentConfigImportHistoryRecordTypeResultParams(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + failures: list[ExternalAgentConfigImportItemTypeFailure] + item_type: Annotated[ExternalAgentConfigMigrationItemType, Field(alias="itemType")] + successes: list[ExternalAgentConfigImportHistoryRecordSuccessParams] + + class ExternalAgentConfigImportProgressNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -8001,6 +9083,31 @@ class FileChangePatchUpdatedNotification(BaseModel): turn_id: Annotated[str, Field(alias="turnId")] +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 FunctionCallOutputBody(RootModel[str | list[FunctionCallOutputContentItem]]): model_config = ConfigDict( populate_by_name=True, @@ -8114,6 +9221,7 @@ class PluginShareContext(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + can_publish_to_workspace: Annotated[bool | None, Field(alias="canPublishToWorkspace")] = None creator_account_user_id: Annotated[str | None, Field(alias="creatorAccountUserId")] = None creator_name: Annotated[str | None, Field(alias="creatorName")] = None discoverability: PluginShareDiscoverability | None = None @@ -8150,6 +9258,20 @@ class PluginSummary(BaseModel): PluginAvailability | None, Field(description="Availability state for installing and using the plugin."), ] = "AVAILABLE" + disabled_reason: Annotated[ + PluginDisabledReason | None, + Field( + alias="disabledReason", + description="Why the remote plugin is unavailable, when provided by plugin-service.", + ), + ] = None + eligible_plan_types: Annotated[ + list[str] | None, + Field( + alias="eligiblePlanTypes", + description="Raw plugin-service plan identifiers eligible to install the plugin.", + ), + ] = None enabled: bool id: str install_policy: Annotated[PluginInstallPolicy, Field(alias="installPolicy")] @@ -8157,6 +9279,13 @@ class PluginSummary(BaseModel): PluginInstallPolicySource | None, Field(alias="installPolicySource") ] = None installed: bool + installed_at: Annotated[ + int | None, + Field( + alias="installedAt", + description="Unix timestamp in seconds when the remote plugin was installed, when available.", + ), + ] = None interface: PluginInterface | None = None keywords: list[str] | None = [] local_version: Annotated[ @@ -8166,6 +9295,9 @@ class PluginSummary(BaseModel): description="Version of the locally materialized plugin package when available.", ), ] = None + must_show_installation_interstitial: Annotated[ + bool | None, Field(alias="mustShowInstallationInterstitial") + ] = None name: str remote_plugin_id: Annotated[ str | None, @@ -8187,15 +9319,6 @@ class PluginSummary(BaseModel): ] = 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, @@ -8270,6 +9393,13 @@ class ErrorServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["error"], Field(title="ErrorNotificationMethod")] params: ErrorNotification @@ -8278,6 +9408,13 @@ class ThreadGoalUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/goal/updated"], Field(title="Thread/goal/updatedNotificationMethod") ] @@ -8288,6 +9425,13 @@ class ThreadSettingsUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/settings/updated"], Field(title="Thread/settings/updatedNotificationMethod") ] @@ -8298,6 +9442,13 @@ class ThreadTokenUsageUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["thread/tokenUsage/updated"], Field(title="Thread/tokenUsage/updatedNotificationMethod"), @@ -8309,6 +9460,13 @@ class HookCompletedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["hook/completed"], Field(title="Hook/completedNotificationMethod")] params: HookCompletedNotification @@ -8317,6 +9475,13 @@ class TurnPlanUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["turn/plan/updated"], Field(title="Turn/plan/updatedNotificationMethod") ] @@ -8327,6 +9492,13 @@ class ItemStartedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["item/started"], Field(title="Item/startedNotificationMethod")] params: ItemStartedNotification @@ -8335,6 +9507,13 @@ class ItemCompletedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["item/completed"], Field(title="Item/completedNotificationMethod")] params: ItemCompletedNotification @@ -8343,6 +9522,13 @@ class ItemFileChangePatchUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["item/fileChange/patchUpdated"], Field(title="Item/fileChange/patchUpdatedNotificationMethod"), @@ -8354,6 +9540,13 @@ class AccountRateLimitsUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["account/rateLimits/updated"], Field(title="Account/rateLimits/updatedNotificationMethod"), @@ -8365,6 +9558,13 @@ class AppListUpdatedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["app/list/updated"], Field(title="App/list/updatedNotificationMethod") ] @@ -8375,6 +9575,13 @@ class ExternalAgentConfigImportProgressServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["externalAgentConfig/import/progress"], Field(title="ExternalAgentConfig/import/progressNotificationMethod"), @@ -8386,6 +9593,13 @@ class ExternalAgentConfigImportCompletedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["externalAgentConfig/import/completed"], Field(title="ExternalAgentConfig/import/completedNotificationMethod"), @@ -8397,6 +9611,13 @@ class WindowsSandboxSetupCompletedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[ Literal["windowsSandbox/setupCompleted"], Field(title="WindowsSandbox/setupCompletedNotificationMethod"), @@ -8491,6 +9712,22 @@ class TurnsPage(BaseModel): next_cursor: Annotated[str | None, Field(alias="nextCursor")] = None +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[LegacyAppPathString] | None, + Field(description="This will be removed in favor of `entries`."), + ] = None + write: Annotated[ + list[LegacyAppPathString] | None, + Field(description="This will be removed in favor of `entries`."), + ] = None + + class PluginShareSaveRequest(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -8514,6 +9751,7 @@ class ConfigRequirements(BaseModel): populate_by_name=True, ) allow_appshots: Annotated[bool | None, Field(alias="allowAppshots")] = None + allow_login_shell: Annotated[bool | None, Field(alias="allowLoginShell")] = None allow_managed_hooks_only: Annotated[bool | None, Field(alias="allowManagedHooksOnly")] = None allow_remote_control: Annotated[bool | None, Field(alias="allowRemoteControl")] = None allowed_approval_policies: Annotated[ @@ -8531,6 +9769,10 @@ class ConfigRequirements(BaseModel): allowed_windows_sandbox_implementations: Annotated[ list[WindowsSandboxSetupMode] | None, Field(alias="allowedWindowsSandboxImplementations") ] = None + browser_use: Annotated[BrowserUseRequirements | None, Field(alias="browserUse")] = None + check_for_update_on_startup: Annotated[bool | None, Field(alias="checkForUpdateOnStartup")] = ( + None + ) computer_use: Annotated[ComputerUseRequirements | None, Field(alias="computerUse")] = None default_permissions: Annotated[str | None, Field(alias="defaultPermissions")] = None enforce_residency: Annotated[ResidencyRequirement | None, Field(alias="enforceResidency")] = ( @@ -8539,7 +9781,14 @@ class ConfigRequirements(BaseModel): feature_requirements: Annotated[dict[str, Any] | None, Field(alias="featureRequirements")] = ( None ) + feedback: FeedbackRequirements | None = None + log_dir: Annotated[str | None, Field(alias="logDir")] = None + model_catalog_json: Annotated[str | None, Field(alias="modelCatalogJson")] = None models: ModelsRequirements | None = None + sqlite_home: Annotated[str | None, Field(alias="sqliteHome")] = None + windows_sandbox_private_desktop: Annotated[ + bool | None, Field(alias="windowsSandboxPrivateDesktop") + ] = None class ConfigRequirementsReadResponse(BaseModel): @@ -8558,6 +9807,7 @@ class ExternalAgentConfigDetectResponse(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + connectors: list[ExternalAgentDetectedConnectorCandidate] | None = [] items: list[ExternalAgentConfigMigrationItem] @@ -8565,9 +9815,29 @@ class ExternalAgentConfigImportHistoriesReadResponse(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + connectors: list[ExternalAgentImportedConnectorCandidate] data: list[ExternalAgentConfigImportHistory] +class ExternalAgentConfigImportHistoryRecordParams(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + item_type_results: Annotated[ + list[ExternalAgentConfigImportHistoryRecordTypeResultParams], + Field( + alias="itemTypeResults", description="Completed results grouped by imported item type." + ), + ] + provider_id: Annotated[ + str, + Field( + alias="providerId", + description="Opaque provider identifier for the externally completed import.", + ), + ] + + class ExternalAgentConfigImportParams(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -8575,111 +9845,26 @@ class ExternalAgentConfigImportParams(BaseModel): migration_items: Annotated[ list[ExternalAgentConfigMigrationItem], Field(alias="migrationItems") ] + migration_source: Annotated[ + str | None, + Field( + alias="migrationSource", + description="Migration-source selector used to produce the migration items. Pass the same value to detection and import; missing or unrecognized values use the default source.", + ), + ] = None + provider_id: Annotated[ + str | None, + Field( + alias="providerId", + description="Opaque provider identifier supplied by the caller for analytics attribution and import history display. This does not select the migration source.", + ), + ] = None source: Annotated[ str | None, - Field( - description="Source product that produced the migration items. Missing means unspecified." - ), + Field(description="Optional identifier for the product that initiated the import."), ] = None -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, @@ -8691,6 +9876,9 @@ class PluginDetail(BaseModel): marketplace_name: Annotated[str, Field(alias="marketplaceName")] marketplace_path: Annotated[AbsolutePathBuf | None, Field(alias="marketplacePath")] = None mcp_servers: Annotated[list[str], Field(alias="mcpServers")] + scheduled_tasks: Annotated[list[ScheduledTaskSummary] | None, Field(alias="scheduledTasks")] = ( + None + ) share_url: Annotated[str | None, Field(alias="shareUrl")] = None skills: list[SkillSummary] summary: PluginSummary @@ -8718,6 +9906,15 @@ class PluginReadResponse(BaseModel): plugin: PluginDetail +class PluginSearchResult(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + marketplace_name: Annotated[str, Field(alias="marketplaceName")] + marketplace_path: Annotated[AbsolutePathBuf | None, Field(alias="marketplacePath")] = None + plugin: PluginSummary + + class PluginShareListItem(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -8742,6 +9939,15 @@ class RawResponseItemCompletedNotification(BaseModel): turn_id: Annotated[str, Field(alias="turnId")] +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 ReviewStartResponse(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -8760,6 +9966,13 @@ class TurnStartedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["turn/started"], Field(title="Turn/startedNotificationMethod")] params: TurnStartedNotification @@ -8768,32 +9981,17 @@ class TurnCompletedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None 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, @@ -8872,6 +10070,17 @@ class Thread(BaseModel): description="Unix timestamp (in seconds) used for thread recency ordering.", ), ] = None + section: Annotated[ + ThreadSection | None, + Field(description="The independently persisted section selected for this thread, if any."), + ] = None + section_entered_at: Annotated[ + int | None, + Field( + alias="sectionEnteredAt", + description="Unix timestamp in seconds when the thread entered its current section.", + ), + ] = None session_id: Annotated[ str, Field( @@ -9088,6 +10297,18 @@ class ExternalAgentConfigImportRequest(BaseModel): params: ExternalAgentConfigImportParams +class ExternalAgentConfigImportRecordHistoryRequest(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + id: RequestId + method: Annotated[ + Literal["externalAgentConfig/import/recordHistory"], + Field(title="ExternalAgentConfig/import/recordHistoryRequestMethod"), + ] + params: ExternalAgentConfigImportHistoryRecordParams + + class ClientRequest( RootModel[ InitializeRequest @@ -9102,12 +10323,17 @@ class ClientRequest( | ThreadGoalGetRequest | ThreadGoalClearRequest | ThreadMetadataUpdateRequest + | ThreadSectionMoveRequest | ThreadUnarchiveRequest | ThreadCompactStartRequest | ThreadShellCommandRequest | ThreadApproveGuardianDeniedActionRequest | ThreadRollbackRequest | ThreadListRequest + | ThreadSectionListRequest + | ThreadSectionCreateRequest + | ThreadSectionUpdateRequest + | ThreadSectionDeleteRequest | ThreadLoadedListRequest | ThreadReadRequest | ThreadInjectItemsRequest @@ -9126,7 +10352,9 @@ class ClientRequest( | PluginShareListRequest | PluginShareCheckoutRequest | PluginShareDeleteRequest + | AppReadRequest | AppListRequest + | AppInstalledRequest | FsReadFileRequest | FsWriteFileRequest | FsCreateDirectoryRequest @@ -9171,6 +10399,7 @@ class ClientRequest( | ConfigReadRequest | ExternalAgentConfigDetectRequest | ExternalAgentConfigImportRequest + | ExternalAgentConfigImportRecordHistoryRequest | ExternalAgentConfigImportReadHistoriesRequest | ConfigValueWriteRequest | ConfigBatchWriteRequest @@ -9195,12 +10424,17 @@ class ClientRequest( | ThreadGoalGetRequest | ThreadGoalClearRequest | ThreadMetadataUpdateRequest + | ThreadSectionMoveRequest | ThreadUnarchiveRequest | ThreadCompactStartRequest | ThreadShellCommandRequest | ThreadApproveGuardianDeniedActionRequest | ThreadRollbackRequest | ThreadListRequest + | ThreadSectionListRequest + | ThreadSectionCreateRequest + | ThreadSectionUpdateRequest + | ThreadSectionDeleteRequest | ThreadLoadedListRequest | ThreadReadRequest | ThreadInjectItemsRequest @@ -9219,7 +10453,9 @@ class ClientRequest( | PluginShareListRequest | PluginShareCheckoutRequest | PluginShareDeleteRequest + | AppReadRequest | AppListRequest + | AppInstalledRequest | FsReadFileRequest | FsWriteFileRequest | FsCreateDirectoryRequest @@ -9264,6 +10500,7 @@ class ClientRequest( | ConfigReadRequest | ExternalAgentConfigDetectRequest | ExternalAgentConfigImportRequest + | ExternalAgentConfigImportRecordHistoryRequest | ExternalAgentConfigImportReadHistoriesRequest | ConfigValueWriteRequest | ConfigBatchWriteRequest @@ -9274,6 +10511,103 @@ class ClientRequest( ] +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 PluginInstalledResponse(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -9299,10 +10633,53 @@ class ThreadStartedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None method: Annotated[Literal["thread/started"], Field(title="Thread/startedNotificationMethod")] params: ThreadStartedNotification +class ItemAutoApprovalReviewStartedServerNotification(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None + method: Annotated[ + Literal["item/autoApprovalReview/started"], + Field(title="Item/autoApprovalReview/startedNotificationMethod"), + ] + params: ItemGuardianApprovalReviewStartedNotification + + +class ItemAutoApprovalReviewCompletedServerNotification(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None + method: Annotated[ + Literal["item/autoApprovalReview/completed"], + Field(title="Item/autoApprovalReview/completedNotificationMethod"), + ] + params: ItemGuardianApprovalReviewCompletedNotification + + class ServerNotification( RootModel[ ErrorServerNotification @@ -9316,6 +10693,8 @@ class ServerNotification( | ThreadNameUpdatedServerNotification | ThreadGoalUpdatedServerNotification | ThreadGoalClearedServerNotification + | ThreadEnvironmentConnectedServerNotification + | ThreadEnvironmentDisconnectedServerNotification | ThreadSettingsUpdatedServerNotification | ThreadTokenUsageUpdatedServerNotification | TurnStartedServerNotification @@ -9390,6 +10769,8 @@ class ServerNotification( | ThreadNameUpdatedServerNotification | ThreadGoalUpdatedServerNotification | ThreadGoalClearedServerNotification + | ThreadEnvironmentConnectedServerNotification + | ThreadEnvironmentDisconnectedServerNotification | ThreadSettingsUpdatedServerNotification | ThreadTokenUsageUpdatedServerNotification | TurnStartedServerNotification diff --git a/sdk/python/tests/test_app_server_run.py b/sdk/python/tests/test_app_server_run.py index 3f741e6ec6..4e453bf66e 100644 --- a/sdk/python/tests/test_app_server_run.py +++ b/sdk/python/tests/test_app_server_run.py @@ -96,6 +96,7 @@ def test_run_params_and_usage_cross_app_server_boundary(tmp_path) -> None: "request_model": "mock-model-override", "usage": { "last": { + "cacheWriteInputTokens": 0, "cachedInputTokens": 3, "inputTokens": 11, "outputTokens": 7, @@ -103,6 +104,7 @@ def test_run_params_and_usage_cross_app_server_boundary(tmp_path) -> None: "totalTokens": 18, }, "total": { + "cacheWriteInputTokens": 0, "cachedInputTokens": 3, "inputTokens": 11, "outputTokens": 7, diff --git a/sdk/python/tests/test_artifact_workflow_and_binaries.py b/sdk/python/tests/test_artifact_workflow_and_binaries.py index f62a1bfecf..23a3cc4493 100644 --- a/sdk/python/tests/test_artifact_workflow_and_binaries.py +++ b/sdk/python/tests/test_artifact_workflow_and_binaries.py @@ -377,17 +377,17 @@ def test_schema_normalization_only_flattens_string_literal_oneofs( if isinstance(definition, dict) and script._flatten_string_enum_one_of(definition.copy()) ] - assert flattened == [ - "MessagePhase", - "TurnItemsView", + assert sorted(flattened) == [ "AuthMode", - "PluginAvailability", - "InputModality", - "ExperimentalFeatureStage", - "ProcessOutputStream", + "AutoCompactTokenLimitScope", "CommandExecOutputStream", "ConsumeAccountRateLimitResetCreditOutcome", - "AutoCompactTokenLimitScope", + "ExperimentalFeatureStage", + "InputModality", + "MessagePhase", + "PluginAvailability", + "ProcessOutputStream", + "TurnItemsView", ] @@ -515,10 +515,10 @@ def test_source_sdk_template_pins_published_runtime() -> None: "dependencies": pyproject["project"]["dependencies"], } == { "sdk_template_version": "0.0.0-dev", - "runtime_pin": "0.144.4", + "runtime_pin": "0.147.0", "dependencies": [ "pydantic>=2.12", - "openai-codex-cli-bin==0.144.4", + "openai-codex-cli-bin==0.147.0", ], } @@ -592,7 +592,7 @@ def test_runtime_setup_reads_independent_runtime_pin_and_release_tags() -> None: } == { "package_name": "openai-codex-cli-bin", "sdk_template_version": "0.0.0-dev", - "runtime_pin": "0.144.4", + "runtime_pin": "0.147.0", "normalized_release_version": "0.116.0a1", "normalized_alpha_hotfix_version": "0.116.0a1.post2", "release_tag": "rust-v0.116.0-alpha.1", @@ -841,7 +841,7 @@ def test_stage_sdk_release_preserves_reviewed_runtime_pin(tmp_path: Path) -> Non script = _load_update_script_module() staged = script.stage_python_sdk_package( tmp_path / "sdk-stage", - "0.144.4", + "0.147.0", ) pyproject = tomllib.loads((staged / "pyproject.toml").read_text()) @@ -851,18 +851,18 @@ def test_stage_sdk_release_preserves_reviewed_runtime_pin(tmp_path: Path) -> Non "dependencies": pyproject["project"]["dependencies"], } == { "name": "openai-codex", - "version": "0.144.4", + "version": "0.147.0", "dependencies": [ "pydantic>=2.12", - "openai-codex-cli-bin==0.144.4", + "openai-codex-cli-bin==0.147.0", ], } assert ( - '__version__ = "0.144.4"' + '__version__ = "0.147.0"' not in (staged / "src" / "openai_codex" / "__init__.py").read_text() ) assert ( - 'client_version: str = "0.144.4"' + 'client_version: str = "0.147.0"' not in (staged / "src" / "openai_codex" / "client.py").read_text() ) assert not any((staged / "src" / "openai_codex").glob("bin/**")) @@ -875,7 +875,7 @@ def test_stage_sdk_release_replaces_existing_staging_dir(tmp_path: Path) -> None old_file.parent.mkdir(parents=True) old_file.write_text("stale") - staged = script.stage_python_sdk_package(staging_dir, "0.144.4") + staged = script.stage_python_sdk_package(staging_dir, "0.147.0") assert staged == staging_dir assert not old_file.exists() @@ -887,11 +887,11 @@ def test_sdk_release_matches_stable_runtime(tmp_path: Path) -> None: sdk_stage = script.stage_python_sdk_package( tmp_path / "sdk-stage", - "0.144.4", + "0.147.0", ) runtime_stage = script.stage_python_runtime_package( tmp_path / "runtime-stage", - "0.144.4", + "0.147.0", package_archive, ) @@ -903,11 +903,11 @@ def test_sdk_release_matches_stable_runtime(tmp_path: Path) -> None: "runtime_version": runtime_pyproject["project"]["version"], "sdk_dependencies": sdk_pyproject["project"]["dependencies"], } == { - "sdk_version": "0.144.4", - "runtime_version": "0.144.4", + "sdk_version": "0.147.0", + "runtime_version": "0.147.0", "sdk_dependencies": [ "pydantic>=2.12", - "openai-codex-cli-bin==0.144.4", + "openai-codex-cli-bin==0.147.0", ], } @@ -920,7 +920,7 @@ def test_stage_sdk_runs_type_generation_before_staging(tmp_path: Path) -> None: "stage-sdk", str(tmp_path / "sdk-stage"), "--sdk-version", - "0.144.4", + "0.147.0", ] ) @@ -951,7 +951,7 @@ def test_stage_sdk_runs_type_generation_before_staging(tmp_path: Path) -> None: script.run_command(args, ops) - assert calls == ["generate_types", "stage_sdk:0.144.4"] + assert calls == ["generate_types", "stage_sdk:0.147.0"] def test_stage_runtime_stages_package_without_type_generation(tmp_path: Path) -> None: diff --git a/sdk/python/tests/test_contract_generation.py b/sdk/python/tests/test_contract_generation.py index 81d1692bdf..e7c9c91c1a 100644 --- a/sdk/python/tests/test_contract_generation.py +++ b/sdk/python/tests/test_contract_generation.py @@ -40,7 +40,7 @@ def test_generated_files_are_up_to_date(): # Regenerate contract artifacts via the pinned runtime package, not a local # app-server binary from the checkout or CI environment. - assert importlib.metadata.version("openai-codex-cli-bin") == "0.144.4" + assert importlib.metadata.version("openai-codex-cli-bin") == "0.147.0" env = os.environ.copy() env.pop("CODEX_EXEC_PATH", None) python_bin = str(Path(sys.executable).parent) diff --git a/sdk/python/tests/test_public_api_signatures.py b/sdk/python/tests/test_public_api_signatures.py index c26ac90f6b..9a67073b52 100644 --- a/sdk/python/tests/test_public_api_signatures.py +++ b/sdk/python/tests/test_public_api_signatures.py @@ -339,6 +339,7 @@ def test_generated_public_signatures_are_snake_case_and_typed() -> None: "limit", "model_providers", "search_term", + "section_id", "sort_direction", "sort_key", "source_kinds", @@ -414,6 +415,7 @@ def test_generated_public_signatures_are_snake_case_and_typed() -> None: "limit", "model_providers", "search_term", + "section_id", "sort_direction", "sort_key", "source_kinds", diff --git a/sdk/python/uv.lock b/sdk/python/uv.lock index 33618337a3..6f6f867ede 100644 --- a/sdk/python/uv.lock +++ b/sdk/python/uv.lock @@ -7,7 +7,7 @@ exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for exclude-newer-span = "P7D" [options.exclude-newer-package] -openai-codex-cli-bin = "2026-07-15T01:00:00Z" +openai-codex-cli-bin = "2026-08-19T00:00:00Z" [[package]] name = "annotated-types" @@ -118,7 +118,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -306,7 +306,7 @@ test = [ [package.metadata] requires-dist = [ - { name = "openai-codex-cli-bin", specifier = "==0.144.4" }, + { name = "openai-codex-cli-bin", specifier = "==0.147.0" }, { name = "pydantic", specifier = ">=2.12" }, ] @@ -325,17 +325,17 @@ test = [ [[package]] name = "openai-codex-cli-bin" -version = "0.144.4" +version = "0.147.0" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/30/7e457c007a32aa7333a78438a9f532504c3b77a1ea57e7808855712c2c0f/openai_codex_cli_bin-0.144.4-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:4d587d152d5f0aa25f21ded4d08aac5150da48639b29fc3e57b2a8b413d06903", size = 126851183, upload-time = "2026-07-15T00:14:00.171Z" }, - { url = "https://files.pythonhosted.org/packages/65/eb/64c180514a2cc3e2500e486813f5a8d7f7e349342e9bebd78d99ddd9791a/openai_codex_cli_bin-0.144.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:05db505a9c7f020f58b70837a94e00d32a50086986c267bcc44ea97b573d4a05", size = 116474758, upload-time = "2026-07-15T00:14:08.177Z" }, - { url = "https://files.pythonhosted.org/packages/85/34/921ab692c7ed140941a91e39b84c6deafddb45072793f3a5f6dcbf86f59a/openai_codex_cli_bin-0.144.4-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:cd4bb31b8a477a3adba22139c8c493693fa5292ba21e86eef08ace3e96c41294", size = 119437596, upload-time = "2026-07-15T00:14:17.418Z" }, - { url = "https://files.pythonhosted.org/packages/25/62/39e630cf8b7b2e2444a5a6669235a6cd88004869a25bb7f3f629ed35638c/openai_codex_cli_bin-0.144.4-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:4106229c38f37245c3eea8d904426afd45b8bf19831765715647f5402f757c06", size = 128817757, upload-time = "2026-07-15T00:14:30.539Z" }, - { url = "https://files.pythonhosted.org/packages/23/24/318f91a95baaff845307e529d138d42a7202e6bd0e626556058eab3dead5/openai_codex_cli_bin-0.144.4-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:d2d3fada11731938e3d3e3660819d5324b7f92e825a0ed5aede63100b36ffc9a", size = 119437594, upload-time = "2026-07-15T00:14:39.327Z" }, - { url = "https://files.pythonhosted.org/packages/2e/a0/65e6fd3a6fba52639937801d9ce517b0c48026458723bb9f08eb07a1dd35/openai_codex_cli_bin-0.144.4-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:70fb62ed7755e332dd8b00ed48e22ee16df10f4a977335039e237cd330490df3", size = 128817755, upload-time = "2026-07-15T00:14:47.849Z" }, - { url = "https://files.pythonhosted.org/packages/e3/8a/3ab5fc97352e8f780d472c8dd6d7504d6a670cd7dede106d461ac1171999/openai_codex_cli_bin-0.144.4-py3-none-win_amd64.whl", hash = "sha256:56e142974467332f1f669b89f2636e06b3ada09413512abb2f24c33b4a4f59fc", size = 140595092, upload-time = "2026-07-15T00:14:58.484Z" }, - { url = "https://files.pythonhosted.org/packages/70/1a/3aa52ab8f89e0f596b6eea835e3f3494697da51917d3231f5f48f92e2bcb/openai_codex_cli_bin-0.144.4-py3-none-win_arm64.whl", hash = "sha256:2ad01058db7181323ae7c6217e560702e38c4f107595b99ab1d0abc9f184890a", size = 130665105, upload-time = "2026-07-15T00:15:08.861Z" }, + { url = "https://files.pythonhosted.org/packages/46/85/3302e5265f35941a24f614573e1a27e6f218d7fa71e4dd3b1353d1726c5a/openai_codex_cli_bin-0.147.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:19c3a72a0eac6706bb5023088ab7eb31d8cfc06bf7860250b5c5b90f4505489b", size = 116948927, upload-time = "2026-08-18T06:05:53.479Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0c/6474ef2f854ecf217550d06667a8ac988b5656c448b680e5b5ece5ae5152/openai_codex_cli_bin-0.147.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b851943fffc48aa7c5c130b6a34be09964833d2785546eda96d749427c6e24f2", size = 107573930, upload-time = "2026-08-18T06:05:57.701Z" }, + { url = "https://files.pythonhosted.org/packages/59/4b/0efce457a301271301b9229b36b3f53ca94d5f4db1d605c86e0da9833565/openai_codex_cli_bin-0.147.0-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:aab3e27ce07cd7bc7a78708efa40375b28e89f586851c495ef55aa6cb6806d11", size = 111220520, upload-time = "2026-08-18T06:06:01.636Z" }, + { url = "https://files.pythonhosted.org/packages/f2/e4/5e4fb0f61ca90c2bb42a8823e08fe05957c54591d1e161c56a93d27d565d/openai_codex_cli_bin-0.147.0-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:cb3907d633cda87c4b68b47ff4979e6054c02a08c41b15aa2e9a689558a61074", size = 119921665, upload-time = "2026-08-18T06:06:05.666Z" }, + { url = "https://files.pythonhosted.org/packages/f9/83/a52e32fc63bde10996e38cb4e1175c402c578ee7c7ca79b96abee5219127/openai_codex_cli_bin-0.147.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:ea0bfdee98164fc7d589eea5623aff06c8f8f2ba3f9bc550297429db45ea68f7", size = 111220518, upload-time = "2026-08-18T06:06:09.538Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b6/c159da0a1ec136fde6d2742ec05347e311f000dfe19024ed7d708cf60aa5/openai_codex_cli_bin-0.147.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:a9be23f46326494b7ebf4bd98cbe985542f5ad076355f3b0fb636a984df56816", size = 119921665, upload-time = "2026-08-18T06:06:15.061Z" }, + { url = "https://files.pythonhosted.org/packages/54/38/1bb47e08b9c523b673358e4f5597fc99699e855ec63bd02fdc157f1679c9/openai_codex_cli_bin-0.147.0-py3-none-win_amd64.whl", hash = "sha256:1a403ff803ae27e078189a0fd24687f32d43c46f152e50cdbe3eddc9e302f697", size = 127586208, upload-time = "2026-08-18T06:06:19.395Z" }, + { url = "https://files.pythonhosted.org/packages/d2/1e/a44a8da140ef080aebac6da6517e8fe6ac1aad49436c8b1f9b87e735b813/openai_codex_cli_bin-0.147.0-py3-none-win_arm64.whl", hash = "sha256:be0c8b9e34b067151d0964a24e9f4b8b48ea516448a08ef2636f357ebdc877b7", size = 117863410, upload-time = "2026-08-18T06:06:23.554Z" }, ] [[package]]