import { createStudioAssistantMessage, createStudioRun } from '../../domain/factories' import type { StudioKind, StudioMessagePart, StudioRun, StudioRuntimeTurnPlan, StudioSession } from '../../domain/types' import { buildStudioSubagentPrompt } from '../../prompts/subagent-prompt' import type { StudioResolvedSkill } from '../tools/tool-runtime-context' export function buildDraftRun( session: StudioSession, inputText: string, metadata?: Record ): StudioRun { return createStudioRun({ sessionId: session.id, inputText, activeAgent: session.agentType, metadata }) } export function buildDraftAssistantMessage(session: StudioSession) { return createStudioAssistantMessage({ sessionId: session.id, agent: session.agentType }) } export function buildSubagentPrompt(input: { agentType: 'reviewer' | 'designer' inputText: string files?: string[] skillName?: string skill?: StudioResolvedSkill studioKind?: StudioKind }): string { return buildStudioSubagentPrompt({ agentType: input.agentType, workflowInput: input.inputText, files: input.files, skill: input.skill, requestedSkillName: input.skillName, studioKind: input.studioKind }) } export function finalizeRunState(input: { run: StudioRun outcome: 'continue' | 'stop' | 'compact' }): StudioRun { return { ...input.run, status: input.outcome === 'stop' ? 'failed' : 'completed', completedAt: new Date().toISOString(), error: input.outcome === 'stop' ? 'Run stopped after tool failure or rejection' : undefined } } export function failRunState(run: StudioRun, error: string): StudioRun { return { ...run, status: 'failed', completedAt: new Date().toISOString(), error } } export function cancelRunState(run: StudioRun, reason: string): StudioRun { return { ...run, status: 'cancelled', completedAt: new Date().toISOString(), error: reason, } } export function extractLatestAssistantText(parts: StudioMessagePart[]): string { const textPart = [...parts].reverse().find((part) => part.type === 'text') return textPart?.type === 'text' ? textPart.text : '' } export function withResolvedPlan(input: T): T { return input } function readRunStopReason(run: StudioRun): string | undefined { const autonomy = run.metadata?.autonomy if (!autonomy || typeof autonomy !== 'object' || Array.isArray(autonomy)) { return undefined } const stopReason = (autonomy as Record).stopReason return typeof stopReason === 'string' && stopReason.trim() ? stopReason : undefined }