@agentlensai/server 0.3.0 → 0.6.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/health-snapshot-store.d.ts +33 -0
- package/dist/db/health-snapshot-store.d.ts.map +1 -0
- package/dist/db/health-snapshot-store.js +112 -0
- package/dist/db/health-snapshot-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 +256 -8
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.sqlite.d.ts +822 -47
- package/dist/db/schema.sqlite.d.ts.map +1 -1
- package/dist/db/schema.sqlite.js +79 -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 +19 -12
- package/dist/db/sqlite-store.d.ts.map +1 -1
- package/dist/db/sqlite-store.js +145 -44
- 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 +18 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/alert-engine.d.ts +11 -0
- package/dist/lib/alert-engine.d.ts.map +1 -1
- package/dist/lib/alert-engine.js +65 -24
- package/dist/lib/alert-engine.js.map +1 -1
- 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 +161 -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 +158 -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 +121 -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 +148 -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 +60 -0
- package/dist/lib/context/retrieval.d.ts.map +1 -0
- package/dist/lib/context/retrieval.js +233 -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/health/computer.d.ts +28 -0
- package/dist/lib/health/computer.d.ts.map +1 -0
- package/dist/lib/health/computer.js +270 -0
- package/dist/lib/health/computer.js.map +1 -0
- package/dist/lib/optimization/classifier.d.ts +34 -0
- package/dist/lib/optimization/classifier.d.ts.map +1 -0
- package/dist/lib/optimization/classifier.js +108 -0
- package/dist/lib/optimization/classifier.js.map +1 -0
- package/dist/lib/optimization/engine.d.ts +24 -0
- package/dist/lib/optimization/engine.d.ts.map +1 -0
- package/dist/lib/optimization/engine.js +202 -0
- package/dist/lib/optimization/engine.js.map +1 -0
- package/dist/lib/optimization/index.d.ts +10 -0
- package/dist/lib/optimization/index.d.ts.map +1 -0
- package/dist/lib/optimization/index.js +9 -0
- package/dist/lib/optimization/index.js.map +1 -0
- package/dist/lib/sse.d.ts +1 -0
- package/dist/lib/sse.d.ts.map +1 -1
- package/dist/lib/sse.js +8 -1
- package/dist/lib/sse.js.map +1 -1
- 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.map +1 -1
- package/dist/routes/agents.js +6 -3
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/alerts.d.ts.map +1 -1
- package/dist/routes/alerts.js +15 -7
- package/dist/routes/alerts.js.map +1 -1
- package/dist/routes/analytics.d.ts.map +1 -1
- package/dist/routes/analytics.js +16 -2
- package/dist/routes/analytics.js.map +1 -1
- 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/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 +6 -1
- package/dist/routes/events.d.ts.map +1 -1
- package/dist/routes/events.js +61 -6
- package/dist/routes/events.js.map +1 -1
- package/dist/routes/health.d.ts +21 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +142 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/ingest.d.ts +6 -0
- package/dist/routes/ingest.d.ts.map +1 -1
- package/dist/routes/ingest.js +23 -4
- package/dist/routes/ingest.js.map +1 -1
- 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/optimize.d.ts +15 -0
- package/dist/routes/optimize.d.ts.map +1 -0
- package/dist/routes/optimize.js +55 -0
- package/dist/routes/optimize.js.map +1 -0
- package/dist/routes/recall.d.ts +22 -0
- package/dist/routes/recall.d.ts.map +1 -0
- package/dist/routes/recall.js +91 -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 +54 -0
- package/dist/routes/reflect.js.map +1 -0
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +8 -6
- package/dist/routes/sessions.js.map +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 +9 -2
- package/dist/routes/stream.d.ts.map +1 -1
- package/dist/routes/stream.js +55 -2
- package/dist/routes/stream.js.map +1 -1
- 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 +35 -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__/alerts.test.d.ts +0 -5
- package/dist/__tests__/alerts.test.d.ts.map +0 -1
- package/dist/__tests__/alerts.test.js +0 -245
- package/dist/__tests__/alerts.test.js.map +0 -1
- package/dist/__tests__/analytics.test.d.ts +0 -5
- package/dist/__tests__/analytics.test.d.ts.map +0 -1
- package/dist/__tests__/analytics.test.js +0 -218
- package/dist/__tests__/analytics.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__/ingest.test.d.ts +0 -8
- package/dist/__tests__/ingest.test.d.ts.map +0 -1
- package/dist/__tests__/ingest.test.js +0 -469
- package/dist/__tests__/ingest.test.js.map +0 -1
- package/dist/__tests__/llm-tracking.test.d.ts +0 -10
- package/dist/__tests__/llm-tracking.test.d.ts.map +0 -1
- package/dist/__tests__/llm-tracking.test.js +0 -602
- package/dist/__tests__/llm-tracking.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__/stream.test.d.ts +0 -5
- package/dist/__tests__/stream.test.d.ts.map +0 -1
- package/dist/__tests__/stream.test.js +0 -352
- package/dist/__tests__/stream.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__/alert-engine.test.d.ts +0 -5
- package/dist/lib/__tests__/alert-engine.test.d.ts.map +0 -1
- package/dist/lib/__tests__/alert-engine.test.js +0 -211
- package/dist/lib/__tests__/alert-engine.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,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event & Session Summarizer (Story 2.3)
|
|
3
|
+
*
|
|
4
|
+
* Produces concise text summaries suitable for embedding.
|
|
5
|
+
* - summarizeEvent(): returns embedding text for events worth embedding, or null to skip
|
|
6
|
+
* - summarizeSession(): produces a heuristic session summary
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Truncate a string to `maxLen` characters, adding "…" if truncated.
|
|
10
|
+
*/
|
|
11
|
+
function truncate(text, maxLen) {
|
|
12
|
+
if (text.length <= maxLen)
|
|
13
|
+
return text;
|
|
14
|
+
return text.slice(0, maxLen) + '…';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Safely extract a string from an unknown value, with fallback.
|
|
18
|
+
*/
|
|
19
|
+
function safeString(value, fallback = '') {
|
|
20
|
+
if (typeof value === 'string')
|
|
21
|
+
return value;
|
|
22
|
+
if (value == null)
|
|
23
|
+
return fallback;
|
|
24
|
+
try {
|
|
25
|
+
return JSON.stringify(value);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return fallback;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Summarize a single event into text suitable for embedding.
|
|
33
|
+
* Returns null if the event should be skipped (not worth embedding).
|
|
34
|
+
*/
|
|
35
|
+
export function summarizeEvent(event) {
|
|
36
|
+
const payload = event.payload;
|
|
37
|
+
switch (event.eventType) {
|
|
38
|
+
case 'tool_error': {
|
|
39
|
+
const p = payload;
|
|
40
|
+
const toolName = safeString(p.toolName, 'unknown');
|
|
41
|
+
const error = safeString(p.error, 'unknown error');
|
|
42
|
+
return `tool_error: ${toolName} - ${truncate(error, 300)}`;
|
|
43
|
+
}
|
|
44
|
+
case 'tool_call': {
|
|
45
|
+
const p = payload;
|
|
46
|
+
const toolName = safeString(p.toolName, 'unknown');
|
|
47
|
+
const args = truncate(safeString(p.arguments, '{}'), 200);
|
|
48
|
+
return `tool_call: ${toolName}(${args})`;
|
|
49
|
+
}
|
|
50
|
+
case 'llm_call': {
|
|
51
|
+
const p = payload;
|
|
52
|
+
const model = safeString(p.model, 'unknown');
|
|
53
|
+
// Find the first user message
|
|
54
|
+
let userMsg = '';
|
|
55
|
+
if (Array.isArray(p.messages)) {
|
|
56
|
+
const userMessage = p.messages.find((m) => m.role === 'user');
|
|
57
|
+
if (userMessage) {
|
|
58
|
+
const content = userMessage.content;
|
|
59
|
+
if (typeof content === 'string') {
|
|
60
|
+
userMsg = content;
|
|
61
|
+
}
|
|
62
|
+
else if (Array.isArray(content)) {
|
|
63
|
+
const textPart = content.find((c) => c.type === 'text');
|
|
64
|
+
userMsg = textPart?.text ?? '';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return `llm_call: ${model} - ${truncate(userMsg, 200)}`;
|
|
69
|
+
}
|
|
70
|
+
case 'llm_response': {
|
|
71
|
+
const p = payload;
|
|
72
|
+
const model = safeString(p.model, 'unknown');
|
|
73
|
+
const completion = safeString(p.completion, '');
|
|
74
|
+
return `llm_response: ${model} - ${truncate(completion, 200)}`;
|
|
75
|
+
}
|
|
76
|
+
default: {
|
|
77
|
+
// Embed events with error or critical severity regardless of type
|
|
78
|
+
if (event.severity === 'error' || event.severity === 'critical') {
|
|
79
|
+
const summary = truncate(safeString(payload, '{}'), 300);
|
|
80
|
+
return `${event.eventType}: ${summary}`;
|
|
81
|
+
}
|
|
82
|
+
// Skip everything else
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Produce a heuristic summary of a session from its metadata and events.
|
|
89
|
+
*/
|
|
90
|
+
export function summarizeSession(session, events) {
|
|
91
|
+
// Collect tool names in order
|
|
92
|
+
const toolSequence = [];
|
|
93
|
+
const toolNames = new Set();
|
|
94
|
+
const errorMessages = [];
|
|
95
|
+
let errorCount = 0;
|
|
96
|
+
for (const event of events) {
|
|
97
|
+
const payload = event.payload;
|
|
98
|
+
if (event.eventType === 'tool_call' ||
|
|
99
|
+
event.eventType === 'tool_response' ||
|
|
100
|
+
event.eventType === 'tool_error') {
|
|
101
|
+
const toolName = safeString(payload.toolName, 'unknown');
|
|
102
|
+
if (event.eventType === 'tool_call') {
|
|
103
|
+
toolSequence.push(toolName);
|
|
104
|
+
}
|
|
105
|
+
toolNames.add(toolName);
|
|
106
|
+
}
|
|
107
|
+
if (event.eventType === 'tool_error') {
|
|
108
|
+
errorCount++;
|
|
109
|
+
errorMessages.push(safeString(payload.error, 'unknown error'));
|
|
110
|
+
}
|
|
111
|
+
if (event.severity === 'error' || event.severity === 'critical') {
|
|
112
|
+
if (event.eventType !== 'tool_error') {
|
|
113
|
+
errorCount++;
|
|
114
|
+
errorMessages.push(`${event.eventType}: ${truncate(safeString(payload, ''), 100)}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Calculate duration
|
|
119
|
+
let duration = 'unknown duration';
|
|
120
|
+
if (session.startedAt) {
|
|
121
|
+
const start = new Date(session.startedAt).getTime();
|
|
122
|
+
const end = session.endedAt
|
|
123
|
+
? new Date(session.endedAt).getTime()
|
|
124
|
+
: Date.now();
|
|
125
|
+
const diffMs = end - start;
|
|
126
|
+
if (diffMs < 1000) {
|
|
127
|
+
duration = `${diffMs}ms`;
|
|
128
|
+
}
|
|
129
|
+
else if (diffMs < 60_000) {
|
|
130
|
+
duration = `${Math.round(diffMs / 1000)}s`;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
duration = `${Math.round(diffMs / 60_000)}m`;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Build summary text
|
|
137
|
+
const agentName = session.agentName ?? session.agentId;
|
|
138
|
+
const toolList = toolNames.size > 0 ? Array.from(toolNames).join(', ') : 'none';
|
|
139
|
+
const cost = session.totalCostUsd > 0 ? ` Cost: $${session.totalCostUsd.toFixed(4)}.` : '';
|
|
140
|
+
const summary = `Agent ${agentName} ran for ${duration}. Used tools: ${toolList}. ${errorCount} errors.${cost}`;
|
|
141
|
+
// Topics: tool names, event types, tags
|
|
142
|
+
const eventTypes = new Set(events.map((e) => e.eventType));
|
|
143
|
+
const topics = [
|
|
144
|
+
...Array.from(toolNames),
|
|
145
|
+
...Array.from(eventTypes),
|
|
146
|
+
...session.tags,
|
|
147
|
+
];
|
|
148
|
+
// Error summary
|
|
149
|
+
const errorSummary = errorMessages.length > 0
|
|
150
|
+
? truncate(errorMessages.join('; '), 500)
|
|
151
|
+
: '';
|
|
152
|
+
// Determine outcome
|
|
153
|
+
let outcome;
|
|
154
|
+
const totalEvents = events.length;
|
|
155
|
+
const lastEvent = events.length > 0 ? events[events.length - 1] : null;
|
|
156
|
+
const endedWithError = lastEvent?.eventType === 'tool_error' ||
|
|
157
|
+
lastEvent?.severity === 'error' ||
|
|
158
|
+
lastEvent?.severity === 'critical' ||
|
|
159
|
+
(lastEvent?.eventType === 'session_ended' &&
|
|
160
|
+
lastEvent.payload?.reason === 'error');
|
|
161
|
+
if (errorCount === 0) {
|
|
162
|
+
outcome = 'success';
|
|
163
|
+
}
|
|
164
|
+
else if (totalEvents > 0 && errorCount / totalEvents > 0.5) {
|
|
165
|
+
outcome = 'failure';
|
|
166
|
+
}
|
|
167
|
+
else if (endedWithError) {
|
|
168
|
+
outcome = 'failure';
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
outcome = 'partial';
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
summary,
|
|
175
|
+
topics,
|
|
176
|
+
toolSequence,
|
|
177
|
+
errorSummary,
|
|
178
|
+
outcome,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=summarizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../../src/lib/embeddings/summarizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding service types (Story 2.1)
|
|
3
|
+
*/
|
|
4
|
+
/** A typed embedding vector */
|
|
5
|
+
export type EmbeddingVector = Float32Array;
|
|
6
|
+
/** Supported embedding backends */
|
|
7
|
+
export type EmbeddingBackend = 'local' | 'openai';
|
|
8
|
+
/** Configuration for the embedding service */
|
|
9
|
+
export interface EmbeddingServiceConfig {
|
|
10
|
+
/** Backend to use: 'local' (Xenova/transformers.js) or 'openai' */
|
|
11
|
+
backend: EmbeddingBackend;
|
|
12
|
+
/** Model name override (default depends on backend) */
|
|
13
|
+
modelName?: string;
|
|
14
|
+
/** OpenAI API key (required for 'openai' backend) */
|
|
15
|
+
openaiApiKey?: string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,+BAA+B;AAC/B,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC;AAE3C,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElD,8CAA8C;AAC9C,MAAM,WAAW,sBAAsB;IACrC,mEAAmE;IACnE,OAAO,EAAE,gBAAgB,CAAC;IAC1B,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/embeddings/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background Embedding Worker (Story 2.3)
|
|
3
|
+
*
|
|
4
|
+
* Processes an in-memory queue of records to embed. Fail-safe — never crashes
|
|
5
|
+
* the server. If embedding service is not configured, silently skips all items.
|
|
6
|
+
*/
|
|
7
|
+
import type { EmbeddingService } from './index.js';
|
|
8
|
+
import type { EmbeddingStore } from '../../db/embedding-store.js';
|
|
9
|
+
/** Item to be embedded */
|
|
10
|
+
export interface EmbeddingQueueItem {
|
|
11
|
+
tenantId: string;
|
|
12
|
+
sourceType: string;
|
|
13
|
+
sourceId: string;
|
|
14
|
+
textContent: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class EmbeddingWorker {
|
|
17
|
+
private readonly embeddingService;
|
|
18
|
+
private readonly embeddingStore;
|
|
19
|
+
private queue;
|
|
20
|
+
private processedCount;
|
|
21
|
+
private intervalHandle;
|
|
22
|
+
private readonly maxQueueSize;
|
|
23
|
+
constructor(embeddingService: EmbeddingService | null, embeddingStore: EmbeddingStore | null, opts?: {
|
|
24
|
+
maxQueueSize?: number;
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Add an item to the embedding queue. Synchronous — never throws.
|
|
28
|
+
* If the queue is full, drops the oldest items to make room.
|
|
29
|
+
*/
|
|
30
|
+
enqueue(item: EmbeddingQueueItem): void;
|
|
31
|
+
/**
|
|
32
|
+
* Start the background processing loop (setInterval-based, every 1 second).
|
|
33
|
+
*/
|
|
34
|
+
start(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Stop the processing loop and flush remaining items.
|
|
37
|
+
*/
|
|
38
|
+
stop(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Process all queued items immediately.
|
|
41
|
+
*/
|
|
42
|
+
flush(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Return current queue length.
|
|
45
|
+
*/
|
|
46
|
+
getQueueSize(): number;
|
|
47
|
+
/**
|
|
48
|
+
* Return total number of items successfully processed.
|
|
49
|
+
*/
|
|
50
|
+
getProcessedCount(): number;
|
|
51
|
+
/**
|
|
52
|
+
* Process up to BATCH_SIZE items from the queue.
|
|
53
|
+
*/
|
|
54
|
+
private processBatch;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,0BAA0B;AAC1B,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAWD,qBAAa,eAAe;IAOxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAPjC,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,EACzC,cAAc,EAAE,cAAc,GAAG,IAAI,EACtD,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;IAKlC;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAavC;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;YACW,YAAY;CA4B3B"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background Embedding Worker (Story 2.3)
|
|
3
|
+
*
|
|
4
|
+
* Processes an in-memory queue of records to embed. Fail-safe — never crashes
|
|
5
|
+
* the server. If embedding service is not configured, silently skips all items.
|
|
6
|
+
*/
|
|
7
|
+
/** Default maximum queue size */
|
|
8
|
+
const DEFAULT_MAX_QUEUE_SIZE = 10_000;
|
|
9
|
+
/** Maximum items to process per tick */
|
|
10
|
+
const BATCH_SIZE = 32;
|
|
11
|
+
/** Processing interval in milliseconds */
|
|
12
|
+
const TICK_INTERVAL_MS = 1_000;
|
|
13
|
+
export class EmbeddingWorker {
|
|
14
|
+
embeddingService;
|
|
15
|
+
embeddingStore;
|
|
16
|
+
queue = [];
|
|
17
|
+
processedCount = 0;
|
|
18
|
+
intervalHandle = null;
|
|
19
|
+
maxQueueSize;
|
|
20
|
+
constructor(embeddingService, embeddingStore, opts) {
|
|
21
|
+
this.embeddingService = embeddingService;
|
|
22
|
+
this.embeddingStore = embeddingStore;
|
|
23
|
+
this.maxQueueSize = opts?.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Add an item to the embedding queue. Synchronous — never throws.
|
|
27
|
+
* If the queue is full, drops the oldest items to make room.
|
|
28
|
+
*/
|
|
29
|
+
enqueue(item) {
|
|
30
|
+
// Silently skip if service is not configured
|
|
31
|
+
if (!this.embeddingService || !this.embeddingStore)
|
|
32
|
+
return;
|
|
33
|
+
this.queue.push(item);
|
|
34
|
+
// Drop oldest on overflow
|
|
35
|
+
if (this.queue.length > this.maxQueueSize) {
|
|
36
|
+
const overflow = this.queue.length - this.maxQueueSize;
|
|
37
|
+
this.queue.splice(0, overflow);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Start the background processing loop (setInterval-based, every 1 second).
|
|
42
|
+
*/
|
|
43
|
+
start() {
|
|
44
|
+
if (this.intervalHandle !== null)
|
|
45
|
+
return; // already running
|
|
46
|
+
if (!this.embeddingService || !this.embeddingStore)
|
|
47
|
+
return; // nothing to do
|
|
48
|
+
this.intervalHandle = setInterval(() => {
|
|
49
|
+
void this.processBatch();
|
|
50
|
+
}, TICK_INTERVAL_MS);
|
|
51
|
+
// Prevent the interval from keeping the process alive
|
|
52
|
+
if (typeof this.intervalHandle === 'object' && 'unref' in this.intervalHandle) {
|
|
53
|
+
this.intervalHandle.unref();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Stop the processing loop and flush remaining items.
|
|
58
|
+
*/
|
|
59
|
+
async stop() {
|
|
60
|
+
if (this.intervalHandle !== null) {
|
|
61
|
+
clearInterval(this.intervalHandle);
|
|
62
|
+
this.intervalHandle = null;
|
|
63
|
+
}
|
|
64
|
+
// Flush remaining
|
|
65
|
+
await this.flush();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Process all queued items immediately.
|
|
69
|
+
*/
|
|
70
|
+
async flush() {
|
|
71
|
+
while (this.queue.length > 0) {
|
|
72
|
+
await this.processBatch();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Return current queue length.
|
|
77
|
+
*/
|
|
78
|
+
getQueueSize() {
|
|
79
|
+
return this.queue.length;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Return total number of items successfully processed.
|
|
83
|
+
*/
|
|
84
|
+
getProcessedCount() {
|
|
85
|
+
return this.processedCount;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Process up to BATCH_SIZE items from the queue.
|
|
89
|
+
*/
|
|
90
|
+
async processBatch() {
|
|
91
|
+
if (!this.embeddingService || !this.embeddingStore)
|
|
92
|
+
return;
|
|
93
|
+
if (this.queue.length === 0)
|
|
94
|
+
return;
|
|
95
|
+
const batch = this.queue.splice(0, BATCH_SIZE);
|
|
96
|
+
for (const item of batch) {
|
|
97
|
+
try {
|
|
98
|
+
const embedding = await this.embeddingService.embed(item.textContent);
|
|
99
|
+
await this.embeddingStore.store(item.tenantId, item.sourceType, item.sourceId, item.textContent, embedding, this.embeddingService.modelName, this.embeddingService.dimensions);
|
|
100
|
+
this.processedCount++;
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
// Log and skip — never crash
|
|
104
|
+
console.error(`[EmbeddingWorker] Failed to embed item (${item.sourceType}/${item.sourceId}):`, err instanceof Error ? err.message : err);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/lib/embeddings/worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,iCAAiC;AACjC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAEtC,wCAAwC;AACxC,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,0CAA0C;AAC1C,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,OAAO,eAAe;IAOP;IACA;IAPX,KAAK,GAAyB,EAAE,CAAC;IACjC,cAAc,GAAG,CAAC,CAAC;IACnB,cAAc,GAA0C,IAAI,CAAC;IACpD,YAAY,CAAS;IAEtC,YACmB,gBAAyC,EACzC,cAAqC,EACtD,IAAgC;QAFf,qBAAgB,GAAhB,gBAAgB,CAAyB;QACzC,mBAAc,GAAd,cAAc,CAAuB;QAGtD,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,YAAY,IAAI,sBAAsB,CAAC;IACnE,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,IAAwB;QAC9B,6CAA6C;QAC7C,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QAE3D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEtB,0BAA0B;QAC1B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;YACvD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI;YAAE,OAAO,CAAC,kBAAkB;QAC5D,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,CAAC,gBAAgB;QAE5E,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3B,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAErB,sDAAsD;QACtD,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC9E,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACjC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,kBAAkB;QAClB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QAC3D,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAE/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACtE,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAC7B,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAW,EAChB,SAAS,EACT,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAC/B,IAAI,CAAC,gBAAgB,CAAC,UAAU,CACjC,CAAC;gBACF,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,6BAA6B;gBAC7B,OAAO,CAAC,KAAK,CACX,2CAA2C,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,IAAI,EAC/E,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Score Computer (Story 1.2)
|
|
3
|
+
*
|
|
4
|
+
* Computes health scores for agents based on five dimensions:
|
|
5
|
+
* error rate, cost efficiency, tool success, latency, and completion rate.
|
|
6
|
+
* Each dimension is normalized to 0-100 and combined with configurable weights.
|
|
7
|
+
*/
|
|
8
|
+
import type { IEventStore, HealthScore, HealthWeights } from '@agentlensai/core';
|
|
9
|
+
export declare class HealthComputer {
|
|
10
|
+
private readonly weights;
|
|
11
|
+
constructor(weights: HealthWeights);
|
|
12
|
+
/**
|
|
13
|
+
* Compute the health score for a single agent within a time window.
|
|
14
|
+
* Returns null if no sessions exist in the window.
|
|
15
|
+
*/
|
|
16
|
+
compute(store: IEventStore, agentId: string, windowDays: number): Promise<HealthScore | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Compute health scores for all agents in the store.
|
|
19
|
+
*/
|
|
20
|
+
computeOverview(store: IEventStore, windowDays: number): Promise<HealthScore[]>;
|
|
21
|
+
private computeErrorRate;
|
|
22
|
+
private computeCostEfficiency;
|
|
23
|
+
private computeToolSuccess;
|
|
24
|
+
private computeLatency;
|
|
25
|
+
private computeCompletionRate;
|
|
26
|
+
private computeTrend;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=computer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computer.d.ts","sourceRoot":"","sources":["../../../src/lib/health/computer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAGX,aAAa,EAGd,MAAM,mBAAmB,CAAC;AAc3B,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAEnD;;;OAGG;IACG,OAAO,CACX,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA0E9B;;OAEG;IACG,eAAe,CACnB,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC;IAgBzB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,qBAAqB;IA4B7B,OAAO,CAAC,kBAAkB;IAqC1B,OAAO,CAAC,cAAc;IAwCtB,OAAO,CAAC,qBAAqB;YAiBf,YAAY;CAoE3B"}
|