57c423cdb1
- ConversationView: an ended session (SessionDetail, SessionReplay pass `ended`) polls its transcript every 60 s instead of 3 s and stops rescanning sub-agents; new_event, reconnect and show still fetch at once. - Workspace: GET /api/run follows run-moving WS messages (lane run columns, session created/status change, runs_interrupted) with a 30 s fallback, instead of a blind 5 s poll. - StatusBar: session counts re-read only when a session's status/waiting/archived state changes (60 s fallback); costs re-read at most every 30 s while work is happening and every 2 min otherwise. - Dashboard recent activity: 60 s safety poll (was 10 s) plus remote import messages; WS still prepends new events. - New lib/sessionChange.ts matcher with tests.
35 lines
1.5 KiB
TypeScript
35 lines
1.5 KiB
TypeScript
/**
|
|
* @file sessionChange.test.ts
|
|
* @description Unit tests for `sessionChangeMatcher`: fires on a new session
|
|
* and on a change of the keyed columns, never on a re-broadcast that moved none.
|
|
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
*/
|
|
|
|
import { describe, expect, it } from "vitest";
|
|
import { sessionChangeMatcher } from "../sessionChange";
|
|
import type { WSMessage } from "../types";
|
|
|
|
const msg = (type: string, data: unknown) => ({ type, data, timestamp: "" }) as WSMessage;
|
|
|
|
describe("sessionChangeMatcher", () => {
|
|
it("fires on a new session and on a state change, not on a same-state re-broadcast", () => {
|
|
const m = sessionChangeMatcher();
|
|
expect(m(msg("session_created", { id: "a", status: "active" }))).toBe(true);
|
|
expect(m(msg("session_updated", { id: "a", status: "active", name: "x" }))).toBe(false);
|
|
expect(
|
|
m(msg("session_updated", { id: "a", status: "active", awaiting_input_since: "t" }))
|
|
).toBe(true);
|
|
expect(m(msg("session_updated", { id: "a", status: "completed" }))).toBe(true);
|
|
expect(m(msg("session_updated", { id: "a", status: "completed", archived_at: "t" }))).toBe(
|
|
true
|
|
);
|
|
});
|
|
|
|
it("takes an unseen or unkeyable session as a change, and ignores other types", () => {
|
|
const m = sessionChangeMatcher();
|
|
expect(m(msg("session_updated", { id: "b", status: "active" }))).toBe(true);
|
|
expect(m(msg("session_updated", null))).toBe(true);
|
|
expect(m(msg("new_event", { session_id: "b" }))).toBe(false);
|
|
});
|
|
});
|