import { describe, expect, it } from "vitest"; import { AssistantSessionStore } from "../src/services/assistantSessionStore"; import { createEmptyInvestigationState } from "../src/services/investigationState"; describe("assistant session backward compatibility", () => { it("lazy-upgrades legacy session objects without investigation_state", () => { const store = new AssistantSessionStore(); const sessionsMap = (store as unknown as { sessions: Map }).sessions; const sessionId = "legacy-session-1"; sessionsMap.set(sessionId, { session_id: sessionId, updated_at: "2026-03-25T10:00:00.000Z", items: [] }); const session = store.getSession(sessionId); expect(session).toBeTruthy(); expect(session?.session_id).toBe(sessionId); expect(Array.isArray(session?.items)).toBe(true); expect(session?.investigation_state?.schema_version).toBe("investigation_state_v1"); }); it("normalizes malformed legacy sessions with missing items array", () => { const store = new AssistantSessionStore(); const sessionsMap = (store as unknown as { sessions: Map }).sessions; const sessionId = "legacy-session-2"; sessionsMap.set(sessionId, { session_id: sessionId }); const ensured = store.ensureSession(sessionId); expect(ensured.session_id).toBe(sessionId); expect(Array.isArray(ensured.items)).toBe(true); expect(ensured.items.length).toBe(0); expect(ensured.investigation_state?.schema_version).toBe("investigation_state_v1"); }); it("preserves optional stage2 problem_unit_state in session clone flow", () => { const store = new AssistantSessionStore(); const sessionsMap = (store as unknown as { sessions: Map }).sessions; const sessionId = "legacy-session-3"; const baseState = createEmptyInvestigationState(sessionId, "2026-03-26T10:00:00.000Z"); sessionsMap.set(sessionId, { session_id: sessionId, updated_at: "2026-03-26T10:00:00.000Z", items: [], investigation_state: { ...baseState, status: "active", problem_unit_state: { active_problem_units: ["pu-1", "pu-2"], resolved_problem_units: ["pu-0"], problem_unit_backlinks: [ { problem_unit_id: "pu-1", entity_backlinks: [ { entity: "counterparty", id: "cp-1" } ] } ], focus_problem_types: ["broken_chain_segment"] } } }); const session = store.getSession(sessionId); expect(session).toBeTruthy(); expect(session?.investigation_state?.problem_unit_state?.active_problem_units).toEqual(["pu-1", "pu-2"]); expect(session?.investigation_state?.problem_unit_state?.focus_problem_types).toEqual(["broken_chain_segment"]); }); });