ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.85 - 2.88 - Убран последний as any из backend/src и довел тип debug до конца цепочки deep-turn

This commit is contained in:
2026-04-11 10:58:28 +03:00
parent dedf193542
commit 966be04af9
19 changed files with 485 additions and 159 deletions
@@ -10,6 +10,88 @@ exports.buildAssistantDeepTurnAnalysisRuntimeInput = buildAssistantDeepTurnAnaly
const companyAnchorResolver_1 = require("./companyAnchorResolver");
const assistantRuntimeGuards_1 = require("./assistantRuntimeGuards");
const assistantClaimBoundEvidence_1 = require("./assistantClaimBoundEvidence");
const KNOWN_GUARD_DOMAINS = [
"settlements_60_62",
"vat_document_register_book",
"month_close_costs_20_44",
"fixed_asset_amortization"
];
function toRecordObject(value) {
if (!value || typeof value !== "object" || Array.isArray(value)) {
return null;
}
return value;
}
function toStringArray(value) {
if (!Array.isArray(value)) {
return [];
}
return value
.map((item) => (typeof item === "string" ? item.trim() : ""))
.filter((item) => item.length > 0);
}
function toCompanyAnchorSet(value) {
const source = toRecordObject(value);
if (!source) {
return null;
}
return {
contract_numbers: toStringArray(source.contract_numbers),
document_numbers: toStringArray(source.document_numbers),
dates: toStringArray(source.dates),
amounts: toStringArray(source.amounts),
accounts: toStringArray(source.accounts),
periods: toStringArray(source.periods),
document_types: toStringArray(source.document_types),
all: toStringArray(source.all)
};
}
function toClaimBoundPrimaryPeriod(value) {
const source = toRecordObject(value);
if (!source) {
return null;
}
const from = typeof source.from === "string" ? source.from.trim() : "";
const to = typeof source.to === "string" ? source.to.trim() : "";
const granularity = source.granularity === "day" || source.granularity === "month" ? source.granularity : null;
if (!from || !to || !granularity) {
return null;
}
return {
from,
to,
granularity
};
}
function normalizeFocusDomainForGuards(value) {
const normalized = typeof value === "string" ? value.trim() : "";
if (!normalized) {
return null;
}
if (KNOWN_GUARD_DOMAINS.includes(normalized)) {
return normalized;
}
return null;
}
const resolveTemporalGuardAdapter = (input) => (0, assistantRuntimeGuards_1.resolveTemporalGuard)({
userMessage: input.userMessage,
normalized: input.normalized,
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
analysisContext: input.analysisContext
});
const resolveDomainPolarityGuardAdapter = (input) => (0, assistantRuntimeGuards_1.resolveDomainPolarityGuard)({
userMessage: input.userMessage,
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
focusDomainHint: input.focusDomainHint
});
const resolveClaimBoundAnchorsAdapter = (input) => (0, assistantClaimBoundEvidence_1.resolveClaimBoundAnchors)({
userMessage: input.userMessage,
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
focusDomainHint: input.focusDomainHint,
primaryPeriod: toClaimBoundPrimaryPeriod(input.primaryPeriod)
});
const applyTemporalHintToExecutionPlanAdapter = (executionPlan, temporalGuard) => (0, assistantRuntimeGuards_1.applyTemporalHintToExecutionPlan)(executionPlan, temporalGuard);
const applyPolarityHintToExecutionPlanAdapter = (executionPlan, domainPolarityGuardInitial) => (0, assistantRuntimeGuards_1.applyPolarityHintToExecutionPlan)(executionPlan, domainPolarityGuardInitial);
function buildAssistantDeepTurnContextRuntimeInput(input) {
return {
userMessage: input.userMessage,
@@ -20,9 +102,9 @@ function buildAssistantDeepTurnContextRuntimeInput(input) {
resolveCompanyAnchors: companyAnchorResolver_1.resolveCompanyAnchors,
resolveBusinessScopeAlignment: input.resolveBusinessScopeAlignment,
inferP0DomainFromMessage: input.inferP0DomainFromMessage,
resolveTemporalGuard: assistantRuntimeGuards_1.resolveTemporalGuard,
resolveDomainPolarityGuard: assistantRuntimeGuards_1.resolveDomainPolarityGuard,
resolveClaimBoundAnchors: assistantClaimBoundEvidence_1.resolveClaimBoundAnchors,
resolveTemporalGuard: resolveTemporalGuardAdapter,
resolveDomainPolarityGuard: resolveDomainPolarityGuardAdapter,
resolveClaimBoundAnchors: resolveClaimBoundAnchorsAdapter,
resolveBusinessScopeFromLiveContext: input.resolveBusinessScopeFromLiveContext
};
}
@@ -38,8 +120,8 @@ function buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime) {
toExecutionPlan: input.toExecutionPlan,
enforceRbpLiveRoutePlan: input.enforceRbpLiveRoutePlan,
enforceFaLiveRoutePlan: input.enforceFaLiveRoutePlan,
applyTemporalHintToExecutionPlan: assistantRuntimeGuards_1.applyTemporalHintToExecutionPlan,
applyPolarityHintToExecutionPlan: assistantRuntimeGuards_1.applyPolarityHintToExecutionPlan
applyTemporalHintToExecutionPlan: applyTemporalHintToExecutionPlanAdapter,
applyPolarityHintToExecutionPlan: applyPolarityHintToExecutionPlanAdapter
};
}
function buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime) {
@@ -57,8 +139,8 @@ function buildAssistantDeepTurnGuardRuntimeInput(runtime) {
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial,
claimAnchorAudit: runtime.claimAnchorAudit,
temporalGuard: runtime.temporalGuard,
focusDomainForGuards: runtime.focusDomainForGuards,
companyAnchors: runtime.companyAnchors,
focusDomainForGuards: normalizeFocusDomainForGuards(runtime.focusDomainForGuards),
companyAnchors: toCompanyAnchorSet(runtime.companyAnchors),
userMessage: runtime.userMessage
};
}
@@ -72,7 +154,7 @@ function buildAssistantDeepTurnGroundingRuntimeInput(input, runtime) {
normalizedPayload: input.normalizedPayload,
userMessage: input.userMessage,
requirementExtraction: runtime.requirementExtraction,
extractRequirements: input.extractRequirements,
extractRequirements: (routeSummary, normalized, userMessage) => input.extractRequirements(routeSummary, normalized ?? null, userMessage),
evaluateCoverage: input.evaluateCoverage,
checkGrounding: input.checkGrounding,
temporalGuard: runtime.temporalGuard,
@@ -106,8 +188,28 @@ function buildAssistantDeepTurnCompositionRuntimeInput(input, runtime) {
function buildAssistantDeepTurnAnalysisRuntimeInput(input) {
return {
userMessage: input.userMessage,
runContextRuntime: () => input.runDeepTurnContextRuntimeSafe(buildAssistantDeepTurnContextRuntimeInput(input)),
runExecutionPlanRuntime: (runtime) => input.runDeepTurnPlanRuntimeSafe(buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime)),
runContextRuntime: () => {
const runtime = input.runDeepTurnContextRuntimeSafe(buildAssistantDeepTurnContextRuntimeInput(input));
return {
companyAnchors: toCompanyAnchorSet(runtime.companyAnchors),
focusDomainForGuards: normalizeFocusDomainForGuards(runtime.focusDomainForGuards),
temporalGuard: runtime.temporalGuard,
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial,
claimAnchorAudit: runtime.claimAnchorAudit,
businessScopeResolution: runtime.businessScopeResolution,
resolvedRouteSummary: runtime.resolvedRouteSummary,
liveTemporalHint: runtime.liveTemporalHint
};
},
runExecutionPlanRuntime: (runtime) => {
const output = input.runDeepTurnPlanRuntimeSafe(buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime));
return {
requirementExtraction: output.requirementExtraction,
executionPlan: output.executionPlan,
rbpRoutePlanEnforcement: output.rbpRoutePlanEnforcement,
faRoutePlanEnforcement: output.faRoutePlanEnforcement
};
},
runRetrievalRuntime: (runtime) => input.runDeepTurnRetrievalRuntimeSafe(buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime)),
runGuardRuntime: (runtime) => input.runDeepTurnGuardRuntimeSafe(buildAssistantDeepTurnGuardRuntimeInput(runtime)),
runGroundingRuntime: (runtime) => input.runDeepTurnGroundingRuntimeSafe(buildAssistantDeepTurnGroundingRuntimeInput(input, runtime)),
@@ -3,6 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.buildAssistantDeepTurnComposition = buildAssistantDeepTurnComposition;
const questionTypeResolver_1 = require("./questionTypeResolver");
const answerComposer_1 = require("./answerComposer");
function toStringArray(value) {
if (!Array.isArray(value)) {
return [];
}
return value
.map((item) => (typeof item === "string" ? item.trim() : ""))
.filter((item) => item.length > 0);
}
function normalizeCompanyAnchorSet(value) {
if (!value || typeof value !== "object" || Array.isArray(value)) {
return null;
}
const source = value;
return {
contract_numbers: toStringArray(source.contract_numbers),
document_numbers: toStringArray(source.document_numbers),
dates: toStringArray(source.dates),
amounts: toStringArray(source.amounts),
accounts: toStringArray(source.accounts),
periods: toStringArray(source.periods),
document_types: toStringArray(source.document_types),
all: toStringArray(source.all)
};
}
function buildAssistantDeepTurnComposition(input) {
const resolveQuestionTypeSafe = input.resolveQuestionTypeFn ?? questionTypeResolver_1.resolveQuestionType;
const composeAssistantAnswerSafe = input.composeAssistantAnswerFn ?? answerComposer_1.composeAssistantAnswer;
@@ -11,7 +35,7 @@ function buildAssistantDeepTurnComposition(input) {
? input.investigationState?.followup_context?.active_domain ?? input.investigationState?.focus.domain ?? null
: null;
const questionTypeClass = resolveQuestionTypeSafe(input.userMessage);
const companyAnchorSet = input.companyAnchors;
const companyAnchorSet = normalizeCompanyAnchorSet(input.companyAnchors);
const hasPeriodInCompanyAnchors = (Array.isArray(companyAnchorSet?.dates) && companyAnchorSet.dates.some((item) => String(item ?? "").trim().length > 0)) ||
(Array.isArray(companyAnchorSet?.periods) && companyAnchorSet.periods.some((item) => String(item ?? "").trim().length > 0));
const normalizationPeriodExplicit = input.hasExplicitPeriodAnchor(input.normalizedPayload) || hasPeriodInCompanyAnchors;
@@ -24,7 +48,7 @@ function buildAssistantDeepTurnComposition(input) {
groundingCheck: input.groundingCheck,
focusDomainHint,
questionTypeHint: questionTypeClass,
companyAnchors: input.companyAnchors,
companyAnchors: companyAnchorSet,
normalizationPeriodExplicit,
enableAnswerPolicyV11: input.featureAnswerPolicyV11,
enableProblemCentricAnswerV1: input.featureProblemCentricAnswerV1,
@@ -5,8 +5,8 @@ const assistantOrchestrationRuntimeAdapter_1 = require("./assistantOrchestration
const assistantDeepTurnGuardRuntimeAdapter_1 = require("./assistantDeepTurnGuardRuntimeAdapter");
function runAssistantDeepTurnGroundingRuntime(input) {
const runCoverageGroundingPipelineSafe = input.runCoverageGroundingPipelineFn ?? assistantOrchestrationRuntimeAdapter_1.runAssistantCoverageGroundingPipeline;
const applyGroundingEligibilitySafe = input.applyGroundingEligibilityFn ??
((payload) => (0, assistantDeepTurnGuardRuntimeAdapter_1.applyAssistantDeepTurnGroundingEligibility)(payload));
const applyGroundingEligibilityDefault = (payload) => (0, assistantDeepTurnGuardRuntimeAdapter_1.applyAssistantDeepTurnGroundingEligibility)(payload);
const applyGroundingEligibilitySafe = input.applyGroundingEligibilityFn ?? applyGroundingEligibilityDefault;
const rbpLiveRouteAudit = input.collectRbpLiveRouteAudit({
claimType: input.claimType,
retrievalResults: input.retrievalResults,
@@ -83,7 +83,7 @@ function assembleAssistantDeepTurnPackaging(input) {
text: deepAnswerArtifacts.safeAssistantReply,
replyType: input.composition.reply_type,
traceId: input.normalized.trace_id,
debug: debug
debug
});
const deepAnalysisLogDetails = (0, assistantMessageLogAssembler_1.buildDeepAnalysisProcessedLogDetails)({
sessionId: input.sessionId,
@@ -391,25 +391,26 @@ function normalizeEvidenceItems(fragmentId, requirementIds, route, value) {
});
}
function normalizeRetrievalResult(fragmentId, requirementIds, route, raw) {
const items = normalizeObjectArray(raw.items);
const summary = normalizeSummary(raw.summary);
const evidence = normalizeEvidenceItems(fragmentId, requirementIds, route, raw.evidence);
const rawResult = toObject(raw) ?? {};
const items = normalizeObjectArray(rawResult.items);
const summary = normalizeSummary(rawResult.summary);
const evidence = normalizeEvidenceItems(fragmentId, requirementIds, route, rawResult.evidence);
const baseResult = {
fragment_id: fragmentId,
requirement_ids: requirementIds,
route,
status: normalizeStatus(raw.status),
result_type: normalizeResultType(raw.result_type),
status: normalizeStatus(rawResult.status),
result_type: normalizeResultType(rawResult.result_type),
items,
summary,
evidence,
why_included: normalizeStringArray(raw.why_included),
selection_reason: normalizeStringArray(raw.selection_reason),
risk_factors: normalizeStringArray(raw.risk_factors),
business_interpretation: normalizeStringArray(raw.business_interpretation),
confidence: normalizeConfidence(raw.confidence),
limitations: normalizeStringArray(raw.limitations),
errors: normalizeErrors(raw.errors)
why_included: normalizeStringArray(rawResult.why_included),
selection_reason: normalizeStringArray(rawResult.selection_reason),
risk_factors: normalizeStringArray(rawResult.risk_factors),
business_interpretation: normalizeStringArray(rawResult.business_interpretation),
confidence: normalizeConfidence(rawResult.confidence),
limitations: normalizeStringArray(rawResult.limitations),
errors: normalizeErrors(rawResult.errors)
};
if (!config_1.FEATURE_ASSISTANT_PROBLEM_UNITS_V1) {
return baseResult;
@@ -81,7 +81,7 @@ function toAnalysisContext(input: DeepAnalysisDebugPayloadInput["runtimeAnalysis
};
}
export function buildDeepAnalysisDebugPayload(input: DeepAnalysisDebugPayloadInput): Record<string, unknown> {
export function buildDeepAnalysisDebugPayload(input: DeepAnalysisDebugPayloadInput): AssistantDebugPayload {
const analysisContext = toAnalysisContext(input.runtimeAnalysisContext);
return {
trace_id: input.traceId,
@@ -156,5 +156,5 @@ export function buildDeepAnalysisDebugPayload(input: DeepAnalysisDebugPayloadInp
answer_structure_v11: input.answerStructureV11,
investigation_state_snapshot: input.investigationStateSnapshot,
normalized: input.normalizedPayload
};
} as unknown as AssistantDebugPayload;
}
@@ -2,6 +2,8 @@ import { resolveCompanyAnchors } from "./companyAnchorResolver";
import {
applyPolarityHintToExecutionPlan,
applyTemporalHintToExecutionPlan,
type DomainPolarityGuardAudit,
type TemporalGuardAudit,
resolveDomainPolarityGuard,
resolveTemporalGuard
} from "./assistantRuntimeGuards";
@@ -13,8 +15,7 @@ import type {
} from "./assistantDeepTurnContextRuntimeAdapter";
import type {
BuildAssistantDeepTurnExecutionPlanInput,
BuildAssistantDeepTurnExecutionPlanOutput,
AssistantRequirementExtractionLike
BuildAssistantDeepTurnExecutionPlanOutput
} from "./assistantDeepTurnPlanRuntimeAdapter";
import type {
AssistantDeepTurnRetrievalExecutionInput,
@@ -32,14 +33,120 @@ import type {
BuildAssistantDeepTurnCompositionInput,
AssistantDeepTurnCompositionOutput
} from "./assistantDeepTurnCompositionRuntimeAdapter";
import type { AssistantExecutionPlanItem } from "./assistantQueryPlanning";
import type { RunAssistantDeepTurnAnalysisAttemptRuntimeInput } from "./assistantDeepTurnAnalysisAttemptRuntimeAdapter";
import type { CompanyAnchorSet } from "./companyAnchorResolver";
type ExecutionPlanRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runExecutionPlanRuntime"]>[0];
type RetrievalRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runRetrievalRuntime"]>[0];
type GuardRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runGuardRuntime"]>[0];
type GroundingRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runGroundingRuntime"]>[0];
type CompositionRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runCompositionRuntime"]>[0];
type ClaimBoundPrimaryPeriod = Parameters<typeof resolveClaimBoundAnchors>[0]["primaryPeriod"];
const KNOWN_GUARD_DOMAINS = [
"settlements_60_62",
"vat_document_register_book",
"month_close_costs_20_44",
"fixed_asset_amortization"
] as const;
function toRecordObject(value: unknown): Record<string, unknown> | null {
if (!value || typeof value !== "object" || Array.isArray(value)) {
return null;
}
return value as Record<string, unknown>;
}
function toStringArray(value: unknown): string[] {
if (!Array.isArray(value)) {
return [];
}
return value
.map((item) => (typeof item === "string" ? item.trim() : ""))
.filter((item) => item.length > 0);
}
function toCompanyAnchorSet(value: unknown): CompanyAnchorSet | null {
const source = toRecordObject(value);
if (!source) {
return null;
}
return {
contract_numbers: toStringArray(source.contract_numbers),
document_numbers: toStringArray(source.document_numbers),
dates: toStringArray(source.dates),
amounts: toStringArray(source.amounts),
accounts: toStringArray(source.accounts),
periods: toStringArray(source.periods),
document_types: toStringArray(source.document_types),
all: toStringArray(source.all)
};
}
function toClaimBoundPrimaryPeriod(value: unknown): ClaimBoundPrimaryPeriod {
const source = toRecordObject(value);
if (!source) {
return null;
}
const from = typeof source.from === "string" ? source.from.trim() : "";
const to = typeof source.to === "string" ? source.to.trim() : "";
const granularity = source.granularity === "day" || source.granularity === "month" ? source.granularity : null;
if (!from || !to || !granularity) {
return null;
}
return {
from,
to,
granularity
};
}
function normalizeFocusDomainForGuards(
value: unknown
): AssistantDeepTurnRetrievalGuardPipelineInput["focusDomainForGuards"] {
const normalized = typeof value === "string" ? value.trim() : "";
if (!normalized) {
return null;
}
if (KNOWN_GUARD_DOMAINS.includes(normalized as (typeof KNOWN_GUARD_DOMAINS)[number])) {
return normalized as AssistantDeepTurnRetrievalGuardPipelineInput["focusDomainForGuards"];
}
return null;
}
const resolveTemporalGuardAdapter: BuildAssistantDeepTurnRuntimeContextInput["resolveTemporalGuard"] = (input) =>
resolveTemporalGuard({
userMessage: input.userMessage,
normalized: input.normalized,
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
analysisContext: input.analysisContext
});
const resolveDomainPolarityGuardAdapter: BuildAssistantDeepTurnRuntimeContextInput["resolveDomainPolarityGuard"] = (
input
) =>
resolveDomainPolarityGuard({
userMessage: input.userMessage,
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
focusDomainHint: input.focusDomainHint
});
const resolveClaimBoundAnchorsAdapter: BuildAssistantDeepTurnRuntimeContextInput["resolveClaimBoundAnchors"] = (
input
) =>
resolveClaimBoundAnchors({
userMessage: input.userMessage,
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
focusDomainHint: input.focusDomainHint,
primaryPeriod: toClaimBoundPrimaryPeriod(input.primaryPeriod)
});
const applyTemporalHintToExecutionPlanAdapter: BuildAssistantDeepTurnExecutionPlanInput["applyTemporalHintToExecutionPlan"] =
(executionPlan, temporalGuard) =>
applyTemporalHintToExecutionPlan(executionPlan, temporalGuard as TemporalGuardAudit);
const applyPolarityHintToExecutionPlanAdapter: BuildAssistantDeepTurnExecutionPlanInput["applyPolarityHintToExecutionPlan"] =
(executionPlan, domainPolarityGuardInitial) =>
applyPolarityHintToExecutionPlan(executionPlan, domainPolarityGuardInitial as DomainPolarityGuardAudit);
export interface BuildAssistantDeepTurnAnalysisRuntimeInputInput
extends RunAssistantDeepTurnAnalysisAttemptRuntimeInput {
@@ -75,9 +182,9 @@ export function buildAssistantDeepTurnContextRuntimeInput(
resolveCompanyAnchors,
resolveBusinessScopeAlignment: input.resolveBusinessScopeAlignment,
inferP0DomainFromMessage: input.inferP0DomainFromMessage,
resolveTemporalGuard: resolveTemporalGuard as any,
resolveDomainPolarityGuard: resolveDomainPolarityGuard as any,
resolveClaimBoundAnchors: resolveClaimBoundAnchors as any,
resolveTemporalGuard: resolveTemporalGuardAdapter,
resolveDomainPolarityGuard: resolveDomainPolarityGuardAdapter,
resolveClaimBoundAnchors: resolveClaimBoundAnchorsAdapter,
resolveBusinessScopeFromLiveContext: input.resolveBusinessScopeFromLiveContext
};
}
@@ -97,8 +204,8 @@ export function buildAssistantDeepTurnExecutionPlanRuntimeInput(
toExecutionPlan: input.toExecutionPlan,
enforceRbpLiveRoutePlan: input.enforceRbpLiveRoutePlan,
enforceFaLiveRoutePlan: input.enforceFaLiveRoutePlan,
applyTemporalHintToExecutionPlan: applyTemporalHintToExecutionPlan as any,
applyPolarityHintToExecutionPlan: applyPolarityHintToExecutionPlan as any
applyTemporalHintToExecutionPlan: applyTemporalHintToExecutionPlanAdapter,
applyPolarityHintToExecutionPlan: applyPolarityHintToExecutionPlanAdapter
};
}
@@ -107,7 +214,7 @@ export function buildAssistantDeepTurnRetrievalRuntimeInput(
runtime: RetrievalRuntimeArgs
): AssistantDeepTurnRetrievalExecutionInput {
return {
executionPlan: runtime.executionPlan as AssistantExecutionPlanItem[],
executionPlan: runtime.executionPlan,
liveTemporalHint: runtime.liveTemporalHint,
executeRouteRuntime: input.executeRouteRuntime,
mapNoRouteReason: input.mapNoRouteReason,
@@ -120,11 +227,11 @@ export function buildAssistantDeepTurnGuardRuntimeInput(
): AssistantDeepTurnRetrievalGuardPipelineInput {
return {
retrievalResults: runtime.retrievalResults,
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial as any,
claimAnchorAudit: runtime.claimAnchorAudit as any,
temporalGuard: runtime.temporalGuard as any,
focusDomainForGuards: runtime.focusDomainForGuards as any,
companyAnchors: runtime.companyAnchors as any,
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial,
claimAnchorAudit: runtime.claimAnchorAudit,
temporalGuard: runtime.temporalGuard,
focusDomainForGuards: normalizeFocusDomainForGuards(runtime.focusDomainForGuards),
companyAnchors: toCompanyAnchorSet(runtime.companyAnchors),
userMessage: runtime.userMessage
};
}
@@ -141,18 +248,19 @@ export function buildAssistantDeepTurnGroundingRuntimeInput(
routeSummary: runtime.routeSummary,
normalizedPayload: input.normalizedPayload,
userMessage: input.userMessage,
requirementExtraction: runtime.requirementExtraction as AssistantRequirementExtractionLike,
extractRequirements: input.extractRequirements as any,
evaluateCoverage: input.evaluateCoverage as any,
checkGrounding: input.checkGrounding as any,
requirementExtraction: runtime.requirementExtraction,
extractRequirements: (routeSummary, normalized, userMessage) =>
input.extractRequirements(routeSummary, normalized ?? null, userMessage),
evaluateCoverage: input.evaluateCoverage,
checkGrounding: input.checkGrounding,
temporalGuard: runtime.temporalGuard,
polarityAudit: runtime.polarityAudit,
evidenceAudit: runtime.evidenceAudit,
claimAnchorAudit: runtime.claimAnchorAudit,
targetedEvidenceHitRate: runtime.targetedEvidenceHitRate,
businessScopeResolved: runtime.businessScopeResolved,
collectRbpLiveRouteAudit: input.collectRbpLiveRouteAudit as any,
collectFaLiveRouteAudit: input.collectFaLiveRouteAudit as any
collectRbpLiveRouteAudit: input.collectRbpLiveRouteAudit,
collectFaLiveRouteAudit: input.collectFaLiveRouteAudit
};
}
@@ -183,25 +291,37 @@ export function buildAssistantDeepTurnAnalysisRuntimeInput(
): RunAssistantDeepTurnAnalysisRuntimeInput {
return {
userMessage: input.userMessage,
runContextRuntime: () =>
input.runDeepTurnContextRuntimeSafe(buildAssistantDeepTurnContextRuntimeInput(input)) as any,
runExecutionPlanRuntime: (runtime) =>
input.runDeepTurnPlanRuntimeSafe(
runContextRuntime: () => {
const runtime = input.runDeepTurnContextRuntimeSafe(buildAssistantDeepTurnContextRuntimeInput(input));
return {
companyAnchors: toCompanyAnchorSet(runtime.companyAnchors),
focusDomainForGuards: normalizeFocusDomainForGuards(runtime.focusDomainForGuards),
temporalGuard: runtime.temporalGuard,
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial,
claimAnchorAudit: runtime.claimAnchorAudit,
businessScopeResolution: runtime.businessScopeResolution,
resolvedRouteSummary: runtime.resolvedRouteSummary,
liveTemporalHint: runtime.liveTemporalHint
};
},
runExecutionPlanRuntime: (runtime) => {
const output = input.runDeepTurnPlanRuntimeSafe(
buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime)
) as any,
);
return {
requirementExtraction: output.requirementExtraction,
executionPlan: output.executionPlan,
rbpRoutePlanEnforcement: output.rbpRoutePlanEnforcement,
faRoutePlanEnforcement: output.faRoutePlanEnforcement
};
},
runRetrievalRuntime: (runtime) =>
input.runDeepTurnRetrievalRuntimeSafe(
buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime)
) as any,
input.runDeepTurnRetrievalRuntimeSafe(buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime)),
runGuardRuntime: (runtime) =>
input.runDeepTurnGuardRuntimeSafe(buildAssistantDeepTurnGuardRuntimeInput(runtime) as any),
input.runDeepTurnGuardRuntimeSafe(buildAssistantDeepTurnGuardRuntimeInput(runtime)),
runGroundingRuntime: (runtime) =>
input.runDeepTurnGroundingRuntimeSafe(
buildAssistantDeepTurnGroundingRuntimeInput(input, runtime)
) as any,
input.runDeepTurnGroundingRuntimeSafe(buildAssistantDeepTurnGroundingRuntimeInput(input, runtime)),
runCompositionRuntime: (runtime) =>
input.runDeepTurnCompositionRuntimeSafe(
buildAssistantDeepTurnCompositionRuntimeInput(input, runtime)
) as any
input.runDeepTurnCompositionRuntimeSafe(buildAssistantDeepTurnCompositionRuntimeInput(input, runtime))
};
}
@@ -1,26 +1,32 @@
import type { AnswerGroundingCheck, AssistantRequirement, RequirementCoverageReport, UnifiedRetrievalResult } from "../types/assistant";
import type { RouteHintSummary } from "../types/normalizer";
import type { ClaimBoundAnchorAudit } from "./assistantClaimBoundEvidence";
import type {
AssistantDeepTurnRetrievalGuardPipelineInput,
AssistantDeepTurnRetrievalGuardPipelineOutput
} from "./assistantDeepTurnGuardRuntimeAdapter";
import type {
AssistantPlanEnforcementAuditLike,
AssistantRequirementExtractionLike
} from "./assistantDeepTurnPlanRuntimeAdapter";
import type { AssistantExecutionPlanItem } from "./assistantQueryPlanning";
import type {
AssistantDeepTurnRetrievalExecutionOutput,
AssistantLiveTemporalHint
} from "./assistantDeepTurnRetrievalRuntimeAdapter";
import type { AssistantDeepTurnRetrievalGuardPipelineOutput } from "./assistantDeepTurnGuardRuntimeAdapter";
import type { AssistantDeepTurnGroundingRuntimeOutput } from "./assistantDeepTurnGroundingRuntimeAdapter";
import type {
AssistantDeepTurnGroundingRuntimeInput,
AssistantDeepTurnGroundingRuntimeOutput
} from "./assistantDeepTurnGroundingRuntimeAdapter";
import type { AssistantDeepTurnCompositionOutput } from "./assistantDeepTurnCompositionRuntimeAdapter";
import type { DomainPolarityGuardAudit, TemporalGuardAudit } from "./assistantRuntimeGuards";
export interface AssistantDeepTurnRuntimeContextLike {
companyAnchors: unknown;
focusDomainForGuards: string | null;
temporalGuard: unknown;
domainPolarityGuardInitial: unknown;
claimAnchorAudit: {
claim_type: string;
[key: string]: unknown;
};
companyAnchors: AssistantDeepTurnRetrievalGuardPipelineInput["companyAnchors"];
focusDomainForGuards: AssistantDeepTurnRetrievalGuardPipelineInput["focusDomainForGuards"];
temporalGuard: TemporalGuardAudit;
domainPolarityGuardInitial: DomainPolarityGuardAudit;
claimAnchorAudit: ClaimBoundAnchorAudit;
businessScopeResolution: {
business_scope_resolved?: string[] | null;
[key: string]: unknown;
@@ -35,25 +41,25 @@ export interface RunAssistantDeepTurnAnalysisRuntimeInput {
runExecutionPlanRuntime: (input: {
resolvedRouteSummary: RouteHintSummary | null;
claimAnchorAudit: AssistantDeepTurnRuntimeContextLike["claimAnchorAudit"];
temporalGuard: unknown;
domainPolarityGuardInitial: unknown;
temporalGuard: TemporalGuardAudit;
domainPolarityGuardInitial: DomainPolarityGuardAudit;
}) => {
requirementExtraction: AssistantRequirementExtractionLike;
executionPlan: unknown[];
executionPlan: AssistantExecutionPlanItem[];
rbpRoutePlanEnforcement: AssistantPlanEnforcementAuditLike;
faRoutePlanEnforcement: AssistantPlanEnforcementAuditLike;
};
runRetrievalRuntime: (input: {
executionPlan: unknown[];
executionPlan: AssistantExecutionPlanItem[];
liveTemporalHint: AssistantLiveTemporalHint | null;
}) => Promise<AssistantDeepTurnRetrievalExecutionOutput>;
runGuardRuntime: (input: {
retrievalResults: UnifiedRetrievalResult[];
domainPolarityGuardInitial: unknown;
domainPolarityGuardInitial: DomainPolarityGuardAudit;
claimAnchorAudit: AssistantDeepTurnRuntimeContextLike["claimAnchorAudit"];
temporalGuard: unknown;
focusDomainForGuards: string | null;
companyAnchors: unknown;
temporalGuard: TemporalGuardAudit;
focusDomainForGuards: AssistantDeepTurnRetrievalGuardPipelineInput["focusDomainForGuards"];
companyAnchors: AssistantDeepTurnRetrievalGuardPipelineInput["companyAnchors"];
userMessage: string;
}) => AssistantDeepTurnRetrievalGuardPipelineOutput;
runGroundingRuntime: (input: {
@@ -63,10 +69,10 @@ export interface RunAssistantDeepTurnAnalysisRuntimeInput {
faPlanAudit: unknown;
routeSummary: RouteHintSummary | null;
requirementExtraction: AssistantRequirementExtractionLike;
temporalGuard: unknown;
polarityAudit: unknown;
evidenceAudit: unknown;
claimAnchorAudit: AssistantDeepTurnRuntimeContextLike["claimAnchorAudit"];
temporalGuard: AssistantDeepTurnGroundingRuntimeInput["temporalGuard"];
polarityAudit: AssistantDeepTurnGroundingRuntimeInput["polarityAudit"];
evidenceAudit: AssistantDeepTurnGroundingRuntimeInput["evidenceAudit"];
claimAnchorAudit: AssistantDeepTurnGroundingRuntimeInput["claimAnchorAudit"];
targetedEvidenceHitRate?: number | null;
businessScopeResolved?: string[] | null;
}) => AssistantDeepTurnGroundingRuntimeOutput;
@@ -87,7 +93,7 @@ export interface RunAssistantDeepTurnAnalysisRuntimeOutput {
businessScopeResolution: AssistantDeepTurnRuntimeContextLike["businessScopeResolution"];
resolvedRouteSummary: RouteHintSummary | null;
requirementExtraction: AssistantRequirementExtractionLike;
executionPlan: unknown[];
executionPlan: AssistantExecutionPlanItem[];
retrievalCalls: AssistantDeepTurnRetrievalExecutionOutput["retrievalCalls"];
retrievalResultsRaw: AssistantDeepTurnRetrievalExecutionOutput["retrievalResultsRaw"];
retrievalResults: UnifiedRetrievalResult[];
@@ -1,4 +1,4 @@
import type { AssistantMessageResponsePayload } from "../types/assistant";
import type { AssistantDebugPayload, AssistantMessageResponsePayload } from "../types/assistant";
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
import {
buildAssistantDeepTurnNormalizationRuntime,
@@ -74,13 +74,13 @@ export interface RunAssistantDeepTurnAttemptRuntimeInput<ResponseType = Assistan
input: RunAssistantDeepTurnResponseAttemptRuntimeInput<ResponseType>
) => {
response: ResponseType;
debug: Record<string, unknown>;
debug: AssistantDebugPayload;
};
}
export interface RunAssistantDeepTurnAttemptRuntimeOutput<ResponseType = AssistantMessageResponsePayload> {
response: ResponseType;
debug: Record<string, unknown>;
debug: AssistantDebugPayload;
normalizationRuntime: BuildAssistantDeepTurnNormalizationRuntimeOutput;
deepTurnAnalysisRuntime: RunAssistantDeepTurnAnalysisRuntimeOutput;
}
@@ -92,8 +92,12 @@ export async function runAssistantDeepTurnAttemptRuntime<ResponseType = Assistan
input.runDeepTurnNormalizationRuntime ?? buildAssistantDeepTurnNormalizationRuntime;
const runDeepTurnAnalysisAttemptRuntimeSafe =
input.runDeepTurnAnalysisAttemptRuntime ?? runAssistantDeepTurnAnalysisAttemptRuntime;
const runDeepTurnResponseAttemptRuntimeSafe =
input.runDeepTurnResponseAttemptRuntime ?? runAssistantDeepTurnResponseAttemptRuntime;
const runDeepTurnResponseAttemptRuntimeSafe: (
input: RunAssistantDeepTurnResponseAttemptRuntimeInput<ResponseType>
) => {
response: ResponseType;
debug: AssistantDebugPayload;
} = input.runDeepTurnResponseAttemptRuntime ?? runAssistantDeepTurnResponseAttemptRuntime;
const normalizationRuntime = await runDeepTurnNormalizationRuntimeSafe(
buildAssistantDeepTurnNormalizationRuntimeInput({
@@ -4,6 +4,7 @@ import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemU
import type { QuestionTypeClass } from "./questionTypeResolver";
import { resolveQuestionType } from "./questionTypeResolver";
import { composeAssistantAnswer } from "./answerComposer";
import type { CompanyAnchorSet } from "./companyAnchorResolver";
export interface BuildAssistantDeepTurnCompositionInput {
userMessage: string;
@@ -32,6 +33,32 @@ export interface AssistantDeepTurnCompositionOutput {
composition: ReturnType<typeof composeAssistantAnswer>;
}
function toStringArray(value: unknown): string[] {
if (!Array.isArray(value)) {
return [];
}
return value
.map((item) => (typeof item === "string" ? item.trim() : ""))
.filter((item) => item.length > 0);
}
function normalizeCompanyAnchorSet(value: unknown): CompanyAnchorSet | null {
if (!value || typeof value !== "object" || Array.isArray(value)) {
return null;
}
const source = value as Record<string, unknown>;
return {
contract_numbers: toStringArray(source.contract_numbers),
document_numbers: toStringArray(source.document_numbers),
dates: toStringArray(source.dates),
amounts: toStringArray(source.amounts),
accounts: toStringArray(source.accounts),
periods: toStringArray(source.periods),
document_types: toStringArray(source.document_types),
all: toStringArray(source.all)
};
}
export function buildAssistantDeepTurnComposition(
input: BuildAssistantDeepTurnCompositionInput
): AssistantDeepTurnCompositionOutput {
@@ -43,10 +70,7 @@ export function buildAssistantDeepTurnComposition(
? input.investigationState?.followup_context?.active_domain ?? input.investigationState?.focus.domain ?? null
: null;
const questionTypeClass = resolveQuestionTypeSafe(input.userMessage);
const companyAnchorSet = input.companyAnchors as {
dates?: unknown[];
periods?: unknown[];
} | null;
const companyAnchorSet = normalizeCompanyAnchorSet(input.companyAnchors);
const hasPeriodInCompanyAnchors =
(Array.isArray(companyAnchorSet?.dates) && companyAnchorSet.dates.some((item) => String(item ?? "").trim().length > 0)) ||
(Array.isArray(companyAnchorSet?.periods) && companyAnchorSet.periods.some((item) => String(item ?? "").trim().length > 0));
@@ -60,7 +84,7 @@ export function buildAssistantDeepTurnComposition(
groundingCheck: input.groundingCheck,
focusDomainHint,
questionTypeHint: questionTypeClass,
companyAnchors: input.companyAnchors as any,
companyAnchors: companyAnchorSet,
normalizationPeriodExplicit,
enableAnswerPolicyV11: input.featureAnswerPolicyV11,
enableProblemCentricAnswerV1: input.featureProblemCentricAnswerV1,
@@ -1,4 +1,7 @@
import type { NormalizeResponsePayload, RouteHintSummary } from "../types/normalizer";
import type { ClaimBoundAnchorAudit } from "./assistantClaimBoundEvidence";
import type { AssistantLiveTemporalHint } from "./assistantDeepTurnRetrievalRuntimeAdapter";
import type { DomainPolarityGuardAudit, TemporalGuardAudit } from "./assistantRuntimeGuards";
const KNOWN_P0_DOMAINS = new Set([
"settlements_60_62",
@@ -9,7 +12,7 @@ const KNOWN_P0_DOMAINS = new Set([
function toAnalysisContext(
runtimeAnalysisContext: BuildAssistantDeepTurnRuntimeContextInput["runtimeAnalysisContext"]
): Record<string, string | null> | null {
): AssistantLiveTemporalHint | null {
if (!runtimeAnalysisContext.active) {
return null;
}
@@ -48,26 +51,19 @@ export interface BuildAssistantDeepTurnRuntimeContextInput {
userMessage: string;
normalized: NormalizeResponsePayload["normalized"];
companyAnchors: unknown;
analysisContext: Record<string, string | null> | null;
}) => {
effective_primary_period?: unknown;
primary_period_window?: unknown;
[key: string]: unknown;
};
analysisContext: AssistantLiveTemporalHint | null;
}) => TemporalGuardAudit;
resolveDomainPolarityGuard: (input: {
userMessage: string;
companyAnchors: unknown;
focusDomainHint: string | null;
}) => unknown;
}) => DomainPolarityGuardAudit;
resolveClaimBoundAnchors: (input: {
userMessage: string;
companyAnchors: unknown;
focusDomainHint: string | null;
primaryPeriod: unknown;
}) => {
claim_type: string;
[key: string]: unknown;
};
}) => ClaimBoundAnchorAudit;
resolveBusinessScopeFromLiveContext: (input: {
current: {
route_summary_resolved: RouteHintSummary | null;
@@ -93,22 +89,15 @@ export interface BuildAssistantDeepTurnRuntimeContextOutput {
};
inferredDomainByMessage: string | null;
focusDomainForGuards: string | null;
temporalGuard: {
effective_primary_period?: unknown;
primary_period_window?: unknown;
[key: string]: unknown;
};
domainPolarityGuardInitial: unknown;
claimAnchorAudit: {
claim_type: string;
[key: string]: unknown;
};
temporalGuard: TemporalGuardAudit;
domainPolarityGuardInitial: DomainPolarityGuardAudit;
claimAnchorAudit: ClaimBoundAnchorAudit;
businessScopeResolution: {
route_summary_resolved: RouteHintSummary | null;
[key: string]: unknown;
};
resolvedRouteSummary: RouteHintSummary | null;
liveTemporalHint: Record<string, string | null> | null;
liveTemporalHint: AssistantLiveTemporalHint | null;
}
export function buildAssistantDeepTurnRuntimeContext(
@@ -8,7 +8,10 @@ import type { NormalizeResponsePayload, RouteHintSummary } from "../types/normal
import type { AssistantRequirementExtractionResult, AssistantCoverageEvaluationResult } from "./assistantOrchestrationRuntimeAdapter";
import { runAssistantCoverageGroundingPipeline } from "./assistantOrchestrationRuntimeAdapter";
import type { AssistantDeepTurnGroundingEligibilityOutput } from "./assistantDeepTurnGuardRuntimeAdapter";
import { applyAssistantDeepTurnGroundingEligibility } from "./assistantDeepTurnGuardRuntimeAdapter";
import {
applyAssistantDeepTurnGroundingEligibility,
type AssistantDeepTurnGroundingEligibilityInput
} from "./assistantDeepTurnGuardRuntimeAdapter";
export interface AssistantDeepTurnGroundingRuntimeInput {
claimType: string;
@@ -34,10 +37,10 @@ export interface AssistantDeepTurnGroundingRuntimeInput {
coverage: RequirementCoverageReport,
retrievalResults: UnifiedRetrievalResult[]
) => AnswerGroundingCheck;
temporalGuard: unknown;
polarityAudit: unknown;
evidenceAudit: unknown;
claimAnchorAudit: unknown;
temporalGuard: AssistantDeepTurnGroundingEligibilityInput<AnswerGroundingCheck>["temporalGuard"];
polarityAudit: AssistantDeepTurnGroundingEligibilityInput<AnswerGroundingCheck>["polarityAudit"];
evidenceAudit: AssistantDeepTurnGroundingEligibilityInput<AnswerGroundingCheck>["evidenceAudit"];
claimAnchorAudit: AssistantDeepTurnGroundingEligibilityInput<AnswerGroundingCheck>["claimAnchorAudit"];
targetedEvidenceHitRate?: number | null;
businessScopeResolved?: string[] | null;
collectRbpLiveRouteAudit: (input: {
@@ -51,15 +54,9 @@ export interface AssistantDeepTurnGroundingRuntimeInput {
planAudit: unknown;
}) => unknown;
runCoverageGroundingPipelineFn?: typeof runAssistantCoverageGroundingPipeline;
applyGroundingEligibilityFn?: (input: {
groundingCheckBase: AnswerGroundingCheck;
temporalGuard: unknown;
polarityAudit: unknown;
evidenceAudit: unknown;
claimAnchorAudit?: unknown;
targetedEvidenceHitRate?: number | null;
businessScopeResolved?: string[] | null;
}) => AssistantDeepTurnGroundingEligibilityOutput<AnswerGroundingCheck>;
applyGroundingEligibilityFn?: (
input: AssistantDeepTurnGroundingEligibilityInput<AnswerGroundingCheck>
) => AssistantDeepTurnGroundingEligibilityOutput<AnswerGroundingCheck>;
}
export interface AssistantDeepTurnGroundingRuntimeOutput {
@@ -75,9 +72,11 @@ export function runAssistantDeepTurnGroundingRuntime(
input: AssistantDeepTurnGroundingRuntimeInput
): AssistantDeepTurnGroundingRuntimeOutput {
const runCoverageGroundingPipelineSafe = input.runCoverageGroundingPipelineFn ?? runAssistantCoverageGroundingPipeline;
const applyGroundingEligibilityDefault: NonNullable<
AssistantDeepTurnGroundingRuntimeInput["applyGroundingEligibilityFn"]
> = (payload) => applyAssistantDeepTurnGroundingEligibility(payload);
const applyGroundingEligibilitySafe =
input.applyGroundingEligibilityFn ??
((payload) => applyAssistantDeepTurnGroundingEligibility(payload as any) as any);
input.applyGroundingEligibilityFn ?? applyGroundingEligibilityDefault;
const rbpLiveRouteAudit = input.collectRbpLiveRouteAudit({
claimType: input.claimType,
@@ -1,5 +1,6 @@
import type {
AssistantConversationItem,
AssistantDebugPayload,
AssistantReplyType,
AssistantRequirement,
AnswerGroundingCheck,
@@ -112,7 +113,7 @@ export interface AssistantDeepTurnPackagingOutput {
evidenceBundleAssembly: AssistantEvidenceBundleAssembly;
contractsBundleV1: AssistantContractsBundleV1;
deepAnswerArtifacts: DeepAnswerArtifacts;
debug: Record<string, unknown>;
debug: AssistantDebugPayload;
assistantItem: AssistantConversationItem;
deepAnalysisLogDetails: Record<string, unknown>;
}
@@ -194,7 +195,7 @@ export function assembleAssistantDeepTurnPackaging(input: AssistantDeepTurnPacka
text: deepAnswerArtifacts.safeAssistantReply,
replyType: input.composition.reply_type,
traceId: input.normalized.trace_id,
debug: debug as any
debug
});
const deepAnalysisLogDetails = buildDeepAnalysisProcessedLogDetails({
sessionId: input.sessionId,
@@ -1,6 +1,7 @@
import { nanoid } from "nanoid";
import type {
AssistantConversationItem,
AssistantDebugPayload,
AssistantRequirement,
AnswerGroundingCheck,
RequirementCoverageReport,
@@ -101,7 +102,7 @@ export interface AssistantDeepTurnPackagingRuntimeOutput {
resolvedExecutionState: unknown;
safeAssistantReplyBase: string;
safeAssistantReply: string;
debug: Record<string, unknown>;
debug: AssistantDebugPayload;
assistantItem: AssistantConversationItem;
deepAnalysisLogDetails: Record<string, unknown>;
}
@@ -1,4 +1,4 @@
import type { AssistantMessageResponsePayload } from "../types/assistant";
import type { AssistantDebugPayload, AssistantMessageResponsePayload } from "../types/assistant";
import type { NormalizeResponsePayload } from "../types/normalizer";
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
import type { RunAssistantDeepTurnAnalysisRuntimeOutput } from "./assistantDeepTurnAnalysisRuntimeAdapter";
@@ -55,7 +55,7 @@ export function runAssistantDeepTurnResponseAttemptRuntime<
input: RunAssistantDeepTurnResponseAttemptRuntimeInput<ResponseType>
): {
response: ResponseType;
debug: Record<string, unknown>;
debug: AssistantDebugPayload;
} {
const runDeepTurnResponseRuntimeSafe =
input.runDeepTurnResponseRuntime ?? runAssistantDeepTurnResponseRuntime;
@@ -1,4 +1,4 @@
import type { AssistantMessageResponsePayload } from "../types/assistant";
import type { AssistantDebugPayload, AssistantMessageResponsePayload } from "../types/assistant";
import type { NormalizeResponsePayload, RouteHintSummary } from "../types/normalizer";
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
import {
@@ -70,7 +70,7 @@ export interface RunAssistantDeepTurnResponseRuntimeInput {
export interface RunAssistantDeepTurnResponseRuntimeOutput {
response: AssistantMessageResponsePayload;
debug: Record<string, unknown>;
debug: AssistantDebugPayload;
}
function toRecordObject(value: unknown): Record<string, unknown> | null {
@@ -105,7 +105,7 @@ export async function executeAssistantDeepTurnRetrievalPlan(
raw_result: raw
});
retrievalResults.push(
normalizeRetrievalResultSafe(planItem.fragment_id, planItem.requirement_ids, planItem.route, raw as any)
normalizeRetrievalResultSafe(planItem.fragment_id, planItem.requirement_ids, planItem.route, raw)
);
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
@@ -118,7 +118,7 @@ export async function executeAssistantDeepTurnRetrievalPlan(
raw_result: rawError
});
retrievalResults.push(
normalizeRetrievalResultSafe(planItem.fragment_id, planItem.requirement_ids, planItem.route, rawError as any)
normalizeRetrievalResultSafe(planItem.fragment_id, planItem.requirement_ids, planItem.route, rawError)
);
}
}
@@ -509,28 +509,29 @@ export function normalizeRetrievalResult(
fragmentId: string,
requirementIds: string[],
route: string,
raw: RawRetrievalResult
raw: unknown
): UnifiedRetrievalResult {
const items = normalizeObjectArray(raw.items);
const summary = normalizeSummary(raw.summary);
const evidence = normalizeEvidenceItems(fragmentId, requirementIds, route, raw.evidence);
const rawResult = (toObject(raw) as RawRetrievalResult | null) ?? {};
const items = normalizeObjectArray(rawResult.items);
const summary = normalizeSummary(rawResult.summary);
const evidence = normalizeEvidenceItems(fragmentId, requirementIds, route, rawResult.evidence);
const baseResult: UnifiedRetrievalResult = {
fragment_id: fragmentId,
requirement_ids: requirementIds,
route,
status: normalizeStatus(raw.status),
result_type: normalizeResultType(raw.result_type),
status: normalizeStatus(rawResult.status),
result_type: normalizeResultType(rawResult.result_type),
items,
summary,
evidence,
why_included: normalizeStringArray(raw.why_included),
selection_reason: normalizeStringArray(raw.selection_reason),
risk_factors: normalizeStringArray(raw.risk_factors),
business_interpretation: normalizeStringArray(raw.business_interpretation),
confidence: normalizeConfidence(raw.confidence),
limitations: normalizeStringArray(raw.limitations),
errors: normalizeErrors(raw.errors)
why_included: normalizeStringArray(rawResult.why_included),
selection_reason: normalizeStringArray(rawResult.selection_reason),
risk_factors: normalizeStringArray(rawResult.risk_factors),
business_interpretation: normalizeStringArray(rawResult.business_interpretation),
confidence: normalizeConfidence(rawResult.confidence),
limitations: normalizeStringArray(rawResult.limitations),
errors: normalizeErrors(rawResult.errors)
};
if (!FEATURE_ASSISTANT_PROBLEM_UNITS_V1) {