ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.692.72 и 2.732.76 - типобезопасность turn-runtime билдера и убрал остатки слабых кастов в маппинге зависимостей: assistantTurnRuntimeInputBuilder.ts / Поднял типы в deps-адаптере до контрактов AssistantTurnRuntimeBuilderDeps (sessions/normalizer/data-layer/query/chat/log), убрал unknown/any-обертки: assistantTurnRuntimeDepsAdapter.ts

This commit is contained in:
dctouch 2026-04-11 10:24:16 +03:00
parent bf16309a29
commit 9f3749fd4a
6 changed files with 309 additions and 220 deletions

View File

@ -1850,7 +1850,47 @@ Validation:
- `assistantWave10SettlementCorrectiveRegression.test.ts` - `assistantWave10SettlementCorrectiveRegression.test.ts`
- `assistantLivingChatMode.test.ts` - `assistantLivingChatMode.test.ts`
Status: **In progress (Phase 2.1 + 2.2 + 2.3 + 2.4 + 2.5 + 2.6 + 2.7 + 2.8 + 2.9 + 2.10 + 2.11 + 2.12 + 2.13 + 2.14 + 2.15 + 2.16 + 2.17 + 2.18 + 2.19 + 2.20 + 2.21 + 2.22 + 2.23 + 2.24 + 2.25 + 2.26 + 2.27 + 2.28 + 2.29 + 2.30 + 2.31 + 2.32 + 2.33 + 2.34 + 2.35 + 2.36 + 2.37 + 2.38 + 2.39 + 2.40 + 2.41 + 2.42 + 2.43 + 2.44 + 2.45 + 2.46 + 2.47 + 2.48 + 2.49 + 2.50 + 2.51 + 2.52 + 2.53 + 2.54 + 2.55 + 2.56 + 2.57 + 2.58 + 2.59 + 2.60 + 2.61 + 2.62 + 2.63 + 2.64 + 2.65 + 2.66 + 2.67 + 2.68 completed)** Implemented in current pass (Phase 2.69 + 2.70 + 2.71 + 2.72):
1. Finalized strict deps typing in turn runtime input builder:
- `assistantTurnRuntimeInputBuilder.ts`
- completed generic `AssistantTurnRuntimeBuilderDeps<ResponseType>` wiring through address/deep runtime input contracts;
- removed residual weak casts from builder field projection.
2. Hardened turn runtime deps adapter contracts:
- `assistantTurnRuntimeDepsAdapter.ts`
- typed sessions/normalizer/data-layer/address-query/chat/log inputs directly from `AssistantTurnRuntimeBuilderDeps` contract slices;
- removed `unknown`/`any` wrappers from adapter mapping while preserving compatible handler signatures for optional args.
3. Preserved behavior of turn orchestration chain under stricter typing:
- bootstrap -> address attempt -> deep attempt flow remains unchanged at runtime.
Validation:
1. `npm run build` passed.
2. Targeted turn/deps regression pack passed:
- `assistantTurnRuntimeInputBuilder.test.ts`
- `assistantTurnRuntimeDepsAdapter.test.ts`
- `assistantTurnAttemptRuntimeAdapter.test.ts`
- `assistantAddressAttemptRuntimeAdapter.test.ts`
Implemented in current pass (Phase 2.73 + 2.74 + 2.75 + 2.76):
1. Removed remaining unsafe casts in address->living-chat bridge:
- `assistantAddressAttemptRuntimeAdapter.ts`
- replaced `mergeKnownOrganizations` dependency type with living-chat compatible contract;
- removed `as any` cast for `mergeKnownOrganizations` and removed final object cast to `RunAssistantLivingChatAttemptRuntimeInput`.
2. Added explicit mode-decision normalization before living-chat runtime handoff:
- mapped untyped `modeDecision` to typed `{ mode: string | null; reason: string | null }` contract.
3. Preserved behavior of address lane + living-chat fallback under stricter typing:
- runtime flow unchanged, only contract hardening.
Validation:
1. `npm run build` passed.
2. Targeted address/living/turn regression pack passed:
- `assistantAddressAttemptRuntimeAdapter.test.ts`
- `assistantLivingChatAttemptRuntimeAdapter.test.ts`
- `assistantLivingChatHandlerRuntimeAdapter.test.ts`
- `assistantTurnRuntimeInputBuilder.test.ts`
- `assistantTurnRuntimeDepsAdapter.test.ts`
- `assistantTurnAttemptRuntimeAdapter.test.ts`
Status: **In progress (Phase 2.1 + 2.2 + 2.3 + 2.4 + 2.5 + 2.6 + 2.7 + 2.8 + 2.9 + 2.10 + 2.11 + 2.12 + 2.13 + 2.14 + 2.15 + 2.16 + 2.17 + 2.18 + 2.19 + 2.20 + 2.21 + 2.22 + 2.23 + 2.24 + 2.25 + 2.26 + 2.27 + 2.28 + 2.29 + 2.30 + 2.31 + 2.32 + 2.33 + 2.34 + 2.35 + 2.36 + 2.37 + 2.38 + 2.39 + 2.40 + 2.41 + 2.42 + 2.43 + 2.44 + 2.45 + 2.46 + 2.47 + 2.48 + 2.49 + 2.50 + 2.51 + 2.52 + 2.53 + 2.54 + 2.55 + 2.56 + 2.57 + 2.58 + 2.59 + 2.60 + 2.61 + 2.62 + 2.63 + 2.64 + 2.65 + 2.66 + 2.67 + 2.68 + 2.69 + 2.70 + 2.71 + 2.72 + 2.73 + 2.74 + 2.75 + 2.76 completed)**
## Stage 3 (P2): Hybrid Semantic Layer (LLM + Deterministic Guards) ## Stage 3 (P2): Hybrid Semantic Layer (LLM + Deterministic Guards)

View File

@ -35,52 +35,64 @@ async function runAssistantAddressAttemptRuntime(input) {
logEvent: input.logEvent, logEvent: input.logEvent,
messageIdFactory: input.messageIdFactory messageIdFactory: input.messageIdFactory
})); }));
const tryHandleLivingChat = async (modeDecision, addressRuntimeMeta = null) => runLivingChatAttemptRuntimeSafe((0, assistantLivingChatAttemptInputBuilder_1.buildAssistantLivingChatAttemptRuntimeInput)({ const tryHandleLivingChat = async (modeDecision, addressRuntimeMeta = null) => {
sessionId: input.sessionId, const normalizedModeDecision = (() => {
userMessage: input.userMessage, if (!modeDecision || typeof modeDecision !== "object") {
sessionItems: input.sessionItems, return undefined;
modeDecision, }
sessionScope: { const candidate = modeDecision;
knownOrganizations: input.sessionScope.knownOrganizations, return {
selectedOrganization: input.sessionScope.selectedOrganization, mode: typeof candidate.mode === "string" ? candidate.mode : null,
activeOrganization: input.sessionScope.activeOrganization reason: typeof candidate.reason === "string" ? candidate.reason : null
}, };
addressRuntimeMeta, })();
toNonEmptyString: input.toNonEmptyString, return runLivingChatAttemptRuntimeSafe((0, assistantLivingChatAttemptInputBuilder_1.buildAssistantLivingChatAttemptRuntimeInput)({
mergeKnownOrganizations: input.mergeKnownOrganizations, sessionId: input.sessionId,
hasAssistantDataScopeMetaQuestionSignal: input.hasAssistantDataScopeMetaQuestionSignal, userMessage: input.userMessage,
shouldHandleAsAssistantCapabilityMetaQuery: input.shouldHandleAsAssistantCapabilityMetaQuery, sessionItems: input.sessionItems,
hasDestructiveDataActionSignal: input.hasDestructiveDataActionSignal, modeDecision: normalizedModeDecision,
hasDangerOrCoercionSignal: input.hasDangerOrCoercionSignal, sessionScope: {
hasOperationalAdminActionRequestSignal: input.hasOperationalAdminActionRequestSignal, knownOrganizations: input.sessionScope.knownOrganizations,
hasOrganizationFactLookupSignal: input.hasOrganizationFactLookupSignal, selectedOrganization: input.sessionScope.selectedOrganization,
hasOrganizationFactFollowupSignal: input.hasOrganizationFactFollowupSignal, activeOrganization: input.sessionScope.activeOrganization
shouldEmitOrganizationSelectionReply: input.shouldEmitOrganizationSelectionReply, },
hasAssistantCapabilityQuestionSignal: input.hasAssistantCapabilityQuestionSignal, addressRuntimeMeta,
resolveDataScopeProbe: input.resolveDataScopeProbe, toNonEmptyString: input.toNonEmptyString,
applyScriptGuard: input.applyScriptGuard, mergeKnownOrganizations: input.mergeKnownOrganizations,
applyGroundingGuard: input.applyGroundingGuard, hasAssistantDataScopeMetaQuestionSignal: input.hasAssistantDataScopeMetaQuestionSignal,
buildAssistantSafetyRefusalReply: input.buildAssistantSafetyRefusalReply, shouldHandleAsAssistantCapabilityMetaQuery: input.shouldHandleAsAssistantCapabilityMetaQuery,
buildAssistantDataScopeContractReply: input.buildAssistantDataScopeContractReply, hasDestructiveDataActionSignal: input.hasDestructiveDataActionSignal,
buildAssistantOrganizationFactBoundaryReply: input.buildAssistantOrganizationFactBoundaryReply, hasDangerOrCoercionSignal: input.hasDangerOrCoercionSignal,
buildAssistantDataScopeSelectionReply: input.buildAssistantDataScopeSelectionReply, hasOperationalAdminActionRequestSignal: input.hasOperationalAdminActionRequestSignal,
buildAssistantOperationalBoundaryReply: input.buildAssistantOperationalBoundaryReply, hasOrganizationFactLookupSignal: input.hasOrganizationFactLookupSignal,
buildAssistantCapabilityContractReply: input.buildAssistantCapabilityContractReply, hasOrganizationFactFollowupSignal: input.hasOrganizationFactFollowupSignal,
appendItem: input.appendItem, shouldEmitOrganizationSelectionReply: input.shouldEmitOrganizationSelectionReply,
getSession: input.getSession, hasAssistantCapabilityQuestionSignal: input.hasAssistantCapabilityQuestionSignal,
persistSession: input.persistSession, resolveDataScopeProbe: input.resolveDataScopeProbe,
cloneConversation: input.cloneConversation, applyScriptGuard: input.applyScriptGuard,
logEvent: input.logEvent, applyGroundingGuard: input.applyGroundingGuard,
messageIdFactory: input.messageIdFactory, buildAssistantSafetyRefusalReply: input.buildAssistantSafetyRefusalReply,
nowIso: input.nowIso, buildAssistantDataScopeContractReply: input.buildAssistantDataScopeContractReply,
payload: input.payload, buildAssistantOrganizationFactBoundaryReply: input.buildAssistantOrganizationFactBoundaryReply,
chatClient: input.chatClient, buildAssistantDataScopeSelectionReply: input.buildAssistantDataScopeSelectionReply,
loadAssistantCanonExcerpt: input.loadAssistantCanonExcerpt, buildAssistantOperationalBoundaryReply: input.buildAssistantOperationalBoundaryReply,
sanitizeOutgoingAssistantText: input.sanitizeOutgoingAssistantText, buildAssistantCapabilityContractReply: input.buildAssistantCapabilityContractReply,
defaultModel: input.defaultModel, appendItem: input.appendItem,
defaultBaseUrl: input.defaultBaseUrl, getSession: input.getSession,
defaultApiKey: input.defaultApiKey persistSession: input.persistSession,
})); cloneConversation: input.cloneConversation,
logEvent: input.logEvent,
messageIdFactory: input.messageIdFactory,
nowIso: input.nowIso,
payload: input.payload,
chatClient: input.chatClient,
loadAssistantCanonExcerpt: input.loadAssistantCanonExcerpt,
sanitizeOutgoingAssistantText: input.sanitizeOutgoingAssistantText,
defaultModel: input.defaultModel,
defaultBaseUrl: input.defaultBaseUrl,
defaultApiKey: input.defaultApiKey
}));
};
const runAddressLaneAttempt = async (messageUsed, carryMeta, analysisDateHint) => runAddressLaneAttemptRuntimeSafe((0, assistantAddressLaneAttemptInputBuilder_1.buildAssistantAddressLaneAttemptRuntimeInput)({ const runAddressLaneAttempt = async (messageUsed, carryMeta, analysisDateHint) => runAddressLaneAttemptRuntimeSafe((0, assistantAddressLaneAttemptInputBuilder_1.buildAssistantAddressLaneAttemptRuntimeInput)({
messageUsed, messageUsed,
carryMeta, carryMeta,

View File

@ -4,12 +4,12 @@ exports.buildAssistantTurnRuntimeDeps = buildAssistantTurnRuntimeDeps;
function buildAssistantTurnRuntimeDeps(input) { function buildAssistantTurnRuntimeDeps(input) {
return { return {
...input.helpers, ...input.helpers,
ensureSession: (sessionId) => input.sessions.ensureSession(sessionId), ensureSession: input.sessions.ensureSession,
appendItem: (sessionId, item) => input.sessions.appendItem(sessionId, item), appendItem: input.sessions.appendItem,
getSession: (sessionId) => input.sessions.getSession(sessionId), getSession: input.sessions.getSession,
persistSession: (sessionState) => input.sessionLogger.persistSession(sessionState), persistSession: input.sessionLogger.persistSession,
setInvestigationState: (sessionId, snapshot) => input.sessions.setInvestigationState(sessionId, snapshot), setInvestigationState: input.sessions.setInvestigationState,
normalize: (payload) => input.normalizerService.normalize(payload), normalize: input.normalizerService.normalize,
executeRouteRuntime: (route, fragmentText, options) => input.dataLayer.executeRouteRuntime(route, fragmentText, options), executeRouteRuntime: (route, fragmentText, options) => input.dataLayer.executeRouteRuntime(route, fragmentText, options),
tryAddressQueryHandle: (messageUsed, options) => input.addressQueryService.tryHandle(messageUsed, options), tryAddressQueryHandle: (messageUsed, options) => input.addressQueryService.tryHandle(messageUsed, options),
chatClient: input.chatClient, chatClient: input.chatClient,

View File

@ -48,7 +48,7 @@ export interface RunAssistantAddressAttemptRuntimeInput<ResponseType = unknown>
sessionScope: AddressSessionScope; sessionScope: AddressSessionScope;
mergeFollowupContextWithOrganizationScope: RunAssistantAddressLaneAttemptRuntimeInput["mergeFollowupContextWithOrganizationScope"]; mergeFollowupContextWithOrganizationScope: RunAssistantAddressLaneAttemptRuntimeInput["mergeFollowupContextWithOrganizationScope"];
runAddressQueryTryHandle: RunAssistantAddressLaneAttemptRuntimeInput["runAddressQueryTryHandle"]; runAddressQueryTryHandle: RunAssistantAddressLaneAttemptRuntimeInput["runAddressQueryTryHandle"];
mergeKnownOrganizations: RunAssistantAddressLaneResponseAttemptRuntimeInput<ResponseType>["mergeKnownOrganizations"]; mergeKnownOrganizations: RunAssistantLivingChatAttemptRuntimeInput<ResponseType>["mergeKnownOrganizations"];
hasAssistantDataScopeMetaQuestionSignal: RunAssistantLivingChatAttemptRuntimeInput<ResponseType>["hasAssistantDataScopeMetaQuestionSignal"]; hasAssistantDataScopeMetaQuestionSignal: RunAssistantLivingChatAttemptRuntimeInput<ResponseType>["hasAssistantDataScopeMetaQuestionSignal"];
shouldHandleAsAssistantCapabilityMetaQuery: RunAssistantLivingChatAttemptRuntimeInput<ResponseType>["shouldHandleAsAssistantCapabilityMetaQuery"]; shouldHandleAsAssistantCapabilityMetaQuery: RunAssistantLivingChatAttemptRuntimeInput<ResponseType>["shouldHandleAsAssistantCapabilityMetaQuery"];
hasDestructiveDataActionSignal: RunAssistantLivingChatAttemptRuntimeInput<ResponseType>["hasDestructiveDataActionSignal"]; hasDestructiveDataActionSignal: RunAssistantLivingChatAttemptRuntimeInput<ResponseType>["hasDestructiveDataActionSignal"];
@ -140,13 +140,24 @@ export async function runAssistantAddressAttemptRuntime<ResponseType = unknown>(
const tryHandleLivingChat: RunAssistantAddressRuntimeInput<ResponseType>["tryHandleLivingChat"] = async ( const tryHandleLivingChat: RunAssistantAddressRuntimeInput<ResponseType>["tryHandleLivingChat"] = async (
modeDecision, modeDecision,
addressRuntimeMeta = null addressRuntimeMeta = null
) => ) => {
runLivingChatAttemptRuntimeSafe( const normalizedModeDecision: RunAssistantLivingChatAttemptRuntimeInput<ResponseType>["modeDecision"] = (() => {
if (!modeDecision || typeof modeDecision !== "object") {
return undefined;
}
const candidate = modeDecision as { mode?: unknown; reason?: unknown };
return {
mode: typeof candidate.mode === "string" ? candidate.mode : null,
reason: typeof candidate.reason === "string" ? candidate.reason : null
};
})();
return runLivingChatAttemptRuntimeSafe(
buildAssistantLivingChatAttemptRuntimeInput({ buildAssistantLivingChatAttemptRuntimeInput({
sessionId: input.sessionId, sessionId: input.sessionId,
userMessage: input.userMessage, userMessage: input.userMessage,
sessionItems: input.sessionItems, sessionItems: input.sessionItems,
modeDecision, modeDecision: normalizedModeDecision,
sessionScope: { sessionScope: {
knownOrganizations: input.sessionScope.knownOrganizations, knownOrganizations: input.sessionScope.knownOrganizations,
selectedOrganization: input.sessionScope.selectedOrganization, selectedOrganization: input.sessionScope.selectedOrganization,
@ -154,7 +165,7 @@ export async function runAssistantAddressAttemptRuntime<ResponseType = unknown>(
}, },
addressRuntimeMeta, addressRuntimeMeta,
toNonEmptyString: input.toNonEmptyString, toNonEmptyString: input.toNonEmptyString,
mergeKnownOrganizations: input.mergeKnownOrganizations as any, mergeKnownOrganizations: input.mergeKnownOrganizations,
hasAssistantDataScopeMetaQuestionSignal: input.hasAssistantDataScopeMetaQuestionSignal, hasAssistantDataScopeMetaQuestionSignal: input.hasAssistantDataScopeMetaQuestionSignal,
shouldHandleAsAssistantCapabilityMetaQuery: input.shouldHandleAsAssistantCapabilityMetaQuery, shouldHandleAsAssistantCapabilityMetaQuery: input.shouldHandleAsAssistantCapabilityMetaQuery,
hasDestructiveDataActionSignal: input.hasDestructiveDataActionSignal, hasDestructiveDataActionSignal: input.hasDestructiveDataActionSignal,
@ -187,8 +198,9 @@ export async function runAssistantAddressAttemptRuntime<ResponseType = unknown>(
defaultModel: input.defaultModel, defaultModel: input.defaultModel,
defaultBaseUrl: input.defaultBaseUrl, defaultBaseUrl: input.defaultBaseUrl,
defaultApiKey: input.defaultApiKey defaultApiKey: input.defaultApiKey
} as any) as RunAssistantLivingChatAttemptRuntimeInput<ResponseType> })
); );
};
const runAddressLaneAttempt: RunAssistantAddressRuntimeInput<ResponseType>["runAddressLaneAttempt"] = async ( const runAddressLaneAttempt: RunAssistantAddressRuntimeInput<ResponseType>["runAddressLaneAttempt"] = async (
messageUsed, messageUsed,

View File

@ -1,26 +1,26 @@
import type { AssistantTurnRuntimeBuilderDeps } from "./assistantTurnRuntimeInputBuilder"; import type { AssistantTurnRuntimeBuilderDeps } from "./assistantTurnRuntimeInputBuilder";
export interface AssistantTurnRuntimeDepsSessionsLike { export interface AssistantTurnRuntimeDepsSessionsLike {
ensureSession: (sessionId: string) => unknown; ensureSession: AssistantTurnRuntimeBuilderDeps["ensureSession"];
appendItem: (sessionId: string, item: unknown) => void; appendItem: AssistantTurnRuntimeBuilderDeps["appendItem"];
getSession: (sessionId: string) => unknown; getSession: AssistantTurnRuntimeBuilderDeps["getSession"];
setInvestigationState: (sessionId: string, snapshot: unknown) => void; setInvestigationState: AssistantTurnRuntimeBuilderDeps["setInvestigationState"];
} }
export interface AssistantTurnRuntimeDepsSessionLoggerLike { export interface AssistantTurnRuntimeDepsSessionLoggerLike {
persistSession: (sessionState: unknown) => void; persistSession: AssistantTurnRuntimeBuilderDeps["persistSession"];
} }
export interface AssistantTurnRuntimeDepsNormalizerLike { export interface AssistantTurnRuntimeDepsNormalizerLike {
normalize: (payload: unknown) => Promise<unknown>; normalize: AssistantTurnRuntimeBuilderDeps["normalize"];
} }
export interface AssistantTurnRuntimeDepsDataLayerLike { export interface AssistantTurnRuntimeDepsDataLayerLike {
executeRouteRuntime: (route: string, fragmentText: string, options?: unknown) => Promise<unknown>; executeRouteRuntime: AssistantTurnRuntimeBuilderDeps["executeRouteRuntime"];
} }
export interface AssistantTurnRuntimeDepsAddressQueryServiceLike { export interface AssistantTurnRuntimeDepsAddressQueryServiceLike {
tryHandle: (messageUsed: string, options?: unknown) => Promise<unknown>; tryHandle: AssistantTurnRuntimeBuilderDeps["tryAddressQueryHandle"];
} }
type BuilderDepsProvidedByAdapter = Pick< type BuilderDepsProvidedByAdapter = Pick<
@ -58,11 +58,11 @@ export interface BuildAssistantTurnRuntimeDepsInput {
normalizerService: AssistantTurnRuntimeDepsNormalizerLike; normalizerService: AssistantTurnRuntimeDepsNormalizerLike;
dataLayer: AssistantTurnRuntimeDepsDataLayerLike; dataLayer: AssistantTurnRuntimeDepsDataLayerLike;
addressQueryService: AssistantTurnRuntimeDepsAddressQueryServiceLike; addressQueryService: AssistantTurnRuntimeDepsAddressQueryServiceLike;
chatClient: unknown; chatClient: AssistantTurnRuntimeBuilderDeps["chatClient"];
messageIdFactory: () => string; messageIdFactory: AssistantTurnRuntimeBuilderDeps["messageIdFactory"];
nowIso: () => string; nowIso: AssistantTurnRuntimeBuilderDeps["nowIso"];
defaultApiKey: string; defaultApiKey: AssistantTurnRuntimeBuilderDeps["defaultApiKey"];
logEvent: (payload: Record<string, unknown>) => void; logEvent: AssistantTurnRuntimeBuilderDeps["logEvent"];
flags: { flags: {
featureAssistantAddressQueryV1: boolean; featureAssistantAddressQueryV1: boolean;
featureAddressLlmPredecomposeV1: boolean; featureAddressLlmPredecomposeV1: boolean;
@ -85,13 +85,14 @@ export function buildAssistantTurnRuntimeDeps(
): AssistantTurnRuntimeBuilderDeps { ): AssistantTurnRuntimeBuilderDeps {
return { return {
...input.helpers, ...input.helpers,
ensureSession: (sessionId) => input.sessions.ensureSession(sessionId) as any, ensureSession: input.sessions.ensureSession,
appendItem: (sessionId, item) => input.sessions.appendItem(sessionId, item as any), appendItem: input.sessions.appendItem,
getSession: (sessionId) => input.sessions.getSession(sessionId) as any, getSession: input.sessions.getSession,
persistSession: (sessionState) => input.sessionLogger.persistSession(sessionState as any), persistSession: input.sessionLogger.persistSession,
setInvestigationState: (sessionId, snapshot) => input.sessions.setInvestigationState(sessionId, snapshot), setInvestigationState: input.sessions.setInvestigationState,
normalize: (payload) => input.normalizerService.normalize(payload), normalize: input.normalizerService.normalize,
executeRouteRuntime: (route, fragmentText, options) => input.dataLayer.executeRouteRuntime(route, fragmentText, options), executeRouteRuntime: (route, fragmentText, options) =>
input.dataLayer.executeRouteRuntime(route, fragmentText, options),
tryAddressQueryHandle: (messageUsed, options) => input.addressQueryService.tryHandle(messageUsed, options), tryAddressQueryHandle: (messageUsed, options) => input.addressQueryService.tryHandle(messageUsed, options),
chatClient: input.chatClient, chatClient: input.chatClient,
messageIdFactory: input.messageIdFactory, messageIdFactory: input.messageIdFactory,

View File

@ -9,83 +9,104 @@ import type {
RunAssistantUserTurnBootstrapRuntimeInput RunAssistantUserTurnBootstrapRuntimeInput
} from "./assistantUserTurnBootstrapRuntimeAdapter"; } from "./assistantUserTurnBootstrapRuntimeAdapter";
export interface AssistantTurnRuntimeBuilderDeps { type AddressAttemptRuntimeInput<ResponseType = unknown> = RunAssistantAddressAttemptRuntimeInput<ResponseType>;
type DeepTurnAttemptRuntimeInput<ResponseType = unknown> = RunAssistantDeepTurnAttemptRuntimeInput<ResponseType>;
export interface AssistantTurnRuntimeBuilderDeps<ResponseType = unknown> {
ensureSession: RunAssistantUserTurnBootstrapRuntimeInput["ensureSession"]; ensureSession: RunAssistantUserTurnBootstrapRuntimeInput["ensureSession"];
appendItem: RunAssistantUserTurnBootstrapRuntimeInput["appendItem"]; appendItem: RunAssistantUserTurnBootstrapRuntimeInput["appendItem"];
getSession: RunAssistantUserTurnBootstrapRuntimeInput["getSession"]; getSession: RunAssistantUserTurnBootstrapRuntimeInput["getSession"];
persistSession: RunAssistantUserTurnBootstrapRuntimeInput["persistSession"]; persistSession: RunAssistantUserTurnBootstrapRuntimeInput["persistSession"];
setInvestigationState: (sessionId: string, snapshot: unknown) => void;
normalize: (payload: unknown) => Promise<unknown>;
executeRouteRuntime: (route: string, fragmentText: string, options?: unknown) => Promise<unknown>;
tryAddressQueryHandle: (messageUsed: string, options?: unknown) => Promise<unknown>;
chatClient: unknown;
messageIdFactory: () => string;
nowIso: () => string;
defaultApiKey: string;
logEvent: (payload: Record<string, unknown>) => void;
featureAssistantAddressQueryV1: boolean;
featureAddressLlmPredecomposeV1: boolean;
featureInvestigationStateV1: boolean;
featureStateFollowupBindingV1: boolean;
featureContractsV11: boolean;
featureAnswerPolicyV11: boolean;
featureProblemCentricAnswerV1: boolean;
featureLifecycleAnswerV1: boolean;
defaultModel: string;
defaultBaseUrl: string;
compactWhitespace: RunAssistantUserTurnBootstrapRuntimeInput["compactWhitespace"]; compactWhitespace: RunAssistantUserTurnBootstrapRuntimeInput["compactWhitespace"];
repairAddressMojibake: RunAssistantUserTurnBootstrapRuntimeInput["repairAddressMojibake"]; repairAddressMojibake: RunAssistantUserTurnBootstrapRuntimeInput["repairAddressMojibake"];
resolveRuntimeAnalysisContext: RunAssistantUserTurnBootstrapRuntimeInput["resolveRuntimeAnalysisContext"]; resolveRuntimeAnalysisContext: RunAssistantUserTurnBootstrapRuntimeInput["resolveRuntimeAnalysisContext"];
runAddressLlmPreDecompose: (payload: unknown, userMessage: string) => Promise<Record<string, unknown>>; runAddressLlmPreDecompose: (
buildAddressLlmPredecomposeContractV1: (...args: any[]) => unknown; payload: AddressAttemptRuntimeInput<ResponseType>["payload"],
sanitizeAddressMessageForFallback: (...args: any[]) => unknown; userMessage: string
toNonEmptyString: (...args: any[]) => unknown; ) => Promise<Record<string, unknown>>;
resolveAddressFollowupCarryoverContext: (...args: any[]) => unknown; tryAddressQueryHandle: AddressAttemptRuntimeInput<ResponseType>["runAddressQueryTryHandle"];
resolveAssistantOrchestrationDecision: (...args: any[]) => unknown; setInvestigationState: DeepTurnAttemptRuntimeInput<ResponseType>["persistInvestigationState"];
buildAddressDialogContinuationContractV2: (...args: any[]) => unknown; normalize: DeepTurnAttemptRuntimeInput<ResponseType>["normalize"];
mergeFollowupContextWithOrganizationScope: (...args: any[]) => unknown; executeRouteRuntime: DeepTurnAttemptRuntimeInput<ResponseType>["executeRouteRuntime"];
isRetryableAddressLimitedResult: (...args: any[]) => unknown; chatClient: AddressAttemptRuntimeInput<ResponseType>["chatClient"];
mergeKnownOrganizations: (...args: any[]) => unknown; messageIdFactory: AddressAttemptRuntimeInput<ResponseType>["messageIdFactory"];
hasAssistantDataScopeMetaQuestionSignal: (...args: any[]) => unknown; nowIso: AddressAttemptRuntimeInput<ResponseType>["nowIso"];
shouldHandleAsAssistantCapabilityMetaQuery: (...args: any[]) => unknown; defaultApiKey: NonNullable<AddressAttemptRuntimeInput<ResponseType>["defaultApiKey"]>;
hasDestructiveDataActionSignal: (...args: any[]) => unknown; logEvent: AddressAttemptRuntimeInput<ResponseType>["logEvent"];
hasDangerOrCoercionSignal: (...args: any[]) => unknown; featureAssistantAddressQueryV1: AddressAttemptRuntimeInput<ResponseType>["featureAssistantAddressQueryV1"];
hasOperationalAdminActionRequestSignal: (...args: any[]) => unknown; featureAddressLlmPredecomposeV1: AddressAttemptRuntimeInput<ResponseType>["featureAddressLlmPredecomposeV1"];
hasOrganizationFactLookupSignal: (...args: any[]) => unknown; featureInvestigationStateV1: DeepTurnAttemptRuntimeInput<ResponseType>["featureInvestigationStateV1"];
hasOrganizationFactFollowupSignal: (...args: any[]) => unknown; featureStateFollowupBindingV1: DeepTurnAttemptRuntimeInput<ResponseType>["featureStateFollowupBindingV1"];
shouldEmitOrganizationSelectionReply: (...args: any[]) => unknown; featureContractsV11: DeepTurnAttemptRuntimeInput<ResponseType>["featureContractsV11"];
hasAssistantCapabilityQuestionSignal: (...args: any[]) => unknown; featureAnswerPolicyV11: DeepTurnAttemptRuntimeInput<ResponseType>["featureAnswerPolicyV11"];
resolveDataScopeProbe: () => unknown; featureProblemCentricAnswerV1: DeepTurnAttemptRuntimeInput<ResponseType>["featureProblemCentricAnswerV1"];
applyScriptGuard: (...args: any[]) => unknown; featureLifecycleAnswerV1: DeepTurnAttemptRuntimeInput<ResponseType>["featureLifecycleAnswerV1"];
applyGroundingGuard: (...args: any[]) => unknown; defaultModel: AddressAttemptRuntimeInput<ResponseType>["defaultModel"];
buildAssistantSafetyRefusalReply: (...args: any[]) => unknown; defaultBaseUrl: AddressAttemptRuntimeInput<ResponseType>["defaultBaseUrl"];
buildAssistantDataScopeContractReply: (...args: any[]) => unknown; buildAddressLlmPredecomposeContractV1:
buildAssistantOrganizationFactBoundaryReply: (...args: any[]) => unknown; AddressAttemptRuntimeInput<ResponseType>["buildAddressLlmPredecomposeContractV1"];
buildAssistantDataScopeSelectionReply: (...args: any[]) => unknown; sanitizeAddressMessageForFallback: AddressAttemptRuntimeInput<ResponseType>["sanitizeAddressMessageForFallback"];
buildAssistantOperationalBoundaryReply: (...args: any[]) => unknown; toNonEmptyString: AddressAttemptRuntimeInput<ResponseType>["toNonEmptyString"];
buildAssistantCapabilityContractReply: (...args: any[]) => unknown; resolveAddressFollowupCarryoverContext:
loadAssistantCanonExcerpt: (...args: any[]) => unknown; AddressAttemptRuntimeInput<ResponseType>["resolveAddressFollowupCarryoverContext"];
sanitizeOutgoingAssistantText: (value: unknown, fallback?: string) => string; resolveAssistantOrchestrationDecision:
buildAddressDebugPayload: (...args: any[]) => unknown; AddressAttemptRuntimeInput<ResponseType>["resolveAssistantOrchestrationDecision"];
buildAddressFollowupOffer: (...args: any[]) => unknown; buildAddressDialogContinuationContractV2:
buildFollowupStateBinding: (...args: any[]) => unknown; AddressAttemptRuntimeInput<ResponseType>["buildAddressDialogContinuationContractV2"];
resolveBusinessScopeAlignment: (...args: any[]) => unknown; mergeFollowupContextWithOrganizationScope:
inferP0DomainFromMessage: (...args: any[]) => unknown; AddressAttemptRuntimeInput<ResponseType>["mergeFollowupContextWithOrganizationScope"];
resolveBusinessScopeFromLiveContext: (...args: any[]) => unknown; isRetryableAddressLimitedResult: AddressAttemptRuntimeInput<ResponseType>["isRetryableAddressLimitedResult"];
extractRequirements: (...args: any[]) => unknown; mergeKnownOrganizations: AddressAttemptRuntimeInput<ResponseType>["mergeKnownOrganizations"];
toExecutionPlan: (...args: any[]) => unknown; hasAssistantDataScopeMetaQuestionSignal:
enforceRbpLiveRoutePlan: (...args: any[]) => unknown; AddressAttemptRuntimeInput<ResponseType>["hasAssistantDataScopeMetaQuestionSignal"];
enforceFaLiveRoutePlan: (...args: any[]) => unknown; shouldHandleAsAssistantCapabilityMetaQuery:
mapNoRouteReason: (...args: any[]) => unknown; AddressAttemptRuntimeInput<ResponseType>["shouldHandleAsAssistantCapabilityMetaQuery"];
buildSkippedResult: (...args: any[]) => unknown; hasDestructiveDataActionSignal: AddressAttemptRuntimeInput<ResponseType>["hasDestructiveDataActionSignal"];
evaluateCoverage: (...args: any[]) => unknown; hasDangerOrCoercionSignal: AddressAttemptRuntimeInput<ResponseType>["hasDangerOrCoercionSignal"];
checkGrounding: (...args: any[]) => unknown; hasOperationalAdminActionRequestSignal:
collectRbpLiveRouteAudit: (...args: any[]) => unknown; AddressAttemptRuntimeInput<ResponseType>["hasOperationalAdminActionRequestSignal"];
collectFaLiveRouteAudit: (...args: any[]) => unknown; hasOrganizationFactLookupSignal: AddressAttemptRuntimeInput<ResponseType>["hasOrganizationFactLookupSignal"];
hasExplicitPeriodAnchorFromNormalized: (...args: any[]) => unknown; hasOrganizationFactFollowupSignal: AddressAttemptRuntimeInput<ResponseType>["hasOrganizationFactFollowupSignal"];
extractDroppedIntentSegments: (...args: any[]) => unknown; shouldEmitOrganizationSelectionReply:
toDebugRoutes: (...args: any[]) => unknown; AddressAttemptRuntimeInput<ResponseType>["shouldEmitOrganizationSelectionReply"];
extractExecutionState: (...args: any[]) => unknown; hasAssistantCapabilityQuestionSignal:
AddressAttemptRuntimeInput<ResponseType>["hasAssistantCapabilityQuestionSignal"];
resolveDataScopeProbe: AddressAttemptRuntimeInput<ResponseType>["resolveDataScopeProbe"];
applyScriptGuard: AddressAttemptRuntimeInput<ResponseType>["applyScriptGuard"];
applyGroundingGuard: AddressAttemptRuntimeInput<ResponseType>["applyGroundingGuard"];
buildAssistantSafetyRefusalReply: AddressAttemptRuntimeInput<ResponseType>["buildAssistantSafetyRefusalReply"];
buildAssistantDataScopeContractReply:
AddressAttemptRuntimeInput<ResponseType>["buildAssistantDataScopeContractReply"];
buildAssistantOrganizationFactBoundaryReply:
AddressAttemptRuntimeInput<ResponseType>["buildAssistantOrganizationFactBoundaryReply"];
buildAssistantDataScopeSelectionReply:
AddressAttemptRuntimeInput<ResponseType>["buildAssistantDataScopeSelectionReply"];
buildAssistantOperationalBoundaryReply:
AddressAttemptRuntimeInput<ResponseType>["buildAssistantOperationalBoundaryReply"];
buildAssistantCapabilityContractReply:
AddressAttemptRuntimeInput<ResponseType>["buildAssistantCapabilityContractReply"];
loadAssistantCanonExcerpt: AddressAttemptRuntimeInput<ResponseType>["loadAssistantCanonExcerpt"];
sanitizeOutgoingAssistantText: AddressAttemptRuntimeInput<ResponseType>["sanitizeOutgoingAssistantText"];
buildAddressDebugPayload: AddressAttemptRuntimeInput<ResponseType>["buildAddressDebugPayload"];
buildAddressFollowupOffer: AddressAttemptRuntimeInput<ResponseType>["buildAddressFollowupOffer"];
buildFollowupStateBinding: DeepTurnAttemptRuntimeInput<ResponseType>["buildFollowupStateBinding"];
resolveBusinessScopeAlignment: DeepTurnAttemptRuntimeInput<ResponseType>["resolveBusinessScopeAlignment"];
inferP0DomainFromMessage: DeepTurnAttemptRuntimeInput<ResponseType>["inferP0DomainFromMessage"];
resolveBusinessScopeFromLiveContext: DeepTurnAttemptRuntimeInput<ResponseType>["resolveBusinessScopeFromLiveContext"];
extractRequirements: DeepTurnAttemptRuntimeInput<ResponseType>["extractRequirements"];
toExecutionPlan: DeepTurnAttemptRuntimeInput<ResponseType>["toExecutionPlan"];
enforceRbpLiveRoutePlan: DeepTurnAttemptRuntimeInput<ResponseType>["enforceRbpLiveRoutePlan"];
enforceFaLiveRoutePlan: DeepTurnAttemptRuntimeInput<ResponseType>["enforceFaLiveRoutePlan"];
mapNoRouteReason: DeepTurnAttemptRuntimeInput<ResponseType>["mapNoRouteReason"];
buildSkippedResult: DeepTurnAttemptRuntimeInput<ResponseType>["buildSkippedResult"];
evaluateCoverage: DeepTurnAttemptRuntimeInput<ResponseType>["evaluateCoverage"];
checkGrounding: DeepTurnAttemptRuntimeInput<ResponseType>["checkGrounding"];
collectRbpLiveRouteAudit: DeepTurnAttemptRuntimeInput<ResponseType>["collectRbpLiveRouteAudit"];
collectFaLiveRouteAudit: DeepTurnAttemptRuntimeInput<ResponseType>["collectFaLiveRouteAudit"];
hasExplicitPeriodAnchorFromNormalized: DeepTurnAttemptRuntimeInput<ResponseType>["hasExplicitPeriodAnchor"];
extractDroppedIntentSegments: DeepTurnAttemptRuntimeInput<ResponseType>["extractDroppedIntentSegments"];
toDebugRoutes: DeepTurnAttemptRuntimeInput<ResponseType>["buildDebugRoutes"];
extractExecutionState: DeepTurnAttemptRuntimeInput<ResponseType>["extractExecutionState"];
} }
export function buildAssistantUserTurnBootstrapRuntimeInput( export function buildAssistantUserTurnBootstrapRuntimeInput(
@ -107,15 +128,15 @@ export function buildAssistantUserTurnBootstrapRuntimeInput(
} }
export function buildAssistantAddressAttemptRuntimeInput<ResponseType = unknown>( export function buildAssistantAddressAttemptRuntimeInput<ResponseType = unknown>(
runtimeInput: RunAssistantTurnAttemptRuntimeAddressInput, runtimeInput: RunAssistantTurnAttemptRuntimeAddressInput<AddressAttemptRuntimeInput<ResponseType>["payload"]>,
deps: AssistantTurnRuntimeBuilderDeps deps: AssistantTurnRuntimeBuilderDeps<ResponseType>
): RunAssistantAddressAttemptRuntimeInput<ResponseType> { ): RunAssistantAddressAttemptRuntimeInput<ResponseType> {
return { return {
featureAssistantAddressQueryV1: deps.featureAssistantAddressQueryV1, featureAssistantAddressQueryV1: deps.featureAssistantAddressQueryV1,
sessionId: runtimeInput.sessionId, sessionId: runtimeInput.sessionId,
userMessage: runtimeInput.userMessage, userMessage: runtimeInput.userMessage,
sessionItems: runtimeInput.sessionItems, sessionItems: runtimeInput.sessionItems,
payload: runtimeInput.payload as any, payload: runtimeInput.payload,
sessionScope: { sessionScope: {
knownOrganizations: runtimeInput.sessionOrganizationScope.knownOrganizations, knownOrganizations: runtimeInput.sessionOrganizationScope.knownOrganizations,
selectedOrganization: runtimeInput.sessionOrganizationScope.selectedOrganization, selectedOrganization: runtimeInput.sessionOrganizationScope.selectedOrganization,
@ -123,65 +144,68 @@ export function buildAssistantAddressAttemptRuntimeInput<ResponseType = unknown>
}, },
featureAddressLlmPredecomposeV1: deps.featureAddressLlmPredecomposeV1, featureAddressLlmPredecomposeV1: deps.featureAddressLlmPredecomposeV1,
runAddressLlmPreDecompose: async () => deps.runAddressLlmPreDecompose(runtimeInput.payload, runtimeInput.userMessage), runAddressLlmPreDecompose: async () => deps.runAddressLlmPreDecompose(runtimeInput.payload, runtimeInput.userMessage),
buildAddressLlmPredecomposeContractV1: deps.buildAddressLlmPredecomposeContractV1 as any, buildAddressLlmPredecomposeContractV1: deps.buildAddressLlmPredecomposeContractV1,
sanitizeAddressMessageForFallback: deps.sanitizeAddressMessageForFallback as any, sanitizeAddressMessageForFallback: deps.sanitizeAddressMessageForFallback,
toNonEmptyString: deps.toNonEmptyString as any, toNonEmptyString: deps.toNonEmptyString,
resolveAddressFollowupCarryoverContext: deps.resolveAddressFollowupCarryoverContext as any, resolveAddressFollowupCarryoverContext: deps.resolveAddressFollowupCarryoverContext,
resolveAssistantOrchestrationDecision: deps.resolveAssistantOrchestrationDecision as any, resolveAssistantOrchestrationDecision: deps.resolveAssistantOrchestrationDecision,
buildAddressDialogContinuationContractV2: deps.buildAddressDialogContinuationContractV2 as any, buildAddressDialogContinuationContractV2: deps.buildAddressDialogContinuationContractV2,
runtimeAnalysisContextAsOfDate: runtimeInput.runtimeAnalysisContext.as_of_date, runtimeAnalysisContextAsOfDate: runtimeInput.runtimeAnalysisContext.as_of_date,
compactWhitespace: deps.compactWhitespace, compactWhitespace: deps.compactWhitespace,
mergeFollowupContextWithOrganizationScope: deps.mergeFollowupContextWithOrganizationScope as any, mergeFollowupContextWithOrganizationScope: deps.mergeFollowupContextWithOrganizationScope,
runAddressQueryTryHandle: deps.tryAddressQueryHandle as any, runAddressQueryTryHandle: deps.tryAddressQueryHandle,
isRetryableAddressLimitedResult: deps.isRetryableAddressLimitedResult as any, isRetryableAddressLimitedResult: deps.isRetryableAddressLimitedResult,
mergeKnownOrganizations: deps.mergeKnownOrganizations as any, mergeKnownOrganizations: deps.mergeKnownOrganizations,
hasAssistantDataScopeMetaQuestionSignal: deps.hasAssistantDataScopeMetaQuestionSignal as any, hasAssistantDataScopeMetaQuestionSignal: deps.hasAssistantDataScopeMetaQuestionSignal,
shouldHandleAsAssistantCapabilityMetaQuery: deps.shouldHandleAsAssistantCapabilityMetaQuery as any, shouldHandleAsAssistantCapabilityMetaQuery: deps.shouldHandleAsAssistantCapabilityMetaQuery,
hasDestructiveDataActionSignal: deps.hasDestructiveDataActionSignal as any, hasDestructiveDataActionSignal: deps.hasDestructiveDataActionSignal,
hasDangerOrCoercionSignal: deps.hasDangerOrCoercionSignal as any, hasDangerOrCoercionSignal: deps.hasDangerOrCoercionSignal,
hasOperationalAdminActionRequestSignal: deps.hasOperationalAdminActionRequestSignal as any, hasOperationalAdminActionRequestSignal: deps.hasOperationalAdminActionRequestSignal,
hasOrganizationFactLookupSignal: deps.hasOrganizationFactLookupSignal as any, hasOrganizationFactLookupSignal: deps.hasOrganizationFactLookupSignal,
hasOrganizationFactFollowupSignal: deps.hasOrganizationFactFollowupSignal as any, hasOrganizationFactFollowupSignal: deps.hasOrganizationFactFollowupSignal,
shouldEmitOrganizationSelectionReply: deps.shouldEmitOrganizationSelectionReply as any, shouldEmitOrganizationSelectionReply: deps.shouldEmitOrganizationSelectionReply,
hasAssistantCapabilityQuestionSignal: deps.hasAssistantCapabilityQuestionSignal as any, hasAssistantCapabilityQuestionSignal: deps.hasAssistantCapabilityQuestionSignal,
resolveDataScopeProbe: deps.resolveDataScopeProbe as any, resolveDataScopeProbe: deps.resolveDataScopeProbe,
applyScriptGuard: deps.applyScriptGuard as any, applyScriptGuard: deps.applyScriptGuard,
applyGroundingGuard: deps.applyGroundingGuard as any, applyGroundingGuard: deps.applyGroundingGuard,
buildAssistantSafetyRefusalReply: deps.buildAssistantSafetyRefusalReply as any, buildAssistantSafetyRefusalReply: deps.buildAssistantSafetyRefusalReply,
buildAssistantDataScopeContractReply: deps.buildAssistantDataScopeContractReply as any, buildAssistantDataScopeContractReply: deps.buildAssistantDataScopeContractReply,
buildAssistantOrganizationFactBoundaryReply: deps.buildAssistantOrganizationFactBoundaryReply as any, buildAssistantOrganizationFactBoundaryReply: deps.buildAssistantOrganizationFactBoundaryReply,
buildAssistantDataScopeSelectionReply: deps.buildAssistantDataScopeSelectionReply as any, buildAssistantDataScopeSelectionReply: deps.buildAssistantDataScopeSelectionReply,
buildAssistantOperationalBoundaryReply: deps.buildAssistantOperationalBoundaryReply as any, buildAssistantOperationalBoundaryReply: deps.buildAssistantOperationalBoundaryReply,
buildAssistantCapabilityContractReply: deps.buildAssistantCapabilityContractReply as any, buildAssistantCapabilityContractReply: deps.buildAssistantCapabilityContractReply,
chatClient: deps.chatClient as any, chatClient: deps.chatClient,
loadAssistantCanonExcerpt: deps.loadAssistantCanonExcerpt as any, loadAssistantCanonExcerpt: deps.loadAssistantCanonExcerpt,
sanitizeOutgoingAssistantText: deps.sanitizeOutgoingAssistantText, sanitizeOutgoingAssistantText: deps.sanitizeOutgoingAssistantText,
defaultModel: deps.defaultModel, defaultModel: deps.defaultModel,
defaultBaseUrl: deps.defaultBaseUrl, defaultBaseUrl: deps.defaultBaseUrl,
defaultApiKey: deps.defaultApiKey, defaultApiKey: deps.defaultApiKey,
buildAddressDebugPayload: deps.buildAddressDebugPayload as any, buildAddressDebugPayload: deps.buildAddressDebugPayload,
buildAddressFollowupOffer: deps.buildAddressFollowupOffer as any, buildAddressFollowupOffer: deps.buildAddressFollowupOffer,
appendItem: deps.appendItem as any, appendItem: deps.appendItem,
getSession: deps.getSession as any, getSession: deps.getSession,
persistSession: deps.persistSession as any, persistSession: deps.persistSession,
cloneConversation: (items) => items.map((item) => ({ ...item })), cloneConversation: (items) => items.map((item) => ({ ...item })),
logEvent: deps.logEvent as any, logEvent: deps.logEvent,
messageIdFactory: deps.messageIdFactory, messageIdFactory: deps.messageIdFactory,
nowIso: deps.nowIso nowIso: deps.nowIso
}; };
} }
export function buildAssistantDeepTurnAttemptRuntimeInput<ResponseType = unknown>( export function buildAssistantDeepTurnAttemptRuntimeInput<ResponseType = unknown>(
runtimeInput: RunAssistantTurnAttemptRuntimeDeepInput, runtimeInput: RunAssistantTurnAttemptRuntimeDeepInput<DeepTurnAttemptRuntimeInput<ResponseType>["payload"]> & {
deps: AssistantTurnRuntimeBuilderDeps runtimeAnalysisContext: DeepTurnAttemptRuntimeInput<ResponseType>["runtimeAnalysisContext"];
sessionInvestigationState: DeepTurnAttemptRuntimeInput<ResponseType>["sessionInvestigationState"];
},
deps: AssistantTurnRuntimeBuilderDeps<ResponseType>
): RunAssistantDeepTurnAttemptRuntimeInput<ResponseType> { ): RunAssistantDeepTurnAttemptRuntimeInput<ResponseType> {
return { return {
sessionId: runtimeInput.sessionId, sessionId: runtimeInput.sessionId,
questionId: runtimeInput.questionId, questionId: runtimeInput.questionId,
userMessage: runtimeInput.userMessage, userMessage: runtimeInput.userMessage,
payload: runtimeInput.payload as any, payload: runtimeInput.payload,
runtimeAnalysisContext: runtimeInput.runtimeAnalysisContext as any, runtimeAnalysisContext: runtimeInput.runtimeAnalysisContext,
sessionInvestigationState: runtimeInput.sessionInvestigationState as any, sessionInvestigationState: runtimeInput.sessionInvestigationState,
addressRuntimeMetaForDeep: runtimeInput.addressRuntimeMetaForDeep, addressRuntimeMetaForDeep: runtimeInput.addressRuntimeMetaForDeep,
featureInvestigationStateV1: deps.featureInvestigationStateV1, featureInvestigationStateV1: deps.featureInvestigationStateV1,
featureStateFollowupBindingV1: deps.featureStateFollowupBindingV1, featureStateFollowupBindingV1: deps.featureStateFollowupBindingV1,
@ -189,33 +213,33 @@ export function buildAssistantDeepTurnAttemptRuntimeInput<ResponseType = unknown
featureAnswerPolicyV11: deps.featureAnswerPolicyV11, featureAnswerPolicyV11: deps.featureAnswerPolicyV11,
featureProblemCentricAnswerV1: deps.featureProblemCentricAnswerV1, featureProblemCentricAnswerV1: deps.featureProblemCentricAnswerV1,
featureLifecycleAnswerV1: deps.featureLifecycleAnswerV1, featureLifecycleAnswerV1: deps.featureLifecycleAnswerV1,
buildFollowupStateBinding: deps.buildFollowupStateBinding as any, buildFollowupStateBinding: deps.buildFollowupStateBinding,
normalize: deps.normalize as any, normalize: deps.normalize,
resolveBusinessScopeAlignment: deps.resolveBusinessScopeAlignment as any, resolveBusinessScopeAlignment: deps.resolveBusinessScopeAlignment,
inferP0DomainFromMessage: deps.inferP0DomainFromMessage as any, inferP0DomainFromMessage: deps.inferP0DomainFromMessage,
resolveBusinessScopeFromLiveContext: deps.resolveBusinessScopeFromLiveContext as any, resolveBusinessScopeFromLiveContext: deps.resolveBusinessScopeFromLiveContext,
extractRequirements: deps.extractRequirements as any, extractRequirements: deps.extractRequirements,
toExecutionPlan: deps.toExecutionPlan as any, toExecutionPlan: deps.toExecutionPlan,
enforceRbpLiveRoutePlan: deps.enforceRbpLiveRoutePlan as any, enforceRbpLiveRoutePlan: deps.enforceRbpLiveRoutePlan,
enforceFaLiveRoutePlan: deps.enforceFaLiveRoutePlan as any, enforceFaLiveRoutePlan: deps.enforceFaLiveRoutePlan,
executeRouteRuntime: deps.executeRouteRuntime as any, executeRouteRuntime: deps.executeRouteRuntime,
mapNoRouteReason: deps.mapNoRouteReason as any, mapNoRouteReason: deps.mapNoRouteReason,
buildSkippedResult: deps.buildSkippedResult as any, buildSkippedResult: deps.buildSkippedResult,
evaluateCoverage: deps.evaluateCoverage as any, evaluateCoverage: deps.evaluateCoverage,
checkGrounding: deps.checkGrounding as any, checkGrounding: deps.checkGrounding,
collectRbpLiveRouteAudit: deps.collectRbpLiveRouteAudit as any, collectRbpLiveRouteAudit: deps.collectRbpLiveRouteAudit,
collectFaLiveRouteAudit: deps.collectFaLiveRouteAudit as any, collectFaLiveRouteAudit: deps.collectFaLiveRouteAudit,
hasExplicitPeriodAnchor: deps.hasExplicitPeriodAnchorFromNormalized as any, hasExplicitPeriodAnchor: deps.hasExplicitPeriodAnchorFromNormalized,
extractDroppedIntentSegments: deps.extractDroppedIntentSegments as any, extractDroppedIntentSegments: deps.extractDroppedIntentSegments,
buildDebugRoutes: deps.toDebugRoutes as any, buildDebugRoutes: deps.toDebugRoutes,
extractExecutionState: deps.extractExecutionState as any, extractExecutionState: deps.extractExecutionState,
sanitizeReply: deps.sanitizeOutgoingAssistantText as any, sanitizeReply: deps.sanitizeOutgoingAssistantText,
persistInvestigationState: deps.setInvestigationState as any, persistInvestigationState: deps.setInvestigationState,
messageIdFactory: deps.messageIdFactory as any, messageIdFactory: deps.messageIdFactory,
appendItem: deps.appendItem as any, appendItem: deps.appendItem,
getSession: deps.getSession as any, getSession: deps.getSession,
persistSession: deps.persistSession as any, persistSession: deps.persistSession,
cloneConversation: (items) => items.map((item) => ({ ...item })), cloneConversation: (items) => items.map((item) => ({ ...item })),
logEvent: deps.logEvent as any logEvent: deps.logEvent
}; };
} }