feat(gateway): add system.sessionAnalytics usage snapshot RPC

This commit is contained in:
William Valentin
2026-02-16 14:07:42 -08:00
parent 426145386f
commit 3d7144b2c5
9 changed files with 245 additions and 3 deletions
+59
View File
@@ -327,6 +327,65 @@ describe('system.tokenUsage handler', () => {
});
});
describe('system.sessionAnalytics handler', () => {
it('returns empty analytics when callback is not provided', async () => {
const handlers = createSystemHandlers({
startTime: Date.now(),
version: '0.1.0',
getSessionCount: () => 0,
getToolCount: () => 0,
getConnectionCount: () => 0,
});
const req: GatewayRequest = { id: 3, method: 'system.sessionAnalytics' };
const result = await handlers['system.sessionAnalytics'](req) as GatewayResponse;
expect(result.id).toBe(3);
const r = result.result as {
daily: unknown[];
topSessions: unknown[];
averageMessagesPerSession: number;
totalSessions: number;
totalMessages: number;
};
expect(r.daily).toEqual([]);
expect(r.topSessions).toEqual([]);
expect(r.averageMessagesPerSession).toBe(0);
expect(r.totalSessions).toBe(0);
expect(r.totalMessages).toBe(0);
});
it('returns analytics from callback', async () => {
const getSessionAnalytics = vi.fn(() => ({
daily: [{ day: '2026-02-16', sessions: 2, messages: 8 }],
topSessions: [{ sessionId: 'telegram:1', messages: 5, lastActivity: 1708080000 }],
averageMessagesPerSession: 4,
totalSessions: 2,
totalMessages: 8,
}));
const handlers = createSystemHandlers({
startTime: Date.now(),
version: '0.1.0',
getSessionCount: () => 2,
getToolCount: () => 0,
getConnectionCount: () => 1,
getSessionAnalytics,
});
const req: GatewayRequest = {
id: 4,
method: 'system.sessionAnalytics',
params: { days: 7, topLimit: 5 },
};
const result = await handlers['system.sessionAnalytics'](req) as GatewayResponse;
expect(getSessionAnalytics).toHaveBeenCalledWith({ days: 7, topLimit: 5 });
expect(getPath(result.result, 'totalSessions')).toBe(2);
expect(getPath(result.result, 'daily')).toEqual([{ day: '2026-02-16', sessions: 2, messages: 8 }]);
});
});
describe('session handlers', () => {
const mockHistory = [
{ role: 'user' as const, content: 'hello' },