refactor(core): extract ExecutionLifecycleService for tool backgrounding (#21717)

This commit is contained in:
Adam Weidman
2026-03-12 00:03:54 -04:00
committed by GitHub
parent 949e85ca55
commit 10ab958378
13 changed files with 1580 additions and 802 deletions
+36
View File
@@ -61,12 +61,14 @@ export interface ToolInvocation<
* Executes the tool with the validated parameters.
* @param signal AbortSignal for tool cancellation.
* @param updateOutput Optional callback to stream output.
* @param setExecutionIdCallback Optional callback for tools that expose a background execution handle.
* @returns Result of the tool execution.
*/
execute(
signal: AbortSignal,
updateOutput?: (output: ToolLiveOutput) => void,
shellExecutionConfig?: ShellExecutionConfig,
setExecutionIdCallback?: (executionId: number) => void,
): Promise<TResult>;
/**
@@ -78,6 +80,40 @@ export interface ToolInvocation<
): PolicyUpdateOptions | undefined;
}
/**
* Structured payload used by tools to surface background execution metadata to
* the CLI UI.
*
* NOTE: `pid` is used as the canonical identifier for now to stay consistent
* with existing types (ExecutingToolCall.pid, ExecutionHandle.pid, etc.).
* A future rename to `executionId` is planned once the codebase is fully
* migrated — not done in this PR to keep the diff focused on the abstraction.
*/
export interface BackgroundExecutionData extends Record<string, unknown> {
pid?: number;
command?: string;
initialOutput?: string;
}
export function isBackgroundExecutionData(
data: unknown,
): data is BackgroundExecutionData {
if (typeof data !== 'object' || data === null) {
return false;
}
const pid = 'pid' in data ? data.pid : undefined;
const command = 'command' in data ? data.command : undefined;
const initialOutput =
'initialOutput' in data ? data.initialOutput : undefined;
return (
(pid === undefined || typeof pid === 'number') &&
(command === undefined || typeof command === 'string') &&
(initialOutput === undefined || typeof initialOutput === 'string')
);
}
/**
* Options for policy updates that can be customized by tool invocations.
*/