import type { AssistantConversationItem, AssistantSessionState } from "../types/assistant"; export interface AssistantUserTurnBootstrapPayloadLike { session_id?: unknown; user_message?: unknown; message?: unknown; context?: unknown; } export interface RunAssistantUserTurnBootstrapRuntimeInput { payload: AssistantUserTurnBootstrapPayloadLike; ensureSession: (sessionId: string) => AssistantSessionState; appendItem: (sessionId: string, item: AssistantConversationItem) => void; getSession: (sessionId: string) => AssistantSessionState | null; persistSession: (session: AssistantSessionState) => void; compactWhitespace: (value: unknown) => string; repairAddressMojibake: (value: unknown) => string; resolveRuntimeAnalysisContext: (value: unknown) => { as_of_date: string | null }; messageIdFactory?: () => string; nowIso?: () => string; } export interface RunAssistantUserTurnBootstrapRuntimeOutput { session: AssistantSessionState; sessionId: string; userMessageRaw: string; userMessage: string; runtimeAnalysisContext: { as_of_date: string | null }; userItem: AssistantConversationItem; } export function runAssistantUserTurnBootstrapRuntime( input: RunAssistantUserTurnBootstrapRuntimeInput ): RunAssistantUserTurnBootstrapRuntimeOutput { const session = input.ensureSession(String(input.payload.session_id ?? "")); const sessionId = session.session_id; const userMessageRaw = String(input.payload.user_message ?? input.payload.message ?? "").trim(); const repairedUserMessage = input.compactWhitespace(input.repairAddressMojibake(userMessageRaw)); const userMessage = repairedUserMessage || userMessageRaw; const runtimeAnalysisContext = input.resolveRuntimeAnalysisContext(input.payload?.context); const userItem: AssistantConversationItem = { message_id: (input.messageIdFactory ?? (() => "msg-unknown"))(), session_id: sessionId, role: "user", text: userMessage, reply_type: null, created_at: (input.nowIso ?? (() => new Date().toISOString()))(), trace_id: null, debug: null }; input.appendItem(sessionId, userItem); const sessionAfterUserAppend = input.getSession(sessionId); if (sessionAfterUserAppend) { input.persistSession(sessionAfterUserAppend); } return { session, sessionId, userMessageRaw, userMessage, runtimeAnalysisContext, userItem }; }