Expose structured standalone web search results (#32898)

## Why

Standalone web search can return structured result DTOs separately from its
model-facing text output. App-server clients need access to that data without
coupling Codex to every result type or field.

## What changed

- Preserve the optional `results` array from `/v1/alpha/search` as opaque JSON
  through web-search completion events, thread history, and app-server
  `webSearch` items.
- Keep responses from older endpoints compatible when `results` is absent, and
  allow clients to ignore result types and fields they do not understand.
- Regenerate the protocol schemas and TypeScript definitions for the optional
  field.

## Testing

- Cover responses with missing, empty, and forward-compatible result payloads.
- Verify standalone web-search results round-trip through app-server item
  notifications and thread-item conversion.

GitOrigin-RevId: 739ef5694ece5733f7b8749ec41d6bfa3f33c8c5
This commit is contained in:
briansong-oai authored and copyberry committed 2026-07-13 23:37:35 +00:00
1 parent 090f4de37b
commit 2ca20d5224
38 files changed
+329 -4

No files matched your search

+16
View File
@@ -46,6 +46,7 @@ fn web_search_item_preserves_stable_wire_shape() {
query: Some("docs".to_string()),
queries: None,
}),
results: None,
});
let value = serde_json::to_value(&item).expect("serialize extension item");
@@ -60,12 +61,27 @@ fn web_search_item_preserves_stable_wire_shape() {
"query": "docs",
"queries": null,
},
"results": null,
})
);
assert_eq!(
serde_json::from_value::<ExtensionItem>(value).expect("deserialize extension item"),
item
);
assert_eq!(
serde_json::from_value::<ExtensionItem>(json!({
"kind": "web.search",
"id": "search-1",
"query": "docs",
"action": {
"type": "search",
"query": "docs",
"queries": null,
},
}))
.expect("deserialize legacy extension item without results"),
item
);
}
#[test]