import type { RunAssistantAddressRuntimeOutput } from "./assistantAddressRuntimeAdapter"; import type { RunAssistantUserTurnBootstrapRuntimeOutput } from "./assistantUserTurnBootstrapRuntimeAdapter"; import { buildAssistantTurnAttemptAddressRuntimeInput, buildAssistantTurnAttemptDeepRuntimeInput } from "./assistantTurnAttemptInputBuilder"; export interface AssistantSessionOrganizationScopeContext { knownOrganizations: string[]; selectedOrganization: string | null; activeOrganization: string | null; } export interface RunAssistantTurnAttemptRuntimeAddressInput { payload: PayloadType; sessionId: string; userMessage: string; sessionItems: unknown[]; sessionAddressNavigationState?: unknown; runtimeAnalysisContext: { as_of_date: string | null }; sessionOrganizationScope: AssistantSessionOrganizationScopeContext; } export interface RunAssistantTurnAttemptRuntimeDeepInput { payload: PayloadType; sessionId: string; questionId: string; userMessage: string; runtimeAnalysisContext: unknown; sessionInvestigationState: unknown; addressRuntimeMetaForDeep: Record | null; } export interface RunAssistantTurnAttemptRuntimeInput { payload: PayloadType; runUserTurnBootstrapRuntime: (payload: PayloadType) => RunAssistantUserTurnBootstrapRuntimeOutput; resolveSessionOrganizationScopeContext: ( userMessage: string, sessionItems: unknown[], sessionAddressNavigationState?: unknown ) => AssistantSessionOrganizationScopeContext; runAddressAttemptRuntime: ( input: RunAssistantTurnAttemptRuntimeAddressInput ) => Promise>; runDeepTurnAttemptRuntime: ( input: RunAssistantTurnAttemptRuntimeDeepInput ) => Promise<{ response: ResponseType }>; } export interface RunAssistantTurnAttemptRuntimeOutput { response: ResponseType; source: "address" | "deep"; addressRuntimeMetaForDeep: Record | null; userTurn: RunAssistantUserTurnBootstrapRuntimeOutput; sessionOrganizationScope: AssistantSessionOrganizationScopeContext; } export async function runAssistantTurnAttemptRuntime( input: RunAssistantTurnAttemptRuntimeInput ): Promise> { const userTurn = input.runUserTurnBootstrapRuntime(input.payload); const sessionOrganizationScope = input.resolveSessionOrganizationScopeContext( userTurn.userMessage, userTurn.session.items, userTurn.session.address_navigation_state ?? null ); const addressRuntime = await input.runAddressAttemptRuntime( buildAssistantTurnAttemptAddressRuntimeInput({ payload: input.payload, userTurn, sessionOrganizationScope }) ); const addressRuntimeMetaForDeep = addressRuntime.addressRuntimeMetaForDeep ?? null; if (addressRuntime.handled && addressRuntime.response) { return { response: addressRuntime.response, source: "address", addressRuntimeMetaForDeep, userTurn, sessionOrganizationScope }; } const deepTurnRuntime = await input.runDeepTurnAttemptRuntime( buildAssistantTurnAttemptDeepRuntimeInput({ payload: input.payload, userTurn, addressRuntimeMetaForDeep }) ); return { response: deepTurnRuntime.response, source: "deep", addressRuntimeMetaForDeep, userTurn, sessionOrganizationScope }; }