Handle partial answers in realtime routing and thread search (#51260)

## Why

Messages with the `partial_answer` phase contain answer text without declaring a terminal answer. They should remain searchable and speakable without being treated as final messages.

## What changed

- Preserve explicit `partial_answer` phases in streamed and completed realtime handoffs, bypassing legacy channel-prefix parsing and routing them to the `speakable` channel.
- Treat partial answers as nonterminal in V1 handoffs and omit the final-message prefix.
- Include partial answers in thread occurrence searches and normalize them to the final conversation channel in rollout traces.

## Testing

Extend coverage for realtime phase routing, streamed and completed handoffs, partial-answer search results, and rollout normalization. Verify that turn summaries still exclude nonterminal messages.

GitOrigin-RevId: aa183da783f6e7e0b78ddd51073cba533297e121
This commit is contained in:
rb-oai
2026-10-06 03:58:55 +00:00
committed by copyberry
parent 162fcb3976
commit 822e58cc3d
10 changed files with 243 additions and 105 deletions
@@ -1589,8 +1589,8 @@ pub struct ThreadSearchResponse {
#[ts(export_to = "v2/")]
pub struct ThreadSearchOccurrencesParams {
pub thread_id: String,
/// Case-insensitive literal substring to find in visible user messages and final assistant
/// messages.
/// Case-insensitive literal substring to find in visible user messages and both partial and
/// final assistant answers.
pub search_term: String,
/// Opaque cursor returned by a previous call for the same thread and search term.
#[ts(optional = nullable)]