@roberttlange/agentlens 0.1.1 → 0.2.0
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/main.js +0 -0
- package/node_modules/@agentlens/contracts/dist/index.d.ts +44 -0
- package/node_modules/@agentlens/server/dist/activity.d.ts +20 -0
- package/node_modules/@agentlens/server/dist/activity.js +396 -0
- package/node_modules/@agentlens/server/dist/activity.js.map +1 -0
- package/node_modules/@agentlens/server/dist/app.js +154 -11
- package/node_modules/@agentlens/server/dist/app.js.map +1 -1
- package/node_modules/@agentlens/server/dist/app.test.js +282 -0
- package/node_modules/@agentlens/server/dist/app.test.js.map +1 -1
- package/node_modules/@agentlens/server/dist/web/assets/index-BzsxAylL.js +52 -0
- package/node_modules/@agentlens/server/dist/web/assets/index-P7-_d86N.css +1 -0
- package/node_modules/@agentlens/server/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/node_modules/@agentlens/server/dist/web/assets/index-B3MSb27F.css +0 -1
- package/node_modules/@agentlens/server/dist/web/assets/index-Cz9nE854.js +0 -52
package/dist/main.js
CHANGED
|
File without changes
|
|
@@ -183,6 +183,50 @@ export interface TracePage {
|
|
|
183
183
|
nextBefore: string;
|
|
184
184
|
liveCursor: string;
|
|
185
185
|
}
|
|
186
|
+
export interface AgentActivityBin {
|
|
187
|
+
startMs: number;
|
|
188
|
+
endMs: number;
|
|
189
|
+
activeSessionCount: number;
|
|
190
|
+
activeTraceIds: string[];
|
|
191
|
+
primaryTraceId: string;
|
|
192
|
+
activeByAgent: Record<AgentKind, number>;
|
|
193
|
+
eventCount: number;
|
|
194
|
+
eventKindCounts: Record<EventKind, number>;
|
|
195
|
+
dominantAgent: AgentKind | "none";
|
|
196
|
+
dominantEventKind: EventKind | "none";
|
|
197
|
+
isBreak: boolean;
|
|
198
|
+
}
|
|
199
|
+
export interface AgentActivityDay {
|
|
200
|
+
dateLocal: string;
|
|
201
|
+
tzOffsetMinutes: number;
|
|
202
|
+
binMinutes: number;
|
|
203
|
+
breakMinutes: number;
|
|
204
|
+
windowStartMs: number;
|
|
205
|
+
windowEndMs: number;
|
|
206
|
+
totalSessionsInWindow: number;
|
|
207
|
+
peakConcurrentSessions: number;
|
|
208
|
+
peakConcurrentAtMs: number | null;
|
|
209
|
+
bins: AgentActivityBin[];
|
|
210
|
+
}
|
|
211
|
+
export interface AgentActivityWeekDay {
|
|
212
|
+
dateLocal: string;
|
|
213
|
+
windowStartMs: number;
|
|
214
|
+
windowEndMs: number;
|
|
215
|
+
totalSessionsInWindow: number;
|
|
216
|
+
peakConcurrentSessions: number;
|
|
217
|
+
peakConcurrentAtMs: number | null;
|
|
218
|
+
bins: AgentActivityBin[];
|
|
219
|
+
}
|
|
220
|
+
export interface AgentActivityWeek {
|
|
221
|
+
tzOffsetMinutes: number;
|
|
222
|
+
dayCount: number;
|
|
223
|
+
slotMinutes: number;
|
|
224
|
+
hourStartLocal: number;
|
|
225
|
+
hourEndLocal: number;
|
|
226
|
+
startDateLocal: string;
|
|
227
|
+
endDateLocal: string;
|
|
228
|
+
days: AgentActivityWeekDay[];
|
|
229
|
+
}
|
|
186
230
|
export interface OverviewStats {
|
|
187
231
|
traceCount: number;
|
|
188
232
|
sessionCount: number;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgentActivityDay, AgentActivityWeek } from "@agentlens/contracts";
|
|
2
|
+
import type { TraceIndex } from "@agentlens/core";
|
|
3
|
+
export interface BuildAgentActivityDayOptions {
|
|
4
|
+
dateLocal?: string;
|
|
5
|
+
tzOffsetMinutes?: number;
|
|
6
|
+
binMinutes?: number;
|
|
7
|
+
breakMinutes?: number;
|
|
8
|
+
nowMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface BuildAgentActivityWeekOptions {
|
|
11
|
+
endDateLocal?: string;
|
|
12
|
+
tzOffsetMinutes?: number;
|
|
13
|
+
dayCount?: number;
|
|
14
|
+
slotMinutes?: number;
|
|
15
|
+
hourStartLocal?: number;
|
|
16
|
+
hourEndLocal?: number;
|
|
17
|
+
nowMs?: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function buildAgentActivityDay(traceIndex: TraceIndex, options?: BuildAgentActivityDayOptions): AgentActivityDay;
|
|
20
|
+
export declare function buildAgentActivityWeek(traceIndex: TraceIndex, options?: BuildAgentActivityWeekOptions): AgentActivityWeek;
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
const AGENT_KIND_KEYS = ["claude", "codex", "cursor", "opencode", "gemini", "pi", "unknown"];
|
|
2
|
+
const EVENT_KIND_KEYS = ["system", "assistant", "user", "tool_use", "tool_result", "reasoning", "meta"];
|
|
3
|
+
const DEFAULT_BIN_MINUTES = 5;
|
|
4
|
+
const DEFAULT_BREAK_MINUTES = 10;
|
|
5
|
+
const DEFAULT_DAY_HOUR_START_LOCAL = 7;
|
|
6
|
+
const MIN_BIN_MINUTES = 1;
|
|
7
|
+
const MAX_BIN_MINUTES = 60;
|
|
8
|
+
const MIN_BREAK_MINUTES = 1;
|
|
9
|
+
const MAX_BREAK_MINUTES = 180;
|
|
10
|
+
const DEFAULT_WEEK_DAY_COUNT = 7;
|
|
11
|
+
const MIN_WEEK_DAY_COUNT = 1;
|
|
12
|
+
const MAX_WEEK_DAY_COUNT = 14;
|
|
13
|
+
const DEFAULT_WEEK_SLOT_MINUTES = 30;
|
|
14
|
+
const DEFAULT_WEEK_HOUR_START_LOCAL = 0;
|
|
15
|
+
const DEFAULT_WEEK_HOUR_END_LOCAL = 24;
|
|
16
|
+
const MIN_TZ_OFFSET_MINUTES = -14 * 60;
|
|
17
|
+
const MAX_TZ_OFFSET_MINUTES = 14 * 60;
|
|
18
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
19
|
+
const ACTIVE_IDLE_GAP_MS = 20 * 60_000;
|
|
20
|
+
function clamp(value, min, max) {
|
|
21
|
+
return Math.max(min, Math.min(max, value));
|
|
22
|
+
}
|
|
23
|
+
function validateInt(value, field) {
|
|
24
|
+
if (value === undefined)
|
|
25
|
+
return undefined;
|
|
26
|
+
if (!Number.isInteger(value)) {
|
|
27
|
+
throw new Error(`invalid ${field}`);
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
function pad2(value) {
|
|
32
|
+
return String(value).padStart(2, "0");
|
|
33
|
+
}
|
|
34
|
+
function toLocalDateString(ms, tzOffsetMinutes) {
|
|
35
|
+
const local = new Date(ms - tzOffsetMinutes * 60_000);
|
|
36
|
+
const year = local.getUTCFullYear();
|
|
37
|
+
const month = local.getUTCMonth() + 1;
|
|
38
|
+
const day = local.getUTCDate();
|
|
39
|
+
return `${year}-${pad2(month)}-${pad2(day)}`;
|
|
40
|
+
}
|
|
41
|
+
function parseDateLocal(dateLocal) {
|
|
42
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(dateLocal.trim());
|
|
43
|
+
if (!match)
|
|
44
|
+
throw new Error("invalid date");
|
|
45
|
+
const year = Number.parseInt(match[1] ?? "", 10);
|
|
46
|
+
const month = Number.parseInt(match[2] ?? "", 10);
|
|
47
|
+
const day = Number.parseInt(match[3] ?? "", 10);
|
|
48
|
+
if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day)) {
|
|
49
|
+
throw new Error("invalid date");
|
|
50
|
+
}
|
|
51
|
+
if (month < 1 || month > 12 || day < 1 || day > 31) {
|
|
52
|
+
throw new Error("invalid date");
|
|
53
|
+
}
|
|
54
|
+
const canonical = new Date(Date.UTC(year, month - 1, day));
|
|
55
|
+
if (canonical.getUTCFullYear() !== year ||
|
|
56
|
+
canonical.getUTCMonth() !== month - 1 ||
|
|
57
|
+
canonical.getUTCDate() !== day) {
|
|
58
|
+
throw new Error("invalid date");
|
|
59
|
+
}
|
|
60
|
+
return { year, month, day };
|
|
61
|
+
}
|
|
62
|
+
function windowStartMsForDateLocal(dateLocal, tzOffsetMinutes) {
|
|
63
|
+
const { year, month, day } = parseDateLocal(dateLocal);
|
|
64
|
+
return Date.UTC(year, month - 1, day) + tzOffsetMinutes * 60_000;
|
|
65
|
+
}
|
|
66
|
+
function computeWeekWindowMinutes(hourStartLocal, hourEndLocal) {
|
|
67
|
+
if (hourEndLocal === hourStartLocal) {
|
|
68
|
+
return 24 * 60;
|
|
69
|
+
}
|
|
70
|
+
if (hourEndLocal === 24) {
|
|
71
|
+
return (24 - hourStartLocal) * 60;
|
|
72
|
+
}
|
|
73
|
+
if (hourEndLocal > hourStartLocal) {
|
|
74
|
+
return (hourEndLocal - hourStartLocal) * 60;
|
|
75
|
+
}
|
|
76
|
+
if (hourEndLocal < hourStartLocal) {
|
|
77
|
+
return (24 - hourStartLocal + hourEndLocal) * 60;
|
|
78
|
+
}
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
function shiftDateLocal(dateLocal, dayOffset) {
|
|
82
|
+
const { year, month, day } = parseDateLocal(dateLocal);
|
|
83
|
+
const shifted = new Date(Date.UTC(year, month - 1, day + dayOffset));
|
|
84
|
+
return `${shifted.getUTCFullYear()}-${pad2(shifted.getUTCMonth() + 1)}-${pad2(shifted.getUTCDate())}`;
|
|
85
|
+
}
|
|
86
|
+
function createEmptyAgentCounts() {
|
|
87
|
+
return {
|
|
88
|
+
claude: 0,
|
|
89
|
+
codex: 0,
|
|
90
|
+
cursor: 0,
|
|
91
|
+
opencode: 0,
|
|
92
|
+
gemini: 0,
|
|
93
|
+
pi: 0,
|
|
94
|
+
unknown: 0,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function createEmptyEventKindCounts() {
|
|
98
|
+
return {
|
|
99
|
+
system: 0,
|
|
100
|
+
assistant: 0,
|
|
101
|
+
user: 0,
|
|
102
|
+
tool_use: 0,
|
|
103
|
+
tool_result: 0,
|
|
104
|
+
reasoning: 0,
|
|
105
|
+
meta: 0,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function resolveSessionSpan(summary) {
|
|
109
|
+
const baseStart = summary.firstEventTs ?? summary.lastEventTs ?? summary.mtimeMs;
|
|
110
|
+
const baseEnd = summary.lastEventTs ?? summary.mtimeMs;
|
|
111
|
+
const startMs = Math.min(baseStart, baseEnd);
|
|
112
|
+
const endMs = Math.max(baseStart, baseEnd);
|
|
113
|
+
return { startMs, endMs };
|
|
114
|
+
}
|
|
115
|
+
function collectTimestampMs(events) {
|
|
116
|
+
const timestamps = [];
|
|
117
|
+
for (const event of events) {
|
|
118
|
+
const timestampMs = event.timestampMs;
|
|
119
|
+
if (timestampMs === null || !Number.isFinite(timestampMs) || timestampMs <= 0)
|
|
120
|
+
continue;
|
|
121
|
+
timestamps.push(timestampMs);
|
|
122
|
+
}
|
|
123
|
+
timestamps.sort((left, right) => left - right);
|
|
124
|
+
return timestamps;
|
|
125
|
+
}
|
|
126
|
+
function buildActiveSegmentsFromEventTimestamps(eventTimestamps) {
|
|
127
|
+
if (eventTimestamps.length === 0)
|
|
128
|
+
return [];
|
|
129
|
+
const segments = [];
|
|
130
|
+
let segmentStartMs = eventTimestamps[0] ?? 0;
|
|
131
|
+
let previousTsMs = segmentStartMs;
|
|
132
|
+
for (let index = 1; index < eventTimestamps.length; index += 1) {
|
|
133
|
+
const nextTsMs = eventTimestamps[index] ?? previousTsMs;
|
|
134
|
+
const gapMs = Math.max(0, nextTsMs - previousTsMs);
|
|
135
|
+
if (gapMs > ACTIVE_IDLE_GAP_MS) {
|
|
136
|
+
segments.push({ startMs: segmentStartMs, endMs: previousTsMs });
|
|
137
|
+
segmentStartMs = nextTsMs;
|
|
138
|
+
}
|
|
139
|
+
previousTsMs = nextTsMs;
|
|
140
|
+
}
|
|
141
|
+
segments.push({ startMs: segmentStartMs, endMs: previousTsMs });
|
|
142
|
+
return segments;
|
|
143
|
+
}
|
|
144
|
+
function pickDominantAgent(counts) {
|
|
145
|
+
let dominant = "none";
|
|
146
|
+
let dominantCount = 0;
|
|
147
|
+
for (const key of AGENT_KIND_KEYS) {
|
|
148
|
+
const count = counts[key] ?? 0;
|
|
149
|
+
if (count > dominantCount) {
|
|
150
|
+
dominant = key;
|
|
151
|
+
dominantCount = count;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return dominant;
|
|
155
|
+
}
|
|
156
|
+
function pickDominantEventKind(counts) {
|
|
157
|
+
let dominant = "none";
|
|
158
|
+
let dominantCount = 0;
|
|
159
|
+
for (const key of EVENT_KIND_KEYS) {
|
|
160
|
+
const count = counts[key] ?? 0;
|
|
161
|
+
if (count > dominantCount) {
|
|
162
|
+
dominant = key;
|
|
163
|
+
dominantCount = count;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return dominant;
|
|
167
|
+
}
|
|
168
|
+
function computeBinIndex(windowStartMs, binMs, binCount, targetMs) {
|
|
169
|
+
if (binCount <= 0)
|
|
170
|
+
return -1;
|
|
171
|
+
const rawIndex = Math.floor((targetMs - windowStartMs) / binMs);
|
|
172
|
+
return clamp(rawIndex, 0, binCount - 1);
|
|
173
|
+
}
|
|
174
|
+
function applyBreakMarkers(bins, breakMinutes) {
|
|
175
|
+
const breakThresholdMs = breakMinutes * 60_000;
|
|
176
|
+
let runStart = -1;
|
|
177
|
+
const markRunIfBreak = (start, endExclusive) => {
|
|
178
|
+
if (start < 0 || endExclusive <= start)
|
|
179
|
+
return;
|
|
180
|
+
let runDurationMs = 0;
|
|
181
|
+
for (let idx = start; idx < endExclusive; idx += 1) {
|
|
182
|
+
const bin = bins[idx];
|
|
183
|
+
if (!bin)
|
|
184
|
+
continue;
|
|
185
|
+
runDurationMs += Math.max(0, bin.endMs - bin.startMs);
|
|
186
|
+
}
|
|
187
|
+
if (runDurationMs < breakThresholdMs)
|
|
188
|
+
return;
|
|
189
|
+
for (let idx = start; idx < endExclusive; idx += 1) {
|
|
190
|
+
const bin = bins[idx];
|
|
191
|
+
if (!bin)
|
|
192
|
+
continue;
|
|
193
|
+
bin.isBreak = true;
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
for (let idx = 0; idx < bins.length; idx += 1) {
|
|
197
|
+
const bin = bins[idx];
|
|
198
|
+
if (!bin)
|
|
199
|
+
continue;
|
|
200
|
+
if (bin.activeSessionCount === 0) {
|
|
201
|
+
if (runStart < 0)
|
|
202
|
+
runStart = idx;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
markRunIfBreak(runStart, idx);
|
|
206
|
+
runStart = -1;
|
|
207
|
+
}
|
|
208
|
+
markRunIfBreak(runStart, bins.length);
|
|
209
|
+
}
|
|
210
|
+
function buildWindowActivity(traceIndex, windowStartMs, windowEndMs, binMinutes, breakMinutes) {
|
|
211
|
+
const binMs = binMinutes * 60_000;
|
|
212
|
+
const totalWindowMs = Math.max(0, windowEndMs - windowStartMs);
|
|
213
|
+
const binCount = totalWindowMs <= 0 ? 0 : Math.ceil(totalWindowMs / binMs);
|
|
214
|
+
const bins = [];
|
|
215
|
+
for (let index = 0; index < binCount; index += 1) {
|
|
216
|
+
const startMs = windowStartMs + index * binMs;
|
|
217
|
+
const endMs = Math.min(startMs + binMs, windowEndMs);
|
|
218
|
+
bins.push({
|
|
219
|
+
startMs,
|
|
220
|
+
endMs,
|
|
221
|
+
activeSessionCount: 0,
|
|
222
|
+
activeTraceIds: [],
|
|
223
|
+
primaryTraceId: "",
|
|
224
|
+
activeByAgent: createEmptyAgentCounts(),
|
|
225
|
+
eventCount: 0,
|
|
226
|
+
eventKindCounts: createEmptyEventKindCounts(),
|
|
227
|
+
dominantAgent: "none",
|
|
228
|
+
dominantEventKind: "none",
|
|
229
|
+
isBreak: false,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
const summaries = traceIndex.getSummaries();
|
|
233
|
+
const inWindowSummaries = [];
|
|
234
|
+
const summaryById = new Map();
|
|
235
|
+
const contributingSessionIds = new Set();
|
|
236
|
+
for (const summary of summaries) {
|
|
237
|
+
const span = resolveSessionSpan(summary);
|
|
238
|
+
if (span.endMs < windowStartMs || span.startMs >= windowEndMs)
|
|
239
|
+
continue;
|
|
240
|
+
inWindowSummaries.push(summary);
|
|
241
|
+
summaryById.set(summary.id, summary);
|
|
242
|
+
}
|
|
243
|
+
if (binCount > 0) {
|
|
244
|
+
for (const summary of inWindowSummaries) {
|
|
245
|
+
const detail = traceIndex.getSessionDetail(summary.id);
|
|
246
|
+
const eventTimestamps = collectTimestampMs(detail.events);
|
|
247
|
+
const activeSegments = buildActiveSegmentsFromEventTimestamps(eventTimestamps);
|
|
248
|
+
for (const segment of activeSegments) {
|
|
249
|
+
if (segment.endMs < windowStartMs || segment.startMs >= windowEndMs)
|
|
250
|
+
continue;
|
|
251
|
+
const clampedStartMs = Math.max(segment.startMs, windowStartMs);
|
|
252
|
+
const clampedEndMs = Math.min(segment.endMs, windowEndMs - 1);
|
|
253
|
+
if (clampedEndMs < clampedStartMs)
|
|
254
|
+
continue;
|
|
255
|
+
const startIndex = computeBinIndex(windowStartMs, binMs, binCount, clampedStartMs);
|
|
256
|
+
const endIndex = computeBinIndex(windowStartMs, binMs, binCount, clampedEndMs);
|
|
257
|
+
for (let index = startIndex; index <= endIndex; index += 1) {
|
|
258
|
+
const bin = bins[index];
|
|
259
|
+
if (!bin)
|
|
260
|
+
continue;
|
|
261
|
+
if (!bin.activeTraceIds.includes(summary.id)) {
|
|
262
|
+
bin.activeTraceIds.push(summary.id);
|
|
263
|
+
bin.activeSessionCount += 1;
|
|
264
|
+
bin.activeByAgent[summary.agent] += 1;
|
|
265
|
+
contributingSessionIds.add(summary.id);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
for (const event of detail.events) {
|
|
270
|
+
const timestampMs = event.timestampMs;
|
|
271
|
+
if (timestampMs === null || timestampMs < windowStartMs || timestampMs >= windowEndMs)
|
|
272
|
+
continue;
|
|
273
|
+
const binIndex = computeBinIndex(windowStartMs, binMs, binCount, timestampMs);
|
|
274
|
+
const bin = bins[binIndex];
|
|
275
|
+
if (!bin)
|
|
276
|
+
continue;
|
|
277
|
+
bin.eventCount += 1;
|
|
278
|
+
bin.eventKindCounts[event.eventKind] += 1;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
let peakConcurrentSessions = 0;
|
|
283
|
+
let peakConcurrentAtMs = null;
|
|
284
|
+
for (const bin of bins) {
|
|
285
|
+
if (bin.activeTraceIds.length > 0) {
|
|
286
|
+
bin.activeTraceIds.sort((leftId, rightId) => {
|
|
287
|
+
const left = summaryById.get(leftId);
|
|
288
|
+
const right = summaryById.get(rightId);
|
|
289
|
+
const leftUpdatedMs = Math.max(left?.lastEventTs ?? 0, left?.mtimeMs ?? 0);
|
|
290
|
+
const rightUpdatedMs = Math.max(right?.lastEventTs ?? 0, right?.mtimeMs ?? 0);
|
|
291
|
+
return rightUpdatedMs - leftUpdatedMs || leftId.localeCompare(rightId);
|
|
292
|
+
});
|
|
293
|
+
bin.primaryTraceId = bin.activeTraceIds[0] ?? "";
|
|
294
|
+
}
|
|
295
|
+
bin.dominantAgent = pickDominantAgent(bin.activeByAgent);
|
|
296
|
+
bin.dominantEventKind = pickDominantEventKind(bin.eventKindCounts);
|
|
297
|
+
if (bin.activeSessionCount > peakConcurrentSessions) {
|
|
298
|
+
peakConcurrentSessions = bin.activeSessionCount;
|
|
299
|
+
peakConcurrentAtMs = bin.startMs;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
applyBreakMarkers(bins, breakMinutes);
|
|
303
|
+
return {
|
|
304
|
+
bins,
|
|
305
|
+
totalSessionsInWindow: contributingSessionIds.size,
|
|
306
|
+
peakConcurrentSessions,
|
|
307
|
+
peakConcurrentAtMs,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
export function buildAgentActivityDay(traceIndex, options = {}) {
|
|
311
|
+
const nowMs = typeof options.nowMs === "number" && Number.isFinite(options.nowMs) ? options.nowMs : Date.now();
|
|
312
|
+
const requestedTzOffset = validateInt(options.tzOffsetMinutes, "tz_offset_min");
|
|
313
|
+
const tzOffsetMinutes = clamp(requestedTzOffset ?? new Date(nowMs).getTimezoneOffset(), MIN_TZ_OFFSET_MINUTES, MAX_TZ_OFFSET_MINUTES);
|
|
314
|
+
const requestedDateLocal = options.dateLocal?.trim() ?? "";
|
|
315
|
+
const dateLocal = requestedDateLocal || toLocalDateString(nowMs, tzOffsetMinutes);
|
|
316
|
+
parseDateLocal(dateLocal);
|
|
317
|
+
const requestedBinMinutes = validateInt(options.binMinutes, "bin_min");
|
|
318
|
+
const requestedBreakMinutes = validateInt(options.breakMinutes, "break_min");
|
|
319
|
+
const binMinutes = clamp(requestedBinMinutes ?? DEFAULT_BIN_MINUTES, MIN_BIN_MINUTES, MAX_BIN_MINUTES);
|
|
320
|
+
const breakMinutes = clamp(requestedBreakMinutes ?? DEFAULT_BREAK_MINUTES, MIN_BREAK_MINUTES, MAX_BREAK_MINUTES);
|
|
321
|
+
const dayStartMs = windowStartMsForDateLocal(dateLocal, tzOffsetMinutes);
|
|
322
|
+
const windowStartMs = dayStartMs + DEFAULT_DAY_HOUR_START_LOCAL * 60 * 60_000;
|
|
323
|
+
const windowEndOfDayMs = windowStartMs + DAY_MS;
|
|
324
|
+
const todayLocal = toLocalDateString(nowMs, tzOffsetMinutes);
|
|
325
|
+
const windowEndMs = dateLocal === todayLocal ? Math.max(windowStartMs, Math.min(windowEndOfDayMs, nowMs)) : windowEndOfDayMs;
|
|
326
|
+
const windowActivity = buildWindowActivity(traceIndex, windowStartMs, windowEndMs, binMinutes, breakMinutes);
|
|
327
|
+
return {
|
|
328
|
+
dateLocal,
|
|
329
|
+
tzOffsetMinutes,
|
|
330
|
+
binMinutes,
|
|
331
|
+
breakMinutes,
|
|
332
|
+
windowStartMs,
|
|
333
|
+
windowEndMs,
|
|
334
|
+
totalSessionsInWindow: windowActivity.totalSessionsInWindow,
|
|
335
|
+
peakConcurrentSessions: windowActivity.peakConcurrentSessions,
|
|
336
|
+
peakConcurrentAtMs: windowActivity.peakConcurrentAtMs,
|
|
337
|
+
bins: windowActivity.bins,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
export function buildAgentActivityWeek(traceIndex, options = {}) {
|
|
341
|
+
const nowMs = typeof options.nowMs === "number" && Number.isFinite(options.nowMs) ? options.nowMs : Date.now();
|
|
342
|
+
const requestedTzOffset = validateInt(options.tzOffsetMinutes, "tz_offset_min");
|
|
343
|
+
const tzOffsetMinutes = clamp(requestedTzOffset ?? new Date(nowMs).getTimezoneOffset(), MIN_TZ_OFFSET_MINUTES, MAX_TZ_OFFSET_MINUTES);
|
|
344
|
+
const requestedEndDateLocal = options.endDateLocal?.trim() ?? "";
|
|
345
|
+
const endDateLocal = requestedEndDateLocal || toLocalDateString(nowMs, tzOffsetMinutes);
|
|
346
|
+
parseDateLocal(endDateLocal);
|
|
347
|
+
const requestedDayCount = validateInt(options.dayCount, "day_count");
|
|
348
|
+
const dayCount = clamp(requestedDayCount ?? DEFAULT_WEEK_DAY_COUNT, MIN_WEEK_DAY_COUNT, MAX_WEEK_DAY_COUNT);
|
|
349
|
+
const startDateLocal = shiftDateLocal(endDateLocal, -(dayCount - 1));
|
|
350
|
+
const requestedSlotMinutes = validateInt(options.slotMinutes, "slot_min");
|
|
351
|
+
const slotMinutes = clamp(requestedSlotMinutes ?? DEFAULT_WEEK_SLOT_MINUTES, MIN_BIN_MINUTES, MAX_BIN_MINUTES);
|
|
352
|
+
const requestedHourStart = validateInt(options.hourStartLocal, "hour_start");
|
|
353
|
+
const requestedHourEnd = validateInt(options.hourEndLocal, "hour_end");
|
|
354
|
+
const hourStartLocal = clamp(requestedHourStart ?? DEFAULT_WEEK_HOUR_START_LOCAL, 0, 23);
|
|
355
|
+
const hourEndLocal = clamp(requestedHourEnd ?? DEFAULT_WEEK_HOUR_END_LOCAL, 0, 24);
|
|
356
|
+
const windowMinutes = computeWeekWindowMinutes(hourStartLocal, hourEndLocal);
|
|
357
|
+
if (windowMinutes <= 0) {
|
|
358
|
+
throw new Error("invalid hour window");
|
|
359
|
+
}
|
|
360
|
+
if (slotMinutes > windowMinutes) {
|
|
361
|
+
throw new Error("slot_min too large for hour window");
|
|
362
|
+
}
|
|
363
|
+
const windowDurationMs = windowMinutes * 60_000;
|
|
364
|
+
const days = [];
|
|
365
|
+
const todayLocal = toLocalDateString(nowMs, tzOffsetMinutes);
|
|
366
|
+
for (let offset = 0; offset < dayCount; offset += 1) {
|
|
367
|
+
const dateLocal = shiftDateLocal(startDateLocal, offset);
|
|
368
|
+
const dayStartMs = windowStartMsForDateLocal(dateLocal, tzOffsetMinutes);
|
|
369
|
+
const windowStartMs = dayStartMs + hourStartLocal * 60 * 60_000;
|
|
370
|
+
const nominalWindowEndMs = windowStartMs + windowDurationMs;
|
|
371
|
+
const windowEndMs = dateLocal === todayLocal
|
|
372
|
+
? Math.max(windowStartMs, Math.min(nominalWindowEndMs, nowMs))
|
|
373
|
+
: nominalWindowEndMs;
|
|
374
|
+
const windowActivity = buildWindowActivity(traceIndex, windowStartMs, windowEndMs, slotMinutes, DEFAULT_BREAK_MINUTES);
|
|
375
|
+
days.push({
|
|
376
|
+
dateLocal,
|
|
377
|
+
windowStartMs,
|
|
378
|
+
windowEndMs,
|
|
379
|
+
totalSessionsInWindow: windowActivity.totalSessionsInWindow,
|
|
380
|
+
peakConcurrentSessions: windowActivity.peakConcurrentSessions,
|
|
381
|
+
peakConcurrentAtMs: windowActivity.peakConcurrentAtMs,
|
|
382
|
+
bins: windowActivity.bins,
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
return {
|
|
386
|
+
tzOffsetMinutes,
|
|
387
|
+
dayCount,
|
|
388
|
+
slotMinutes,
|
|
389
|
+
hourStartLocal,
|
|
390
|
+
hourEndLocal,
|
|
391
|
+
startDateLocal,
|
|
392
|
+
endDateLocal,
|
|
393
|
+
days,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"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"}
|