Support typed content in contextual prompt fragments (#54776)

## Why

Contextual fragments and extension-owned world-state sections currently return strings, limiting them to text content.

## What changed

- Return `ContentItem` from fragment bodies and rendering, preserving classification and attribution. Apply text markers only to `InputText`; pass other content through unchanged.
- Allow extension prompt and world-state contributions to carry typed content, and preserve media in context-window hints.
- Hash non-text world-state fragments by their serialized content and role while retaining the existing text hashing behavior.
- Add shared content-to-tool-output conversion that preserves image references, image detail, and audio.

## Testing

Add coverage for typed world-state hashing and preservation of image content and attribution. Expand code-mode output tests to cover input text, output text, file-backed and inline images, and audio.

GitOrigin-RevId: 2ed00d466a3f169b151202f3eef71e667ea64be1
This commit is contained in:
pakrym-oai
2026-10-17 04:02:21 +00:00
committed by copyberry
parent 3b8f43a06b
commit ce0323f2f2
162 changed files with 1109 additions and 570 deletions
+3 -1
View File
@@ -3,6 +3,8 @@ use crate::context::AvailablePluginsInstructions;
#[cfg(test)]
use crate::context::ContextualUserFragment;
use crate::plugins::PluginCapabilitySummary;
#[cfg(test)]
use codex_protocol_test_support::ContentItemTestExt;
use codex_utils_string::take_bytes_at_char_boundary;
const MAX_EXPLICIT_PLUGIN_INSTRUCTIONS_BYTES: usize = 4 * 1024;
@@ -11,7 +13,7 @@ const TRUNCATED_PLUGIN_INSTRUCTIONS_SUFFIX: &str =
#[cfg(test)]
pub(crate) fn render_plugins_section(plugins: &[PluginCapabilitySummary]) -> Option<String> {
(!plugins.is_empty()).then(|| AvailablePluginsInstructions.render())
(!plugins.is_empty()).then(|| AvailablePluginsInstructions.render().expect_text())
}
pub(crate) fn render_explicit_plugin_instructions(