179 lines
7.0 KiB
TypeScript
179 lines
7.0 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
attachAssistantCapabilityRuntimeBinding,
|
|
resolveAssistantCapabilityRuntimeBinding
|
|
} from "../src/services/assistantCapabilityRuntimeBindingAdapter";
|
|
|
|
describe("assistant capability runtime binding adapter", () => {
|
|
it("binds a grounded root inventory capability to its contract", () => {
|
|
const binding = resolveAssistantCapabilityRuntimeBinding({
|
|
addressDebug: {
|
|
capability_id: "confirmed_inventory_on_hand_as_of_date",
|
|
detected_intent: "inventory_on_hand_as_of_date",
|
|
detected_mode: "address_query",
|
|
capability_layer: "compute",
|
|
capability_route_mode: "exact",
|
|
rows_matched: 3,
|
|
route_expectation_status: "matched"
|
|
},
|
|
groundingStatus: "grounded",
|
|
replyType: "factual"
|
|
});
|
|
|
|
expect(binding).toEqual(
|
|
expect.objectContaining({
|
|
schema_version: "assistant_capability_runtime_binding_v1",
|
|
binding_owner: "assistantCapabilityRuntimeBindingAdapter",
|
|
capability_id: "confirmed_inventory_on_hand_as_of_date",
|
|
capability_contract_id: "confirmed_inventory_on_hand_as_of_date",
|
|
binding_status: "bound",
|
|
binding_action: "allow",
|
|
runtime_lane_expected: "address_exact",
|
|
runtime_lane_observed: "address_exact",
|
|
transition_id: "T1",
|
|
transition_allowed: true,
|
|
missing_anchors: [],
|
|
focus_object_binding_status: "not_required",
|
|
result_shape: "item_list_with_quantity_cost_warehouse_organization",
|
|
answer_object_shape: "inventory_stock_snapshot",
|
|
truth_fallback_allowed: true,
|
|
answer_shape_compatible: true,
|
|
violations: []
|
|
})
|
|
);
|
|
});
|
|
|
|
it("binds selected-object follow-ups through item anchor when focus object is implicit", () => {
|
|
const binding = resolveAssistantCapabilityRuntimeBinding({
|
|
addressDebug: {
|
|
capability_id: "inventory_inventory_purchase_provenance_for_item",
|
|
detected_intent: "inventory_purchase_provenance_for_item",
|
|
detected_mode: "address_query",
|
|
capability_layer: "compute",
|
|
capability_route_mode: "exact",
|
|
extracted_filters: {
|
|
item: "Диван трехместный"
|
|
},
|
|
rows_matched: 1,
|
|
route_expectation_status: "matched"
|
|
},
|
|
addressRuntimeMeta: {
|
|
dialogContinuationContract: {
|
|
decision: "continue_previous",
|
|
target_intent: "inventory_purchase_provenance_for_item"
|
|
}
|
|
},
|
|
groundingStatus: "grounded",
|
|
replyType: "factual"
|
|
});
|
|
|
|
expect(binding.binding_status).toBe("bound");
|
|
expect(binding.transition_id).toBe("T4");
|
|
expect(binding.transition_allowed).toBe(true);
|
|
expect(binding.required_anchors).toEqual(["item"]);
|
|
expect(binding.provided_anchors).toContain("item");
|
|
expect(binding.focus_object_binding_status).toBe("inferred_from_anchor");
|
|
expect(binding.violations).toEqual([]);
|
|
});
|
|
|
|
it("blocks selected-object capabilities when required anchors are missing", () => {
|
|
const binding = resolveAssistantCapabilityRuntimeBinding({
|
|
addressDebug: {
|
|
capability_id: "inventory_inventory_purchase_provenance_for_item",
|
|
limited_reason_category: "missing_anchor",
|
|
missing_required_filters: ["item"]
|
|
},
|
|
replyType: "partial_coverage"
|
|
});
|
|
|
|
expect(binding.binding_status).toBe("blocked");
|
|
expect(binding.binding_action).toBe("clarify");
|
|
expect(binding.missing_anchors).toEqual(["item"]);
|
|
expect(binding.focus_object_binding_status).toBe("missing");
|
|
expect(binding.violations).toEqual(
|
|
expect.arrayContaining(["required_anchor_missing", "focus_object_required_but_unbound"])
|
|
);
|
|
});
|
|
|
|
it("blocks capabilities entered through unsupported transition classes", () => {
|
|
const binding = resolveAssistantCapabilityRuntimeBinding({
|
|
addressDebug: {
|
|
capability_id: "confirmed_inventory_on_hand_as_of_date",
|
|
rows_matched: 1,
|
|
route_expectation_status: "matched"
|
|
},
|
|
runtimeContractShadow: {
|
|
schema_version: "assistant_runtime_contracts_v1",
|
|
transition_contract_id: "T4",
|
|
transition_contract_title: "Short Action Follow-Up On Selected Object",
|
|
transition_contract_reason: ["test_forced_selected_object_transition"],
|
|
capability_contract_id: "confirmed_inventory_on_hand_as_of_date",
|
|
capability_contract_reason: ["debug_capability_id_matched_contract"],
|
|
truth_gate_contract_status: "full_confirmed",
|
|
carryover_eligibility: "object_only"
|
|
},
|
|
groundingStatus: "grounded",
|
|
replyType: "factual"
|
|
});
|
|
|
|
expect(binding.binding_status).toBe("blocked");
|
|
expect(binding.binding_action).toBe("block");
|
|
expect(binding.transition_id).toBe("T4");
|
|
expect(binding.transition_allowed).toBe(false);
|
|
expect(binding.violations).toContain("transition_not_supported_by_capability");
|
|
});
|
|
|
|
it("allows inventory root capability to return through T6 after a drilldown pivot", () => {
|
|
const binding = resolveAssistantCapabilityRuntimeBinding({
|
|
addressDebug: {
|
|
capability_id: "confirmed_inventory_on_hand_as_of_date",
|
|
detected_intent: "inventory_on_hand_as_of_date",
|
|
detected_mode: "address_query",
|
|
capability_layer: "compute",
|
|
capability_route_mode: "exact",
|
|
rows_matched: 11,
|
|
route_expectation_status: "matched"
|
|
},
|
|
runtimeContractShadow: {
|
|
schema_version: "assistant_runtime_contracts_v1",
|
|
transition_contract_id: "T6",
|
|
transition_contract_title: "Domain Pivot With Root-Only Carryover",
|
|
transition_contract_reason: ["root_context_reused_after_drilldown_context"],
|
|
capability_contract_id: "confirmed_inventory_on_hand_as_of_date",
|
|
capability_contract_reason: ["debug_capability_id_matched_contract"],
|
|
truth_gate_contract_status: "full_confirmed",
|
|
carryover_eligibility: "root_only"
|
|
},
|
|
groundingStatus: "grounded",
|
|
replyType: "factual"
|
|
});
|
|
|
|
expect(binding.binding_status).toBe("bound");
|
|
expect(binding.binding_action).toBe("allow");
|
|
expect(binding.transition_id).toBe("T6");
|
|
expect(binding.transition_allowed).toBe(true);
|
|
expect(binding.violations).toEqual([]);
|
|
});
|
|
|
|
it("attaches compact debug fields and preserves the binding contract", () => {
|
|
const debug = attachAssistantCapabilityRuntimeBinding(
|
|
{
|
|
capability_id: "confirmed_inventory_on_hand_as_of_date",
|
|
detected_intent: "inventory_on_hand_as_of_date",
|
|
rows_matched: 2,
|
|
route_expectation_status: "matched"
|
|
},
|
|
{
|
|
groundingStatus: "grounded",
|
|
replyType: "factual"
|
|
}
|
|
);
|
|
|
|
expect(debug.capability_binding_status).toBe("bound");
|
|
expect(debug.capability_binding_action).toBe("allow");
|
|
expect(debug.capability_binding_violations).toEqual([]);
|
|
expect(debug.assistant_capability_binding_v1.schema_version).toBe("assistant_capability_runtime_binding_v1");
|
|
expect(debug.capability_binding_contract.capability_contract_id).toBe("confirmed_inventory_on_hand_as_of_date");
|
|
});
|
|
});
|