АРЧ АП11 - Вынести coverage evidence contract для exact lane и завершить phase 4 агентным прогоном
This commit is contained in:
@@ -0,0 +1,299 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ADDRESS_COVERAGE_EVIDENCE_SCHEMA_VERSION = void 0;
|
||||
exports.isHeuristicCandidatesIntent = isHeuristicCandidatesIntent;
|
||||
exports.isConfirmedBalanceIntent = isConfirmedBalanceIntent;
|
||||
exports.resolveAddressAsOfDateBasis = resolveAddressAsOfDateBasis;
|
||||
exports.resolveAddressRequestedResultMode = resolveAddressRequestedResultMode;
|
||||
exports.resolveAddressCoverageEvidence = resolveAddressCoverageEvidence;
|
||||
exports.attachAddressCoverageEvidence = attachAddressCoverageEvidence;
|
||||
exports.toAddressCoverageEvidenceContract = toAddressCoverageEvidenceContract;
|
||||
exports.ADDRESS_COVERAGE_EVIDENCE_SCHEMA_VERSION = "address_coverage_evidence_v1";
|
||||
function toRecordObject(value) {
|
||||
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
||||
return null;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
function toNonEmptyString(value) {
|
||||
if (value === null || value === undefined) {
|
||||
return null;
|
||||
}
|
||||
const text = String(value).trim();
|
||||
return text.length > 0 ? text : null;
|
||||
}
|
||||
function normalizeIsoDateHint(value) {
|
||||
if (typeof value !== "string") {
|
||||
return null;
|
||||
}
|
||||
const trimmed = value.trim();
|
||||
if (!trimmed) {
|
||||
return null;
|
||||
}
|
||||
const match = trimmed.match(/^(\d{4})-(\d{2})-(\d{2})(?:T.*)?$/);
|
||||
if (!match) {
|
||||
return null;
|
||||
}
|
||||
const year = Number(match[1]);
|
||||
const month = Number(match[2]);
|
||||
const day = Number(match[3]);
|
||||
if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
|
||||
return null;
|
||||
}
|
||||
const candidate = new Date(Date.UTC(year, month - 1, day));
|
||||
if (candidate.getUTCFullYear() !== year ||
|
||||
candidate.getUTCMonth() + 1 !== month ||
|
||||
candidate.getUTCDate() !== day) {
|
||||
return null;
|
||||
}
|
||||
return `${match[1]}-${match[2]}-${match[3]}`;
|
||||
}
|
||||
function normalizeReasonCode(value) {
|
||||
const normalized = value
|
||||
.trim()
|
||||
.replace(/[^\p{L}\p{N}_.:-]+/gu, "_")
|
||||
.replace(/^_+|_+$/g, "")
|
||||
.toLowerCase();
|
||||
return normalized.length > 0 ? normalized.slice(0, 120) : null;
|
||||
}
|
||||
function pushReason(target, value) {
|
||||
const text = toNonEmptyString(value);
|
||||
if (!text) {
|
||||
return;
|
||||
}
|
||||
const normalized = normalizeReasonCode(text);
|
||||
if (normalized && !target.includes(normalized)) {
|
||||
target.push(normalized);
|
||||
}
|
||||
}
|
||||
function isResultMode(value) {
|
||||
return value === "heuristic_candidates" || value === "confirmed_balance";
|
||||
}
|
||||
function isEvidenceStrength(value) {
|
||||
return value === "weak" || value === "medium" || value === "strong";
|
||||
}
|
||||
function isCoverageStatus(value) {
|
||||
return value === "full" || value === "partial" || value === "blocked";
|
||||
}
|
||||
function isAsOfDateBasis(value) {
|
||||
return (value === "period_end" ||
|
||||
value === "explicit_as_of_date" ||
|
||||
value === "period_range" ||
|
||||
value === "implicit_current_snapshot");
|
||||
}
|
||||
function isEvidenceBasis(value) {
|
||||
return (value === "matched_rows" ||
|
||||
value === "exact_negative" ||
|
||||
value === "limited_response" ||
|
||||
value === "heuristic_candidates" ||
|
||||
value === "unknown");
|
||||
}
|
||||
function isHeuristicCandidatesIntent(intent) {
|
||||
return (intent === "list_receivables_counterparties" ||
|
||||
intent === "list_payables_counterparties" ||
|
||||
intent === "list_open_contracts" ||
|
||||
intent === "open_items_by_counterparty_or_contract");
|
||||
}
|
||||
function isConfirmedBalanceIntent(intent) {
|
||||
return (intent === "account_balance_snapshot" ||
|
||||
intent === "documents_forming_balance" ||
|
||||
intent === "inventory_on_hand_as_of_date" ||
|
||||
intent === "inventory_purchase_provenance_for_item" ||
|
||||
intent === "inventory_purchase_documents_for_item" ||
|
||||
intent === "inventory_sale_trace_for_item" ||
|
||||
intent === "inventory_purchase_to_sale_chain" ||
|
||||
intent === "open_contracts_confirmed_as_of_date" ||
|
||||
intent === "payables_confirmed_as_of_date" ||
|
||||
intent === "receivables_confirmed_as_of_date" ||
|
||||
intent === "vat_payable_confirmed_as_of_date" ||
|
||||
intent === "vat_liability_confirmed_for_tax_period");
|
||||
}
|
||||
function resolveAddressAsOfDateBasis(filters, semanticFrame) {
|
||||
if (semanticFrame?.date_basis_hint) {
|
||||
return semanticFrame.date_basis_hint;
|
||||
}
|
||||
const asOfDate = normalizeIsoDateHint(filters.as_of_date);
|
||||
if (asOfDate) {
|
||||
return "explicit_as_of_date";
|
||||
}
|
||||
const periodFrom = normalizeIsoDateHint(filters.period_from);
|
||||
const periodTo = normalizeIsoDateHint(filters.period_to);
|
||||
if (periodFrom && periodTo) {
|
||||
return "period_range";
|
||||
}
|
||||
if (!periodFrom && periodTo) {
|
||||
return "period_end";
|
||||
}
|
||||
if (periodFrom) {
|
||||
return "period_range";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function deriveAddressEvidenceStrength(input) {
|
||||
if (isHeuristicCandidatesIntent(input.intent)) {
|
||||
if (input.rowsMatched <= 0 || input.responseType === "LIMITED_WITH_REASON") {
|
||||
return "weak";
|
||||
}
|
||||
if (input.selectedRecipe === "address_open_items_by_party_or_contract_v1") {
|
||||
return "medium";
|
||||
}
|
||||
return "weak";
|
||||
}
|
||||
if (isConfirmedBalanceIntent(input.intent)) {
|
||||
if (input.rowsMatched > 0) {
|
||||
return "strong";
|
||||
}
|
||||
return input.responseType === "LIMITED_WITH_REASON" ? "weak" : "medium";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function resolveAddressRequestedResultMode(intent, filters, semanticFrame) {
|
||||
if (isConfirmedBalanceIntent(intent)) {
|
||||
return "confirmed_balance";
|
||||
}
|
||||
if (intent === "list_open_contracts") {
|
||||
return "heuristic_candidates";
|
||||
}
|
||||
if (isHeuristicCandidatesIntent(intent)) {
|
||||
const asOfDateBasis = resolveAddressAsOfDateBasis(filters, semanticFrame);
|
||||
if (asOfDateBasis === "explicit_as_of_date" ||
|
||||
asOfDateBasis === "period_end" ||
|
||||
asOfDateBasis === "period_range" ||
|
||||
asOfDateBasis === "implicit_current_snapshot") {
|
||||
return "confirmed_balance";
|
||||
}
|
||||
return "heuristic_candidates";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function balanceConfirmedFrom(input) {
|
||||
if (isHeuristicCandidatesIntent(input.intent)) {
|
||||
return false;
|
||||
}
|
||||
if (isConfirmedBalanceIntent(input.intent)) {
|
||||
return input.responseType !== "LIMITED_WITH_REASON";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function coverageStatusFrom(input) {
|
||||
if (input.responseType === "LIMITED_WITH_REASON") {
|
||||
return input.resultMode === "heuristic_candidates" ? "partial" : "blocked";
|
||||
}
|
||||
if (input.balanceConfirmed === false) {
|
||||
return "partial";
|
||||
}
|
||||
if (input.rowsMatched > 0) {
|
||||
return "full";
|
||||
}
|
||||
if (input.resultMode === "heuristic_candidates") {
|
||||
return "partial";
|
||||
}
|
||||
if (input.resultMode === "confirmed_balance" && input.balanceConfirmed === true) {
|
||||
return "full";
|
||||
}
|
||||
return "blocked";
|
||||
}
|
||||
function evidenceBasisFrom(input) {
|
||||
if (input.responseType === "LIMITED_WITH_REASON") {
|
||||
return "limited_response";
|
||||
}
|
||||
if (input.resultMode === "heuristic_candidates" || input.balanceConfirmed === false) {
|
||||
return "heuristic_candidates";
|
||||
}
|
||||
if (input.rowsMatched > 0) {
|
||||
return "matched_rows";
|
||||
}
|
||||
if (input.resultMode === "confirmed_balance") {
|
||||
return "exact_negative";
|
||||
}
|
||||
return "unknown";
|
||||
}
|
||||
function resolveAddressCoverageEvidence(input) {
|
||||
const requestedResultMode = resolveAddressRequestedResultMode(input.intent, input.filters, input.semanticFrame);
|
||||
const resultMode = input.overrideResultMode ?? requestedResultMode;
|
||||
const evidenceStrength = input.overrideEvidenceStrength ?? deriveAddressEvidenceStrength(input);
|
||||
const balanceConfirmed = input.overrideBalanceConfirmed ?? balanceConfirmedFrom(input);
|
||||
const asOfDateBasis = resolveAddressAsOfDateBasis(input.filters, input.semanticFrame);
|
||||
const coverageStatus = coverageStatusFrom({
|
||||
resultMode,
|
||||
balanceConfirmed,
|
||||
responseType: input.responseType,
|
||||
rowsMatched: input.rowsMatched
|
||||
});
|
||||
const evidenceBasis = evidenceBasisFrom({
|
||||
resultMode,
|
||||
responseType: input.responseType,
|
||||
rowsMatched: input.rowsMatched,
|
||||
balanceConfirmed
|
||||
});
|
||||
const reasonCodes = [];
|
||||
pushReason(reasonCodes, `coverage_status_${coverageStatus}`);
|
||||
pushReason(reasonCodes, resultMode ? `result_mode_${resultMode}` : "result_mode_unknown");
|
||||
pushReason(reasonCodes, evidenceStrength ? `evidence_strength_${evidenceStrength}` : "evidence_strength_none");
|
||||
pushReason(reasonCodes, `evidence_basis_${evidenceBasis}`);
|
||||
pushReason(reasonCodes, balanceConfirmed === true ? "balance_confirmed_true" : balanceConfirmed === false ? "balance_confirmed_false" : "balance_confirmed_unknown");
|
||||
pushReason(reasonCodes, asOfDateBasis ? `as_of_date_basis_${asOfDateBasis}` : "as_of_date_basis_none");
|
||||
return {
|
||||
schema_version: exports.ADDRESS_COVERAGE_EVIDENCE_SCHEMA_VERSION,
|
||||
policy_owner: "addressCoverageEvidencePolicy",
|
||||
requested_result_mode: requestedResultMode,
|
||||
result_mode: resultMode,
|
||||
evidence_strength: evidenceStrength,
|
||||
balance_confirmed: balanceConfirmed,
|
||||
as_of_date_basis: asOfDateBasis,
|
||||
coverage_status: coverageStatus,
|
||||
evidence_basis: evidenceBasis,
|
||||
reason_codes: reasonCodes.slice(0, 24)
|
||||
};
|
||||
}
|
||||
function attachAddressCoverageEvidence(debugPayload, input) {
|
||||
return {
|
||||
...debugPayload,
|
||||
address_coverage_evidence_v1: resolveAddressCoverageEvidence(input)
|
||||
};
|
||||
}
|
||||
function toAddressCoverageEvidenceContract(value) {
|
||||
const record = toRecordObject(value);
|
||||
if (!record) {
|
||||
return null;
|
||||
}
|
||||
const requestedResultMode = toNonEmptyString(record.requested_result_mode);
|
||||
const resultMode = toNonEmptyString(record.result_mode);
|
||||
const evidenceStrength = toNonEmptyString(record.evidence_strength);
|
||||
const asOfDateBasis = toNonEmptyString(record.as_of_date_basis);
|
||||
const coverageStatus = toNonEmptyString(record.coverage_status);
|
||||
const evidenceBasis = toNonEmptyString(record.evidence_basis);
|
||||
const balanceConfirmed = typeof record.balance_confirmed === "boolean" ? record.balance_confirmed : null;
|
||||
if (!isCoverageStatus(coverageStatus) || !isEvidenceBasis(evidenceBasis)) {
|
||||
return null;
|
||||
}
|
||||
if (requestedResultMode !== null && !isResultMode(requestedResultMode)) {
|
||||
return null;
|
||||
}
|
||||
if (resultMode !== null && !isResultMode(resultMode)) {
|
||||
return null;
|
||||
}
|
||||
if (evidenceStrength !== null && !isEvidenceStrength(evidenceStrength)) {
|
||||
return null;
|
||||
}
|
||||
if (asOfDateBasis !== null && !isAsOfDateBasis(asOfDateBasis)) {
|
||||
return null;
|
||||
}
|
||||
return {
|
||||
schema_version: exports.ADDRESS_COVERAGE_EVIDENCE_SCHEMA_VERSION,
|
||||
policy_owner: "addressCoverageEvidencePolicy",
|
||||
requested_result_mode: requestedResultMode,
|
||||
result_mode: resultMode,
|
||||
evidence_strength: evidenceStrength,
|
||||
balance_confirmed: balanceConfirmed,
|
||||
as_of_date_basis: asOfDateBasis,
|
||||
coverage_status: coverageStatus,
|
||||
evidence_basis: evidenceBasis,
|
||||
reason_codes: Array.isArray(record.reason_codes)
|
||||
? record.reason_codes
|
||||
.map((item) => toNonEmptyString(item))
|
||||
.filter((item) => Boolean(item))
|
||||
.slice(0, 24)
|
||||
: []
|
||||
};
|
||||
}
|
||||
+82
-149
@@ -10,6 +10,7 @@ const composeStage_1 = require("./address_runtime/composeStage");
|
||||
const addressCapabilityPolicy_1 = require("./addressCapabilityPolicy");
|
||||
const addressRouteExpectations_1 = require("./addressRouteExpectations");
|
||||
const assistantOrganizationMatcher_1 = require("./assistantOrganizationMatcher");
|
||||
const addressCoverageEvidencePolicy_1 = require("./addressCoverageEvidencePolicy");
|
||||
const addressTruthGatePolicy_1 = require("./addressTruthGatePolicy");
|
||||
const openaiResponsesClient_1 = require("./openaiResponsesClient");
|
||||
const files_1 = require("../utils/files");
|
||||
@@ -1452,124 +1453,6 @@ function isOrganizationScopedInventoryIntent(intent) {
|
||||
function collectOrganizationCandidatesFromRows(rows) {
|
||||
return (0, assistantOrganizationMatcher_1.mergeKnownOrganizations)(rows.map((row) => row.organization).filter((value) => Boolean(value)));
|
||||
}
|
||||
function isHeuristicCandidatesIntent(intent) {
|
||||
return (intent === "list_receivables_counterparties" ||
|
||||
intent === "list_payables_counterparties" ||
|
||||
intent === "list_open_contracts" ||
|
||||
intent === "open_items_by_counterparty_or_contract");
|
||||
}
|
||||
function isConfirmedBalanceIntent(intent) {
|
||||
return (intent === "account_balance_snapshot" ||
|
||||
intent === "documents_forming_balance" ||
|
||||
intent === "inventory_on_hand_as_of_date" ||
|
||||
intent === "inventory_purchase_provenance_for_item" ||
|
||||
intent === "inventory_purchase_documents_for_item" ||
|
||||
intent === "inventory_sale_trace_for_item" ||
|
||||
intent === "inventory_purchase_to_sale_chain" ||
|
||||
intent === "open_contracts_confirmed_as_of_date" ||
|
||||
intent === "payables_confirmed_as_of_date" ||
|
||||
intent === "receivables_confirmed_as_of_date" ||
|
||||
intent === "vat_payable_confirmed_as_of_date" ||
|
||||
intent === "vat_liability_confirmed_for_tax_period");
|
||||
}
|
||||
function resolveAsOfDateBasis(filters, semanticFrame) {
|
||||
if (semanticFrame?.date_basis_hint) {
|
||||
return semanticFrame.date_basis_hint;
|
||||
}
|
||||
const asOfDate = normalizeAnalysisDateHint(filters.as_of_date);
|
||||
if (asOfDate) {
|
||||
return "explicit_as_of_date";
|
||||
}
|
||||
const periodFrom = normalizeAnalysisDateHint(filters.period_from);
|
||||
const periodTo = normalizeAnalysisDateHint(filters.period_to);
|
||||
if (periodFrom && periodTo) {
|
||||
return "period_range";
|
||||
}
|
||||
if (!periodFrom && periodTo) {
|
||||
return "period_end";
|
||||
}
|
||||
if (periodFrom) {
|
||||
return "period_range";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function deriveAddressEvidenceStrength(input) {
|
||||
if (isHeuristicCandidatesIntent(input.intent)) {
|
||||
if (input.rowsMatched <= 0 || input.responseType === "LIMITED_WITH_REASON") {
|
||||
return "weak";
|
||||
}
|
||||
if (input.selectedRecipe === "address_open_items_by_party_or_contract_v1") {
|
||||
return "medium";
|
||||
}
|
||||
return "weak";
|
||||
}
|
||||
if (isConfirmedBalanceIntent(input.intent)) {
|
||||
if (input.rowsMatched > 0) {
|
||||
return "strong";
|
||||
}
|
||||
return input.responseType === "LIMITED_WITH_REASON" ? "weak" : "medium";
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
function resolveRequestedResultMode(intent, filters, semanticFrame) {
|
||||
if (isConfirmedBalanceIntent(intent)) {
|
||||
return "confirmed_balance";
|
||||
}
|
||||
if (intent === "list_open_contracts") {
|
||||
return "heuristic_candidates";
|
||||
}
|
||||
if (isHeuristicCandidatesIntent(intent)) {
|
||||
const asOfDateBasis = resolveAsOfDateBasis(filters, semanticFrame);
|
||||
if (asOfDateBasis === "explicit_as_of_date" ||
|
||||
asOfDateBasis === "period_end" ||
|
||||
asOfDateBasis === "period_range" ||
|
||||
asOfDateBasis === "implicit_current_snapshot") {
|
||||
return "confirmed_balance";
|
||||
}
|
||||
return "heuristic_candidates";
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
function deriveAddressResultSemantics(input) {
|
||||
const asOfDateBasis = resolveAsOfDateBasis(input.filters, input.semanticFrame);
|
||||
const requestedResultMode = resolveRequestedResultMode(input.intent, input.filters, input.semanticFrame);
|
||||
if (isHeuristicCandidatesIntent(input.intent)) {
|
||||
return {
|
||||
requested_result_mode: requestedResultMode,
|
||||
result_mode: "heuristic_candidates",
|
||||
evidence_strength: deriveAddressEvidenceStrength(input),
|
||||
balance_confirmed: false,
|
||||
as_of_date_basis: asOfDateBasis
|
||||
};
|
||||
}
|
||||
if (isConfirmedBalanceIntent(input.intent)) {
|
||||
const balanceConfirmed = input.responseType !== "LIMITED_WITH_REASON";
|
||||
return {
|
||||
requested_result_mode: requestedResultMode,
|
||||
result_mode: "confirmed_balance",
|
||||
evidence_strength: deriveAddressEvidenceStrength(input),
|
||||
balance_confirmed: balanceConfirmed,
|
||||
as_of_date_basis: asOfDateBasis ?? "period_end"
|
||||
};
|
||||
}
|
||||
if (requestedResultMode) {
|
||||
return {
|
||||
requested_result_mode: requestedResultMode
|
||||
};
|
||||
}
|
||||
return {};
|
||||
}
|
||||
function mergeAddressResultSemantics(base, override) {
|
||||
if (!override) {
|
||||
return base;
|
||||
}
|
||||
return {
|
||||
...base,
|
||||
...(override.result_mode ? { result_mode: override.result_mode } : {}),
|
||||
...(override.evidence_strength ? { evidence_strength: override.evidence_strength } : {}),
|
||||
...(typeof override.balance_confirmed === "boolean" ? { balance_confirmed: override.balance_confirmed } : {})
|
||||
};
|
||||
}
|
||||
function withConfirmedBalanceFallbackReason(reasons, requestedResultMode, semantics, baseResultMode) {
|
||||
if (requestedResultMode !== "confirmed_balance") {
|
||||
return reasons;
|
||||
@@ -2479,7 +2362,7 @@ function composeLimitedReply(input) {
|
||||
}
|
||||
function buildLimitedExecutionResult(input) {
|
||||
const accountScopeAudit = input.accountScopeAudit ?? buildDefaultAccountScopeAudit(input.filters);
|
||||
const resultSemantics = deriveAddressResultSemantics({
|
||||
const coverageEvidence = (0, addressCoverageEvidencePolicy_1.resolveAddressCoverageEvidence)({
|
||||
intent: input.intent.intent,
|
||||
selectedRecipe: input.selectedRecipe,
|
||||
filters: input.filters,
|
||||
@@ -2487,8 +2370,7 @@ function buildLimitedExecutionResult(input) {
|
||||
responseType: "LIMITED_WITH_REASON",
|
||||
rowsMatched: input.rowsMatched
|
||||
});
|
||||
const requestedResultMode = resolveRequestedResultMode(input.intent.intent, input.filters, input.semanticFrame);
|
||||
const reasonsWithConfirmedFallback = withConfirmedBalanceFallbackReason(input.reasons, requestedResultMode, undefined, resultSemantics.result_mode);
|
||||
const reasonsWithConfirmedFallback = withConfirmedBalanceFallbackReason(input.reasons, coverageEvidence.requested_result_mode ?? undefined, undefined, coverageEvidence.result_mode ?? undefined);
|
||||
const exactLimitedReason = input.intent.intent === "inventory_on_hand_as_of_date"
|
||||
? "exact_inventory_mode_limited_response"
|
||||
: input.intent.intent === "payables_confirmed_as_of_date"
|
||||
@@ -2507,11 +2389,11 @@ function buildLimitedExecutionResult(input) {
|
||||
buildRouteExpectationAudit({
|
||||
intent: input.intent.intent,
|
||||
selectedRecipe: input.selectedRecipe,
|
||||
requestedResultMode: requestedResultMode,
|
||||
resultMode: resultSemantics.result_mode
|
||||
requestedResultMode: coverageEvidence.requested_result_mode ?? undefined,
|
||||
resultMode: coverageEvidence.result_mode ?? undefined
|
||||
});
|
||||
const runtimeReadiness = runtimeReadinessForLimitedCategory(input.category);
|
||||
const debugPayload = (0, addressTruthGatePolicy_1.attachAddressTruthGate)({
|
||||
const debugPayload = (0, addressTruthGatePolicy_1.attachAddressTruthGate)((0, addressCoverageEvidencePolicy_1.attachAddressCoverageEvidence)({
|
||||
detected_mode: input.mode.mode,
|
||||
detected_mode_confidence: input.mode.confidence,
|
||||
query_shape: input.shape.shape,
|
||||
@@ -2562,10 +2444,21 @@ function buildLimitedExecutionResult(input) {
|
||||
route_expectation_expected_selected_recipes: routeExpectationAudit.expectedSelectedRecipes,
|
||||
route_expectation_expected_requested_result_modes: routeExpectationAudit.expectedRequestedResultModes,
|
||||
route_expectation_expected_result_modes: routeExpectationAudit.expectedResultModes,
|
||||
...resultSemantics,
|
||||
requested_result_mode: coverageEvidence.requested_result_mode ?? undefined,
|
||||
result_mode: coverageEvidence.result_mode ?? undefined,
|
||||
evidence_strength: coverageEvidence.evidence_strength ?? undefined,
|
||||
balance_confirmed: typeof coverageEvidence.balance_confirmed === "boolean" ? coverageEvidence.balance_confirmed : undefined,
|
||||
as_of_date_basis: coverageEvidence.as_of_date_basis ?? undefined,
|
||||
limitations: input.limitations,
|
||||
reasons
|
||||
}, {
|
||||
intent: input.intent.intent,
|
||||
selectedRecipe: input.selectedRecipe,
|
||||
filters: input.filters,
|
||||
semanticFrame: input.semanticFrame ?? null,
|
||||
responseType: "LIMITED_WITH_REASON",
|
||||
rowsMatched: input.rowsMatched
|
||||
}), {
|
||||
intent: input.intent.intent,
|
||||
filters: input.filters,
|
||||
semanticFrame: input.semanticFrame ?? null,
|
||||
@@ -2692,12 +2585,12 @@ class AddressQueryService {
|
||||
capabilityAudit: buildCapabilityAudit(intent.intent),
|
||||
shadowRouteAudit: buildShadowRouteAudit({
|
||||
intent: intent.intent,
|
||||
requestedResultMode: resolveRequestedResultMode(intent.intent, filters.extracted_filters, semanticFrame),
|
||||
requestedResultMode: (0, addressCoverageEvidencePolicy_1.resolveAddressRequestedResultMode)(intent.intent, filters.extracted_filters, semanticFrame) ?? undefined,
|
||||
filters: filters.extracted_filters
|
||||
})
|
||||
});
|
||||
}
|
||||
const requestedResultMode = resolveRequestedResultMode(intent.intent, filters.extracted_filters, semanticFrame);
|
||||
const requestedResultMode = (0, addressCoverageEvidencePolicy_1.resolveAddressRequestedResultMode)(intent.intent, filters.extracted_filters, semanticFrame) ?? undefined;
|
||||
const confirmedBalancePayablesIntent = (intent.intent === "list_payables_counterparties" || intent.intent === "payables_confirmed_as_of_date") &&
|
||||
requestedResultMode === "confirmed_balance";
|
||||
const confirmedBalanceReceivablesIntent = intent.intent === "receivables_confirmed_as_of_date" && requestedResultMode === "confirmed_balance";
|
||||
@@ -3331,23 +3224,23 @@ class AddressQueryService {
|
||||
: null;
|
||||
const buildFactualNoRowsResult = (replyText, noRowsReason, extraLimitations = []) => {
|
||||
const responseType = "FACTUAL_SUMMARY";
|
||||
const semantics = mergeAddressResultSemantics(deriveAddressResultSemantics({
|
||||
const coverageEvidence = (0, addressCoverageEvidencePolicy_1.resolveAddressCoverageEvidence)({
|
||||
intent: intent.intent,
|
||||
selectedRecipe: effectiveRecipeId,
|
||||
filters: filters.extracted_filters,
|
||||
semanticFrame,
|
||||
responseType,
|
||||
rowsMatched: 0
|
||||
}), undefined);
|
||||
});
|
||||
const factualNoRowsLimitations = [...filters.warnings, ...extraLimitations];
|
||||
const factualNoRowsReasons = withConfirmedBalanceFallbackReason([...baseReasons, noRowsReason], requestedResultMode, undefined, semantics.result_mode);
|
||||
const factualNoRowsReasons = withConfirmedBalanceFallbackReason([...baseReasons, noRowsReason], requestedResultMode, undefined, coverageEvidence.result_mode ?? undefined);
|
||||
const routeExpectationAudit = buildRouteExpectationAudit({
|
||||
intent: routeExpectationIntent,
|
||||
selectedRecipe: effectiveRecipeId,
|
||||
requestedResultMode,
|
||||
resultMode: semantics.result_mode
|
||||
resultMode: coverageEvidence.result_mode ?? undefined
|
||||
});
|
||||
const debugPayload = (0, addressTruthGatePolicy_1.attachAddressTruthGate)({
|
||||
const debugPayload = (0, addressTruthGatePolicy_1.attachAddressTruthGate)((0, addressCoverageEvidencePolicy_1.attachAddressCoverageEvidence)({
|
||||
detected_mode: mode.mode,
|
||||
detected_mode_confidence: mode.confidence,
|
||||
query_shape: shape.shape,
|
||||
@@ -3389,7 +3282,11 @@ class AddressQueryService {
|
||||
route_expectation_expected_selected_recipes: routeExpectationAudit.expectedSelectedRecipes,
|
||||
route_expectation_expected_requested_result_modes: routeExpectationAudit.expectedRequestedResultModes,
|
||||
route_expectation_expected_result_modes: routeExpectationAudit.expectedResultModes,
|
||||
...semantics,
|
||||
requested_result_mode: coverageEvidence.requested_result_mode ?? undefined,
|
||||
result_mode: coverageEvidence.result_mode ?? undefined,
|
||||
evidence_strength: coverageEvidence.evidence_strength ?? undefined,
|
||||
balance_confirmed: typeof coverageEvidence.balance_confirmed === "boolean" ? coverageEvidence.balance_confirmed : undefined,
|
||||
as_of_date_basis: coverageEvidence.as_of_date_basis ?? undefined,
|
||||
limitations: factualNoRowsLimitations,
|
||||
reasons: factualNoRowsReasons,
|
||||
...(capabilityAudit
|
||||
@@ -3409,6 +3306,13 @@ class AddressQueryService {
|
||||
}
|
||||
: {})
|
||||
}, {
|
||||
intent: intent.intent,
|
||||
selectedRecipe: effectiveRecipeId,
|
||||
filters: filters.extracted_filters,
|
||||
semanticFrame,
|
||||
responseType,
|
||||
rowsMatched: 0
|
||||
}), {
|
||||
intent: intent.intent,
|
||||
filters: filters.extracted_filters,
|
||||
semanticFrame,
|
||||
@@ -3431,22 +3335,27 @@ class AddressQueryService {
|
||||
};
|
||||
};
|
||||
const buildFactualExecutionResult = (input) => {
|
||||
const resultSemantics = mergeAddressResultSemantics(deriveAddressResultSemantics({
|
||||
const coverageEvidence = (0, addressCoverageEvidencePolicy_1.resolveAddressCoverageEvidence)({
|
||||
intent: intent.intent,
|
||||
selectedRecipe: input.selectedRecipe,
|
||||
filters: input.extractedFilters ?? filters.extracted_filters,
|
||||
semanticFrame: input.semanticFrame ?? semanticFrame,
|
||||
responseType: input.responseType,
|
||||
rowsMatched: input.rowsMatched
|
||||
}), input.responseSemantics);
|
||||
rowsMatched: input.rowsMatched,
|
||||
overrideResultMode: input.responseSemantics?.result_mode ?? null,
|
||||
overrideEvidenceStrength: input.responseSemantics?.evidence_strength ?? null,
|
||||
overrideBalanceConfirmed: typeof input.responseSemantics?.balance_confirmed === "boolean"
|
||||
? input.responseSemantics.balance_confirmed
|
||||
: null
|
||||
});
|
||||
const routeExpectationAudit = input.routeExpectationAudit ??
|
||||
buildRouteExpectationAudit({
|
||||
intent: routeExpectationIntent,
|
||||
selectedRecipe: input.selectedRecipe,
|
||||
requestedResultMode,
|
||||
resultMode: resultSemantics.result_mode
|
||||
resultMode: coverageEvidence.result_mode ?? undefined
|
||||
});
|
||||
const debugPayload = (0, addressTruthGatePolicy_1.attachAddressTruthGate)({
|
||||
const debugPayload = (0, addressTruthGatePolicy_1.attachAddressTruthGate)((0, addressCoverageEvidencePolicy_1.attachAddressCoverageEvidence)({
|
||||
detected_mode: mode.mode,
|
||||
detected_mode_confidence: mode.confidence,
|
||||
query_shape: shape.shape,
|
||||
@@ -3489,7 +3398,11 @@ class AddressQueryService {
|
||||
route_expectation_expected_requested_result_modes: routeExpectationAudit.expectedRequestedResultModes,
|
||||
route_expectation_expected_result_modes: routeExpectationAudit.expectedResultModes,
|
||||
semantic_frame: input.semanticFrame ?? semanticFrame,
|
||||
...resultSemantics,
|
||||
requested_result_mode: coverageEvidence.requested_result_mode ?? undefined,
|
||||
result_mode: coverageEvidence.result_mode ?? undefined,
|
||||
evidence_strength: coverageEvidence.evidence_strength ?? undefined,
|
||||
balance_confirmed: typeof coverageEvidence.balance_confirmed === "boolean" ? coverageEvidence.balance_confirmed : undefined,
|
||||
as_of_date_basis: coverageEvidence.as_of_date_basis ?? undefined,
|
||||
limitations: input.limitations,
|
||||
reasons: input.reasons,
|
||||
...(input.capabilityAudit
|
||||
@@ -3509,6 +3422,18 @@ class AddressQueryService {
|
||||
}
|
||||
: {})
|
||||
}, {
|
||||
intent: intent.intent,
|
||||
selectedRecipe: input.selectedRecipe,
|
||||
filters: input.extractedFilters ?? filters.extracted_filters,
|
||||
semanticFrame: input.semanticFrame ?? semanticFrame,
|
||||
responseType: input.responseType,
|
||||
rowsMatched: input.rowsMatched,
|
||||
overrideResultMode: input.responseSemantics?.result_mode ?? null,
|
||||
overrideEvidenceStrength: input.responseSemantics?.evidence_strength ?? null,
|
||||
overrideBalanceConfirmed: typeof input.responseSemantics?.balance_confirmed === "boolean"
|
||||
? input.responseSemantics.balance_confirmed
|
||||
: null
|
||||
}), {
|
||||
intent: intent.intent,
|
||||
filters: input.extractedFilters ?? filters.extracted_filters,
|
||||
semanticFrame: input.semanticFrame ?? semanticFrame,
|
||||
@@ -3784,19 +3709,24 @@ class AddressQueryService {
|
||||
"period_window_auto_broadened_to_available_data"
|
||||
];
|
||||
const broadenedReasons = [...baseReasons, ...broadenedAdjustments, "period_window_auto_broadened_to_available_data"];
|
||||
const broadenedResultSemantics = mergeAddressResultSemantics(deriveAddressResultSemantics({
|
||||
const broadenedCoverageEvidence = (0, addressCoverageEvidencePolicy_1.resolveAddressCoverageEvidence)({
|
||||
intent: intent.intent,
|
||||
selectedRecipe: broadenedSelection.selected_recipe.recipe_id,
|
||||
filters: filters.extracted_filters,
|
||||
semanticFrame,
|
||||
responseType: broadenedFactual.responseType,
|
||||
rowsMatched: broadenedFilteredRows.length
|
||||
}), broadenedFactual.semantics);
|
||||
rowsMatched: broadenedFilteredRows.length,
|
||||
overrideResultMode: broadenedFactual.semantics?.result_mode ?? null,
|
||||
overrideEvidenceStrength: broadenedFactual.semantics?.evidence_strength ?? null,
|
||||
overrideBalanceConfirmed: typeof broadenedFactual.semantics?.balance_confirmed === "boolean"
|
||||
? broadenedFactual.semantics.balance_confirmed
|
||||
: null
|
||||
});
|
||||
const broadenedRouteExpectationAudit = buildRouteExpectationAudit({
|
||||
intent: routeExpectationIntent,
|
||||
selectedRecipe: broadenedSelection.selected_recipe.recipe_id,
|
||||
requestedResultMode,
|
||||
resultMode: broadenedResultSemantics.result_mode
|
||||
resultMode: broadenedCoverageEvidence.result_mode ?? undefined
|
||||
});
|
||||
return buildFactualExecutionResult({
|
||||
replyText: injectNoticeAfterLeadLine(broadenedFactual.text, broadenedPrefix),
|
||||
@@ -4155,19 +4085,22 @@ class AddressQueryService {
|
||||
: []
|
||||
: [];
|
||||
const factualLimitations = [...filters.warnings, ...vatProbeLimitations];
|
||||
const factualResultSemantics = mergeAddressResultSemantics(deriveAddressResultSemantics({
|
||||
const factualCoverageEvidence = (0, addressCoverageEvidencePolicy_1.resolveAddressCoverageEvidence)({
|
||||
intent: composeIntent,
|
||||
selectedRecipe: effectiveRecipeId,
|
||||
filters: filters.extracted_filters,
|
||||
semanticFrame,
|
||||
responseType: factual.responseType,
|
||||
rowsMatched: filteredRows.length
|
||||
}), factual.semantics);
|
||||
rowsMatched: filteredRows.length,
|
||||
overrideResultMode: factual.semantics?.result_mode ?? null,
|
||||
overrideEvidenceStrength: factual.semantics?.evidence_strength ?? null,
|
||||
overrideBalanceConfirmed: typeof factual.semantics?.balance_confirmed === "boolean" ? factual.semantics.balance_confirmed : null
|
||||
});
|
||||
const finalRouteExpectationAudit = buildRouteExpectationAudit({
|
||||
intent: routeExpectationIntent,
|
||||
selectedRecipe: effectiveRecipeId,
|
||||
requestedResultMode,
|
||||
resultMode: factualResultSemantics.result_mode
|
||||
resultMode: factualCoverageEvidence.result_mode ?? undefined
|
||||
});
|
||||
if (finalRouteExpectationAudit.status === "mismatch" && config_1.FEATURE_ASSISTANT_ROUTE_EXPECTATION_HARD_GUARD_V1) {
|
||||
return finalizeLimitedResult({
|
||||
@@ -4208,7 +4141,7 @@ class AddressQueryService {
|
||||
(intent.intent === "vat_payable_confirmed_as_of_date" && composeIntent === "vat_payable_confirmed_as_of_date") ||
|
||||
(intent.intent === "vat_liability_confirmed_for_tax_period" &&
|
||||
composeIntent === "vat_liability_confirmed_for_tax_period");
|
||||
if (exactConfirmedIntent && factualResultSemantics.balance_confirmed !== true) {
|
||||
if (exactConfirmedIntent && factualCoverageEvidence.balance_confirmed !== true) {
|
||||
const exactModeName = intent.intent === "payables_confirmed_as_of_date"
|
||||
? "payables"
|
||||
: intent.intent === "receivables_confirmed_as_of_date"
|
||||
@@ -4277,7 +4210,7 @@ class AddressQueryService {
|
||||
matchFailureStage: "none",
|
||||
matchFailureReason: null,
|
||||
limitations: factualLimitations,
|
||||
reasons: withConfirmedBalanceFallbackReason(reasonsWithRouteExpectation, requestedResultMode, factual.semantics, factualResultSemantics.result_mode),
|
||||
reasons: withConfirmedBalanceFallbackReason(reasonsWithRouteExpectation, requestedResultMode, factual.semantics, factualCoverageEvidence.result_mode ?? undefined),
|
||||
routeExpectationAudit: finalRouteExpectationAudit,
|
||||
capabilityAudit,
|
||||
shadowRouteAudit,
|
||||
|
||||
+13
-1
@@ -4,6 +4,7 @@ exports.resolveAssistantTruthAnswerPolicyRuntime = resolveAssistantTruthAnswerPo
|
||||
exports.buildAssistantTruthAnswerPolicyRuntimeFields = buildAssistantTruthAnswerPolicyRuntimeFields;
|
||||
exports.attachAssistantTruthAnswerPolicy = attachAssistantTruthAnswerPolicy;
|
||||
const assistantRuntimeContracts_1 = require("../types/assistantRuntimeContracts");
|
||||
const addressCoverageEvidencePolicy_1 = require("./addressCoverageEvidencePolicy");
|
||||
const addressTruthGatePolicy_1 = require("./addressTruthGatePolicy");
|
||||
const assistantRuntimeContractResolver_1 = require("./assistantRuntimeContractResolver");
|
||||
function toRecordObject(value) {
|
||||
@@ -78,6 +79,7 @@ function groundingStatusFrom(debug, input, truthGateStatus) {
|
||||
return "unsupported";
|
||||
}
|
||||
function coverageStatusFrom(debug, input, truthGateStatus, groundingStatus) {
|
||||
const explicitCoverageEvidence = (0, addressCoverageEvidencePolicy_1.toAddressCoverageEvidenceContract)(debug.address_coverage_evidence_v1);
|
||||
if (truthGateStatus === "full_confirmed") {
|
||||
return "full";
|
||||
}
|
||||
@@ -90,6 +92,9 @@ function coverageStatusFrom(debug, input, truthGateStatus, groundingStatus) {
|
||||
if (toStringList(debug.missing_required_filters).length > 0 || groundingStatus === "route_mismatch_blocked" || groundingStatus === "no_grounded_answer") {
|
||||
return "blocked";
|
||||
}
|
||||
if (explicitCoverageEvidence) {
|
||||
return explicitCoverageEvidence.coverage_status;
|
||||
}
|
||||
const coverageReport = toRecordObject(input.coverageReport) ?? toRecordObject(debug.coverage_report);
|
||||
if (coverageReport) {
|
||||
const total = asNumber(coverageReport.requirements_total);
|
||||
@@ -127,6 +132,10 @@ function truthModeFrom(input) {
|
||||
return "unsupported";
|
||||
}
|
||||
function evidenceGradeFrom(debug, coverageStatus, groundingStatus, truthGateStatus) {
|
||||
const explicitCoverageEvidence = (0, addressCoverageEvidencePolicy_1.toAddressCoverageEvidenceContract)(debug.address_coverage_evidence_v1);
|
||||
if (explicitCoverageEvidence?.evidence_strength && isEvidenceGrade(explicitCoverageEvidence.evidence_strength)) {
|
||||
return explicitCoverageEvidence.evidence_strength;
|
||||
}
|
||||
const explicit = toNonEmptyString(debug.evidence_strength);
|
||||
if (isEvidenceGrade(explicit)) {
|
||||
return explicit;
|
||||
@@ -166,6 +175,7 @@ function collectReasonCodes(input) {
|
||||
pushReason(reasons, `truth_gate_${input.truthGateStatus}`);
|
||||
pushReason(reasons, `truth_mode_${input.truthMode}`);
|
||||
input.explicitGateReasonCodes.forEach((item) => pushReason(reasons, item));
|
||||
input.explicitCoverageReasonCodes.forEach((item) => pushReason(reasons, item));
|
||||
input.shadow.transition_contract_reason.forEach((item) => pushReason(reasons, item));
|
||||
input.shadow.capability_contract_reason.forEach((item) => pushReason(reasons, item));
|
||||
toStringList(input.debug.missing_required_filters).forEach((item) => pushReason(reasons, `missing_filter_${item}`));
|
||||
@@ -235,6 +245,7 @@ function requiredSectionsFor(shape) {
|
||||
function resolveAssistantTruthAnswerPolicyRuntime(input) {
|
||||
const debug = toRecordObject(input.addressDebug) ?? {};
|
||||
const explicitAddressTruthGate = (0, addressTruthGatePolicy_1.toAddressTruthGateContract)(debug.address_truth_gate_v1);
|
||||
const explicitCoverageEvidence = (0, addressCoverageEvidencePolicy_1.toAddressCoverageEvidenceContract)(debug.address_coverage_evidence_v1);
|
||||
const shadow = (0, assistantRuntimeContractResolver_1.resolveAssistantRuntimeContractShadow)({
|
||||
addressDebug: debug,
|
||||
addressRuntimeMeta: input.addressRuntimeMeta,
|
||||
@@ -257,7 +268,8 @@ function resolveAssistantTruthAnswerPolicyRuntime(input) {
|
||||
shadow,
|
||||
truthMode,
|
||||
truthGateStatus,
|
||||
explicitGateReasonCodes: explicitAddressTruthGate?.reason_codes ?? []
|
||||
explicitGateReasonCodes: explicitAddressTruthGate?.reason_codes ?? [],
|
||||
explicitCoverageReasonCodes: explicitCoverageEvidence?.reason_codes ?? []
|
||||
});
|
||||
const shape = answerShapeFrom({
|
||||
coverageStatus,
|
||||
|
||||
Reference in New Issue
Block a user