import { logPlotStudioTiming } from '../../../observability/plot-studio-timing' import { isStudioRunCancelledError, throwIfStudioRunCancelled } from '../run-cancellation' import type { StudioAssistantMessage, StudioRun } from '../../../domain/types' import type { StudioPreparedRunContext, StudioPreparedRunExecution, StudioSessionRunnerDependencies } from './dependency-center' import type { StudioSubagentRunResult } from '../../tools/tool-runtime-context' import { handleCancelledRun, handleFailedRun, finalizeSuccessfulRun } from './result-handler' export async function executePreparedStream( deps: StudioSessionRunnerDependencies, prepared: StudioPreparedRunContext, execution: StudioPreparedRunExecution, abortSignal: AbortSignal, ): Promise { try { throwIfStudioRunCancelled(abortSignal) if (execution.startLog) { logPlotStudioTiming(prepared.input.session.studioKind, execution.startLog.event, execution.startLog.payload) } const outcome = await deps.processor.processStream({ session: prepared.input.session, run: prepared.run, assistantMessage: prepared.assistantMessage, eventBus: prepared.eventBus, events: execution.events }) return finalizeSuccessfulRun(deps, { session: prepared.input.session, run: prepared.run, assistantMessage: prepared.assistantMessage, outcome, eventBus: prepared.eventBus }) } catch (error) { if (isStudioRunCancelledError(error)) { return handleCancelledRun(deps, { session: prepared.input.session, run: prepared.run, reason: error.reason, }) } return handleFailedRun(deps, { session: prepared.input.session, run: prepared.run, error }) } }