@agentlensai/server 0.2.0 → 0.5.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/db/embedding-store.d.ts +74 -0
- package/dist/db/embedding-store.d.ts.map +1 -0
- package/dist/db/embedding-store.js +177 -0
- package/dist/db/embedding-store.js.map +1 -0
- package/dist/db/lesson-store.d.ts +57 -0
- package/dist/db/lesson-store.d.ts.map +1 -0
- package/dist/db/lesson-store.js +217 -0
- package/dist/db/lesson-store.js.map +1 -0
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +250 -4
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.sqlite.d.ts +881 -55
- package/dist/db/schema.sqlite.d.ts.map +1 -1
- package/dist/db/schema.sqlite.js +82 -4
- package/dist/db/schema.sqlite.js.map +1 -1
- package/dist/db/session-summary-store.d.ts +45 -0
- package/dist/db/session-summary-store.d.ts.map +1 -0
- package/dist/db/session-summary-store.js +112 -0
- package/dist/db/session-summary-store.js.map +1 -0
- package/dist/db/sqlite-store.d.ts +25 -13
- package/dist/db/sqlite-store.d.ts.map +1 -1
- package/dist/db/sqlite-store.js +224 -47
- package/dist/db/sqlite-store.js.map +1 -1
- package/dist/db/tenant-scoped-store.d.ts +61 -0
- package/dist/db/tenant-scoped-store.d.ts.map +1 -0
- package/dist/db/tenant-scoped-store.js +94 -0
- package/dist/db/tenant-scoped-store.js.map +1 -0
- package/dist/index.d.ts +25 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +99 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/alert-engine.d.ts +72 -0
- package/dist/lib/alert-engine.d.ts.map +1 -0
- package/dist/lib/alert-engine.js +318 -0
- package/dist/lib/alert-engine.js.map +1 -0
- package/dist/lib/analysis/cost-analysis.d.ts +20 -0
- package/dist/lib/analysis/cost-analysis.d.ts.map +1 -0
- package/dist/lib/analysis/cost-analysis.js +158 -0
- package/dist/lib/analysis/cost-analysis.js.map +1 -0
- package/dist/lib/analysis/error-patterns.d.ts +26 -0
- package/dist/lib/analysis/error-patterns.d.ts.map +1 -0
- package/dist/lib/analysis/error-patterns.js +155 -0
- package/dist/lib/analysis/error-patterns.js.map +1 -0
- package/dist/lib/analysis/index.d.ts +23 -0
- package/dist/lib/analysis/index.d.ts.map +1 -0
- package/dist/lib/analysis/index.js +144 -0
- package/dist/lib/analysis/index.js.map +1 -0
- package/dist/lib/analysis/performance-trends.d.ts +19 -0
- package/dist/lib/analysis/performance-trends.d.ts.map +1 -0
- package/dist/lib/analysis/performance-trends.js +118 -0
- package/dist/lib/analysis/performance-trends.js.map +1 -0
- package/dist/lib/analysis/tool-sequences.d.ts +19 -0
- package/dist/lib/analysis/tool-sequences.d.ts.map +1 -0
- package/dist/lib/analysis/tool-sequences.js +145 -0
- package/dist/lib/analysis/tool-sequences.js.map +1 -0
- package/dist/lib/context/index.d.ts +5 -0
- package/dist/lib/context/index.d.ts.map +1 -0
- package/dist/lib/context/index.js +5 -0
- package/dist/lib/context/index.js.map +1 -0
- package/dist/lib/context/retrieval.d.ts +56 -0
- package/dist/lib/context/retrieval.d.ts.map +1 -0
- package/dist/lib/context/retrieval.js +229 -0
- package/dist/lib/context/retrieval.js.map +1 -0
- package/dist/lib/embeddings/index.d.ts +31 -0
- package/dist/lib/embeddings/index.d.ts.map +1 -0
- package/dist/lib/embeddings/index.js +31 -0
- package/dist/lib/embeddings/index.js.map +1 -0
- package/dist/lib/embeddings/local.d.ts +15 -0
- package/dist/lib/embeddings/local.d.ts.map +1 -0
- package/dist/lib/embeddings/local.js +65 -0
- package/dist/lib/embeddings/local.js.map +1 -0
- package/dist/lib/embeddings/math.d.ts +13 -0
- package/dist/lib/embeddings/math.d.ts.map +1 -0
- package/dist/lib/embeddings/math.js +35 -0
- package/dist/lib/embeddings/math.js.map +1 -0
- package/dist/lib/embeddings/openai.d.ts +15 -0
- package/dist/lib/embeddings/openai.d.ts.map +1 -0
- package/dist/lib/embeddings/openai.js +58 -0
- package/dist/lib/embeddings/openai.js.map +1 -0
- package/dist/lib/embeddings/summarizer.d.ts +26 -0
- package/dist/lib/embeddings/summarizer.d.ts.map +1 -0
- package/dist/lib/embeddings/summarizer.js +181 -0
- package/dist/lib/embeddings/summarizer.js.map +1 -0
- package/dist/lib/embeddings/types.d.ts +17 -0
- package/dist/lib/embeddings/types.d.ts.map +1 -0
- package/dist/lib/embeddings/types.js +5 -0
- package/dist/lib/embeddings/types.js.map +1 -0
- package/dist/lib/embeddings/worker.d.ts +56 -0
- package/dist/lib/embeddings/worker.d.ts.map +1 -0
- package/dist/lib/embeddings/worker.js +109 -0
- package/dist/lib/embeddings/worker.js.map +1 -0
- package/dist/lib/event-bus.d.ts +48 -0
- package/dist/lib/event-bus.d.ts.map +1 -0
- package/dist/lib/event-bus.js +34 -0
- package/dist/lib/event-bus.js.map +1 -0
- package/dist/lib/retention.d.ts +1 -1
- package/dist/lib/retention.d.ts.map +1 -1
- package/dist/lib/sse.d.ts +22 -0
- package/dist/lib/sse.d.ts.map +1 -0
- package/dist/lib/sse.js +121 -0
- package/dist/lib/sse.js.map +1 -0
- package/dist/middleware/auth.d.ts +1 -0
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +2 -1
- package/dist/middleware/auth.js.map +1 -1
- package/dist/routes/agents.d.ts +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +6 -3
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/alerts.d.ts +17 -0
- package/dist/routes/alerts.d.ts.map +1 -0
- package/dist/routes/alerts.js +141 -0
- package/dist/routes/alerts.js.map +1 -0
- package/dist/routes/analytics.d.ts +16 -0
- package/dist/routes/analytics.d.ts.map +1 -0
- package/dist/routes/analytics.js +307 -0
- package/dist/routes/analytics.js.map +1 -0
- package/dist/routes/api-keys.d.ts.map +1 -1
- package/dist/routes/api-keys.js +30 -5
- package/dist/routes/api-keys.js.map +1 -1
- package/dist/routes/config.d.ts +5 -0
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +27 -7
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/context.d.ts +23 -0
- package/dist/routes/context.d.ts.map +1 -0
- package/dist/routes/context.js +52 -0
- package/dist/routes/context.js.map +1 -0
- package/dist/routes/events.d.ts +7 -2
- package/dist/routes/events.d.ts.map +1 -1
- package/dist/routes/events.js +76 -8
- package/dist/routes/events.js.map +1 -1
- package/dist/routes/ingest.d.ts +36 -0
- package/dist/routes/ingest.d.ts.map +1 -0
- package/dist/routes/ingest.js +280 -0
- package/dist/routes/ingest.js.map +1 -0
- package/dist/routes/lessons.d.ts +19 -0
- package/dist/routes/lessons.d.ts.map +1 -0
- package/dist/routes/lessons.js +164 -0
- package/dist/routes/lessons.js.map +1 -0
- package/dist/routes/recall.d.ts +20 -0
- package/dist/routes/recall.d.ts.map +1 -0
- package/dist/routes/recall.js +71 -0
- package/dist/routes/recall.js.map +1 -0
- package/dist/routes/reflect.d.ts +15 -0
- package/dist/routes/reflect.d.ts.map +1 -0
- package/dist/routes/reflect.js +55 -0
- package/dist/routes/reflect.js.map +1 -0
- package/dist/routes/sessions.d.ts +1 -1
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +9 -7
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/stats.d.ts +1 -1
- package/dist/routes/stats.d.ts.map +1 -1
- package/dist/routes/stats.js +3 -1
- package/dist/routes/stats.js.map +1 -1
- package/dist/routes/stream.d.ts +23 -0
- package/dist/routes/stream.d.ts.map +1 -0
- package/dist/routes/stream.js +94 -0
- package/dist/routes/stream.js.map +1 -0
- package/dist/routes/tenant-helper.d.ts +20 -0
- package/dist/routes/tenant-helper.d.ts.map +1 -0
- package/dist/routes/tenant-helper.js +23 -0
- package/dist/routes/tenant-helper.js.map +1 -0
- package/package.json +11 -11
- package/LICENSE +0 -21
- package/dist/__tests__/agents-stats.test.d.ts +0 -5
- package/dist/__tests__/agents-stats.test.d.ts.map +0 -1
- package/dist/__tests__/agents-stats.test.js +0 -134
- package/dist/__tests__/agents-stats.test.js.map +0 -1
- package/dist/__tests__/api-keys.test.d.ts +0 -5
- package/dist/__tests__/api-keys.test.d.ts.map +0 -1
- package/dist/__tests__/api-keys.test.js +0 -118
- package/dist/__tests__/api-keys.test.js.map +0 -1
- package/dist/__tests__/auth-no-db.test.d.ts +0 -2
- package/dist/__tests__/auth-no-db.test.d.ts.map +0 -1
- package/dist/__tests__/auth-no-db.test.js +0 -43
- package/dist/__tests__/auth-no-db.test.js.map +0 -1
- package/dist/__tests__/auth.test.d.ts +0 -5
- package/dist/__tests__/auth.test.d.ts.map +0 -1
- package/dist/__tests__/auth.test.js +0 -86
- package/dist/__tests__/auth.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -37
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/events-ingest.test.d.ts +0 -5
- package/dist/__tests__/events-ingest.test.d.ts.map +0 -1
- package/dist/__tests__/events-ingest.test.js +0 -248
- package/dist/__tests__/events-ingest.test.js.map +0 -1
- package/dist/__tests__/events-query.test.d.ts +0 -5
- package/dist/__tests__/events-query.test.d.ts.map +0 -1
- package/dist/__tests__/events-query.test.js +0 -205
- package/dist/__tests__/events-query.test.js.map +0 -1
- package/dist/__tests__/health.test.d.ts +0 -5
- package/dist/__tests__/health.test.d.ts.map +0 -1
- package/dist/__tests__/health.test.js +0 -40
- package/dist/__tests__/health.test.js.map +0 -1
- package/dist/__tests__/sessions.test.d.ts +0 -5
- package/dist/__tests__/sessions.test.d.ts.map +0 -1
- package/dist/__tests__/sessions.test.js +0 -176
- package/dist/__tests__/sessions.test.js.map +0 -1
- package/dist/__tests__/test-helpers.d.ts +0 -24
- package/dist/__tests__/test-helpers.d.ts.map +0 -1
- package/dist/__tests__/test-helpers.js +0 -45
- package/dist/__tests__/test-helpers.js.map +0 -1
- package/dist/db/__tests__/init.test.d.ts +0 -2
- package/dist/db/__tests__/init.test.d.ts.map +0 -1
- package/dist/db/__tests__/init.test.js +0 -73
- package/dist/db/__tests__/init.test.js.map +0 -1
- package/dist/db/__tests__/sqlite-store-read.test.d.ts +0 -2
- package/dist/db/__tests__/sqlite-store-read.test.d.ts.map +0 -1
- package/dist/db/__tests__/sqlite-store-read.test.js +0 -749
- package/dist/db/__tests__/sqlite-store-read.test.js.map +0 -1
- package/dist/db/__tests__/sqlite-store-write.test.d.ts +0 -2
- package/dist/db/__tests__/sqlite-store-write.test.d.ts.map +0 -1
- package/dist/db/__tests__/sqlite-store-write.test.js +0 -418
- package/dist/db/__tests__/sqlite-store-write.test.js.map +0 -1
- package/dist/lib/__tests__/retention.test.d.ts +0 -2
- package/dist/lib/__tests__/retention.test.d.ts.map +0 -1
- package/dist/lib/__tests__/retention.test.js +0 -238
- package/dist/lib/__tests__/retention.test.js.map +0 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process EventBus for real-time notifications (Story 12.5, Epic 14 — Arch §11.1)
|
|
3
|
+
*
|
|
4
|
+
* Typed EventEmitter for decoupled communication between
|
|
5
|
+
* server components. Consumed by SSE endpoint (Epic 14) and Alert Engine (Epic 12).
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'node:events';
|
|
8
|
+
/**
|
|
9
|
+
* Typed event bus for internal server communication.
|
|
10
|
+
* Wraps Node.js EventEmitter with type safety.
|
|
11
|
+
*/
|
|
12
|
+
class EventBus {
|
|
13
|
+
emitter = new EventEmitter();
|
|
14
|
+
constructor() {
|
|
15
|
+
// Allow many SSE clients
|
|
16
|
+
this.emitter.setMaxListeners(1000);
|
|
17
|
+
}
|
|
18
|
+
emit(event) {
|
|
19
|
+
this.emitter.emit(event.type, event);
|
|
20
|
+
this.emitter.emit('*', event); // wildcard for "all events"
|
|
21
|
+
}
|
|
22
|
+
on(type, listener) {
|
|
23
|
+
this.emitter.on(type, listener);
|
|
24
|
+
}
|
|
25
|
+
off(type, listener) {
|
|
26
|
+
this.emitter.off(type, listener);
|
|
27
|
+
}
|
|
28
|
+
removeAllListeners() {
|
|
29
|
+
this.emitter.removeAllListeners();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Singleton event bus instance */
|
|
33
|
+
export const eventBus = new EventBus();
|
|
34
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/lib/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAuC3C;;;GAGG;AACH,MAAM,QAAQ;IACJ,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IAErC;QACE,yBAAyB;QACzB,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,CAAC,KAAe;QAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,4BAA4B;IAC7D,CAAC;IAED,EAAE,CAAC,IAA4B,EAAE,QAAmC;QAClE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAAC,IAA4B,EAAE,QAAmC;QACnE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;IACpC,CAAC;CACF;AAED,mCAAmC;AACnC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC"}
|
package/dist/lib/retention.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* This is the ONE exception to the "no DELETE on events" rule —
|
|
8
8
|
* retention cleanup is the audited, authorized path for event deletion.
|
|
9
9
|
*/
|
|
10
|
-
import type { IEventStore } from '@
|
|
10
|
+
import type { IEventStore } from '@agentlensai/core';
|
|
11
11
|
export interface RetentionPolicy {
|
|
12
12
|
/** Keep events for this many days (0 = keep forever) */
|
|
13
13
|
retentionDays: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../src/lib/retention.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../src/lib/retention.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,aAAa,EAAE,MAAM,CAAC;CACvB;AAID;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CASpD;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAoBrD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE Connection Manager (Story 14.1, Arch §11.3)
|
|
3
|
+
*
|
|
4
|
+
* Creates a ReadableStream that:
|
|
5
|
+
* - Subscribes to EventBus with optional filters
|
|
6
|
+
* - Sends heartbeat every 30s
|
|
7
|
+
* - Cleans up on client disconnect
|
|
8
|
+
*/
|
|
9
|
+
export interface SSEFilters {
|
|
10
|
+
sessionId?: string;
|
|
11
|
+
agentId?: string;
|
|
12
|
+
eventTypes?: string[];
|
|
13
|
+
tenantId?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a ReadableStream for SSE that subscribes to the EventBus.
|
|
17
|
+
*
|
|
18
|
+
* @param filters — optional filters for sessionId, agentId, eventTypes
|
|
19
|
+
* @param signal — AbortSignal from the request for disconnect cleanup
|
|
20
|
+
*/
|
|
21
|
+
export declare function createSSEStream(filters: SSEFilters, signal: AbortSignal): ReadableStream<Uint8Array>;
|
|
22
|
+
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/lib/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA6BD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,WAAW,GAClB,cAAc,CAAC,UAAU,CAAC,CAgF5B"}
|
package/dist/lib/sse.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE Connection Manager (Story 14.1, Arch §11.3)
|
|
3
|
+
*
|
|
4
|
+
* Creates a ReadableStream that:
|
|
5
|
+
* - Subscribes to EventBus with optional filters
|
|
6
|
+
* - Sends heartbeat every 30s
|
|
7
|
+
* - Cleans up on client disconnect
|
|
8
|
+
*/
|
|
9
|
+
import { eventBus } from './event-bus.js';
|
|
10
|
+
/** Default heartbeat interval in ms */
|
|
11
|
+
const HEARTBEAT_INTERVAL_MS = 30_000;
|
|
12
|
+
/**
|
|
13
|
+
* Format an SSE message (event: type\ndata: json\n\n)
|
|
14
|
+
*/
|
|
15
|
+
function formatSSE(eventName, data) {
|
|
16
|
+
return `event: ${eventName}\ndata: ${JSON.stringify(data)}\n\n`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if an ingested event matches the SSE filters.
|
|
20
|
+
*/
|
|
21
|
+
function matchesFilters(event, filters) {
|
|
22
|
+
if (filters.tenantId && event.tenantId !== filters.tenantId)
|
|
23
|
+
return false;
|
|
24
|
+
if (filters.sessionId && event.sessionId !== filters.sessionId)
|
|
25
|
+
return false;
|
|
26
|
+
if (filters.agentId && event.agentId !== filters.agentId)
|
|
27
|
+
return false;
|
|
28
|
+
if (filters.eventTypes &&
|
|
29
|
+
filters.eventTypes.length > 0 &&
|
|
30
|
+
!filters.eventTypes.includes(event.eventType)) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create a ReadableStream for SSE that subscribes to the EventBus.
|
|
37
|
+
*
|
|
38
|
+
* @param filters — optional filters for sessionId, agentId, eventTypes
|
|
39
|
+
* @param signal — AbortSignal from the request for disconnect cleanup
|
|
40
|
+
*/
|
|
41
|
+
export function createSSEStream(filters, signal) {
|
|
42
|
+
const encoder = new TextEncoder();
|
|
43
|
+
return new ReadableStream({
|
|
44
|
+
start(controller) {
|
|
45
|
+
const send = (eventName, data) => {
|
|
46
|
+
try {
|
|
47
|
+
controller.enqueue(encoder.encode(formatSSE(eventName, data)));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Controller may be closed if client disconnected
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
// Send initial heartbeat so client knows connection is alive
|
|
54
|
+
send('heartbeat', { time: new Date().toISOString() });
|
|
55
|
+
// Heartbeat every 30s to keep connection alive
|
|
56
|
+
const heartbeatTimer = setInterval(() => {
|
|
57
|
+
send('heartbeat', { time: new Date().toISOString() });
|
|
58
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
59
|
+
// Handler for all bus events
|
|
60
|
+
const handler = (busEvent) => {
|
|
61
|
+
switch (busEvent.type) {
|
|
62
|
+
case 'event_ingested': {
|
|
63
|
+
const ev = busEvent.event;
|
|
64
|
+
if (matchesFilters(ev, filters)) {
|
|
65
|
+
send('event', ev);
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
case 'session_updated': {
|
|
70
|
+
const session = busEvent.session;
|
|
71
|
+
// Session updates are sent if:
|
|
72
|
+
// - Matching tenantId (if filtered)
|
|
73
|
+
// - No sessionId filter, or matching sessionId
|
|
74
|
+
// - No agentId filter, or matching agentId
|
|
75
|
+
if (filters.tenantId && session.tenantId !== filters.tenantId)
|
|
76
|
+
break;
|
|
77
|
+
if (filters.sessionId && session.id !== filters.sessionId)
|
|
78
|
+
break;
|
|
79
|
+
if (filters.agentId && session.agentId !== filters.agentId)
|
|
80
|
+
break;
|
|
81
|
+
send('session_update', session);
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case 'alert_triggered': {
|
|
85
|
+
const alert = busEvent;
|
|
86
|
+
// Alerts are tenant-scoped if filter is set
|
|
87
|
+
if (filters.tenantId && alert.rule.tenantId !== filters.tenantId)
|
|
88
|
+
break;
|
|
89
|
+
send('alert', {
|
|
90
|
+
ruleId: alert.rule.id,
|
|
91
|
+
name: alert.rule.name,
|
|
92
|
+
currentValue: alert.history.currentValue,
|
|
93
|
+
threshold: alert.history.threshold,
|
|
94
|
+
message: alert.history.message,
|
|
95
|
+
triggeredAt: alert.history.triggeredAt,
|
|
96
|
+
});
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
// alert_resolved is informational, not critical for SSE
|
|
100
|
+
default:
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
// Subscribe to all bus events
|
|
105
|
+
eventBus.on('*', handler);
|
|
106
|
+
// Cleanup on client disconnect
|
|
107
|
+
const cleanup = () => {
|
|
108
|
+
clearInterval(heartbeatTimer);
|
|
109
|
+
eventBus.off('*', handler);
|
|
110
|
+
try {
|
|
111
|
+
controller.close();
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Already closed
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
signal.addEventListener('abort', cleanup, { once: true });
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/lib/sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO;eAC3B,aAAa;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO;eAC3B,aAAa;yBA2DnD"}
|
package/dist/middleware/auth.js
CHANGED
|
@@ -26,7 +26,7 @@ export function authMiddleware(db, authDisabled) {
|
|
|
26
26
|
return createMiddleware(async (c, next) => {
|
|
27
27
|
// Dev mode: skip auth
|
|
28
28
|
if (authDisabled) {
|
|
29
|
-
c.set('apiKey', { id: 'dev', name: 'dev-mode', scopes: ['*'] });
|
|
29
|
+
c.set('apiKey', { id: 'dev', name: 'dev-mode', scopes: ['*'], tenantId: 'default' });
|
|
30
30
|
return next();
|
|
31
31
|
}
|
|
32
32
|
const authHeader = c.req.header('Authorization');
|
|
@@ -71,6 +71,7 @@ export function authMiddleware(db, authDisabled) {
|
|
|
71
71
|
id: row.id,
|
|
72
72
|
name: row.name,
|
|
73
73
|
scopes,
|
|
74
|
+
tenantId: row.tenantId,
|
|
74
75
|
});
|
|
75
76
|
return next();
|
|
76
77
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAmB9C;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,EAAY,EAAE,YAAqB;IAChE,OAAO,gBAAgB,CAA+B,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACtE,sBAAsB;QACtB,IAAI,YAAY,EAAE,CAAC;YACjB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YACrF,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+DAA+D,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9G,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACzB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAEnC,wCAAwC;QACxC,MAAM,GAAG,GAAG,EAAE;aACX,MAAM,EAAE;aACR,IAAI,CAAC,OAAO,CAAC;aACb,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;aACnE,GAAG,EAAE,CAAC;QAET,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3E,CAAC;QAED,oCAAoC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;iBACf,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;iBACxB,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;iBAC7B,GAAG,EAAE,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;QAED,MAAM,MAAM,GAAa,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAa,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;YACd,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM;YACN,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC,CAAC;QAEH,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/routes/agents.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* GET /api/agents/:id — single agent
|
|
6
6
|
*/
|
|
7
7
|
import { Hono } from 'hono';
|
|
8
|
-
import type { IEventStore } from '@
|
|
8
|
+
import type { IEventStore } from '@agentlensai/core';
|
|
9
9
|
import type { AuthVariables } from '../middleware/auth.js';
|
|
10
10
|
export declare function agentsRoutes(store: IEventStore): Hono<{
|
|
11
11
|
Variables: AuthVariables;
|
|
@@ -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,
|
|
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"}
|
package/dist/routes/agents.js
CHANGED
|
@@ -5,14 +5,16 @@
|
|
|
5
5
|
* GET /api/agents/:id — single agent
|
|
6
6
|
*/
|
|
7
7
|
import { Hono } from 'hono';
|
|
8
|
+
import { getTenantStore } from './tenant-helper.js';
|
|
8
9
|
export function agentsRoutes(store) {
|
|
9
10
|
const app = new Hono();
|
|
10
11
|
// GET /api/agents — list all agents with computed error rates
|
|
11
12
|
app.get('/', async (c) => {
|
|
12
|
-
const
|
|
13
|
+
const tenantStore = getTenantStore(store, c);
|
|
14
|
+
const agents = await tenantStore.listAgents();
|
|
13
15
|
// Enrich agents with error rate computed from their sessions
|
|
14
16
|
const enriched = await Promise.all(agents.map(async (agent) => {
|
|
15
|
-
const { sessions } = await
|
|
17
|
+
const { sessions } = await tenantStore.querySessions({ agentId: agent.id, limit: 10000 });
|
|
16
18
|
const totalErrors = sessions.reduce((sum, s) => sum + s.errorCount, 0);
|
|
17
19
|
const totalEvents = sessions.reduce((sum, s) => sum + s.eventCount, 0);
|
|
18
20
|
const errorRate = totalEvents > 0 ? totalErrors / totalEvents : 0;
|
|
@@ -22,8 +24,9 @@ export function agentsRoutes(store) {
|
|
|
22
24
|
});
|
|
23
25
|
// GET /api/agents/:id — single agent
|
|
24
26
|
app.get('/:id', async (c) => {
|
|
27
|
+
const tenantStore = getTenantStore(store, c);
|
|
25
28
|
const id = c.req.param('id');
|
|
26
|
-
const agent = await
|
|
29
|
+
const agent = await tenantStore.getAgent(id);
|
|
27
30
|
if (!agent) {
|
|
28
31
|
return c.json({ error: 'Agent not found', status: 404 }, 404);
|
|
29
32
|
}
|
|
@@ -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;
|
|
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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alert Endpoints (Story 12.1)
|
|
3
|
+
*
|
|
4
|
+
* POST /api/alerts/rules — create alert rule
|
|
5
|
+
* GET /api/alerts/rules — list alert rules
|
|
6
|
+
* GET /api/alerts/rules/:id — get single alert rule
|
|
7
|
+
* PUT /api/alerts/rules/:id — update alert rule
|
|
8
|
+
* DELETE /api/alerts/rules/:id — delete alert rule
|
|
9
|
+
* GET /api/alerts/history — list alert history
|
|
10
|
+
*/
|
|
11
|
+
import { Hono } from 'hono';
|
|
12
|
+
import type { IEventStore } from '@agentlensai/core';
|
|
13
|
+
import type { AuthVariables } from '../middleware/auth.js';
|
|
14
|
+
export declare function alertsRoutes(store: IEventStore): Hono<{
|
|
15
|
+
Variables: AuthVariables;
|
|
16
|
+
}, import("hono/types").BlankSchema, "/">;
|
|
17
|
+
//# sourceMappingURL=alerts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW;eACX,aAAa;0CAsJhD"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alert Endpoints (Story 12.1)
|
|
3
|
+
*
|
|
4
|
+
* POST /api/alerts/rules — create alert rule
|
|
5
|
+
* GET /api/alerts/rules — list alert rules
|
|
6
|
+
* GET /api/alerts/rules/:id — get single alert rule
|
|
7
|
+
* PUT /api/alerts/rules/:id — update alert rule
|
|
8
|
+
* DELETE /api/alerts/rules/:id — delete alert rule
|
|
9
|
+
* GET /api/alerts/history — list alert history
|
|
10
|
+
*/
|
|
11
|
+
import { Hono } from 'hono';
|
|
12
|
+
import { ulid } from 'ulid';
|
|
13
|
+
import { createAlertRuleSchema, updateAlertRuleSchema } from '@agentlensai/core';
|
|
14
|
+
import { NotFoundError } from '../db/errors.js';
|
|
15
|
+
import { getTenantStore } from './tenant-helper.js';
|
|
16
|
+
export function alertsRoutes(store) {
|
|
17
|
+
const app = new Hono();
|
|
18
|
+
// POST /api/alerts/rules — create alert rule
|
|
19
|
+
app.post('/rules', async (c) => {
|
|
20
|
+
const tenantStore = getTenantStore(store, c);
|
|
21
|
+
const rawBody = await c.req.json().catch(() => null);
|
|
22
|
+
if (!rawBody) {
|
|
23
|
+
return c.json({ error: 'Invalid JSON body', status: 400 }, 400);
|
|
24
|
+
}
|
|
25
|
+
const parseResult = createAlertRuleSchema.safeParse(rawBody);
|
|
26
|
+
if (!parseResult.success) {
|
|
27
|
+
return c.json({
|
|
28
|
+
error: 'Validation failed',
|
|
29
|
+
status: 400,
|
|
30
|
+
details: parseResult.error.issues.map((issue) => ({
|
|
31
|
+
path: issue.path.join('.'),
|
|
32
|
+
message: issue.message,
|
|
33
|
+
})),
|
|
34
|
+
}, 400);
|
|
35
|
+
}
|
|
36
|
+
const input = parseResult.data;
|
|
37
|
+
const now = new Date().toISOString();
|
|
38
|
+
const rule = {
|
|
39
|
+
id: ulid(),
|
|
40
|
+
name: input.name,
|
|
41
|
+
enabled: input.enabled,
|
|
42
|
+
condition: input.condition,
|
|
43
|
+
threshold: input.threshold,
|
|
44
|
+
windowMinutes: input.windowMinutes,
|
|
45
|
+
scope: input.scope,
|
|
46
|
+
notifyChannels: input.notifyChannels,
|
|
47
|
+
createdAt: now,
|
|
48
|
+
updatedAt: now,
|
|
49
|
+
tenantId: 'default',
|
|
50
|
+
};
|
|
51
|
+
await tenantStore.createAlertRule(rule);
|
|
52
|
+
return c.json(rule, 201);
|
|
53
|
+
});
|
|
54
|
+
// GET /api/alerts/rules — list all alert rules
|
|
55
|
+
app.get('/rules', async (c) => {
|
|
56
|
+
const tenantStore = getTenantStore(store, c);
|
|
57
|
+
const rules = await tenantStore.listAlertRules();
|
|
58
|
+
return c.json({ rules });
|
|
59
|
+
});
|
|
60
|
+
// GET /api/alerts/rules/:id — get single alert rule
|
|
61
|
+
app.get('/rules/:id', async (c) => {
|
|
62
|
+
const tenantStore = getTenantStore(store, c);
|
|
63
|
+
const id = c.req.param('id');
|
|
64
|
+
const rule = await tenantStore.getAlertRule(id);
|
|
65
|
+
if (!rule) {
|
|
66
|
+
return c.json({ error: 'Alert rule not found', status: 404 }, 404);
|
|
67
|
+
}
|
|
68
|
+
return c.json(rule);
|
|
69
|
+
});
|
|
70
|
+
// PUT /api/alerts/rules/:id — update alert rule
|
|
71
|
+
app.put('/rules/:id', async (c) => {
|
|
72
|
+
const tenantStore = getTenantStore(store, c);
|
|
73
|
+
const id = c.req.param('id');
|
|
74
|
+
const rawBody = await c.req.json().catch(() => null);
|
|
75
|
+
if (!rawBody) {
|
|
76
|
+
return c.json({ error: 'Invalid JSON body', status: 400 }, 400);
|
|
77
|
+
}
|
|
78
|
+
const parseResult = updateAlertRuleSchema.safeParse(rawBody);
|
|
79
|
+
if (!parseResult.success) {
|
|
80
|
+
return c.json({
|
|
81
|
+
error: 'Validation failed',
|
|
82
|
+
status: 400,
|
|
83
|
+
details: parseResult.error.issues.map((issue) => ({
|
|
84
|
+
path: issue.path.join('.'),
|
|
85
|
+
message: issue.message,
|
|
86
|
+
})),
|
|
87
|
+
}, 400);
|
|
88
|
+
}
|
|
89
|
+
const updates = parseResult.data;
|
|
90
|
+
try {
|
|
91
|
+
await tenantStore.updateAlertRule(id, {
|
|
92
|
+
...updates,
|
|
93
|
+
updatedAt: new Date().toISOString(),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
if (err instanceof NotFoundError) {
|
|
98
|
+
return c.json({ error: 'Alert rule not found', status: 404 }, 404);
|
|
99
|
+
}
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
const updated = await tenantStore.getAlertRule(id);
|
|
103
|
+
return c.json(updated);
|
|
104
|
+
});
|
|
105
|
+
// DELETE /api/alerts/rules/:id — delete alert rule
|
|
106
|
+
app.delete('/rules/:id', async (c) => {
|
|
107
|
+
const tenantStore = getTenantStore(store, c);
|
|
108
|
+
const id = c.req.param('id');
|
|
109
|
+
try {
|
|
110
|
+
await tenantStore.deleteAlertRule(id);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
if (err instanceof NotFoundError) {
|
|
114
|
+
return c.json({ error: 'Alert rule not found', status: 404 }, 404);
|
|
115
|
+
}
|
|
116
|
+
throw err;
|
|
117
|
+
}
|
|
118
|
+
return c.json({ id, deleted: true });
|
|
119
|
+
});
|
|
120
|
+
// GET /api/alerts/history — list alert history
|
|
121
|
+
app.get('/history', async (c) => {
|
|
122
|
+
const tenantStore = getTenantStore(store, c);
|
|
123
|
+
const ruleId = c.req.query('ruleId');
|
|
124
|
+
const limitStr = c.req.query('limit');
|
|
125
|
+
const offsetStr = c.req.query('offset');
|
|
126
|
+
const limit = limitStr ? Math.max(1, Math.min(parseInt(limitStr, 10) || 50, 500)) : 50;
|
|
127
|
+
const offset = offsetStr ? Math.max(0, parseInt(offsetStr, 10) || 0) : 0;
|
|
128
|
+
const result = await tenantStore.listAlertHistory({
|
|
129
|
+
ruleId: ruleId ?? undefined,
|
|
130
|
+
limit,
|
|
131
|
+
offset,
|
|
132
|
+
});
|
|
133
|
+
return c.json({
|
|
134
|
+
entries: result.entries,
|
|
135
|
+
total: result.total,
|
|
136
|
+
hasMore: offset + result.entries.length < result.total,
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
return app;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=alerts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Endpoints (Story 11.2)
|
|
3
|
+
*
|
|
4
|
+
* GET /api/analytics — bucketed metrics over time
|
|
5
|
+
* GET /api/analytics/costs — cost breakdown by agent and time period
|
|
6
|
+
* GET /api/analytics/agents — per-agent metrics (session count, error rate, avg duration, total cost)
|
|
7
|
+
* GET /api/analytics/tools — tool usage statistics (frequency, avg duration, error rate per tool)
|
|
8
|
+
*/
|
|
9
|
+
import { Hono } from 'hono';
|
|
10
|
+
import type { IEventStore } from '@agentlensai/core';
|
|
11
|
+
import type { AuthVariables } from '../middleware/auth.js';
|
|
12
|
+
import type { SqliteDb } from '../db/index.js';
|
|
13
|
+
export declare function analyticsRoutes(store: IEventStore, db: SqliteDb): Hono<{
|
|
14
|
+
Variables: AuthVariables;
|
|
15
|
+
}, import("hono/types").BlankSchema, "/">;
|
|
16
|
+
//# sourceMappingURL=analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ;eAC5B,aAAa;0CAoYhD"}
|