Spaces:
Sleeping
Sleeping
| import { createStudioOpenAIToolLoop } from '../../../orchestration/openai-tool-loop/controller' | |
| import { createStudioTurnExecutionStream } from '../tool-execution-stream' | |
| import { readRunElapsedMs } from '../../../observability/plot-studio-timing' | |
| import type { CustomApiConfig } from '../../../../types' | |
| import type { StudioToolChoice, StudioRuntimeTurnPlan } from '../../../domain/types' | |
| import type { StudioPreparedRunContext, StudioPreparedRunExecution, StudioSessionRunnerDependencies } from './dependency-center' | |
| export function createResolvedPlanExecution( | |
| deps: StudioSessionRunnerDependencies, | |
| input: { | |
| prepared: StudioPreparedRunContext | |
| plan: StudioRuntimeTurnPlan | |
| customApiConfig?: CustomApiConfig | |
| toolChoice?: StudioToolChoice | |
| abortSignal: AbortSignal | |
| }, | |
| ): StudioPreparedRunExecution { | |
| return { | |
| events: createStudioTurnExecutionStream({ | |
| projectId: input.prepared.input.projectId, | |
| session: input.prepared.input.session, | |
| run: input.prepared.run, | |
| assistantMessage: input.prepared.assistantMessage, | |
| plan: input.plan, | |
| registry: deps.registry, | |
| eventBus: input.prepared.eventBus, | |
| messageStore: deps.messageStore, | |
| partStore: deps.partStore, | |
| sessionStore: deps.sessionStore, | |
| taskStore: deps.taskStore, | |
| workStore: deps.workStore, | |
| workResultStore: deps.workResultStore, | |
| runSubagent: (request) => deps.runSubagent({ | |
| ...request, | |
| customApiConfig: input.customApiConfig, | |
| toolChoice: input.toolChoice | |
| }), | |
| resolveSkill: deps.resolveSkill, | |
| listSkills: deps.listSkills, | |
| listSkillSummaries: deps.listSkillSummaries, | |
| recordSkillUsage: deps.recordSkillUsage, | |
| setToolMetadata: (callId, metadata) => { | |
| void deps.processor.applyToolMetadata({ | |
| assistantMessage: input.prepared.assistantMessage, | |
| callId, | |
| title: metadata.title, | |
| metadata: metadata.metadata | |
| }) | |
| }, | |
| customApiConfig: input.customApiConfig, | |
| abortSignal: input.abortSignal, | |
| }) | |
| } | |
| } | |
| export function createAgentLoopExecution( | |
| deps: StudioSessionRunnerDependencies, | |
| input: { | |
| prepared: StudioPreparedRunContext | |
| customApiConfig: CustomApiConfig | |
| toolChoice?: StudioToolChoice | |
| abortSignal: AbortSignal | |
| }, | |
| ): StudioPreparedRunExecution { | |
| return { | |
| startLog: { | |
| event: 'loop.started', | |
| payload: { | |
| sessionId: input.prepared.input.session.id, | |
| runId: input.prepared.run.id, | |
| model: input.customApiConfig.model, | |
| toolChoice: input.toolChoice ?? null, | |
| runElapsedMs: readRunElapsedMs(input.prepared.run), | |
| } | |
| }, | |
| events: createStudioOpenAIToolLoop({ | |
| projectId: input.prepared.input.projectId, | |
| session: input.prepared.input.session, | |
| run: input.prepared.run, | |
| assistantMessage: input.prepared.assistantMessage, | |
| inputText: input.prepared.input.inputText, | |
| messageStore: deps.messageStore, | |
| registry: deps.registry, | |
| eventBus: input.prepared.eventBus, | |
| partStore: deps.partStore, | |
| sessionStore: deps.sessionStore, | |
| taskStore: deps.taskStore, | |
| workStore: deps.workStore, | |
| workResultStore: deps.workResultStore, | |
| workContext: input.prepared.workContext, | |
| runSubagent: (request) => deps.runSubagent({ | |
| ...request, | |
| customApiConfig: input.customApiConfig, | |
| toolChoice: input.toolChoice | |
| }), | |
| resolveSkill: deps.resolveSkill, | |
| listSkills: deps.listSkills, | |
| listSkillSummaries: deps.listSkillSummaries, | |
| recordSkillUsage: deps.recordSkillUsage, | |
| createAssistantMessage: () => deps.createAssistantMessage(input.prepared.input.session, input.prepared.run.id), | |
| setToolMetadata: (assistantMessage, callId, metadata) => { | |
| void deps.processor.applyToolMetadata({ | |
| assistantMessage, | |
| callId, | |
| title: metadata.title, | |
| metadata: metadata.metadata | |
| }) | |
| }, | |
| customApiConfig: input.customApiConfig, | |
| toolChoice: input.toolChoice, | |
| abortSignal: input.abortSignal, | |
| onCheckpoint: async (patch) => { | |
| const nextRun = deps.runStore | |
| ? await deps.runStore.update(input.prepared.run.id, patch) ?? { ...input.prepared.run, ...patch } | |
| : { ...input.prepared.run, ...patch } | |
| input.prepared.run = nextRun | |
| input.prepared.eventBus.publish({ | |
| type: 'run_updated', | |
| run: nextRun | |
| }) | |
| } | |
| }) | |
| } | |
| } | |