ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.47: вынесен верхний orchestration-скелет handleMessage (bootstrap -> address attempt -> deep attempt) в единый turn runtime adapter без изменения поведения.

This commit is contained in:
2026-04-11 00:31:17 +03:00
parent 5f4e898c7c
commit 90d529f79b
6 changed files with 514 additions and 237 deletions
@@ -0,0 +1,97 @@
import type { RunAssistantAddressRuntimeOutput } from "./assistantAddressRuntimeAdapter";
import type { RunAssistantUserTurnBootstrapRuntimeOutput } from "./assistantUserTurnBootstrapRuntimeAdapter";
export interface AssistantSessionOrganizationScopeContext {
knownOrganizations: string[];
selectedOrganization: string | null;
activeOrganization: string | null;
}
export interface RunAssistantTurnAttemptRuntimeAddressInput<PayloadType = unknown> {
payload: PayloadType;
sessionId: string;
userMessage: string;
sessionItems: unknown[];
runtimeAnalysisContext: { as_of_date: string | null };
sessionOrganizationScope: AssistantSessionOrganizationScopeContext;
}
export interface RunAssistantTurnAttemptRuntimeDeepInput<PayloadType = unknown> {
payload: PayloadType;
sessionId: string;
questionId: string;
userMessage: string;
runtimeAnalysisContext: unknown;
sessionInvestigationState: unknown;
addressRuntimeMetaForDeep: Record<string, unknown> | null;
}
export interface RunAssistantTurnAttemptRuntimeInput<ResponseType = unknown, PayloadType = unknown> {
payload: PayloadType;
runUserTurnBootstrapRuntime: (payload: PayloadType) => RunAssistantUserTurnBootstrapRuntimeOutput;
resolveSessionOrganizationScopeContext: (
userMessage: string,
sessionItems: unknown[]
) => AssistantSessionOrganizationScopeContext;
runAddressAttemptRuntime: (
input: RunAssistantTurnAttemptRuntimeAddressInput<PayloadType>
) => Promise<RunAssistantAddressRuntimeOutput<ResponseType>>;
runDeepTurnAttemptRuntime: (
input: RunAssistantTurnAttemptRuntimeDeepInput<PayloadType>
) => Promise<{ response: ResponseType }>;
}
export interface RunAssistantTurnAttemptRuntimeOutput<ResponseType = unknown> {
response: ResponseType;
source: "address" | "deep";
addressRuntimeMetaForDeep: Record<string, unknown> | null;
userTurn: RunAssistantUserTurnBootstrapRuntimeOutput;
sessionOrganizationScope: AssistantSessionOrganizationScopeContext;
}
export async function runAssistantTurnAttemptRuntime<ResponseType = unknown, PayloadType = unknown>(
input: RunAssistantTurnAttemptRuntimeInput<ResponseType, PayloadType>
): Promise<RunAssistantTurnAttemptRuntimeOutput<ResponseType>> {
const userTurn = input.runUserTurnBootstrapRuntime(input.payload);
const sessionOrganizationScope = input.resolveSessionOrganizationScopeContext(
userTurn.userMessage,
userTurn.session.items
);
const addressRuntime = await input.runAddressAttemptRuntime({
payload: input.payload,
sessionId: userTurn.sessionId,
userMessage: userTurn.userMessage,
sessionItems: userTurn.session.items,
runtimeAnalysisContext: userTurn.runtimeAnalysisContext,
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({
payload: input.payload,
sessionId: userTurn.sessionId,
questionId: userTurn.userItem.message_id,
userMessage: userTurn.userMessage,
runtimeAnalysisContext: userTurn.runtimeAnalysisContext,
sessionInvestigationState: userTurn.session.investigation_state,
addressRuntimeMetaForDeep
});
return {
response: deepTurnRuntime.response,
source: "deep",
addressRuntimeMetaForDeep,
userTurn,
sessionOrganizationScope
};
}