Архитектура: перенести base address tool gate из assistantService в assistantRoutePolicy и выровнять top-level orchestration owner

This commit is contained in:
2026-04-19 13:42:55 +03:00
parent d1ad8e2c1b
commit ac3757bc59
6 changed files with 329 additions and 279 deletions
@@ -85,6 +85,7 @@ function buildPolicy(overrides: Record<string, unknown> = {}) {
contextualMemoryRecapFollowupDetected: false
}),
findLastAddressAssistantItem: () => null,
hasAddressLlmPreDecomposeCandidate: () => false,
resolveAddressToolGateDecision: () => ({
runAddressLane: false,
decision: "skip_address_lane",
@@ -159,6 +160,28 @@ describe("assistantRoutePolicy", () => {
expect(decision.orchestrationContract?.semantic_route_arbitration?.supported_address_intent_detected).toBe(true);
});
it("uses internal route-policy tool gate when no external override is provided", () => {
const policy = buildPolicy({
resolveAddressToolGateDecision: undefined,
detectAddressQuestionMode: () => ({ mode: "address_query", confidence: "high" }),
resolveAddressIntent: () => ({ intent: "inventory_on_hand_as_of_date", confidence: "high" }),
hasAddressLlmPreDecomposeCandidate: () => true
});
const decision = policy.resolveAssistantOrchestrationDecision({
rawUserMessage: "какие остатки на складе",
effectiveAddressUserMessage: "какие остатки на складе",
followupContext: null,
llmPreDecomposeMeta: null,
useMock: false
});
expect(decision.runAddressLane).toBe(true);
expect(decision.toolGateDecision).toBe("run_address_lane");
expect(decision.toolGateReason).toBe("address_mode_classifier_detected");
expect(decision.livingMode).toBe("address_data");
});
it("does not let deep session continuation override an exact VAT period route", () => {
const policy = buildPolicy({
detectAddressQuestionMode: () => ({ mode: "address_query", confidence: "high" }),