Архитектура: протянуть shared organization authority в data-scope history recovery и session bootstrap

This commit is contained in:
2026-04-18 21:25:18 +03:00
parent cf17404925
commit 59656a44a0
4 changed files with 57 additions and 51 deletions
@@ -180,34 +180,18 @@ function createAssistantDataScopePolicy(deps) {
return Array.from(new Set(extracted));
}
function extractKnownOrganizationsFromHistory(items) {
const collected = [];
const authority = (0, assistantContinuityPolicy_1.resolveAssistantOrganizationAuthority)({
sessionItems: items,
toNonEmptyString: assistantOrganizationMatcher_1.normalizeOrganizationScopeValue,
normalizeOrganizationScopeValue: assistantOrganizationMatcher_1.normalizeOrganizationScopeValue,
mergeKnownOrganizations: assistantOrganizationMatcher_1.mergeKnownOrganizations
});
const collected = [...authority.knownOrganizations];
for (let index = (Array.isArray(items) ? items.length : 0) - 1; index >= 0; index -= 1) {
const item = Array.isArray(items) ? items[index] : null;
if (!item || typeof item !== "object" || item.role !== "assistant") {
continue;
}
const debug = item.debug;
if (debug && typeof debug === "object") {
const directFromProbe = Array.isArray(debug.living_chat_data_scope_probe_organizations)
? debug.living_chat_data_scope_probe_organizations
: [];
const knownFromDebug = Array.isArray(debug.assistant_known_organizations)
? debug.assistant_known_organizations
: [];
const directFromCandidates = Array.isArray(debug.organization_candidates) ? debug.organization_candidates : [];
const directFromResolved = [
(0, assistantOrganizationMatcher_1.normalizeOrganizationScopeValue)(debug.assistant_active_organization),
(0, assistantOrganizationMatcher_1.normalizeOrganizationScopeValue)(debug.living_chat_selected_organization),
(0, assistantOrganizationMatcher_1.normalizeOrganizationScopeValue)(debug.extracted_filters?.organization),
(0, assistantOrganizationMatcher_1.normalizeOrganizationScopeValue)(debug.address_root_frame_context?.organization)
].filter((value) => Boolean(value));
if (directFromProbe.length > 0 ||
knownFromDebug.length > 0 ||
directFromCandidates.length > 0 ||
directFromResolved.length > 0) {
collected.push(...directFromProbe, ...knownFromDebug, ...directFromCandidates, ...directFromResolved);
}
}
const parsedFromText = parseOrganizationsFromDataScopeAssistantText(item.text);
if (parsedFromText.length > 0) {
collected.push(...parsedFromText);
@@ -249,39 +249,18 @@ export function createAssistantDataScopePolicy(deps: AssistantDataScopePolicyDep
}
function extractKnownOrganizationsFromHistory(items: unknown[]): string[] {
const collected: unknown[] = [];
const authority = resolveAssistantOrganizationAuthority({
sessionItems: items,
toNonEmptyString: normalizeOrganizationScopeValue,
normalizeOrganizationScopeValue,
mergeKnownOrganizations
});
const collected: unknown[] = [...authority.knownOrganizations];
for (let index = (Array.isArray(items) ? items.length : 0) - 1; index >= 0; index -= 1) {
const item = Array.isArray(items) ? items[index] : null;
if (!item || typeof item !== "object" || (item as { role?: string }).role !== "assistant") {
continue;
}
const debug = (item as { debug?: Record<string, unknown> }).debug;
if (debug && typeof debug === "object") {
const directFromProbe = Array.isArray(debug.living_chat_data_scope_probe_organizations)
? debug.living_chat_data_scope_probe_organizations
: [];
const knownFromDebug = Array.isArray(debug.assistant_known_organizations)
? debug.assistant_known_organizations
: [];
const directFromCandidates = Array.isArray(debug.organization_candidates) ? debug.organization_candidates : [];
const directFromResolved = [
normalizeOrganizationScopeValue(debug.assistant_active_organization),
normalizeOrganizationScopeValue(debug.living_chat_selected_organization),
normalizeOrganizationScopeValue(debug.extracted_filters?.organization),
normalizeOrganizationScopeValue(debug.address_root_frame_context?.organization)
].filter((value): value is string => Boolean(value));
if (
directFromProbe.length > 0 ||
knownFromDebug.length > 0 ||
directFromCandidates.length > 0 ||
directFromResolved.length > 0
) {
collected.push(...directFromProbe, ...knownFromDebug, ...directFromCandidates, ...directFromResolved);
}
}
const parsedFromText = parseOrganizationsFromDataScopeAssistantText((item as { text?: unknown }).text);
if (parsedFromText.length > 0) {
collected.push(...parsedFromText);
@@ -11,6 +11,43 @@ function createPolicy() {
}
describe("assistantDataScopePolicy", () => {
it("extracts known organizations from shared assistant organization authority and assistant text fallback", () => {
const policy = createPolicy();
const organizations = policy.extractKnownOrganizationsFromHistory([
{
role: "assistant",
text: "Доступны организации: Org Text, Org Extra.",
debug: {
execution_lane: "living_chat",
living_chat_selected_organization: "Org Selected",
assistant_active_organization: "Org Selected",
assistant_known_organizations: ["Org Selected", "Org Backup"],
organization_candidates: ["Org Candidate"]
}
},
{
role: "assistant",
debug: {
execution_lane: "address_query",
answer_grounding_check: { status: "grounded" },
extracted_filters: {
organization: "Org Grounded"
}
}
}
]);
expect(organizations).toEqual([
"Org Grounded",
"Org Selected",
"Org Backup",
"Org Candidate",
"Org Text",
"Org Extra"
]);
});
it("recovers active organization from assistant-side living chat authority when grounded answer is absent", () => {
const policy = createPolicy();