mirror of
https://github.com/openai/codex.git
synced 2026-11-09 20:50:33 +00:00
Allow deferring plain-text MCP output in thread item listings (#60390)
## What changed Add experimental `deferOutput.mcpToolCall` support to `thread/items/list` requests scoped to a `turnId`. Successful, completed MCP calls with nonempty, unannotated plain-text results can return empty `result.content` with `outputDeferred: true`. Clients can retrieve the saved output through `thread/items/read`; connector identity remains on the listed item. Keep rich results, JSON or fenced text, app UI results, and built-in `codex_app` results inline. Preserve plain-text output when creating bounded previews of oversized MCP results so those previews remain eligible for deferral. Reads return the saved preview when output exceeds the 64 KiB history limit. ## Testing Extend thread history integration coverage for independent and combined command/MCP deferral, experimental capability gating, excluded result types, connector identity, oversized previews, and retrieval of deferred items. GitOrigin-RevId: 5c160b30a4eac2a9b70e3fa65b6dbd83e935338b
This commit is contained in:
@@ -361,6 +361,21 @@ pub struct CallToolResult {
|
||||
pub meta: Option<serde_json::Value>,
|
||||
}
|
||||
|
||||
/// Returns display text from an unannotated MCP text block. Some tools encode
|
||||
/// sources and UI data as JSON or fenced text, which history must keep inline.
|
||||
pub fn plain_output_text(block: &serde_json::Value) -> Option<&str> {
|
||||
let fields = block.as_object()?;
|
||||
if fields.len() != 2 || fields.get("type")?.as_str()? != "text" {
|
||||
return None;
|
||||
}
|
||||
let text = fields.get("text")?.as_str()?;
|
||||
let trimmed = text.trim_start_matches(|ch: char| ch.is_whitespace() || ch == '\u{feff}');
|
||||
if trimmed.starts_with(['{', '[']) || trimmed.starts_with("```") || trimmed.starts_with("~~~") {
|
||||
return None;
|
||||
}
|
||||
Some(text)
|
||||
}
|
||||
|
||||
// === Adapter helpers ===
|
||||
//
|
||||
// These types and conversions intentionally live in `codex-protocol` so other crates can convert
|
||||
|
||||
Reference in New Issue
Block a user