feat(agent,coding-agent): per-tool executionMode override for sequential tool execution (#3345)
* feat(agent,coding-agent): add per-tool executionMode field to AgentTool and ToolDefinition Add optional executionMode?: ToolExecutionMode to AgentTool and ToolDefinition interfaces. Propagate through wrapToolDefinition and createToolDefinitionFromAgentTool. No behavioral change yet — agent loop will read this field in a follow-up. * feat(agent): support per-tool executionMode override for sequential execution When a tool defines executionMode='sequential', the agent loop forces sequential execution of all tool calls in that batch, even if the global config is parallel. * feat(coding-agent): re-export ToolExecutionMode from @mariozechner/pi-agent-core Makes the type available to extensions that want to set executionMode on tool definitions. * feat(coding-agent): add tic-tac-toe extension example with executionMode: sequential Demonstrates per-tool executionMode: the agent plays via move/play tool calls that share a cursor. Without sequential execution, play can resolve before earlier moves finish, landing on the wrong cell.
This commit is contained in:
@@ -341,7 +341,10 @@ async function executeToolCalls(
|
||||
emit: AgentEventSink,
|
||||
): Promise<ToolResultMessage[]> {
|
||||
const toolCalls = assistantMessage.content.filter((c) => c.type === "toolCall");
|
||||
if (config.toolExecution === "sequential") {
|
||||
const hasSequentialToolCall = toolCalls.some(
|
||||
(tc) => currentContext.tools?.find((t) => t.name === tc.name)?.executionMode === "sequential",
|
||||
);
|
||||
if (config.toolExecution === "sequential" || hasSequentialToolCall) {
|
||||
return executeToolCallsSequential(currentContext, assistantMessage, toolCalls, config, signal, emit);
|
||||
}
|
||||
return executeToolCallsParallel(currentContext, assistantMessage, toolCalls, config, signal, emit);
|
||||
|
||||
@@ -304,6 +304,14 @@ export interface AgentTool<TParameters extends TSchema = TSchema, TDetails = any
|
||||
signal?: AbortSignal,
|
||||
onUpdate?: AgentToolUpdateCallback<TDetails>,
|
||||
) => Promise<AgentToolResult<TDetails>>;
|
||||
/**
|
||||
* Per-tool execution mode override.
|
||||
* - "sequential": this tool must execute one at a time with other tool calls.
|
||||
* - "parallel": this tool can execute concurrently with other tool calls.
|
||||
*
|
||||
* If omitted, the default execution mode applies.
|
||||
*/
|
||||
executionMode?: ToolExecutionMode;
|
||||
}
|
||||
|
||||
/** Context snapshot passed into the low-level agent loop. */
|
||||
|
||||
Reference in New Issue
Block a user