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
+21
View File
@@ -3,6 +3,7 @@ import { makeResponse, makeError, ErrorCode } from '../protocol.js';
import type { MetricsSnapshot, EventEntry, ActiveRequestInfo } from '../metrics.js';
import type { ServiceInfo } from './services.js';
import type { NodeLocation, NodeStatus, NodePushToken } from './node.js';
import type { SessionAnalyticsSnapshot } from '../../session/index.js';
/** Per-session token usage report returned by system.tokenUsage. */
export interface TokenUsageEntry {
@@ -64,6 +65,8 @@ export interface SystemHandlerDeps {
getTokenUsage?: () => TokenUsageEntry[];
/** Optional callback to retrieve aggregated metrics snapshot. */
getMetrics?: () => MetricsSnapshot;
/** Optional callback to retrieve session analytics. */
getSessionAnalytics?: (opts?: { days?: number; topLimit?: number }) => SessionAnalyticsSnapshot;
/** Optional callback to retrieve recent events. */
getEvents?: (opts?: { level?: string; limit?: number }) => EventEntry[];
/** Optional callback to retrieve active requests. */
@@ -206,6 +209,24 @@ export function createSystemHandlers(deps: SystemHandlerDeps) {
return makeResponse(request.id, deps.getMetrics());
},
'system.sessionAnalytics': async (request: GatewayRequest): Promise<OutboundMessage> => {
if (!deps.getSessionAnalytics) {
return makeResponse(request.id, {
daily: [],
topSessions: [],
averageMessagesPerSession: 0,
totalSessions: 0,
totalMessages: 0,
});
}
const params = request.params as { days?: number; topLimit?: number } | undefined;
const snapshot = deps.getSessionAnalytics({
days: params?.days,
topLimit: params?.topLimit,
});
return makeResponse(request.id, snapshot);
},
'system.events': async (request: GatewayRequest): Promise<OutboundMessage> => {
if (!deps.getEvents) {
return makeResponse(request.id, { events: [] });