ManimCat / src /studio-agent /runtime /builder-runtime.ts
Bin29's picture
Sync from main: c1ef036 chore: document docker persistence volumes
94e1b2f
import type { CustomApiConfig } from '../../types'
import type {
StudioAssistantMessage,
StudioEventBus,
StudioMessageStore,
StudioPartStore,
StudioPermissionDecision,
StudioPermissionRequest,
StudioRun,
StudioRunStore,
StudioRuntimeTurnPlan,
StudioSession,
StudioSessionEventStore,
StudioSessionStore,
StudioTaskStore,
StudioToolChoice,
StudioWorkResultStore,
StudioWorkStore
} from '../domain/types'
import type { StudioPermissionService } from '../permissions/permission-service'
import { StudioToolRegistry } from '../tools/registry'
import { StudioSessionRunner, type StudioBackgroundRunHandle } from './session-runner'
import type { StudioTurnPlanResolver } from './turn-plan-resolver'
import type {
StudioResolvedSkill,
StudioSubagentRunRequest,
StudioSubagentRunResult
} from './tool-runtime-context'
interface StudioBuilderRuntimeOptions {
registry: StudioToolRegistry
messageStore: StudioMessageStore
partStore: StudioPartStore
runStore?: StudioRunStore
sessionStore?: StudioSessionStore
sessionEventStore?: StudioSessionEventStore
permissionService?: StudioPermissionService
askForConfirmation?: (request: StudioPermissionRequest) => Promise<StudioPermissionDecision>
taskStore?: StudioTaskStore
workStore?: StudioWorkStore
workResultStore?: StudioWorkResultStore
eventBus?: StudioEventBus
resolveTurnPlan: StudioTurnPlanResolver
resolveSkill?: (name: string, session: StudioSession) => Promise<StudioResolvedSkill>
}
export class StudioBuilderRuntime {
private readonly runner: StudioSessionRunner
constructor(options: StudioBuilderRuntimeOptions) {
this.runner = new StudioSessionRunner({
registry: options.registry,
messageStore: options.messageStore,
partStore: options.partStore,
runStore: options.runStore,
sessionStore: options.sessionStore,
sessionEventStore: options.sessionEventStore,
permissionService: options.permissionService,
askForConfirmation: options.askForConfirmation,
taskStore: options.taskStore,
workStore: options.workStore,
workResultStore: options.workResultStore,
eventBus: options.eventBus,
resolveTurnPlan: options.resolveTurnPlan,
resolveSkill: options.resolveSkill
})
}
async createAssistantMessage(session: StudioSession): Promise<StudioAssistantMessage> {
return this.runner.createAssistantMessage(session)
}
createRun(session: StudioSession, inputText: string, metadata?: Record<string, unknown>): StudioRun {
return this.runner.createRun(session, inputText, metadata)
}
async executePlan(input: {
projectId: string
session: StudioSession
run: StudioRun
assistantMessage: StudioAssistantMessage
plan: StudioRuntimeTurnPlan
customApiConfig?: CustomApiConfig
toolChoice?: StudioToolChoice
}): Promise<void> {
await this.runner.runWithPlan({
projectId: input.projectId,
session: input.session,
inputText: input.run.inputText,
plan: input.plan,
customApiConfig: input.customApiConfig,
toolChoice: input.toolChoice
})
}
async run(input: {
projectId: string
session: StudioSession
inputText: string
customApiConfig?: CustomApiConfig
toolChoice?: StudioToolChoice
runMetadata?: Record<string, unknown>
}): Promise<StudioSubagentRunResult & { run: StudioRun; assistantMessage: StudioAssistantMessage }> {
return this.runner.run(input)
}
async startBackgroundRun(input: {
projectId: string
session: StudioSession
inputText: string
customApiConfig?: CustomApiConfig
toolChoice?: StudioToolChoice
runMetadata?: Record<string, unknown>
}): Promise<StudioBackgroundRunHandle> {
return this.runner.startBackgroundRun(input)
}
async runSubagent(input: StudioSubagentRunRequest): Promise<StudioSubagentRunResult> {
return this.runner.runSubagent(input)
}
}