[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
+5 -45
View File
@@ -2289,13 +2289,6 @@
},
"type": "array"
},
"id": {
"type": [
"string",
"null"
],
"writeOnly": true
},
"metadata": {
"anyOf": [
{
@@ -2437,14 +2430,6 @@
"null"
]
},
"id": {
"description": "Legacy id field retained for compatibility with older payloads.",
"type": [
"string",
"null"
],
"writeOnly": true
},
"metadata": {
"anyOf": [
{
@@ -2482,13 +2467,6 @@
"call_id": {
"type": "string"
},
"id": {
"type": [
"string",
"null"
],
"writeOnly": true
},
"metadata": {
"anyOf": [
{
@@ -2537,13 +2515,6 @@
"execution": {
"type": "string"
},
"id": {
"type": [
"string",
"null"
],
"writeOnly": true
},
"metadata": {
"anyOf": [
{
@@ -2615,13 +2586,6 @@
"call_id": {
"type": "string"
},
"id": {
"type": [
"string",
"null"
],
"writeOnly": true
},
"input": {
"type": "string"
},
@@ -2758,13 +2722,6 @@
}
]
},
"id": {
"type": [
"string",
"null"
],
"writeOnly": true
},
"metadata": {
"anyOf": [
{
@@ -2798,7 +2755,11 @@
{
"properties": {
"id": {
"type": "string"
"description": "Existing provider ID retained on serialized history for compatibility.",
"type": [
"string",
"null"
]
},
"metadata": {
"anyOf": [
@@ -2831,7 +2792,6 @@
}
},
"required": [
"id",
"result",
"status",
"type"