[codex] Add optional IDs to response items (#28812)

## Why

`ResponseItem` variants do not have a consistent internal ID shape: some
variants carry required IDs, some carry optional IDs, and some cannot
represent an ID at all. The existing fields also use inconsistent serde,
TypeScript, and JSON-schema annotations. A single enum-level access path
is needed before history recording can assign and retain IDs.

This PR establishes that internal model only. It intentionally does not
generate or serialize IDs; allocation and wire persistence are isolated
in the stacked follow-up.

## What changed

- Give every concrete `ResponseItem` variant an `Option<String>` ID
field.
- Apply the same internal-only annotations to every ID field:
`#[serde(default, skip_serializing)]`, `#[ts(skip)]`, and
`#[schemars(skip)]`.
- Add `ResponseItem::id()` and `ResponseItem::set_id()` as the shared
accessors.
- Preserve IDs when history items are rewritten for truncation.
- Adapt consumers that previously assumed reasoning and image-generation
IDs were required.
- Regenerate app-server schemas so the hidden fields are represented
consistently.

The serde catch-all `ResponseItem::Other` remains ID-less because it
must remain a unit variant.

## Test plan

- `cargo check --tests -p codex-core -p codex-api -p codex-rollout-trace
-p codex-image-generation-extension`
- `just test -p codex-protocol`
- `just test -p codex-app-server-protocol`
- `just test -p codex-api -p codex-rollout-trace -p
codex-image-generation-extension`
- `just test -p codex-core event_mapping`
This commit is contained in:
pakrym-oai
2026-06-17 18:27:43 -07:00
committed by GitHub
Unverified
parent c274a83f8b
commit dbd2857f4b
36 changed files with 278 additions and 258 deletions
@@ -11236,13 +11236,6 @@
},
"type": "array"
},
"id": {
"type": [
"string",
"null"
],
"writeOnly": true
},
"metadata": {
"anyOf": [
{
@@ -11384,14 +11377,6 @@
"null"
]
},
"id": {
"description": "Legacy id field retained for compatibility with older payloads.",
"type": [
"string",
"null"
],
"writeOnly": true
},
"metadata": {
"anyOf": [
{
@@ -11429,13 +11414,6 @@
"call_id": {
"type": "string"
},
"id": {
"type": [
"string",
"null"
],
"writeOnly": true
},
"metadata": {
"anyOf": [
{
@@ -11484,13 +11462,6 @@
"execution": {
"type": "string"
},
"id": {
"type": [
"string",
"null"
],
"writeOnly": true
},
"metadata": {
"anyOf": [
{
@@ -11562,13 +11533,6 @@
"call_id": {
"type": "string"
},
"id": {
"type": [
"string",
"null"
],
"writeOnly": true
},
"input": {
"type": "string"
},
@@ -11705,13 +11669,6 @@
}
]
},
"id": {
"type": [
"string",
"null"
],
"writeOnly": true
},
"metadata": {
"anyOf": [
{
@@ -11745,7 +11702,11 @@
{
"properties": {
"id": {
"type": "string"
"description": "Existing provider ID retained on serialized history for compatibility.",
"type": [
"string",
"null"
]
},
"metadata": {
"anyOf": [
@@ -11778,7 +11739,6 @@
}
},
"required": [
"id",
"result",
"status",
"type"