proofscan 0.10.26 → 0.10.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/catalog.d.ts.map +1 -1
- package/dist/commands/catalog.js +22 -0
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/connectors.d.ts.map +1 -1
- package/dist/commands/connectors.js +10 -3
- package/dist/commands/connectors.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/monitor.d.ts +6 -0
- package/dist/commands/monitor.d.ts.map +1 -0
- package/dist/commands/monitor.js +58 -0
- package/dist/commands/monitor.js.map +1 -0
- package/dist/html/analytics.d.ts +58 -0
- package/dist/html/analytics.d.ts.map +1 -0
- package/dist/html/analytics.js +337 -0
- package/dist/html/analytics.js.map +1 -0
- package/dist/html/index.d.ts +3 -2
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +3 -1
- package/dist/html/index.js.map +1 -1
- package/dist/html/templates.d.ts +9 -1
- package/dist/html/templates.d.ts.map +1 -1
- package/dist/html/templates.js +580 -30
- package/dist/html/templates.js.map +1 -1
- package/dist/html/types.d.ts +93 -0
- package/dist/html/types.d.ts.map +1 -1
- package/dist/html/types.js.map +1 -1
- package/dist/monitor/data/aggregator.d.ts +13 -0
- package/dist/monitor/data/aggregator.d.ts.map +1 -0
- package/dist/monitor/data/aggregator.js +101 -0
- package/dist/monitor/data/aggregator.js.map +1 -0
- package/dist/monitor/data/connectors.d.ts +13 -0
- package/dist/monitor/data/connectors.d.ts.map +1 -0
- package/dist/monitor/data/connectors.js +326 -0
- package/dist/monitor/data/connectors.js.map +1 -0
- package/dist/monitor/data/popl.d.ts +30 -0
- package/dist/monitor/data/popl.d.ts.map +1 -0
- package/dist/monitor/data/popl.js +310 -0
- package/dist/monitor/data/popl.js.map +1 -0
- package/dist/monitor/index.d.ts +6 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/monitor/index.js +6 -0
- package/dist/monitor/index.js.map +1 -0
- package/dist/monitor/routes/api.d.ts +7 -0
- package/dist/monitor/routes/api.d.ts.map +1 -0
- package/dist/monitor/routes/api.js +63 -0
- package/dist/monitor/routes/api.js.map +1 -0
- package/dist/monitor/routes/connectors.d.ts +7 -0
- package/dist/monitor/routes/connectors.d.ts.map +1 -0
- package/dist/monitor/routes/connectors.js +417 -0
- package/dist/monitor/routes/connectors.js.map +1 -0
- package/dist/monitor/routes/home.d.ts +7 -0
- package/dist/monitor/routes/home.d.ts.map +1 -0
- package/dist/monitor/routes/home.js +15 -0
- package/dist/monitor/routes/home.js.map +1 -0
- package/dist/monitor/routes/index.d.ts +10 -0
- package/dist/monitor/routes/index.d.ts.map +1 -0
- package/dist/monitor/routes/index.js +19 -0
- package/dist/monitor/routes/index.js.map +1 -0
- package/dist/monitor/routes/popl.d.ts +7 -0
- package/dist/monitor/routes/popl.d.ts.map +1 -0
- package/dist/monitor/routes/popl.js +84 -0
- package/dist/monitor/routes/popl.js.map +1 -0
- package/dist/monitor/server.d.ts +24 -0
- package/dist/monitor/server.d.ts.map +1 -0
- package/dist/monitor/server.js +52 -0
- package/dist/monitor/server.js.map +1 -0
- package/dist/monitor/templates/components.d.ts +21 -0
- package/dist/monitor/templates/components.d.ts.map +1 -0
- package/dist/monitor/templates/components.js +405 -0
- package/dist/monitor/templates/components.js.map +1 -0
- package/dist/monitor/templates/home.d.ts +9 -0
- package/dist/monitor/templates/home.d.ts.map +1 -0
- package/dist/monitor/templates/home.js +322 -0
- package/dist/monitor/templates/home.js.map +1 -0
- package/dist/monitor/templates/layout.d.ts +26 -0
- package/dist/monitor/templates/layout.d.ts.map +1 -0
- package/dist/monitor/templates/layout.js +186 -0
- package/dist/monitor/templates/layout.js.map +1 -0
- package/dist/monitor/templates/popl.d.ts +33 -0
- package/dist/monitor/templates/popl.d.ts.map +1 -0
- package/dist/monitor/templates/popl.js +654 -0
- package/dist/monitor/templates/popl.js.map +1 -0
- package/dist/monitor/types.d.ts +121 -0
- package/dist/monitor/types.d.ts.map +1 -0
- package/dist/monitor/types.js +5 -0
- package/dist/monitor/types.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics computation for Connector HTML reports (Phase 5.2)
|
|
3
|
+
*
|
|
4
|
+
* Computes KPIs, heatmap, latency histogram, and top tools
|
|
5
|
+
* from session report data.
|
|
6
|
+
*/
|
|
7
|
+
import type { HtmlSessionReportV1, HtmlConnectorAnalyticsV1 } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Minimum sample size for P95 calculation.
|
|
10
|
+
* Below this threshold, P95 returns null to avoid statistical noise.
|
|
11
|
+
*/
|
|
12
|
+
export declare const P95_MIN_SAMPLES = 20;
|
|
13
|
+
/**
|
|
14
|
+
* Fixed latency histogram buckets.
|
|
15
|
+
* to_ms: null means +infinity (for "1000+" bucket)
|
|
16
|
+
*/
|
|
17
|
+
export declare const LATENCY_BUCKETS: readonly [{
|
|
18
|
+
readonly label: "0-10";
|
|
19
|
+
readonly from_ms: 0;
|
|
20
|
+
readonly to_ms: 10;
|
|
21
|
+
}, {
|
|
22
|
+
readonly label: "10-25";
|
|
23
|
+
readonly from_ms: 10;
|
|
24
|
+
readonly to_ms: 25;
|
|
25
|
+
}, {
|
|
26
|
+
readonly label: "25-50";
|
|
27
|
+
readonly from_ms: 25;
|
|
28
|
+
readonly to_ms: 50;
|
|
29
|
+
}, {
|
|
30
|
+
readonly label: "50-100";
|
|
31
|
+
readonly from_ms: 50;
|
|
32
|
+
readonly to_ms: 100;
|
|
33
|
+
}, {
|
|
34
|
+
readonly label: "100-250";
|
|
35
|
+
readonly from_ms: 100;
|
|
36
|
+
readonly to_ms: 250;
|
|
37
|
+
}, {
|
|
38
|
+
readonly label: "250-500";
|
|
39
|
+
readonly from_ms: 250;
|
|
40
|
+
readonly to_ms: 500;
|
|
41
|
+
}, {
|
|
42
|
+
readonly label: "500-1000";
|
|
43
|
+
readonly from_ms: 500;
|
|
44
|
+
readonly to_ms: 1000;
|
|
45
|
+
}, {
|
|
46
|
+
readonly label: "1000+";
|
|
47
|
+
readonly from_ms: 1000;
|
|
48
|
+
readonly to_ms: null;
|
|
49
|
+
}];
|
|
50
|
+
/**
|
|
51
|
+
* Compute all analytics for a connector report.
|
|
52
|
+
*/
|
|
53
|
+
export declare function computeConnectorAnalytics(args: {
|
|
54
|
+
sessionReports: Record<string, HtmlSessionReportV1>;
|
|
55
|
+
sessionsTotal: number;
|
|
56
|
+
sessionsDisplayed: number;
|
|
57
|
+
}): HtmlConnectorAnalyticsV1;
|
|
58
|
+
//# sourceMappingURL=analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/html/analytics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAEnB,wBAAwB,EAUzB,MAAM,YAAY,CAAC;AAMpB;;;GAGG;AACH,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASlB,CAAC;AAMX;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,GAAG,wBAAwB,CAuB3B"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics computation for Connector HTML reports (Phase 5.2)
|
|
3
|
+
*
|
|
4
|
+
* Computes KPIs, heatmap, latency histogram, and top tools
|
|
5
|
+
* from session report data.
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Constants
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Minimum sample size for P95 calculation.
|
|
12
|
+
* Below this threshold, P95 returns null to avoid statistical noise.
|
|
13
|
+
*/
|
|
14
|
+
export const P95_MIN_SAMPLES = 20;
|
|
15
|
+
/**
|
|
16
|
+
* Fixed latency histogram buckets.
|
|
17
|
+
* to_ms: null means +infinity (for "1000+" bucket)
|
|
18
|
+
*/
|
|
19
|
+
export const LATENCY_BUCKETS = [
|
|
20
|
+
{ label: '0-10', from_ms: 0, to_ms: 10 },
|
|
21
|
+
{ label: '10-25', from_ms: 10, to_ms: 25 },
|
|
22
|
+
{ label: '25-50', from_ms: 25, to_ms: 50 },
|
|
23
|
+
{ label: '50-100', from_ms: 50, to_ms: 100 },
|
|
24
|
+
{ label: '100-250', from_ms: 100, to_ms: 250 },
|
|
25
|
+
{ label: '250-500', from_ms: 250, to_ms: 500 },
|
|
26
|
+
{ label: '500-1000', from_ms: 500, to_ms: 1000 },
|
|
27
|
+
{ label: '1000+', from_ms: 1000, to_ms: null }, // null = +infinity
|
|
28
|
+
];
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Main Entry Point
|
|
31
|
+
// ============================================================================
|
|
32
|
+
/**
|
|
33
|
+
* Compute all analytics for a connector report.
|
|
34
|
+
*/
|
|
35
|
+
export function computeConnectorAnalytics(args) {
|
|
36
|
+
const { sessionReports, sessionsTotal, sessionsDisplayed } = args;
|
|
37
|
+
// Collect all RPCs from all sessions
|
|
38
|
+
const allRpcs = [];
|
|
39
|
+
for (const report of Object.values(sessionReports)) {
|
|
40
|
+
allRpcs.push(...report.rpcs);
|
|
41
|
+
}
|
|
42
|
+
// Compute each analytics component
|
|
43
|
+
const topTools = computeTopTools(allRpcs);
|
|
44
|
+
const kpis = computeKpis(allRpcs, sessionsTotal, sessionsDisplayed, topTools);
|
|
45
|
+
const heatmap = computeHeatmap(allRpcs);
|
|
46
|
+
const latency = computeLatencyHistogram(allRpcs);
|
|
47
|
+
const methodDistribution = computeMethodDistribution(allRpcs);
|
|
48
|
+
return {
|
|
49
|
+
kpis,
|
|
50
|
+
heatmap,
|
|
51
|
+
latency,
|
|
52
|
+
top_tools: topTools,
|
|
53
|
+
method_distribution: methodDistribution,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// KPI Computation
|
|
58
|
+
// ============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Compute KPI metrics from RPCs.
|
|
61
|
+
*/
|
|
62
|
+
function computeKpis(rpcs, sessionsTotal, sessionsDisplayed, topTools) {
|
|
63
|
+
// Count by status
|
|
64
|
+
let okCount = 0;
|
|
65
|
+
let errCount = 0;
|
|
66
|
+
let pendingCount = 0;
|
|
67
|
+
// Latency collection
|
|
68
|
+
const latencies = [];
|
|
69
|
+
// Bytes
|
|
70
|
+
let totalRequestBytes = 0;
|
|
71
|
+
let totalResponseBytes = 0;
|
|
72
|
+
for (const rpc of rpcs) {
|
|
73
|
+
// Status counting
|
|
74
|
+
switch (rpc.status) {
|
|
75
|
+
case 'OK':
|
|
76
|
+
okCount++;
|
|
77
|
+
break;
|
|
78
|
+
case 'ERR':
|
|
79
|
+
errCount++;
|
|
80
|
+
break;
|
|
81
|
+
case 'PENDING':
|
|
82
|
+
pendingCount++;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
// Latency
|
|
86
|
+
if (rpc.latency_ms !== null) {
|
|
87
|
+
latencies.push(rpc.latency_ms);
|
|
88
|
+
}
|
|
89
|
+
// Bytes
|
|
90
|
+
totalRequestBytes += rpc.request.size;
|
|
91
|
+
totalResponseBytes += rpc.response.size;
|
|
92
|
+
}
|
|
93
|
+
// Latency statistics
|
|
94
|
+
const avgLatency = latencies.length > 0 ? Math.round(latencies.reduce((a, b) => a + b, 0) / latencies.length) : null;
|
|
95
|
+
const p95Latency = computeP95(latencies);
|
|
96
|
+
const maxLatency = latencies.length > 0 ? Math.max(...latencies) : null;
|
|
97
|
+
// Top tool from topTools
|
|
98
|
+
const topToolName = topTools.items.length > 0 ? topTools.items[0].name : null;
|
|
99
|
+
const topToolCalls = topTools.items.length > 0 ? topTools.items[0].count : null;
|
|
100
|
+
return {
|
|
101
|
+
rpc_total: rpcs.length,
|
|
102
|
+
rpc_ok: okCount,
|
|
103
|
+
rpc_err: errCount,
|
|
104
|
+
rpc_pending: pendingCount,
|
|
105
|
+
avg_latency_ms: avgLatency,
|
|
106
|
+
p95_latency_ms: p95Latency,
|
|
107
|
+
max_latency_ms: maxLatency,
|
|
108
|
+
total_request_bytes: totalRequestBytes,
|
|
109
|
+
total_response_bytes: totalResponseBytes,
|
|
110
|
+
sessions_total: sessionsTotal,
|
|
111
|
+
sessions_displayed: sessionsDisplayed,
|
|
112
|
+
top_tool_name: topToolName,
|
|
113
|
+
top_tool_calls: topToolCalls,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Compute P95 latency using nearest-rank method.
|
|
118
|
+
* Returns null if sample size < P95_MIN_SAMPLES.
|
|
119
|
+
*
|
|
120
|
+
* Algorithm: k = ceil(0.95 * n), take sorted[k-1]
|
|
121
|
+
*/
|
|
122
|
+
function computeP95(latencies) {
|
|
123
|
+
const n = latencies.length;
|
|
124
|
+
if (n < P95_MIN_SAMPLES) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const sorted = [...latencies].sort((a, b) => a - b);
|
|
128
|
+
const k = Math.ceil(0.95 * n);
|
|
129
|
+
return sorted[k - 1];
|
|
130
|
+
}
|
|
131
|
+
// ============================================================================
|
|
132
|
+
// Heatmap Computation
|
|
133
|
+
// ============================================================================
|
|
134
|
+
/**
|
|
135
|
+
* Compute activity heatmap from RPCs.
|
|
136
|
+
* Groups RPCs by UTC date and fills gaps with zero-count days.
|
|
137
|
+
*
|
|
138
|
+
* Note: request_ts is stored in UTC ISO8601 format (Z suffix),
|
|
139
|
+
* so slice(0, 10) gives the UTC date.
|
|
140
|
+
*/
|
|
141
|
+
function computeHeatmap(rpcs) {
|
|
142
|
+
if (rpcs.length === 0) {
|
|
143
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
144
|
+
return {
|
|
145
|
+
start_date: today,
|
|
146
|
+
end_date: today,
|
|
147
|
+
cells: [{ date: today, count: 0 }],
|
|
148
|
+
max_count: 0,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// Count RPCs per UTC date
|
|
152
|
+
const dateCounts = new Map();
|
|
153
|
+
for (const rpc of rpcs) {
|
|
154
|
+
// request_ts is stored in UTC ISO8601 (Z suffix), so slice(0, 10) gives UTC date
|
|
155
|
+
const date = rpc.request_ts.slice(0, 10);
|
|
156
|
+
dateCounts.set(date, (dateCounts.get(date) || 0) + 1);
|
|
157
|
+
}
|
|
158
|
+
// Find date range
|
|
159
|
+
const dates = Array.from(dateCounts.keys()).sort();
|
|
160
|
+
const startDate = dates[0];
|
|
161
|
+
const endDate = dates[dates.length - 1];
|
|
162
|
+
// Fill gaps with zero-count days
|
|
163
|
+
const cells = [];
|
|
164
|
+
const current = new Date(startDate + 'T00:00:00Z');
|
|
165
|
+
const end = new Date(endDate + 'T00:00:00Z');
|
|
166
|
+
while (current <= end) {
|
|
167
|
+
const dateStr = current.toISOString().slice(0, 10);
|
|
168
|
+
cells.push({
|
|
169
|
+
date: dateStr,
|
|
170
|
+
count: dateCounts.get(dateStr) || 0,
|
|
171
|
+
});
|
|
172
|
+
current.setUTCDate(current.getUTCDate() + 1);
|
|
173
|
+
}
|
|
174
|
+
// Calculate max count for intensity scaling
|
|
175
|
+
const maxCount = Math.max(...cells.map((c) => c.count));
|
|
176
|
+
return {
|
|
177
|
+
start_date: startDate,
|
|
178
|
+
end_date: endDate,
|
|
179
|
+
cells,
|
|
180
|
+
max_count: maxCount,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
// ============================================================================
|
|
184
|
+
// Latency Histogram Computation
|
|
185
|
+
// ============================================================================
|
|
186
|
+
/**
|
|
187
|
+
* Compute latency histogram using fixed buckets.
|
|
188
|
+
*/
|
|
189
|
+
function computeLatencyHistogram(rpcs) {
|
|
190
|
+
// Initialize buckets with zero counts
|
|
191
|
+
const buckets = LATENCY_BUCKETS.map((b) => ({
|
|
192
|
+
label: b.label,
|
|
193
|
+
from_ms: b.from_ms,
|
|
194
|
+
to_ms: b.to_ms,
|
|
195
|
+
count: 0,
|
|
196
|
+
}));
|
|
197
|
+
let sampleSize = 0;
|
|
198
|
+
let excludedCount = 0;
|
|
199
|
+
for (const rpc of rpcs) {
|
|
200
|
+
if (rpc.latency_ms === null) {
|
|
201
|
+
excludedCount++;
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
sampleSize++;
|
|
205
|
+
const latency = rpc.latency_ms;
|
|
206
|
+
// Find matching bucket
|
|
207
|
+
// Bucket condition: from_ms <= latency < to_ms (or to_ms is null for +infinity)
|
|
208
|
+
for (const bucket of buckets) {
|
|
209
|
+
const inLowerBound = latency >= bucket.from_ms;
|
|
210
|
+
const inUpperBound = bucket.to_ms === null || latency < bucket.to_ms;
|
|
211
|
+
if (inLowerBound && inUpperBound) {
|
|
212
|
+
bucket.count++;
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
buckets,
|
|
219
|
+
sample_size: sampleSize,
|
|
220
|
+
excluded_count: excludedCount,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
// ============================================================================
|
|
224
|
+
// Top Tools Computation
|
|
225
|
+
// ============================================================================
|
|
226
|
+
/**
|
|
227
|
+
* Compute top 5 tools from tools/call RPCs.
|
|
228
|
+
*
|
|
229
|
+
* Tool name extraction fallback chain: params.name ?? params.tool ?? params.toolName
|
|
230
|
+
* If none found, the RPC is skipped (not counted as "unknown").
|
|
231
|
+
*/
|
|
232
|
+
function computeTopTools(rpcs) {
|
|
233
|
+
const toolCounts = new Map();
|
|
234
|
+
let totalCalls = 0;
|
|
235
|
+
for (const rpc of rpcs) {
|
|
236
|
+
if (rpc.method !== 'tools/call') {
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
// Extract tool name from request payload
|
|
240
|
+
const toolName = extractToolName(rpc.request.json);
|
|
241
|
+
if (toolName === null) {
|
|
242
|
+
continue; // Skip if no tool name found
|
|
243
|
+
}
|
|
244
|
+
toolCounts.set(toolName, (toolCounts.get(toolName) || 0) + 1);
|
|
245
|
+
totalCalls++;
|
|
246
|
+
}
|
|
247
|
+
// Sort by count descending and take top 5
|
|
248
|
+
const sorted = Array.from(toolCounts.entries())
|
|
249
|
+
.sort((a, b) => b[1] - a[1])
|
|
250
|
+
.slice(0, 5);
|
|
251
|
+
const items = sorted.map(([name, count]) => ({
|
|
252
|
+
name,
|
|
253
|
+
count,
|
|
254
|
+
pct: totalCalls > 0 ? Math.round((count / totalCalls) * 100) : 0,
|
|
255
|
+
}));
|
|
256
|
+
return {
|
|
257
|
+
items,
|
|
258
|
+
total_calls: totalCalls,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Extract tool name from request JSON.
|
|
263
|
+
* Fallback chain: params.name ?? params.tool ?? params.toolName
|
|
264
|
+
*/
|
|
265
|
+
function extractToolName(json) {
|
|
266
|
+
if (json === null || typeof json !== 'object') {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
const obj = json;
|
|
270
|
+
const params = obj.params;
|
|
271
|
+
if (params === null || typeof params !== 'object') {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
const p = params;
|
|
275
|
+
// Fallback chain: params.name ?? params.tool ?? params.toolName
|
|
276
|
+
if (typeof p.name === 'string' && p.name.length > 0) {
|
|
277
|
+
return p.name;
|
|
278
|
+
}
|
|
279
|
+
if (typeof p.tool === 'string' && p.tool.length > 0) {
|
|
280
|
+
return p.tool;
|
|
281
|
+
}
|
|
282
|
+
if (typeof p.toolName === 'string' && p.toolName.length > 0) {
|
|
283
|
+
return p.toolName;
|
|
284
|
+
}
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
// ============================================================================
|
|
288
|
+
// Method Distribution Computation
|
|
289
|
+
// ============================================================================
|
|
290
|
+
/**
|
|
291
|
+
* Compute method distribution for donut chart.
|
|
292
|
+
* Shows top 5 methods + "Others" bucket.
|
|
293
|
+
*/
|
|
294
|
+
function computeMethodDistribution(rpcs) {
|
|
295
|
+
if (rpcs.length === 0) {
|
|
296
|
+
return {
|
|
297
|
+
slices: [],
|
|
298
|
+
total_rpcs: 0,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
// Count by method
|
|
302
|
+
const methodCounts = new Map();
|
|
303
|
+
for (const rpc of rpcs) {
|
|
304
|
+
methodCounts.set(rpc.method, (methodCounts.get(rpc.method) || 0) + 1);
|
|
305
|
+
}
|
|
306
|
+
// Sort by count descending
|
|
307
|
+
const sorted = Array.from(methodCounts.entries()).sort((a, b) => b[1] - a[1]);
|
|
308
|
+
const totalRpcs = rpcs.length;
|
|
309
|
+
const slices = [];
|
|
310
|
+
// Take top 5
|
|
311
|
+
const top5 = sorted.slice(0, 5);
|
|
312
|
+
let top5Total = 0;
|
|
313
|
+
for (const [method, count] of top5) {
|
|
314
|
+
top5Total += count;
|
|
315
|
+
slices.push({
|
|
316
|
+
method,
|
|
317
|
+
count,
|
|
318
|
+
pct: Math.round((count / totalRpcs) * 100),
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
// Add "Others" if there are more than 5 methods
|
|
322
|
+
if (sorted.length > 5) {
|
|
323
|
+
const othersCount = totalRpcs - top5Total;
|
|
324
|
+
if (othersCount > 0) {
|
|
325
|
+
slices.push({
|
|
326
|
+
method: 'Others',
|
|
327
|
+
count: othersCount,
|
|
328
|
+
pct: Math.round((othersCount / totalRpcs) * 100),
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
slices,
|
|
334
|
+
total_rpcs: totalRpcs,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/html/analytics.ts"],"names":[],"mappings":"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"}
|
package/dist/html/index.d.ts
CHANGED
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* Exports standalone HTML reports for RPC and Session data.
|
|
5
5
|
*/
|
|
6
6
|
export { HTML_REPORT_SCHEMA_VERSION, DEFAULT_EMBED_MAX_BYTES, TRUNCATION_PREVIEW_LENGTH, SHORT_ID_LENGTH, DEFAULT_EXPORT_OPTIONS, toRpcStatus, getStatusSymbol, createPayloadData, getRpcHtmlFilename, getSessionHtmlFilename, getSpillFilename, getConnectorHtmlFilename, } from './types.js';
|
|
7
|
-
export type { HtmlReportMeta, RpcStatus, HtmlExportOptions, PayloadData, HtmlRpcData, HtmlRpcReportV1, SessionRpcDetail, HtmlSessionData, HtmlSessionReportV1, HtmlMcpCapabilities, HtmlMcpServerInfo, HtmlConnectorInfo, HtmlConnectorSessionRow, HtmlConnectorReportV1, } from './types.js';
|
|
8
|
-
export { escapeHtml, escapeJsonForScript, generateRpcHtml, generateSessionHtml, generateConnectorHtml, } from './templates.js';
|
|
7
|
+
export type { HtmlReportMeta, RpcStatus, HtmlExportOptions, PayloadData, HtmlRpcData, HtmlRpcReportV1, SessionRpcDetail, HtmlSessionData, HtmlSessionReportV1, HtmlMcpCapabilities, HtmlMcpServerInfo, HtmlConnectorInfo, HtmlConnectorSessionRow, HtmlConnectorReportV1, HtmlConnectorKpis, HtmlHeatmapCell, HtmlHeatmapData, HtmlLatencyBucket, HtmlLatencyHistogram, HtmlTopTool, HtmlTopToolsData, HtmlMethodSlice, HtmlMethodDistribution, HtmlConnectorAnalyticsV1, } from './types.js';
|
|
8
|
+
export { escapeHtml, escapeJsonForScript, generateRpcHtml, generateSessionHtml, generateConnectorHtml, renderHeatmap, renderMethodDistribution, } from './templates.js';
|
|
9
9
|
export { openInBrowser } from './browser.js';
|
|
10
10
|
export { getPackageVersion, validateOutputPath, validateEmbedMaxBytes, ensureOutputDir, safeWriteFile, } from './utils.js';
|
|
11
|
+
export { computeConnectorAnalytics, LATENCY_BUCKETS, P95_MIN_SAMPLES } from './analytics.js';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/html/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/html/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EAEnB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/html/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EAEnB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EAErB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/html/index.js
CHANGED
|
@@ -6,9 +6,11 @@
|
|
|
6
6
|
// Types
|
|
7
7
|
export { HTML_REPORT_SCHEMA_VERSION, DEFAULT_EMBED_MAX_BYTES, TRUNCATION_PREVIEW_LENGTH, SHORT_ID_LENGTH, DEFAULT_EXPORT_OPTIONS, toRpcStatus, getStatusSymbol, createPayloadData, getRpcHtmlFilename, getSessionHtmlFilename, getSpillFilename, getConnectorHtmlFilename, } from './types.js';
|
|
8
8
|
// Templates
|
|
9
|
-
export { escapeHtml, escapeJsonForScript, generateRpcHtml, generateSessionHtml, generateConnectorHtml, } from './templates.js';
|
|
9
|
+
export { escapeHtml, escapeJsonForScript, generateRpcHtml, generateSessionHtml, generateConnectorHtml, renderHeatmap, renderMethodDistribution, } from './templates.js';
|
|
10
10
|
// Browser
|
|
11
11
|
export { openInBrowser } from './browser.js';
|
|
12
12
|
// Utilities
|
|
13
13
|
export { getPackageVersion, validateOutputPath, validateEmbedMaxBytes, ensureOutputDir, safeWriteFile, } from './utils.js';
|
|
14
|
+
// Analytics (Phase 5.2)
|
|
15
|
+
export { computeConnectorAnalytics, LATENCY_BUCKETS, P95_MIN_SAMPLES } from './analytics.js';
|
|
14
16
|
//# sourceMappingURL=index.js.map
|
package/dist/html/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/html/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/html/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AA+BpB,YAAY;AACZ,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,YAAY;AACZ,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,wBAAwB;AACxB,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/html/templates.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Generates standalone HTML files for RPC and Session reports.
|
|
5
5
|
* Dark theme with neon blue accent badges.
|
|
6
6
|
*/
|
|
7
|
-
import type { HtmlConnectorReportV1, HtmlRpcReportV1, HtmlSessionReportV1 } from './types.js';
|
|
7
|
+
import type { HtmlConnectorReportV1, HtmlHeatmapData, HtmlMethodDistribution, HtmlRpcReportV1, HtmlSessionReportV1 } from './types.js';
|
|
8
8
|
/**
|
|
9
9
|
* Escape HTML special characters to prevent XSS
|
|
10
10
|
*/
|
|
@@ -22,6 +22,14 @@ export declare function generateRpcHtml(report: HtmlRpcReportV1): string;
|
|
|
22
22
|
* Generate Session HTML report (2-pane Wireshark-style layout)
|
|
23
23
|
*/
|
|
24
24
|
export declare function generateSessionHtml(report: HtmlSessionReportV1): string;
|
|
25
|
+
/**
|
|
26
|
+
* Render activity heatmap (GitHub contributions style, SVG)
|
|
27
|
+
*/
|
|
28
|
+
export declare function renderHeatmap(heatmap: HtmlHeatmapData): string;
|
|
29
|
+
/**
|
|
30
|
+
* Render method distribution donut chart (SVG)
|
|
31
|
+
*/
|
|
32
|
+
export declare function renderMethodDistribution(methodDist: HtmlMethodDistribution): string;
|
|
25
33
|
/**
|
|
26
34
|
* Generate Connector HTML report (3-hierarchy: Connector -> Sessions -> RPCs)
|
|
27
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/html/templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/html/templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAGV,qBAAqB,EAErB,eAAe,EAEf,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EAKpB,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AA0jBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAyE/D;AAuBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CA4EvE;AAu5BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAoD9D;AAsFD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,sBAAsB,GAAG,MAAM,CAuFnF;AAuHD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CA8G3E"}
|