Use captured step settings for tool planning and execution (#44242)

## Why

After a model change within a turn, tools could still use the turn's original model capabilities, output limits, and telemetry attribution.

## What changed

- Build each step's tool plan from its captured model settings.
- Use those settings for image support and detail, command and MCP output truncation, extension metadata, and tool telemetry.
- Preserve the issuing step's model for delayed command completion events while allowing later `write_stdin` calls to use their own step's output limits.

## Testing

Add regression coverage for model changes within a turn, including tool replanning, Code Mode execution, image handling, MCP tool and resource output limits, extension settings, and delayed command completion.

GitOrigin-RevId: ef991598e89a846889baf770a0c9e12e56886d5d
This commit is contained in:
Abhinav authored and copyberry committed 2026-09-09 17:45:37 +00:00
1 parent ed4ca07ba6
commit 205f3671e1
24 files changed
+1053 -241

No files matched your search

+2 -6
View File
@@ -3670,13 +3670,10 @@ impl Session {
});
extension_data.insert(selected_plugins.clone());
turn_context.extension_data.insert(selected_plugins);
// Tool availability still follows the admitted turn; the async message
// description comes from the captured step model.
let tool_router = turn::built_tools(
self.as_ref(),
turn_context.as_ref(),
// TODO(CDXENT-441): use the step scoped model
turn_context.model_info(),
&settings.model_info,
settings.model_info.model_messages.as_ref(),
&environments,
&mcp,
@@ -3685,8 +3682,7 @@ impl Session {
)
.or_cancel(cancellation_token)
.await??;
// Publish inventory after planning rather than during finalization, so constructing
// additional candidate plans cannot overwrite turn-wide metadata.
// Publish inventory only after the step's tool plan has been finalized.
if turn_context
.config
.tool_registry