@agentlensai/server 0.6.0 → 0.8.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.
Files changed (72) hide show
  1. package/dist/db/benchmark-store.d.ts +74 -0
  2. package/dist/db/benchmark-store.d.ts.map +1 -0
  3. package/dist/db/benchmark-store.js +268 -0
  4. package/dist/db/benchmark-store.js.map +1 -0
  5. package/dist/db/guardrail-store.d.ts +34 -0
  6. package/dist/db/guardrail-store.d.ts.map +1 -0
  7. package/dist/db/guardrail-store.js +221 -0
  8. package/dist/db/guardrail-store.js.map +1 -0
  9. package/dist/db/migrate.d.ts.map +1 -1
  10. package/dist/db/migrate.js +112 -0
  11. package/dist/db/migrate.js.map +1 -1
  12. package/dist/db/schema.sqlite.d.ts +58 -1
  13. package/dist/db/schema.sqlite.d.ts.map +1 -1
  14. package/dist/db/schema.sqlite.js +6 -0
  15. package/dist/db/schema.sqlite.js.map +1 -1
  16. package/dist/db/sqlite-store.d.ts +12 -0
  17. package/dist/db/sqlite-store.d.ts.map +1 -1
  18. package/dist/db/sqlite-store.js +47 -0
  19. package/dist/db/sqlite-store.js.map +1 -1
  20. package/dist/db/tenant-scoped-store.d.ts +1 -0
  21. package/dist/db/tenant-scoped-store.d.ts.map +1 -1
  22. package/dist/db/tenant-scoped-store.js +3 -0
  23. package/dist/db/tenant-scoped-store.js.map +1 -1
  24. package/dist/index.d.ts +4 -0
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +32 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/lib/benchmark/engine.d.ts +24 -0
  29. package/dist/lib/benchmark/engine.d.ts.map +1 -0
  30. package/dist/lib/benchmark/engine.js +159 -0
  31. package/dist/lib/benchmark/engine.js.map +1 -0
  32. package/dist/lib/benchmark/metric-aggregator.d.ts +38 -0
  33. package/dist/lib/benchmark/metric-aggregator.d.ts.map +1 -0
  34. package/dist/lib/benchmark/metric-aggregator.js +159 -0
  35. package/dist/lib/benchmark/metric-aggregator.js.map +1 -0
  36. package/dist/lib/benchmark/statistical.d.ts +51 -0
  37. package/dist/lib/benchmark/statistical.d.ts.map +1 -0
  38. package/dist/lib/benchmark/statistical.js +381 -0
  39. package/dist/lib/benchmark/statistical.js.map +1 -0
  40. package/dist/lib/guardrails/actions.d.ts +28 -0
  41. package/dist/lib/guardrails/actions.d.ts.map +1 -0
  42. package/dist/lib/guardrails/actions.js +126 -0
  43. package/dist/lib/guardrails/actions.js.map +1 -0
  44. package/dist/lib/guardrails/conditions.d.ts +13 -0
  45. package/dist/lib/guardrails/conditions.d.ts.map +1 -0
  46. package/dist/lib/guardrails/conditions.js +188 -0
  47. package/dist/lib/guardrails/conditions.js.map +1 -0
  48. package/dist/lib/guardrails/engine.d.ts +24 -0
  49. package/dist/lib/guardrails/engine.d.ts.map +1 -0
  50. package/dist/lib/guardrails/engine.js +122 -0
  51. package/dist/lib/guardrails/engine.js.map +1 -0
  52. package/dist/lib/replay/builder.d.ts +28 -0
  53. package/dist/lib/replay/builder.d.ts.map +1 -0
  54. package/dist/lib/replay/builder.js +482 -0
  55. package/dist/lib/replay/builder.js.map +1 -0
  56. package/dist/routes/agents.d.ts +4 -3
  57. package/dist/routes/agents.d.ts.map +1 -1
  58. package/dist/routes/agents.js +37 -12
  59. package/dist/routes/agents.js.map +1 -1
  60. package/dist/routes/benchmarks.d.ts +18 -0
  61. package/dist/routes/benchmarks.d.ts.map +1 -0
  62. package/dist/routes/benchmarks.js +312 -0
  63. package/dist/routes/benchmarks.js.map +1 -0
  64. package/dist/routes/guardrails.d.ts +18 -0
  65. package/dist/routes/guardrails.d.ts.map +1 -0
  66. package/dist/routes/guardrails.js +184 -0
  67. package/dist/routes/guardrails.js.map +1 -0
  68. package/dist/routes/replay.d.ts +28 -0
  69. package/dist/routes/replay.d.ts.map +1 -0
  70. package/dist/routes/replay.js +140 -0
  71. package/dist/routes/replay.js.map +1 -0
  72. package/package.json +2 -2
@@ -0,0 +1,482 @@
1
+ /**
2
+ * ReplayBuilder — Core Replay Logic (Stories 2.1, 2.4)
3
+ *
4
+ * Constructs a ReplayState from raw events for a given session.
5
+ * Handles event pairing, cumulative context tracking, pagination,
6
+ * filtering, and redaction of sensitive LLM content.
7
+ */
8
+ import { verifyChain } from '@agentlensai/core';
9
+ // ─── ReplayBuilder ─────────────────────────────────────────
10
+ export class ReplayBuilder {
11
+ store;
12
+ constructor(store) {
13
+ this.store = store;
14
+ }
15
+ /**
16
+ * Build a ReplayState for the given session.
17
+ * Returns null when the session does not exist.
18
+ */
19
+ async build(sessionId, options = {}) {
20
+ const { offset = 0, limit = 1000, eventTypes, includeContext = true, } = options;
21
+ // 1. Fetch session metadata
22
+ const session = await this.store.getSession(sessionId);
23
+ if (!session)
24
+ return null;
25
+ // 2. Fetch ALL events for the session (ascending)
26
+ const allEvents = await this.store.getSessionTimeline(sessionId);
27
+ if (allEvents.length === 0) {
28
+ return {
29
+ session,
30
+ chainValid: true,
31
+ totalSteps: 0,
32
+ steps: [],
33
+ pagination: { offset, limit, hasMore: false },
34
+ summary: emptySummary(),
35
+ };
36
+ }
37
+ // 3. Verify hash chain
38
+ const chainResult = verifyChain(allEvents);
39
+ const chainValid = chainResult.valid;
40
+ // 4. Build pairing maps (always on full set for correct pairing)
41
+ const pairMap = buildPairMap(allEvents);
42
+ // 5. Apply eventTypes filter (but keep full list for summary)
43
+ let filteredEvents = allEvents;
44
+ if (eventTypes && eventTypes.length > 0) {
45
+ const typeSet = new Set(eventTypes);
46
+ filteredEvents = allEvents.filter((e) => typeSet.has(e.eventType));
47
+ }
48
+ const totalSteps = filteredEvents.length;
49
+ // 6. Summary is always computed from the full (unfiltered, unpaginated) event list
50
+ const summary = computeSummary(allEvents);
51
+ // 7. Paginate
52
+ const pageEvents = filteredEvents.slice(offset, offset + limit);
53
+ const hasMore = offset + limit < totalSteps;
54
+ // 8. Build steps with cumulative context
55
+ const steps = [];
56
+ if (includeContext) {
57
+ // We need to compute context cumulatively through ALL filtered events
58
+ // up to (offset + limit), then only return the paginated slice.
59
+ const contextState = createContextState(allEvents.length);
60
+ let stepIndex = 0;
61
+ for (const event of filteredEvents) {
62
+ // Update context with this event (even if before our page window)
63
+ updateContext(contextState, event, allEvents);
64
+ if (stepIndex >= offset && stepIndex < offset + limit) {
65
+ const paired = pairMap.get(event.id);
66
+ const step = {
67
+ index: stepIndex,
68
+ event: maybeRedactEvent(event),
69
+ context: snapshotContext(contextState),
70
+ };
71
+ if (paired) {
72
+ step.pairedEvent = maybeRedactEvent(paired.event);
73
+ step.pairDurationMs = paired.durationMs;
74
+ }
75
+ steps.push(step);
76
+ }
77
+ stepIndex++;
78
+ if (stepIndex >= offset + limit && stepIndex >= totalSteps)
79
+ break;
80
+ }
81
+ }
82
+ else {
83
+ // No context — just build steps with empty context
84
+ let stepIndex = offset;
85
+ for (const event of pageEvents) {
86
+ const paired = pairMap.get(event.id);
87
+ const step = {
88
+ index: stepIndex,
89
+ event: maybeRedactEvent(event),
90
+ context: emptyContext(allEvents.length),
91
+ };
92
+ if (paired) {
93
+ step.pairedEvent = maybeRedactEvent(paired.event);
94
+ step.pairDurationMs = paired.durationMs;
95
+ }
96
+ steps.push(step);
97
+ stepIndex++;
98
+ }
99
+ }
100
+ return {
101
+ session,
102
+ chainValid,
103
+ totalSteps,
104
+ steps,
105
+ pagination: { offset, limit, hasMore },
106
+ summary,
107
+ };
108
+ }
109
+ }
110
+ /**
111
+ * Build a map from initiator event ID → paired response event + duration.
112
+ *
113
+ * Pairings:
114
+ * - tool_call → tool_response/tool_error (by callId)
115
+ * - llm_call → llm_response (by callId)
116
+ * - approval_requested → approval_granted/denied/expired (by requestId)
117
+ * - form_submitted → form_completed/form_expired (by submissionId)
118
+ */
119
+ function buildPairMap(events) {
120
+ const pairMap = new Map();
121
+ // Index initiator events by their correlation key
122
+ const toolCalls = new Map(); // callId → event
123
+ const llmCalls = new Map(); // callId → event
124
+ const approvalRequests = new Map(); // requestId → event
125
+ const formSubmissions = new Map(); // submissionId → event
126
+ for (const event of events) {
127
+ const p = event.payload;
128
+ switch (event.eventType) {
129
+ case 'tool_call':
130
+ toolCalls.set(p.callId, event);
131
+ break;
132
+ case 'llm_call':
133
+ llmCalls.set(p.callId, event);
134
+ break;
135
+ case 'approval_requested':
136
+ approvalRequests.set(p.requestId, event);
137
+ break;
138
+ case 'form_submitted':
139
+ formSubmissions.set(p.submissionId, event);
140
+ break;
141
+ case 'tool_response':
142
+ case 'tool_error': {
143
+ const callId = p.callId;
144
+ const initiator = toolCalls.get(callId);
145
+ if (initiator) {
146
+ const durationMs = new Date(event.timestamp).getTime() -
147
+ new Date(initiator.timestamp).getTime();
148
+ pairMap.set(initiator.id, { event, durationMs });
149
+ }
150
+ break;
151
+ }
152
+ case 'llm_response': {
153
+ const callId = p.callId;
154
+ const initiator = llmCalls.get(callId);
155
+ if (initiator) {
156
+ const durationMs = new Date(event.timestamp).getTime() -
157
+ new Date(initiator.timestamp).getTime();
158
+ pairMap.set(initiator.id, { event, durationMs });
159
+ }
160
+ break;
161
+ }
162
+ case 'approval_granted':
163
+ case 'approval_denied':
164
+ case 'approval_expired': {
165
+ const requestId = p.requestId;
166
+ const initiator = approvalRequests.get(requestId);
167
+ if (initiator) {
168
+ const durationMs = new Date(event.timestamp).getTime() -
169
+ new Date(initiator.timestamp).getTime();
170
+ pairMap.set(initiator.id, { event, durationMs });
171
+ }
172
+ break;
173
+ }
174
+ case 'form_completed':
175
+ case 'form_expired': {
176
+ const submissionId = p.submissionId;
177
+ const initiator = formSubmissions.get(submissionId);
178
+ if (initiator) {
179
+ const durationMs = new Date(event.timestamp).getTime() -
180
+ new Date(initiator.timestamp).getTime();
181
+ pairMap.set(initiator.id, { event, durationMs });
182
+ }
183
+ break;
184
+ }
185
+ }
186
+ }
187
+ return pairMap;
188
+ }
189
+ function createContextState(totalEvents) {
190
+ return {
191
+ totalEvents,
192
+ eventIndex: 0,
193
+ cumulativeCostUsd: 0,
194
+ firstTimestamp: null,
195
+ eventCounts: {},
196
+ llmHistory: [],
197
+ toolResults: [],
198
+ pendingApprovals: [],
199
+ errorCount: 0,
200
+ warnings: [],
201
+ _currentTimestamp: null,
202
+ _pendingToolCalls: new Map(),
203
+ _pendingLlmCalls: new Map(),
204
+ };
205
+ }
206
+ function updateContext(ctx, event, _allEvents) {
207
+ ctx.eventIndex++;
208
+ // Track first timestamp and current elapsed
209
+ if (ctx.firstTimestamp === null) {
210
+ ctx.firstTimestamp = event.timestamp;
211
+ }
212
+ ctx._currentTimestamp = event.timestamp;
213
+ // Event counts
214
+ ctx.eventCounts[event.eventType] = (ctx.eventCounts[event.eventType] ?? 0) + 1;
215
+ // Error tracking
216
+ if (event.eventType === 'tool_error' ||
217
+ event.severity === 'error') {
218
+ ctx.errorCount++;
219
+ }
220
+ const p = event.payload;
221
+ switch (event.eventType) {
222
+ case 'cost_tracked': {
223
+ const payload = p;
224
+ ctx.cumulativeCostUsd += payload.costUsd;
225
+ break;
226
+ }
227
+ case 'tool_call': {
228
+ const payload = p;
229
+ ctx._pendingToolCalls.set(payload.callId, {
230
+ toolName: payload.toolName,
231
+ arguments: payload.arguments,
232
+ });
233
+ ctx.toolResults.push({
234
+ callId: payload.callId,
235
+ toolName: payload.toolName,
236
+ arguments: payload.arguments,
237
+ completed: false,
238
+ });
239
+ break;
240
+ }
241
+ case 'tool_response': {
242
+ const payload = p;
243
+ const pending = ctx._pendingToolCalls.get(payload.callId);
244
+ if (pending) {
245
+ // Update the existing entry
246
+ const entry = ctx.toolResults.find((t) => t.callId === payload.callId);
247
+ if (entry) {
248
+ entry.result = payload.result;
249
+ entry.durationMs = payload.durationMs;
250
+ entry.completed = true;
251
+ }
252
+ ctx._pendingToolCalls.delete(payload.callId);
253
+ }
254
+ break;
255
+ }
256
+ case 'tool_error': {
257
+ const payload = p;
258
+ const pending = ctx._pendingToolCalls.get(payload.callId);
259
+ if (pending) {
260
+ const entry = ctx.toolResults.find((t) => t.callId === payload.callId);
261
+ if (entry) {
262
+ entry.error = payload.error;
263
+ entry.durationMs = payload.durationMs;
264
+ entry.completed = true;
265
+ }
266
+ ctx._pendingToolCalls.delete(payload.callId);
267
+ }
268
+ break;
269
+ }
270
+ case 'llm_call': {
271
+ const payload = p;
272
+ const messages = payload.redacted
273
+ ? redactMessages(payload.messages)
274
+ : payload.messages;
275
+ ctx._pendingLlmCalls.set(payload.callId, {
276
+ provider: payload.provider,
277
+ model: payload.model,
278
+ messages,
279
+ costUsd: 0,
280
+ });
281
+ ctx.llmHistory.push({
282
+ callId: payload.callId,
283
+ provider: payload.provider,
284
+ model: payload.model,
285
+ messages,
286
+ costUsd: 0,
287
+ latencyMs: 0,
288
+ });
289
+ break;
290
+ }
291
+ case 'llm_response': {
292
+ const payload = p;
293
+ ctx.cumulativeCostUsd += payload.costUsd;
294
+ const entry = ctx.llmHistory.find((h) => h.callId === payload.callId);
295
+ if (entry) {
296
+ entry.response = payload.redacted
297
+ ? '[REDACTED]'
298
+ : (payload.completion ?? undefined);
299
+ entry.toolCalls = payload.toolCalls;
300
+ entry.costUsd = payload.costUsd;
301
+ entry.latencyMs = payload.latencyMs;
302
+ }
303
+ else {
304
+ // Response without a matching call — still record it
305
+ ctx.llmHistory.push({
306
+ callId: payload.callId,
307
+ provider: payload.provider,
308
+ model: payload.model,
309
+ messages: [],
310
+ response: payload.redacted
311
+ ? '[REDACTED]'
312
+ : (payload.completion ?? undefined),
313
+ toolCalls: payload.toolCalls,
314
+ costUsd: payload.costUsd,
315
+ latencyMs: payload.latencyMs,
316
+ });
317
+ }
318
+ break;
319
+ }
320
+ case 'approval_requested': {
321
+ const payload = p;
322
+ ctx.pendingApprovals.push({
323
+ requestId: payload.requestId,
324
+ action: payload.action,
325
+ status: 'pending',
326
+ });
327
+ break;
328
+ }
329
+ case 'approval_granted':
330
+ case 'approval_denied':
331
+ case 'approval_expired': {
332
+ const payload = p;
333
+ const approval = ctx.pendingApprovals.find((a) => a.requestId === payload.requestId);
334
+ if (approval) {
335
+ const statusMap = {
336
+ approval_granted: 'granted',
337
+ approval_denied: 'denied',
338
+ approval_expired: 'expired',
339
+ };
340
+ approval.status = statusMap[event.eventType] ?? 'granted';
341
+ }
342
+ break;
343
+ }
344
+ }
345
+ }
346
+ function snapshotContext(ctx) {
347
+ const elapsedMs = ctx.firstTimestamp && ctx._currentTimestamp
348
+ ? new Date(ctx._currentTimestamp).getTime() -
349
+ new Date(ctx.firstTimestamp).getTime()
350
+ : 0;
351
+ return {
352
+ eventIndex: ctx.eventIndex,
353
+ totalEvents: ctx.totalEvents,
354
+ cumulativeCostUsd: ctx.cumulativeCostUsd,
355
+ elapsedMs,
356
+ eventCounts: { ...ctx.eventCounts },
357
+ llmHistory: ctx.llmHistory.map((h) => ({ ...h, messages: [...h.messages] })),
358
+ toolResults: ctx.toolResults.map((t) => ({ ...t })),
359
+ pendingApprovals: ctx.pendingApprovals.map((a) => ({ ...a })),
360
+ errorCount: ctx.errorCount,
361
+ warnings: [...ctx.warnings],
362
+ };
363
+ }
364
+ function emptyContext(totalEvents) {
365
+ return {
366
+ eventIndex: 0,
367
+ totalEvents,
368
+ cumulativeCostUsd: 0,
369
+ elapsedMs: 0,
370
+ eventCounts: {},
371
+ llmHistory: [],
372
+ toolResults: [],
373
+ pendingApprovals: [],
374
+ errorCount: 0,
375
+ warnings: [],
376
+ };
377
+ }
378
+ // ─── Summary ───────────────────────────────────────────────
379
+ function emptySummary() {
380
+ return {
381
+ totalCost: 0,
382
+ totalDurationMs: 0,
383
+ totalLlmCalls: 0,
384
+ totalToolCalls: 0,
385
+ totalErrors: 0,
386
+ models: [],
387
+ tools: [],
388
+ };
389
+ }
390
+ function computeSummary(events) {
391
+ let totalCost = 0;
392
+ let totalLlmCalls = 0;
393
+ let totalToolCalls = 0;
394
+ let totalErrors = 0;
395
+ const models = new Set();
396
+ const tools = new Set();
397
+ for (const event of events) {
398
+ const p = event.payload;
399
+ switch (event.eventType) {
400
+ case 'llm_call': {
401
+ totalLlmCalls++;
402
+ const payload = p;
403
+ models.add(payload.model);
404
+ break;
405
+ }
406
+ case 'llm_response': {
407
+ const payload = p;
408
+ totalCost += payload.costUsd;
409
+ break;
410
+ }
411
+ case 'cost_tracked': {
412
+ const payload = p;
413
+ totalCost += payload.costUsd;
414
+ break;
415
+ }
416
+ case 'tool_call': {
417
+ totalToolCalls++;
418
+ const payload = p;
419
+ tools.add(payload.toolName);
420
+ break;
421
+ }
422
+ case 'tool_error':
423
+ totalErrors++;
424
+ break;
425
+ }
426
+ if (event.severity === 'error' && event.eventType !== 'tool_error') {
427
+ totalErrors++;
428
+ }
429
+ }
430
+ const totalDurationMs = events.length >= 2
431
+ ? new Date(events[events.length - 1].timestamp).getTime() -
432
+ new Date(events[0].timestamp).getTime()
433
+ : 0;
434
+ return {
435
+ totalCost,
436
+ totalDurationMs,
437
+ totalLlmCalls,
438
+ totalToolCalls,
439
+ totalErrors,
440
+ models: [...models],
441
+ tools: [...tools],
442
+ };
443
+ }
444
+ // ─── Redaction (Story 2.4) ─────────────────────────────────
445
+ const REDACTED = '[REDACTED]';
446
+ function redactMessages(messages) {
447
+ return messages.map((msg) => ({
448
+ ...msg,
449
+ content: REDACTED,
450
+ }));
451
+ }
452
+ /**
453
+ * Return a shallow copy of the event with redacted payload content
454
+ * if the event's payload has `redacted === true`.
455
+ * Metadata (model, tokens, cost, latency) is always preserved.
456
+ */
457
+ function maybeRedactEvent(event) {
458
+ const p = event.payload;
459
+ if (event.eventType === 'llm_call' && p.redacted) {
460
+ const payload = p;
461
+ return {
462
+ ...event,
463
+ payload: {
464
+ ...payload,
465
+ messages: redactMessages(payload.messages),
466
+ systemPrompt: payload.systemPrompt ? REDACTED : undefined,
467
+ },
468
+ };
469
+ }
470
+ if (event.eventType === 'llm_response' && p.redacted) {
471
+ const payload = p;
472
+ return {
473
+ ...event,
474
+ payload: {
475
+ ...payload,
476
+ completion: REDACTED,
477
+ },
478
+ };
479
+ }
480
+ return event;
481
+ }
482
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/lib/replay/builder.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  /**
2
- * Agent Endpoints (Story 4.7)
2
+ * Agent Endpoints (Story 4.7 + B1 — Story 1.2)
3
3
  *
4
- * GET /api/agents — list all agents (with error rate from sessions)
5
- * GET /api/agents/:id — single agent
4
+ * GET /api/agents — list all agents (with error rate from sessions)
5
+ * GET /api/agents/:id — single agent
6
+ * PUT /api/agents/:id/unpause — unpause an agent (clear paused_at, pause_reason, optionally model_override)
6
7
  */
7
8
  import { Hono } from 'hono';
8
9
  import type { IEventStore } from '@agentlensai/core';
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW;eACX,aAAa;0CAmChD"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW;eACX,aAAa;0CA4DhD"}
@@ -1,8 +1,9 @@
1
1
  /**
2
- * Agent Endpoints (Story 4.7)
2
+ * Agent Endpoints (Story 4.7 + B1 — Story 1.2)
3
3
  *
4
- * GET /api/agents — list all agents (with error rate from sessions)
5
- * GET /api/agents/:id — single agent
4
+ * GET /api/agents — list all agents (with error rate from sessions)
5
+ * GET /api/agents/:id — single agent
6
+ * PUT /api/agents/:id/unpause — unpause an agent (clear paused_at, pause_reason, optionally model_override)
6
7
  */
7
8
  import { Hono } from 'hono';
8
9
  import { getTenantStore } from './tenant-helper.js';
@@ -12,15 +13,39 @@ export function agentsRoutes(store) {
12
13
  app.get('/', async (c) => {
13
14
  const tenantStore = getTenantStore(store, c);
14
15
  const agents = await tenantStore.listAgents();
15
- // Enrich agents with error rate computed from their sessions
16
- const enriched = await Promise.all(agents.map(async (agent) => {
17
- const { sessions } = await tenantStore.querySessions({ agentId: agent.id, limit: 10000 });
18
- const totalErrors = sessions.reduce((sum, s) => sum + s.errorCount, 0);
19
- const totalEvents = sessions.reduce((sum, s) => sum + s.eventCount, 0);
20
- const errorRate = totalEvents > 0 ? totalErrors / totalEvents : 0;
21
- return { ...agent, errorRate };
22
- }));
23
- return c.json({ agents: enriched });
16
+ return c.json({ agents });
17
+ });
18
+ // PUT /api/agents/:id/unpause Unpause an agent (B1 Story 1.2)
19
+ app.put('/:id/unpause', async (c) => {
20
+ const tenantStore = getTenantStore(store, c);
21
+ const id = c.req.param('id');
22
+ // Verify agent exists (tenant-scoped)
23
+ const agent = await tenantStore.getAgent(id);
24
+ if (!agent) {
25
+ return c.json({ error: 'Agent not found', status: 404 }, 404);
26
+ }
27
+ // Parse optional body for clearModelOverride
28
+ let clearModelOverride = false;
29
+ try {
30
+ const body = await c.req.json().catch(() => ({}));
31
+ clearModelOverride = body?.clearModelOverride === true;
32
+ }
33
+ catch {
34
+ // No body or invalid JSON — that's fine
35
+ }
36
+ // Unpause by clearing pause fields
37
+ const updates = {
38
+ id,
39
+ pausedAt: undefined,
40
+ pauseReason: undefined,
41
+ };
42
+ if (clearModelOverride) {
43
+ updates.modelOverride = undefined;
44
+ }
45
+ await tenantStore.upsertAgent(updates);
46
+ // Return the updated agent
47
+ const updated = await tenantStore.getAgent(id);
48
+ return c.json(updated);
24
49
  });
25
50
  // GET /api/agents/:id — single agent
26
51
  app.get('/:id', async (c) => {
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC7C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAgC,CAAC;IAErD,8DAA8D;IAC9D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;QAE9C,6DAA6D;QAC7D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1F,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACvE,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACvE,MAAM,SAAS,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC;QACjC,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,qCAAqC;IACrC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC7C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAgC,CAAC;IAErD,8DAA8D;IAC9D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;QAE9C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7B,sCAAsC;QACtC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,6CAA6C;QAC7C,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,kBAAkB,GAAG,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;QAED,mCAAmC;QACnC,MAAM,OAAO,GAAgE;YAC3E,EAAE;YACF,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,SAAS;SACvB,CAAC;QACF,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;QACpC,CAAC;QACD,MAAM,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEvC,2BAA2B;QAC3B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,qCAAqC;IACrC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Benchmark REST Endpoints (Story 3.5)
3
+ *
4
+ * POST /api/benchmarks — Create benchmark
5
+ * GET /api/benchmarks — List benchmarks
6
+ * GET /api/benchmarks/:id — Get benchmark detail
7
+ * PUT /api/benchmarks/:id/status — Transition status
8
+ * GET /api/benchmarks/:id/results — Get comparison results
9
+ * DELETE /api/benchmarks/:id — Delete draft/cancelled
10
+ */
11
+ import { Hono } from 'hono';
12
+ import type { IEventStore } from '@agentlensai/core';
13
+ import type { AuthVariables } from '../middleware/auth.js';
14
+ import type { SqliteDb } from '../db/index.js';
15
+ export declare function benchmarkRoutes(store: IEventStore, db?: SqliteDb): Hono<{
16
+ Variables: AuthVariables;
17
+ }, import("hono/types").BlankSchema, "/">;
18
+ //# sourceMappingURL=benchmarks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmarks.d.ts","sourceRoot":"","sources":["../../src/routes/benchmarks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAoC,MAAM,mBAAmB,CAAC;AAEvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAQ3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAqF/C,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,QAAQ;eAC7B,aAAa;0CAqRhD"}