File size: 1,856 Bytes
abcf568
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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<StudioSubagentRunResult & { run: StudioRun; assistantMessage: StudioAssistantMessage }> {
  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
    })
  }
}