Этап 4 / Пакет по РБП восстановление живого контура сбора данных и доказательной базы

This commit is contained in:
2026-03-29 10:38:04 +03:00
parent 095e74ad3b
commit 133b6dca3c
83 changed files with 265742 additions and 77 deletions
@@ -122,6 +122,86 @@ describe.sequential("assistant MCP runtime bridge", () => {
const summary = result.summary as Record<string, unknown>;
const liveSummary = summary.live_mcp as Record<string, unknown>;
expect(liveSummary.status).toBe("error");
expect(result.limitations.some((item) => item.includes("Live MCP"))).toBe(true);
expect(result.limitations.some((item) => /live/i.test(item))).toBe(true);
});
it("does not inject out-of-scope rows when account filter matched zero", async () => {
process.env[MCP_FLAG] = "1";
process.env[MCP_PROXY] = "http://127.0.0.1:6003";
process.env[MCP_CHANNEL] = "default";
const payload = JSON.stringify({
success: true,
data: [
{
Период: "2026-03-01T00:00:00",
Регистратор: "Операция бухгалтерская 0002",
СчетДт: "91.02",
СчетКт: "51",
Сумма: 900
}
]
});
const fetchMock = vi.fn(async () => new Response(payload, { status: 200 }));
vi.stubGlobal("fetch", fetchMock);
const { AssistantDataLayer } = await import("../src/services/assistantDataLayer");
const dataLayer = new AssistantDataLayer(createSnapshotRoot());
const result = await dataLayer.executeRouteRuntime("hybrid_store_plus_live", "Check account 60 only");
const summary = result.summary as Record<string, unknown>;
const liveSummary = summary.live_mcp as Record<string, unknown>;
expect(fetchMock).toHaveBeenCalledTimes(1);
expect(Array.isArray(liveSummary.account_scope)).toBe(true);
expect((liveSummary.account_scope as string[]).some((item) => String(item).includes("60"))).toBe(true);
expect(liveSummary.matched_rows).toBe(0);
expect(liveSummary.returned_rows).toBe(0);
expect(result.items).toHaveLength(0);
});
it("uses claim-bound live call sequence for RBP lifecycle query", async () => {
process.env[MCP_FLAG] = "1";
process.env[MCP_PROXY] = "http://127.0.0.1:6003";
process.env[MCP_CHANNEL] = "default";
const payload = JSON.stringify({
success: true,
data: [
{
Период: "2020-07-31T00:00:00",
Регистратор: "Списание РБП за Июль 2020",
СчетДт: "20.01",
СчетКт: "97.01",
Сумма: 5000
},
{
Период: "2020-07-31T00:00:00",
Регистратор: "Закрытие месяца Июль 2020",
СчетДт: "97.01",
СчетКт: "20.01",
Сумма: 5000
}
]
});
const fetchMock = vi.fn(async () => new Response(payload, { status: 200 }));
vi.stubGlobal("fetch", fetchMock);
const { AssistantDataLayer } = await import("../src/services/assistantDataLayer");
const dataLayer = new AssistantDataLayer(createSnapshotRoot());
const result = await dataLayer.executeRouteRuntime(
"hybrid_store_plus_live",
"31 июля прошло Списание РБП за июль 2020 на 5000. Есть ли хвост РБП?"
);
expect(fetchMock).toHaveBeenCalledTimes(4);
const summary = result.summary as Record<string, unknown>;
const liveSummary = summary.live_mcp as Record<string, unknown>;
expect(liveSummary.claim_type).toBe("prove_rbp_tail_state");
expect(Array.isArray(liveSummary.required_live_calls)).toBe(true);
expect((liveSummary.required_live_calls as unknown[]).length).toBe(4);
expect(Array.isArray(liveSummary.executed_live_calls)).toBe(true);
expect((liveSummary.executed_live_calls as unknown[]).length).toBe(4);
expect(liveSummary.matched_rows).toBeGreaterThan(0);
expect(result.items.some((item) => Array.isArray((item as Record<string, unknown>).relation_pattern_hits))).toBe(true);
});
});