Архитектура: централизовать organization carryover precedence в continuity policy и transition glue

This commit is contained in:
2026-04-19 10:23:23 +03:00
parent ca71335499
commit 0a423288b9
6 changed files with 89 additions and 36 deletions
@@ -13,6 +13,7 @@ exports.hydrateInventoryRootFrameState = hydrateInventoryRootFrameState;
exports.buildRootScopedCarryoverFilters = buildRootScopedCarryoverFilters;
exports.shouldUseNavigationTemporalCarryover = shouldUseNavigationTemporalCarryover;
exports.applyTemporalCarryoverFilters = applyTemporalCarryoverFilters;
exports.applyOrganizationCarryoverFilters = applyOrganizationCarryoverFilters;
exports.buildInventoryRootFrameFromAddressDebug = buildInventoryRootFrameFromAddressDebug;
exports.isGroundedAddressDebug = isGroundedAddressDebug;
exports.resolveAssistantContinuitySnapshot = resolveAssistantContinuitySnapshot;
@@ -267,6 +268,19 @@ function applyTemporalCarryoverFilters(previousFilters, navigationDateScope, con
}
return nextFilters;
}
function applyOrganizationCarryoverFilters(previousFilters, historicalOrganization, authorityActiveOrganization, continuityActiveOrganization, navigationOrganization, organizationClarificationSelection, toNonEmptyString = fallbackToNonEmptyString) {
const nextFilters = previousFilters && typeof previousFilters === "object" ? { ...previousFilters } : {};
if (!toNonEmptyString(nextFilters.organization)) {
nextFilters.organization =
toNonEmptyString(historicalOrganization) ??
toNonEmptyString(authorityActiveOrganization) ??
toNonEmptyString(continuityActiveOrganization) ??
toNonEmptyString(navigationOrganization) ??
toNonEmptyString(organizationClarificationSelection) ??
undefined;
}
return nextFilters;
}
function buildInventoryRootFrameFromAddressDebug(debug, toNonEmptyString = fallbackToNonEmptyString) {
if (!debug || typeof debug !== "object") {
return null;
@@ -614,26 +614,10 @@ function createAssistantTransitionPolicy(deps) {
previousFilters.counterparty = historicalCounterparty;
}
}
if (!deps.toNonEmptyString(previousFilters.organization)) {
const historicalOrganization = deps.findRecentAddressFilterValue(items, "organization");
if (historicalOrganization) {
previousFilters.organization = historicalOrganization;
}
}
const historicalOrganization = deps.findRecentAddressFilterValue(items, "organization");
const authorityActiveOrganization = deps.normalizeOrganizationScopeValue(organizationAuthority.activeOrganization) ??
deps.normalizeOrganizationScopeValue(organizationAuthority.continuityActiveOrganization);
if (!deps.toNonEmptyString(previousFilters.organization) && authorityActiveOrganization) {
previousFilters.organization = authorityActiveOrganization;
}
if (!deps.toNonEmptyString(previousFilters.organization) && continuitySnapshot.activeOrganization) {
previousFilters.organization = continuitySnapshot.activeOrganization;
}
if (!deps.toNonEmptyString(previousFilters.organization) && navigationOrganization) {
previousFilters.organization = navigationOrganization;
}
if (!deps.toNonEmptyString(previousFilters.organization) && organizationClarificationSelection) {
previousFilters.organization = organizationClarificationSelection;
}
previousFilters = (0, assistantContinuityPolicy_1.applyOrganizationCarryoverFilters)(previousFilters, historicalOrganization, authorityActiveOrganization, continuitySnapshot.activeOrganization, navigationOrganization, organizationClarificationSelection, deps.toNonEmptyString);
if (inventoryPurchaseDateVatBridge) {
const purchaseBridgeItem = previousAddressItem &&
deps.toNonEmptyString(previousAddressDebug?.detected_intent) === "inventory_purchase_provenance_for_item"
@@ -413,6 +413,29 @@ export function applyTemporalCarryoverFilters(
return nextFilters;
}
export function applyOrganizationCarryoverFilters(
previousFilters: Record<string, unknown> | null,
historicalOrganization: unknown,
authorityActiveOrganization: unknown,
continuityActiveOrganization: unknown,
navigationOrganization: unknown,
organizationClarificationSelection: unknown,
toNonEmptyString: (value: unknown) => string | null = fallbackToNonEmptyString
): Record<string, unknown> {
const nextFilters =
previousFilters && typeof previousFilters === "object" ? { ...previousFilters } : {};
if (!toNonEmptyString(nextFilters.organization)) {
nextFilters.organization =
toNonEmptyString(historicalOrganization) ??
toNonEmptyString(authorityActiveOrganization) ??
toNonEmptyString(continuityActiveOrganization) ??
toNonEmptyString(navigationOrganization) ??
toNonEmptyString(organizationClarificationSelection) ??
undefined;
}
return nextFilters;
}
export function buildInventoryRootFrameFromAddressDebug(
debug: Record<string, unknown> | null,
toNonEmptyString: (value: unknown) => string | null = fallbackToNonEmptyString
@@ -1,5 +1,6 @@
// @ts-nocheck
import {
applyOrganizationCarryoverFilters,
applyTemporalCarryoverFilters,
buildRootScopedCarryoverFilters,
buildInventoryRootFrameFromAddressDebug,
@@ -770,27 +771,19 @@ export function createAssistantTransitionPolicy(deps) {
previousFilters.counterparty = historicalCounterparty;
}
}
if (!deps.toNonEmptyString(previousFilters.organization)) {
const historicalOrganization = deps.findRecentAddressFilterValue(items, "organization");
if (historicalOrganization) {
previousFilters.organization = historicalOrganization;
}
}
const historicalOrganization = deps.findRecentAddressFilterValue(items, "organization");
const authorityActiveOrganization =
deps.normalizeOrganizationScopeValue(organizationAuthority.activeOrganization) ??
deps.normalizeOrganizationScopeValue(organizationAuthority.continuityActiveOrganization);
if (!deps.toNonEmptyString(previousFilters.organization) && authorityActiveOrganization) {
previousFilters.organization = authorityActiveOrganization;
}
if (!deps.toNonEmptyString(previousFilters.organization) && continuitySnapshot.activeOrganization) {
previousFilters.organization = continuitySnapshot.activeOrganization;
}
if (!deps.toNonEmptyString(previousFilters.organization) && navigationOrganization) {
previousFilters.organization = navigationOrganization;
}
if (!deps.toNonEmptyString(previousFilters.organization) && organizationClarificationSelection) {
previousFilters.organization = organizationClarificationSelection;
}
previousFilters = applyOrganizationCarryoverFilters(
previousFilters,
historicalOrganization,
authorityActiveOrganization,
continuitySnapshot.activeOrganization,
navigationOrganization,
organizationClarificationSelection,
deps.toNonEmptyString
);
if (inventoryPurchaseDateVatBridge) {
const purchaseBridgeItem =
previousAddressItem &&
@@ -1,5 +1,6 @@
import { describe, expect, it } from "vitest";
import {
applyOrganizationCarryoverFilters,
applyTemporalCarryoverFilters,
buildRootScopedCarryoverFilters,
hydrateInventoryRootFrameState,
@@ -248,4 +249,36 @@ describe("assistantContinuityPolicy organization authority", () => {
organization: "Org Alt"
});
});
it("applies organization carryover precedence from historical to shared authority to navigation and clarification", () => {
const filters = applyOrganizationCarryoverFilters(
{},
null,
"Org Authority",
"Org Continuity",
"Org Navigation",
"Org Clarification"
);
expect(filters).toEqual({
organization: "Org Authority"
});
});
it("keeps existing organization and does not overwrite it during organization carryover backfill", () => {
const filters = applyOrganizationCarryoverFilters(
{
organization: "Org Existing"
},
"Org Historical",
"Org Authority",
"Org Continuity",
"Org Navigation",
"Org Clarification"
);
expect(filters).toEqual({
organization: "Org Existing"
});
});
});