ЮИ - Автопрогоны: доработать иконки и hover-состояния saved sessions

This commit is contained in:
2026-04-18 14:12:11 +03:00
parent 31cb4ccbbb
commit f58ef9ad55
32 changed files with 2214 additions and 132 deletions
@@ -100,6 +100,37 @@ function uniqueStrings(values: string[]): string[] {
);
}
function normalizeCounterpartyDisplayLabel(value: string | null | undefined): string | null {
const source = String(value ?? "").trim().replace(/[.]+$/u, "");
if (!source) {
return null;
}
return source.replace(/\s+/gu, " ");
}
function isGenericCounterpartyDisplayLabel(value: string | null | undefined): boolean {
const normalized = normalizeCounterpartyDisplayLabel(value);
if (!normalized) {
return true;
}
return /^(?:группа|контрагент|компания|организация)$/iu.test(normalized);
}
function resolvePreferredCounterpartyDisplayLabel(
requestedHint: string | null | undefined,
rowLabels: string[]
): string | null {
const requested = normalizeCounterpartyDisplayLabel(requestedHint);
const resolvedFromRows =
rowLabels.length === 1 ? normalizeCounterpartyDisplayLabel(rowLabels[0]) : null;
if (requested && resolvedFromRows) {
if (isGenericCounterpartyDisplayLabel(resolvedFromRows) || requested.includes(resolvedFromRows)) {
return requested;
}
}
return requested ?? resolvedFromRows;
}
function formatTopRows(rows: ComposeStageRow[], limit = 6): string[] {
return rows.slice(0, limit).map((row, index) => {
const period = row.period ?? "дата не указана";
@@ -4181,18 +4212,15 @@ function composeFactualReplyBody(
}
if (intent === "list_documents_by_counterparty") {
const resolvedCounterparty =
(typeof options.counterpartyHint === "string" && options.counterpartyHint.trim().length > 0
? options.counterpartyHint.trim()
: null) ??
(() => {
const counterparties = uniqueStrings(
rows
.map((row) => extractCounterpartyName(row))
.filter((item): item is string => Boolean(item))
);
return counterparties.length === 1 ? counterparties[0] : null;
})();
const rowCounterparties = uniqueStrings(
rows
.map((row) => extractCounterpartyName(row))
.filter((item): item is string => Boolean(item))
);
const resolvedCounterparty = resolvePreferredCounterpartyDisplayLabel(
typeof options.counterpartyHint === "string" ? options.counterpartyHint : null,
rowCounterparties
);
const counterpartyLabel =
typeof resolvedCounterparty === "string" && resolvedCounterparty.endsWith(".")
? resolvedCounterparty