Bin29's picture
Sync from main: e764154 feat(plot-skill): add math-exam-diagram SKILL.md for exam-style math figures
abcf568
import { InMemoryStudioEventBus } from '../../../events/event-bus'
import { createStudioUserMessage } from '../../../domain/factories'
import { logPlotStudioTiming, readElapsedMs } from '../../../observability/plot-studio-timing'
import { buildDraftAssistantMessage } from '../session-runner-helpers'
import { buildStudioWorkContext } from '../work-context'
import type { StudioSession, StudioWorkContext } from '../../../domain/types'
import type {
StudioPreparedRunContext,
StudioRunRequestInput,
StudioSessionRunnerDependencies
} from './dependency-center'
import { hasUsableCustomApiConfig } from './factory'
export async function buildWorkContext(
deps: Pick<StudioSessionRunnerDependencies, 'workStore' | 'workResultStore' | 'taskStore' | 'sessionEventStore'>,
input: {
session: StudioSession
inputText: string
},
): Promise<StudioWorkContext> {
const draftAssistantMessage = buildDraftAssistantMessage(input.session)
const workContext = await buildStudioWorkContext({
sessionId: input.session.id,
agent: input.session.agentType,
assistantMessage: draftAssistantMessage,
workStore: deps.workStore,
workResultStore: deps.workResultStore,
taskStore: deps.taskStore,
sessionEventStore: deps.sessionEventStore
})
return workContext ?? {
sessionId: input.session.id,
agent: input.session.agentType
}
}
export async function prepareRun(
deps: StudioSessionRunnerDependencies,
input: StudioRunRequestInput,
): Promise<StudioPreparedRunContext> {
const prepareStartedAt = Date.now()
const workContext = await deps.buildWorkContext(input)
const run = deps.createRun(input.session, input.inputText, input.runMetadata)
const persistedRun = deps.runStore ? await deps.runStore.create(run) : run
await deps.messageStore.createUserMessage(createStudioUserMessage({
sessionId: input.session.id,
text: input.inputText
}))
const assistantMessage = await deps.createAssistantMessage(input.session, persistedRun.id)
const eventBus = deps.sharedEventBus ?? new InMemoryStudioEventBus()
logPlotStudioTiming(input.session.studioKind, 'run.started', {
sessionId: input.session.id,
runId: persistedRun.id,
assistantMessageId: assistantMessage.id,
prepareDurationMs: readElapsedMs(prepareStartedAt),
hasCustomApiConfig: hasUsableCustomApiConfig(input.customApiConfig),
})
const runningRun = deps.runStore
? await deps.runStore.update(persistedRun.id, { status: 'running' }) ?? { ...persistedRun, status: 'running' }
: { ...persistedRun, status: 'running' as const }
eventBus.publish({
type: 'run_updated',
run: runningRun
})
return {
input,
workContext,
run: runningRun,
assistantMessage,
eventBus
}
}