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
2026-07-13 23:37:35 +00:00
committed by copyberry
parent 090f4de37b
commit 2ca20d5224
38 changed files with 329 additions and 4 deletions
+1
View File
@@ -206,6 +206,7 @@ pub fn parse_turn_item(item: &ResponseItem) -> Option<TurnItem> {
id: id.as_deref().unwrap_or_default().to_string(),
query,
action,
results: None,
}))
}
ResponseItem::ImageGenerationCall {
+4
View File
@@ -509,6 +509,7 @@ fn parses_web_search_call() {
query: Some("weather".to_string()),
queries: None,
},
results: None,
}
),
other => panic!("expected TurnItem::WebSearch, got {other:?}"),
@@ -537,6 +538,7 @@ fn parses_web_search_open_page_call() {
action: WebSearchAction::OpenPage {
url: Some("https://example.com".to_string()),
},
results: None,
}
),
other => panic!("expected TurnItem::WebSearch, got {other:?}"),
@@ -567,6 +569,7 @@ fn parses_web_search_find_in_page_call() {
url: Some("https://example.com".to_string()),
pattern: Some("needle".to_string()),
},
results: None,
}
),
other => panic!("expected TurnItem::WebSearch, got {other:?}"),
@@ -590,6 +593,7 @@ fn parses_partial_web_search_call_without_action_as_other() {
id: "ws_partial".to_string(),
query: String::new(),
action: WebSearchAction::Other,
results: None,
}
),
other => panic!("expected TurnItem::WebSearch, got {other:?}"),
@@ -272,6 +272,7 @@ mod tests {
id: call.call_id.clone(),
query: String::new(),
action: None,
results: None,
}),
legacy_events: Vec::new(),
})
@@ -421,6 +422,7 @@ mod tests {
id: "call-extension".to_string(),
query: String::new(),
action: None,
results: None,
}
);
}