Prepare Python SDK 0.149.0 release

This commit is contained in:
Ahmed Ibrahim
2026-08-20 22:53:52 -07:00
parent 2151d3a5b7
commit 25b5957f0e
6 changed files with 605 additions and 79 deletions
+3 -3
View File
@@ -16,7 +16,7 @@ classifiers = [
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = ["pydantic>=2.12", "openai-codex-cli-bin==0.147.0"]
dependencies = ["pydantic>=2.12", "openai-codex-cli-bin==0.149.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-08-19T00:00:00Z" }
exclude-newer-package = { openai-codex-cli-bin = "2026-08-21T05:44:00Z" }
index-strategy = "first-index"
[tool.uv.pip]
exclude-newer = "7 days"
exclude-newer-package = { openai-codex-cli-bin = "2026-08-19T00:00:00Z" }
exclude-newer-package = { openai-codex-cli-bin = "2026-08-21T05:44:00Z" }
index-strategy = "first-index"
@@ -40,12 +40,14 @@ from .v2_all import ModelVerificationNotification
from .v2_all import PlanDeltaNotification
from .v2_all import ProcessExitedNotification
from .v2_all import ProcessOutputDeltaNotification
from .v2_all import ProjectChangedNotification
from .v2_all import ReasoningSummaryPartAddedNotification
from .v2_all import ReasoningSummaryTextDeltaNotification
from .v2_all import ReasoningTextDeltaNotification
from .v2_all import RemoteControlStatusChangedNotification
from .v2_all import ServerRequestResolvedNotification
from .v2_all import SkillsChangedNotification
from .v2_all import StrictReviewRequiredNotification
from .v2_all import TerminalInteractionNotification
from .v2_all import ThreadArchivedNotification
from .v2_all import ThreadClosedNotification
@@ -53,6 +55,8 @@ from .v2_all import ThreadDeletedNotification
from .v2_all import ThreadGoalClearedNotification
from .v2_all import ThreadGoalUpdatedNotification
from .v2_all import ThreadNameUpdatedNotification
from .v2_all import ThreadProjectUpdatedNotification
from .v2_all import ThreadQueueChangedNotification
from .v2_all import ThreadRealtimeClosedNotification
from .v2_all import ThreadRealtimeErrorNotification
from .v2_all import ThreadRealtimeItemAddedNotification
@@ -61,6 +65,7 @@ from .v2_all import ThreadRealtimeSdpNotification
from .v2_all import ThreadRealtimeStartedNotification
from .v2_all import ThreadRealtimeTranscriptDeltaNotification
from .v2_all import ThreadRealtimeTranscriptDoneNotification
from .v2_all import ThreadRevertedNotification
from .v2_all import ThreadSettingsUpdatedNotification
from .v2_all import ThreadStartedNotification
from .v2_all import ThreadStatusChangedNotification
@@ -80,6 +85,7 @@ NOTIFICATION_MODELS: dict[str, type[BaseModel]] = {
"account/rateLimits/updated": AccountRateLimitsUpdatedNotification,
"account/updated": AccountUpdatedNotification,
"app/list/updated": AppListUpdatedNotification,
"autoApprovalReview/strictReviewRequired": StrictReviewRequiredNotification,
"command/exec/outputDelta": CommandExecOutputDeltaNotification,
"configWarning": ConfigWarningNotification,
"deprecationNotice": DeprecationNoticeNotification,
@@ -113,6 +119,7 @@ NOTIFICATION_MODELS: dict[str, type[BaseModel]] = {
"model/verification": ModelVerificationNotification,
"process/exited": ProcessExitedNotification,
"process/outputDelta": ProcessOutputDeltaNotification,
"project/changed": ProjectChangedNotification,
"remoteControl/status/changed": RemoteControlStatusChangedNotification,
"serverRequest/resolved": ServerRequestResolvedNotification,
"skills/changed": SkillsChangedNotification,
@@ -125,6 +132,8 @@ NOTIFICATION_MODELS: dict[str, type[BaseModel]] = {
"thread/goal/cleared": ThreadGoalClearedNotification,
"thread/goal/updated": ThreadGoalUpdatedNotification,
"thread/name/updated": ThreadNameUpdatedNotification,
"thread/project/updated": ThreadProjectUpdatedNotification,
"thread/queue/changed": ThreadQueueChangedNotification,
"thread/realtime/closed": ThreadRealtimeClosedNotification,
"thread/realtime/error": ThreadRealtimeErrorNotification,
"thread/realtime/itemAdded": ThreadRealtimeItemAddedNotification,
@@ -133,6 +142,7 @@ NOTIFICATION_MODELS: dict[str, type[BaseModel]] = {
"thread/realtime/started": ThreadRealtimeStartedNotification,
"thread/realtime/transcript/delta": ThreadRealtimeTranscriptDeltaNotification,
"thread/realtime/transcript/done": ThreadRealtimeTranscriptDoneNotification,
"thread/reverted": ThreadRevertedNotification,
"thread/settings/updated": ThreadSettingsUpdatedNotification,
"thread/started": ThreadStartedNotification,
"thread/status/changed": ThreadStatusChangedNotification,
@@ -169,6 +179,7 @@ DIRECT_TURN_ID_NOTIFICATION_TYPES: tuple[type[BaseModel], ...] = (
ReasoningSummaryPartAddedNotification,
ReasoningSummaryTextDeltaNotification,
ReasoningTextDeltaNotification,
StrictReviewRequiredNotification,
TerminalInteractionNotification,
ThreadGoalUpdatedNotification,
ThreadTokenUsageUpdatedNotification,
+563 -48
View File
@@ -102,6 +102,13 @@ class AdditionalNetworkPermissions(BaseModel):
enabled: bool | None = None
class AgentMessageDelivery(RootModel[Literal["async"]]):
model_config = ConfigDict(
populate_by_name=True,
)
root: Literal["async"]
class AgentMessageDeltaNotification(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -314,6 +321,13 @@ class AppsReadParams(BaseModel):
description="When true, include display-only public tool summaries in the returned metadata.",
),
] = None
thread_id: Annotated[
str | None,
Field(
alias="threadId",
description="Optional loaded thread id used to evaluate effective app configuration.",
),
] = None
class AskForApprovalValue(Enum):
@@ -375,6 +389,14 @@ class AutoReviewDecisionSource(RootModel[Literal["agent"]]):
]
class AutoReviewRequirements(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
ignore_rules: Annotated[list[str] | None, Field(alias="ignoreRules")] = None
required_on_models: Annotated[list[str] | None, Field(alias="requiredOnModels")] = None
class BrowserUseRequirements(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -423,6 +445,13 @@ class CapabilityRootLocation(RootModel[EnvironmentCapabilityRootLocation]):
]
class CliAuthCredentialsStoreMode(Enum):
file = "file"
keyring = "keyring"
auto = "auto"
ephemeral = "ephemeral"
class ClientInfo(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -438,6 +467,7 @@ class CodexErrorInfoValue(Enum):
usage_limit_exceeded = "usageLimitExceeded"
server_overloaded = "serverOverloaded"
cyber_policy = "cyberPolicy"
misalignment_policy_violation = "misalignmentPolicyViolation"
internal_server_error = "internalServerError"
unauthorized = "unauthorized"
bad_request = "badRequest"
@@ -696,6 +726,18 @@ class ComputerUseRequirements(BaseModel):
allow_locked_computer_use: Annotated[bool | None, Field(alias="allowLockedComputerUse")] = None
class PackagedDefaultsConfigLayerSource(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
file: Annotated[
AbsolutePathBuf, Field(description="Path to the packaged default configuration file.")
]
type: Annotated[
Literal["packagedDefaults"], Field(title="PackagedDefaultsConfigLayerSourceType")
]
class MdmConfigLayerSource(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -791,7 +833,8 @@ class LegacyManagedConfigTomlFromMdmConfigLayerSource(BaseModel):
class ConfigLayerSource(
RootModel[
MdmConfigLayerSource
PackagedDefaultsConfigLayerSource
| MdmConfigLayerSource
| SystemConfigLayerSource
| EnterpriseManagedConfigLayerSource
| UserConfigLayerSource
@@ -805,7 +848,8 @@ class ConfigLayerSource(
populate_by_name=True,
)
root: (
MdmConfigLayerSource
PackagedDefaultsConfigLayerSource
| MdmConfigLayerSource
| SystemConfigLayerSource
| EnterpriseManagedConfigLayerSource
| UserConfigLayerSource
@@ -849,6 +893,18 @@ class CommandConfiguredHookHandler(BaseModel):
type: Annotated[Literal["command"], Field(title="CommandConfiguredHookHandlerType")]
class McpToolConfiguredHookHandler(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
input: dict[str, Any]
server: str
status_message: Annotated[str | None, Field(alias="statusMessage")] = None
timeout_sec: Annotated[int | None, Field(alias="timeoutSec", ge=0)] = None
tool: str
type: Annotated[Literal["mcp_tool"], Field(title="McpToolConfiguredHookHandlerType")]
class PromptConfiguredHookHandler(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -865,13 +921,21 @@ class AgentConfiguredHookHandler(BaseModel):
class ConfiguredHookHandler(
RootModel[
CommandConfiguredHookHandler | PromptConfiguredHookHandler | AgentConfiguredHookHandler
CommandConfiguredHookHandler
| McpToolConfiguredHookHandler
| PromptConfiguredHookHandler
| AgentConfiguredHookHandler
]
):
model_config = ConfigDict(
populate_by_name=True,
)
root: CommandConfiguredHookHandler | PromptConfiguredHookHandler | AgentConfiguredHookHandler
root: (
CommandConfiguredHookHandler
| McpToolConfiguredHookHandler
| PromptConfiguredHookHandler
| AgentConfiguredHookHandler
)
class ConfiguredHookMatcherGroup(BaseModel):
@@ -1648,14 +1712,17 @@ class GetAccountParams(BaseModel):
] = None
class GetAccountTokenUsageResponse(BaseModel):
class GetAccountTokenUsageParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
daily_usage_buckets: Annotated[
list[AccountTokenUsageDailyBucket] | None, Field(alias="dailyUsageBuckets")
thread_id: Annotated[
str | None,
Field(
alias="threadId",
description="When present, read estimated usage for this thread instead of account-wide token activity.",
),
] = None
summary: AccountTokenUsageSummary
class GitInfo(BaseModel):
@@ -1758,6 +1825,7 @@ class HookExecutionMode(Enum):
class HookHandlerType(Enum):
command = "command"
mcp_tool = "mcpTool"
prompt = "prompt"
agent = "agent"
@@ -1836,6 +1904,24 @@ class ImageDetail(Enum):
original = "original"
class UsageLimitExceededImageGenerationFailure(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
limit_id: Annotated[str, Field(alias="limitId")]
resets_at: Annotated[int | None, Field(alias="resetsAt")] = None
type: Annotated[
Literal["usageLimitExceeded"], Field(title="UsageLimitExceededImageGenerationFailureType")
]
class ImageGenerationFailure(RootModel[UsageLimitExceededImageGenerationFailure]):
model_config = ConfigDict(
populate_by_name=True,
)
root: UsageLimitExceededImageGenerationFailure
class InitializeCapabilities(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -2211,6 +2297,14 @@ class McpResourceReadParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
connector_id: Annotated[str | None, Field(alias="connectorId")] = None
origin_call_id: Annotated[
str | None,
Field(
alias="originCallId",
description="Originating MCP tool call used to select the resource's app.",
),
] = None
server: str
thread_id: Annotated[str | None, Field(alias="threadId")] = None
uri: str
@@ -2235,6 +2329,12 @@ class McpServerMigration(BaseModel):
name: str
class McpServerOauthClientRegistration(Enum):
auto = "auto"
cimd = "cimd"
dcr = "dcr"
class McpServerOauthLoginCompletedNotification(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -2249,6 +2349,13 @@ class McpServerOauthLoginParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
client_registration: Annotated[
McpServerOauthClientRegistration | None,
Field(
alias="clientRegistration",
description="Registration strategy for this login only; omission selects automatic discovery.",
),
] = None
name: str
scopes: list[str] | None = None
thread_id: Annotated[str | None, Field(alias="threadId")] = None
@@ -2480,6 +2587,13 @@ class ModelUpgradeInfo(BaseModel):
migration_markdown: Annotated[str | None, Field(alias="migrationMarkdown")] = None
model: str
model_link: Annotated[str | None, Field(alias="modelLink")] = None
retirement_at: Annotated[
int | None,
Field(
alias="retirementAt",
description="Informational Unix timestamp for this upgrade's scheduled retirement, if known.",
),
] = None
upgrade_copy: Annotated[str | None, Field(alias="upgradeCopy")] = None
@@ -2524,6 +2638,12 @@ class MultiAgentMode(RootModel[MultiAgentModeValue | CustomMultiAgentMode]):
]
class MultiAgentVersion(Enum):
disabled = "disabled"
v1 = "v1"
v2 = "v2"
class NetworkAccess(Enum):
restricted = "restricted"
enabled = "enabled"
@@ -2605,6 +2725,15 @@ class NonSteerableTurnKind(Enum):
compact = "compact"
class NullableGetAccountTokenUsageParams(RootModel[GetAccountTokenUsageParams | None]):
model_config = ConfigDict(
populate_by_name=True,
)
root: Annotated[
GetAccountTokenUsageParams | None, Field(title="Nullable_GetAccountTokenUsageParams")
]
class PatchApplyStatus(Enum):
in_progress = "inProgress"
completed = "completed"
@@ -2710,6 +2839,8 @@ class PlanType(str, Enum):
enterprise_cbp_usage_based = "enterprise_cbp_usage_based"
enterprise = "enterprise"
edu = "edu"
edu_plus = "edu_plus"
edu_pro = "edu_pro"
unknown = "unknown"
@classmethod
@@ -2751,6 +2882,13 @@ class PluginInstallParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
install_attempt_id: Annotated[
str | None,
Field(
alias="installAttemptId",
description="Client-generated identifier used to correlate one installation attempt.",
),
] = None
marketplace_path: Annotated[AbsolutePathBuf | None, Field(alias="marketplacePath")] = None
plugin_name: Annotated[str, Field(alias="pluginName")]
remote_marketplace_name: Annotated[str | None, Field(alias="remoteMarketplaceName")] = None
@@ -3129,6 +3267,27 @@ class ProcessTerminalSize(BaseModel):
rows: Annotated[int, Field(description="Terminal height in character cells.", ge=0)]
class ProjectChangeType(Enum):
created = "created"
updated = "updated"
deleted = "deleted"
class ProjectChangedNotification(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
change_type: Annotated[ProjectChangeType, Field(alias="changeType")]
project_id: Annotated[str, Field(alias="projectId")]
class ProjectRoot(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
path: AbsolutePathBuf
class RateLimitReachedType(Enum):
rate_limit_reached = "rate_limit_reached"
workspace_owner_credits_depleted = "workspace_owner_credits_depleted"
@@ -3798,6 +3957,40 @@ class SendAddCreditsNudgeEmailResponse(BaseModel):
status: AddCreditsNudgeEmailStatus
class ServerDiagnosticsGauge(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
name: str
value: Annotated[int, Field(ge=0)]
class ServerDiagnosticsProcess(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
id: Annotated[int, Field(ge=0)]
physical_footprint_bytes: Annotated[int | None, Field(alias="physicalFootprintBytes", ge=0)] = (
None
)
resident_memory_bytes: Annotated[int | None, Field(alias="residentMemoryBytes", ge=0)] = None
class ProjectChangedServerNotification(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["project/changed"], Field(title="Project/changedNotificationMethod")]
params: ProjectChangedNotification
class ThreadEnvironmentConnectedServerNotification(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -4370,6 +4563,21 @@ class SpendControlLimitSnapshot(BaseModel):
used: str
class StrictReviewRequiredNotification(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
started_at_ms: Annotated[
int,
Field(
alias="startedAtMs",
description="Unix timestamp (in milliseconds) when this review started.",
),
]
thread_id: Annotated[str, Field(alias="threadId")]
turn_id: Annotated[str, Field(alias="turnId")]
class SubAgentActivityKind(Enum):
started = "started"
interacted = "interacted"
@@ -4717,6 +4925,7 @@ class ImageGenerationThreadItem(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
failure: ImageGenerationFailure | None = None
id: str
result: str
revised_prompt: Annotated[str | None, Field(alias="revisedPrompt")] = None
@@ -4839,6 +5048,21 @@ class ThreadNameUpdatedNotification(BaseModel):
thread_name: Annotated[str | None, Field(alias="threadName")] = None
class ThreadProjectUpdatedNotification(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
project_id: Annotated[str | None, Field(alias="projectId")] = None
thread_id: Annotated[str, Field(alias="threadId")]
class ThreadQueueChangedNotification(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
thread_id: Annotated[str, Field(alias="threadId")]
class ThreadReadParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -4997,6 +5221,13 @@ class ThreadResumeParams(BaseModel):
thread_id: Annotated[str, Field(alias="threadId")]
class ThreadRevertedNotification(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
thread_id: Annotated[str, Field(alias="threadId")]
class ThreadRollbackParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -5018,33 +5249,22 @@ class ThreadSearchSortKey(Enum):
recency_at = "recency_at"
class ThreadSection(BaseModel):
class ThreadSectionAppearance(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.")]
color: str | None = None
icon: str | None = None
class ThreadSectionCreateParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
appearance: ThreadSectionAppearance | None = None
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,
@@ -5077,20 +5297,6 @@ class ThreadSectionListParams(BaseModel):
] = 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,
@@ -5126,6 +5332,12 @@ class ThreadSectionUpdateParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
appearance: Annotated[
ThreadSectionAppearance | None,
Field(
description="Omit to preserve appearance, use `null` to clear it, or provide a replacement."
),
] = None
name: Annotated[str, Field(description="The updated user-visible name of the section.")]
section_id: Annotated[
str,
@@ -5136,13 +5348,6 @@ class ThreadSectionUpdateParams(BaseModel):
]
class ThreadSectionUpdateResponse(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
section: ThreadSection
class ThreadSetNameParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -5293,6 +5498,21 @@ class ThreadUnsubscribeStatus(Enum):
unsubscribed = "unsubscribed"
class ThreadUsageBreakdownGroup(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
cached_input_tokens: Annotated[int | None, Field(alias="cachedInputTokens")] = None
estimated_usage_credits_micros: Annotated[int, Field(alias="estimatedUsageCreditsMicros")]
input_tokens: Annotated[int | None, Field(alias="inputTokens")] = None
model: str | None = None
net_new_input_tokens: Annotated[int | None, Field(alias="netNewInputTokens")] = None
output_tokens: Annotated[int | None, Field(alias="outputTokens")] = None
reasoning_effort: Annotated[str | None, Field(alias="reasoningEffort")] = None
speed: str | None = None
total_tokens: Annotated[int | None, Field(alias="totalTokens")] = None
class TokenUsageBreakdown(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -6423,7 +6643,7 @@ class AccountUsageReadRequest(BaseModel):
)
id: RequestId
method: Annotated[Literal["account/usage/read"], Field(title="Account/usage/readRequestMethod")]
params: None = None
params: GetAccountTokenUsageParams | None = None
class AccountWorkspaceMessagesReadRequest(BaseModel):
@@ -7101,7 +7321,7 @@ class NetworkAccessGuardianApprovalReviewAction(BaseModel):
]
class HookMetadata(BaseModel):
class HookMetadata1(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
@@ -7113,12 +7333,10 @@ class HookMetadata(BaseModel):
ge=0,
),
] = None
command: str | None = None
current_hash: Annotated[str, Field(alias="currentHash")]
display_order: Annotated[int, Field(alias="displayOrder")]
enabled: bool
event_name: Annotated[HookEventName, Field(alias="eventName")]
handler_type: Annotated[HookHandlerType, Field(alias="handlerType")]
is_managed: Annotated[bool, Field(alias="isManaged")]
key: str
matcher: str | None = None
@@ -7128,6 +7346,104 @@ class HookMetadata(BaseModel):
status_message: Annotated[str | None, Field(alias="statusMessage")] = None
timeout_sec: Annotated[int, Field(alias="timeoutSec", ge=0)]
trust_status: Annotated[HookTrustStatus, Field(alias="trustStatus")]
async_: Annotated[bool | None, Field(alias="async")] = False
command: str
handler_type: Annotated[Literal["command"], Field(alias="handlerType")]
class HookMetadata2(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
current_hash: Annotated[str, Field(alias="currentHash")]
display_order: Annotated[int, Field(alias="displayOrder")]
enabled: bool
event_name: Annotated[HookEventName, Field(alias="eventName")]
is_managed: Annotated[bool, Field(alias="isManaged")]
key: str
matcher: str | None = None
plugin_id: Annotated[str | None, Field(alias="pluginId")] = None
source: HookSource
source_path: Annotated[AbsolutePathBuf, Field(alias="sourcePath")]
status_message: Annotated[str | None, Field(alias="statusMessage")] = None
timeout_sec: Annotated[int, Field(alias="timeoutSec", ge=0)]
trust_status: Annotated[HookTrustStatus, Field(alias="trustStatus")]
handler_type: Annotated[Literal["mcpTool"], Field(alias="handlerType")]
server: str
tool: str
class PromptHookMetadata(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
current_hash: Annotated[str, Field(alias="currentHash")]
display_order: Annotated[int, Field(alias="displayOrder")]
enabled: bool
event_name: Annotated[HookEventName, Field(alias="eventName")]
is_managed: Annotated[bool, Field(alias="isManaged")]
key: str
matcher: str | None = None
plugin_id: Annotated[str | None, Field(alias="pluginId")] = None
source: HookSource
source_path: Annotated[AbsolutePathBuf, Field(alias="sourcePath")]
status_message: Annotated[str | None, Field(alias="statusMessage")] = None
timeout_sec: Annotated[int, Field(alias="timeoutSec", ge=0)]
trust_status: Annotated[HookTrustStatus, Field(alias="trustStatus")]
handler_type: Annotated[Literal["prompt"], Field(alias="handlerType")]
class AgentHookMetadata(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
current_hash: Annotated[str, Field(alias="currentHash")]
display_order: Annotated[int, Field(alias="displayOrder")]
enabled: bool
event_name: Annotated[HookEventName, Field(alias="eventName")]
is_managed: Annotated[bool, Field(alias="isManaged")]
key: str
matcher: str | None = None
plugin_id: Annotated[str | None, Field(alias="pluginId")] = None
source: HookSource
source_path: Annotated[AbsolutePathBuf, Field(alias="sourcePath")]
status_message: Annotated[str | None, Field(alias="statusMessage")] = None
timeout_sec: Annotated[int, Field(alias="timeoutSec", ge=0)]
trust_status: Annotated[HookTrustStatus, Field(alias="trustStatus")]
handler_type: Annotated[Literal["agent"], Field(alias="handlerType")]
class HookMetadata(
RootModel[HookMetadata1 | HookMetadata2 | PromptHookMetadata | AgentHookMetadata]
):
model_config = ConfigDict(
populate_by_name=True,
)
root: HookMetadata1 | HookMetadata2 | PromptHookMetadata | AgentHookMetadata
class HookOutputEntry(BaseModel):
@@ -7243,6 +7559,13 @@ class McpResourceReadResponse(BaseModel):
populate_by_name=True,
)
contents: list[ResourceContent]
origin_call_id: Annotated[
str | None,
Field(
alias="originCallId",
description="Originating call when the server applied app-specific resource scoping.",
),
] = None
class McpServerStatus(BaseModel):
@@ -7251,6 +7574,7 @@ class McpServerStatus(BaseModel):
)
auth_status: Annotated[McpAuthStatus, Field(alias="authStatus")]
name: str
plugin_id: Annotated[str | None, Field(alias="pluginId")] = None
resource_templates: Annotated[list[ResourceTemplate], Field(alias="resourceTemplates")]
resources: list[Resource]
server_info: Annotated[McpServerInfo | None, Field(alias="serverInfo")] = None
@@ -7307,6 +7631,13 @@ class Model(BaseModel):
is_default: Annotated[bool, Field(alias="isDefault")]
model: str
model_specialty: Annotated[str | None, Field(alias="modelSpecialty")] = None
multi_agent_version: Annotated[
MultiAgentVersion | None,
Field(
alias="multiAgentVersion",
description="Multi-agent runtime declared by this model, when available.",
),
] = None
service_tiers: Annotated[list[ModelServiceTier] | None, Field(alias="serviceTiers")] = []
supported_reasoning_efforts: Annotated[
list[ReasoningEffortOption], Field(alias="supportedReasoningEfforts")
@@ -7426,6 +7757,28 @@ class ProcessOutputDeltaNotification(BaseModel):
]
class Project(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
created_at: Annotated[int, Field(alias="createdAt")]
id: str
metadata: dict[str, str]
name: str
position: int
roots: list[ProjectRoot]
updated_at: Annotated[int, Field(alias="updatedAt")]
class QueuedSubmission(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
client_user_message_id: Annotated[str, Field(alias="clientUserMessageId")]
id: str
input: list[UserInput]
class RateLimitResetCredit(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -7671,6 +8024,21 @@ class ThreadClosedServerNotification(BaseModel):
params: ThreadClosedNotification
class ThreadRevertedServerNotification(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/reverted"], Field(title="Thread/revertedNotificationMethod")]
params: ThreadRevertedNotification
class SkillsChangedServerNotification(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -7720,6 +8088,40 @@ class ThreadGoalClearedServerNotification(BaseModel):
params: ThreadGoalClearedNotification
class ThreadQueueChangedServerNotification(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/queue/changed"], Field(title="Thread/queue/changedNotificationMethod")
]
params: ThreadQueueChangedNotification
class ThreadProjectUpdatedServerNotification(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/project/updated"], Field(title="Thread/project/updatedNotificationMethod")
]
params: ThreadProjectUpdatedNotification
class HookStartedServerNotification(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -7752,6 +8154,24 @@ class TurnDiffUpdatedServerNotification(BaseModel):
params: TurnDiffUpdatedNotification
class AutoApprovalReviewStrictReviewRequiredServerNotification(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["autoApprovalReview/strictReviewRequired"],
Field(title="AutoApprovalReview/strictReviewRequiredNotificationMethod"),
]
params: StrictReviewRequiredNotification
class CommandExecOutputDeltaServerNotification(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -8231,6 +8651,7 @@ class AgentMessageThreadItem(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
delivery: AgentMessageDelivery | None = None
id: str
memory_citation: Annotated[MemoryCitation | None, Field(alias="memoryCitation")] = None
phase: MessagePhase | None = None
@@ -8515,6 +8936,51 @@ class ThreadResumeInitialTurnsPageParams(BaseModel):
] = None
class ThreadSection(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
appearance: Annotated[
ThreadSectionAppearance | None,
Field(description="Optional appearance synchronized across clients."),
] = None
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 ThreadSectionCreateResponse(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
section: ThreadSection
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 ThreadSectionUpdateResponse(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
section: ThreadSection
class ThreadSettings(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -8603,6 +9069,16 @@ class ThreadUnsubscribeResponse(BaseModel):
status: ThreadUnsubscribeStatus
class ThreadUsage(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
estimated_usage_credits_micros: Annotated[int, Field(alias="estimatedUsageCreditsMicros")]
estimated_usage_usd_micros: Annotated[int | None, Field(alias="estimatedUsageUsdMicros")] = None
groups: list[ThreadUsageBreakdownGroup]
thread_id: Annotated[str, Field(alias="threadId")]
class ToolsV2(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -9140,6 +9616,23 @@ class GetAccountRateLimitsResponse(BaseModel):
] = None
class GetAccountTokenUsageResponse(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
daily_usage_buckets: Annotated[
list[AccountTokenUsageDailyBucket] | None, Field(alias="dailyUsageBuckets")
] = None
summary: AccountTokenUsageSummary
thread_usage: Annotated[
ThreadUsage | None,
Field(
alias="threadUsage",
description="Estimated usage when a thread was requested and its billing route is available.",
),
] = None
class GetWorkspaceMessagesResponse(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -9771,10 +10264,15 @@ class ConfigRequirements(BaseModel):
allowed_windows_sandbox_implementations: Annotated[
list[WindowsSandboxSetupMode] | None, Field(alias="allowedWindowsSandboxImplementations")
] = None
auto_review: Annotated[AutoReviewRequirements | None, Field(alias="autoReview")] = None
browser_use: Annotated[BrowserUseRequirements | None, Field(alias="browserUse")] = None
chatgpt_base_url: Annotated[str | None, Field(alias="chatgptBaseUrl")] = None
check_for_update_on_startup: Annotated[bool | None, Field(alias="checkForUpdateOnStartup")] = (
None
)
cli_auth_credentials_store: Annotated[
CliAuthCredentialsStoreMode | None, Field(alias="cliAuthCredentialsStore")
] = 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")] = (
@@ -10065,6 +10563,13 @@ class Thread(BaseModel):
preview: Annotated[
str, Field(description="Usually the first user message in the thread, if available.")
]
project_id: Annotated[
str | None,
Field(
alias="projectId",
description="Canonical project assignment owned by app-server, if any.",
),
] = None
recency_at: Annotated[
int | None,
Field(
@@ -10691,10 +11196,14 @@ class ServerNotification(
| ThreadDeletedServerNotification
| ThreadUnarchivedServerNotification
| ThreadClosedServerNotification
| ThreadRevertedServerNotification
| SkillsChangedServerNotification
| ThreadNameUpdatedServerNotification
| ThreadGoalUpdatedServerNotification
| ThreadGoalClearedServerNotification
| ThreadQueueChangedServerNotification
| ProjectChangedServerNotification
| ThreadProjectUpdatedServerNotification
| ThreadEnvironmentConnectedServerNotification
| ThreadEnvironmentDisconnectedServerNotification
| ThreadSettingsUpdatedServerNotification
@@ -10708,6 +11217,7 @@ class ServerNotification(
| ItemStartedServerNotification
| ItemAutoApprovalReviewStartedServerNotification
| ItemAutoApprovalReviewCompletedServerNotification
| AutoApprovalReviewStrictReviewRequiredServerNotification
| ItemCompletedServerNotification
| ItemAgentMessageDeltaServerNotification
| ItemPlanDeltaServerNotification
@@ -10767,10 +11277,14 @@ class ServerNotification(
| ThreadDeletedServerNotification
| ThreadUnarchivedServerNotification
| ThreadClosedServerNotification
| ThreadRevertedServerNotification
| SkillsChangedServerNotification
| ThreadNameUpdatedServerNotification
| ThreadGoalUpdatedServerNotification
| ThreadGoalClearedServerNotification
| ThreadQueueChangedServerNotification
| ProjectChangedServerNotification
| ThreadProjectUpdatedServerNotification
| ThreadEnvironmentConnectedServerNotification
| ThreadEnvironmentDisconnectedServerNotification
| ThreadSettingsUpdatedServerNotification
@@ -10784,6 +11298,7 @@ class ServerNotification(
| ItemStartedServerNotification
| ItemAutoApprovalReviewStartedServerNotification
| ItemAutoApprovalReviewCompletedServerNotification
| AutoApprovalReviewStrictReviewRequiredServerNotification
| ItemCompletedServerNotification
| ItemAgentMessageDeltaServerNotification
| ItemPlanDeltaServerNotification
@@ -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.147.0",
"runtime_pin": "0.149.0",
"dependencies": [
"pydantic>=2.12",
"openai-codex-cli-bin==0.147.0",
"openai-codex-cli-bin==0.149.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.147.0",
"runtime_pin": "0.149.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.147.0",
"0.149.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.147.0",
"version": "0.149.0",
"dependencies": [
"pydantic>=2.12",
"openai-codex-cli-bin==0.147.0",
"openai-codex-cli-bin==0.149.0",
],
}
assert (
'__version__ = "0.147.0"'
'__version__ = "0.149.0"'
not in (staged / "src" / "openai_codex" / "__init__.py").read_text()
)
assert (
'client_version: str = "0.147.0"'
'client_version: str = "0.149.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.147.0")
staged = script.stage_python_sdk_package(staging_dir, "0.149.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.147.0",
"0.149.0",
)
runtime_stage = script.stage_python_runtime_package(
tmp_path / "runtime-stage",
"0.147.0",
"0.149.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.147.0",
"runtime_version": "0.147.0",
"sdk_version": "0.149.0",
"runtime_version": "0.149.0",
"sdk_dependencies": [
"pydantic>=2.12",
"openai-codex-cli-bin==0.147.0",
"openai-codex-cli-bin==0.149.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.147.0",
"0.149.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.147.0"]
assert calls == ["generate_types", "stage_sdk:0.149.0"]
def test_stage_runtime_stages_package_without_type_generation(tmp_path: Path) -> None:
+1 -1
View File
@@ -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.147.0"
assert importlib.metadata.version("openai-codex-cli-bin") == "0.149.0"
env = os.environ.copy()
env.pop("CODEX_EXEC_PATH", None)
python_bin = str(Path(sys.executable).parent)
+11 -11
View File
@@ -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-08-19T00:00:00Z"
openai-codex-cli-bin = "2026-08-21T05:44:00Z"
[[package]]
name = "annotated-types"
@@ -306,7 +306,7 @@ test = [
[package.metadata]
requires-dist = [
{ name = "openai-codex-cli-bin", specifier = "==0.147.0" },
{ name = "openai-codex-cli-bin", specifier = "==0.149.0" },
{ name = "pydantic", specifier = ">=2.12" },
]
@@ -325,17 +325,17 @@ test = [
[[package]]
name = "openai-codex-cli-bin"
version = "0.147.0"
version = "0.149.0"
source = { registry = "https://pypi.org/simple" }
wheels = [
{ 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" },
{ url = "https://files.pythonhosted.org/packages/38/47/2bc9a23d0d2dbcf515287b51719de3731c45c54708d31825da72e4bfb2ab/openai_codex_cli_bin-0.149.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:75d6cc460928053d7cf4ab7311529b62c9c023abef2887f1da2de0bbda04d9a0", size = 120217719, upload-time = "2026-08-21T05:42:17.253Z" },
{ url = "https://files.pythonhosted.org/packages/c0/ad/208c83aa56532a41fe1a5895dc27191f95b9fcd6d3e2b027031e6b527c01/openai_codex_cli_bin-0.149.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2a6865f3d827a2f010983753add06cb7eacd8e135679da5c6b2ee0f8a4c7e594", size = 110399883, upload-time = "2026-08-21T05:42:29.583Z" },
{ url = "https://files.pythonhosted.org/packages/b6/6f/f35f5c15ea8e2a2136b1577dd2998ff535eaec31678131146b742e3621e9/openai_codex_cli_bin-0.149.0-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:986ee1c12f04065a390ab46f92c7f7561aea29c136872a65e834d58ecf43eb4f", size = 114097934, upload-time = "2026-08-21T05:42:40.977Z" },
{ url = "https://files.pythonhosted.org/packages/5f/99/b5eb1f18ee446996dc1622bd1cd484e90f91c187ab0d66516064ae8abf06/openai_codex_cli_bin-0.149.0-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:8134aa26af0eb8ac87793058ae1b83621e5d8458a4e664502f0647742499f2c1", size = 123378423, upload-time = "2026-08-21T05:42:52.626Z" },
{ url = "https://files.pythonhosted.org/packages/9b/4a/ec1b95fb43b2553be4b396999146c9f70fb1e06f16651aa96d6365d43c98/openai_codex_cli_bin-0.149.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:6730ea9b54e00cd4576ddfc8fe3338ec41c24d327a2861240ecd79deab2b889a", size = 114097931, upload-time = "2026-08-21T05:43:03.362Z" },
{ url = "https://files.pythonhosted.org/packages/2f/6f/0650fcfaefd6bbea6764e10fa19512fa13b418936674ba238b747dafc930/openai_codex_cli_bin-0.149.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:620c53b4a3ce635fa8585659ea0af08c8c4ce49705ef30bb06f269d0b53fbd52", size = 123378421, upload-time = "2026-08-21T05:43:13.773Z" },
{ url = "https://files.pythonhosted.org/packages/68/89/d9f436c049c67a8c92eaca2407a2d13f8c74e69dcb27560633b878986f2d/openai_codex_cli_bin-0.149.0-py3-none-win_amd64.whl", hash = "sha256:fc1a9981b76a93d9375f0ed567768798a6f236f47d8026e3dca83bfa4eff0e1b", size = 135361508, upload-time = "2026-08-21T05:43:23.785Z" },
{ url = "https://files.pythonhosted.org/packages/1e/69/9c0030b9531e47a9fe6d9d4da6b154aef7340d9b053b7fa3dd1a2fe8f90d/openai_codex_cli_bin-0.149.0-py3-none-win_arm64.whl", hash = "sha256:05bc14a86033f4edf4e703be72d3d36372582d681c7dbbfdef15e9f0561774ec", size = 125269074, upload-time = "2026-08-21T05:43:31.612Z" },
]
[[package]]