@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,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Pattern Analysis (Story 4.1)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes tool_error events and error/critical severity events to find
|
|
5
|
+
* recurring error patterns, grouping by normalized message.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Normalize an error message for grouping:
|
|
9
|
+
* - Replace UUIDs with <UUID>
|
|
10
|
+
* - Replace file paths with <PATH>
|
|
11
|
+
* - Replace numbers with <N>
|
|
12
|
+
*/
|
|
13
|
+
export function normalizeErrorMessage(msg) {
|
|
14
|
+
return msg
|
|
15
|
+
// UUIDs: 8-4-4-4-12 hex pattern
|
|
16
|
+
.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, '<UUID>')
|
|
17
|
+
// File paths: /foo/bar/baz.ts etc.
|
|
18
|
+
.replace(/\/[\w\/.\-]+/g, '<PATH>')
|
|
19
|
+
// Numbers (standalone or in context)
|
|
20
|
+
.replace(/\d+/g, '<N>');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Extract error message from an event payload.
|
|
24
|
+
*/
|
|
25
|
+
function getErrorMessage(event) {
|
|
26
|
+
const payload = event.payload;
|
|
27
|
+
if (event.eventType === 'tool_error') {
|
|
28
|
+
return String(payload.error ?? 'Unknown error');
|
|
29
|
+
}
|
|
30
|
+
// For other error/critical severity events, try to extract a message
|
|
31
|
+
return String(payload.error ?? payload.message ?? payload.reason ?? JSON.stringify(payload));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Analyze error patterns from the event store.
|
|
35
|
+
*/
|
|
36
|
+
export async function analyzeErrorPatterns(store, opts = {}) {
|
|
37
|
+
const limit = opts.limit ?? 20;
|
|
38
|
+
// Query error events: tool_error events + error/critical severity events
|
|
39
|
+
// We query tool_error events first
|
|
40
|
+
const toolErrorResult = await store.queryEvents({
|
|
41
|
+
agentId: opts.agentId,
|
|
42
|
+
from: opts.from,
|
|
43
|
+
to: opts.to,
|
|
44
|
+
eventType: 'tool_error',
|
|
45
|
+
limit: 500,
|
|
46
|
+
order: 'asc',
|
|
47
|
+
});
|
|
48
|
+
// Then query error/critical severity events
|
|
49
|
+
const severityErrorResult = await store.queryEvents({
|
|
50
|
+
agentId: opts.agentId,
|
|
51
|
+
from: opts.from,
|
|
52
|
+
to: opts.to,
|
|
53
|
+
severity: ['error', 'critical'],
|
|
54
|
+
limit: 500,
|
|
55
|
+
order: 'asc',
|
|
56
|
+
});
|
|
57
|
+
// Merge and deduplicate by event ID
|
|
58
|
+
const seenIds = new Set();
|
|
59
|
+
const allErrors = [];
|
|
60
|
+
for (const event of [...toolErrorResult.events, ...severityErrorResult.events]) {
|
|
61
|
+
if (!seenIds.has(event.id)) {
|
|
62
|
+
seenIds.add(event.id);
|
|
63
|
+
allErrors.push(event);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Sort by timestamp ascending
|
|
67
|
+
allErrors.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
|
|
68
|
+
const eventsAnalyzed = allErrors.length;
|
|
69
|
+
const timeRange = {
|
|
70
|
+
from: allErrors.length > 0 ? allErrors[0].timestamp : (opts.from ?? ''),
|
|
71
|
+
to: allErrors.length > 0 ? allErrors[allErrors.length - 1].timestamp : (opts.to ?? ''),
|
|
72
|
+
};
|
|
73
|
+
// Group by normalized error message pattern
|
|
74
|
+
const patternMap = new Map();
|
|
75
|
+
// To find preceding tools, we need session timelines.
|
|
76
|
+
// Cache session events to avoid repeated queries.
|
|
77
|
+
const sessionEventsCache = new Map();
|
|
78
|
+
for (const event of allErrors) {
|
|
79
|
+
const msg = getErrorMessage(event);
|
|
80
|
+
const pattern = normalizeErrorMessage(msg);
|
|
81
|
+
let entry = patternMap.get(pattern);
|
|
82
|
+
if (!entry) {
|
|
83
|
+
entry = {
|
|
84
|
+
count: 0,
|
|
85
|
+
firstSeen: event.timestamp,
|
|
86
|
+
lastSeen: event.timestamp,
|
|
87
|
+
sessions: new Set(),
|
|
88
|
+
precedingTools: [],
|
|
89
|
+
};
|
|
90
|
+
patternMap.set(pattern, entry);
|
|
91
|
+
}
|
|
92
|
+
entry.count++;
|
|
93
|
+
if (event.timestamp < entry.firstSeen)
|
|
94
|
+
entry.firstSeen = event.timestamp;
|
|
95
|
+
if (event.timestamp > entry.lastSeen)
|
|
96
|
+
entry.lastSeen = event.timestamp;
|
|
97
|
+
entry.sessions.add(event.sessionId);
|
|
98
|
+
// Get preceding tool calls (last 3 tool_call events before this error in the session)
|
|
99
|
+
let sessionEvents = sessionEventsCache.get(event.sessionId);
|
|
100
|
+
if (!sessionEvents) {
|
|
101
|
+
sessionEvents = await store.getSessionTimeline(event.sessionId);
|
|
102
|
+
sessionEventsCache.set(event.sessionId, sessionEvents);
|
|
103
|
+
}
|
|
104
|
+
const eventIdx = sessionEvents.findIndex((e) => e.id === event.id);
|
|
105
|
+
if (eventIdx > 0) {
|
|
106
|
+
const preceding = [];
|
|
107
|
+
for (let i = eventIdx - 1; i >= 0 && preceding.length < 3; i--) {
|
|
108
|
+
const prev = sessionEvents[i];
|
|
109
|
+
if (prev.eventType === 'tool_call') {
|
|
110
|
+
const p = prev.payload;
|
|
111
|
+
preceding.unshift(String(p.toolName ?? 'unknown'));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (preceding.length > 0) {
|
|
115
|
+
entry.precedingTools.push(preceding);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Build result sorted by frequency descending
|
|
120
|
+
const patterns = Array.from(patternMap.entries())
|
|
121
|
+
.map(([pattern, entry]) => ({
|
|
122
|
+
pattern,
|
|
123
|
+
count: entry.count,
|
|
124
|
+
firstSeen: entry.firstSeen,
|
|
125
|
+
lastSeen: entry.lastSeen,
|
|
126
|
+
affectedSessions: Array.from(entry.sessions),
|
|
127
|
+
// Deduplicate preceding tool sequences
|
|
128
|
+
precedingTools: deduplicateSequences(entry.precedingTools),
|
|
129
|
+
}))
|
|
130
|
+
.sort((a, b) => b.count - a.count)
|
|
131
|
+
.slice(0, limit);
|
|
132
|
+
return {
|
|
133
|
+
patterns,
|
|
134
|
+
metadata: {
|
|
135
|
+
eventsAnalyzed,
|
|
136
|
+
timeRange,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Deduplicate tool sequences by stringified form, keeping unique ones.
|
|
142
|
+
*/
|
|
143
|
+
function deduplicateSequences(sequences) {
|
|
144
|
+
const seen = new Set();
|
|
145
|
+
const result = [];
|
|
146
|
+
for (const seq of sequences) {
|
|
147
|
+
const key = seq.join('→');
|
|
148
|
+
if (!seen.has(key)) {
|
|
149
|
+
seen.add(key);
|
|
150
|
+
result.push(seq);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=error-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-patterns.js","sourceRoot":"","sources":["../../../src/lib/analysis/error-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analysis Dispatcher (Story 4.6)
|
|
3
|
+
*
|
|
4
|
+
* Maps analysis type strings to handler functions and converts
|
|
5
|
+
* their results into the unified ReflectResult format.
|
|
6
|
+
*/
|
|
7
|
+
import type { IEventStore, ReflectResult } from '@agentlensai/core';
|
|
8
|
+
export interface AnalysisOpts {
|
|
9
|
+
agentId?: string;
|
|
10
|
+
from?: string;
|
|
11
|
+
to?: string;
|
|
12
|
+
limit?: number;
|
|
13
|
+
params?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Run an analysis by type string and return a unified ReflectResult.
|
|
17
|
+
*/
|
|
18
|
+
export declare function runAnalysis(analysis: string, store: IEventStore, opts?: AnalysisOpts): Promise<ReflectResult>;
|
|
19
|
+
export { analyzeErrorPatterns } from './error-patterns.js';
|
|
20
|
+
export { analyzeToolSequences } from './tool-sequences.js';
|
|
21
|
+
export { analyzeCosts } from './cost-analysis.js';
|
|
22
|
+
export { analyzePerformance } from './performance-trends.js';
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAmC,MAAM,mBAAmB,CAAC;AAMrG,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,aAAa,CAAC,CAaxB;AA+ID,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analysis Dispatcher (Story 4.6)
|
|
3
|
+
*
|
|
4
|
+
* Maps analysis type strings to handler functions and converts
|
|
5
|
+
* their results into the unified ReflectResult format.
|
|
6
|
+
*/
|
|
7
|
+
import { analyzeErrorPatterns } from './error-patterns.js';
|
|
8
|
+
import { analyzeToolSequences } from './tool-sequences.js';
|
|
9
|
+
import { analyzeCosts } from './cost-analysis.js';
|
|
10
|
+
import { analyzePerformance } from './performance-trends.js';
|
|
11
|
+
/**
|
|
12
|
+
* Run an analysis by type string and return a unified ReflectResult.
|
|
13
|
+
*/
|
|
14
|
+
export async function runAnalysis(analysis, store, opts = {}) {
|
|
15
|
+
switch (analysis) {
|
|
16
|
+
case 'error_patterns':
|
|
17
|
+
return runErrorPatterns(store, opts);
|
|
18
|
+
case 'tool_sequences':
|
|
19
|
+
return runToolSequences(store, opts);
|
|
20
|
+
case 'cost_analysis':
|
|
21
|
+
return runCostAnalysis(store, opts);
|
|
22
|
+
case 'performance_trends':
|
|
23
|
+
return runPerformanceTrends(store, opts);
|
|
24
|
+
default:
|
|
25
|
+
throw new Error(`Unknown analysis type: ${analysis}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function runErrorPatterns(store, opts) {
|
|
29
|
+
const result = await analyzeErrorPatterns(store, opts);
|
|
30
|
+
const insights = result.patterns.map((p) => ({
|
|
31
|
+
type: 'error_pattern',
|
|
32
|
+
summary: `Error pattern "${p.pattern}" occurred ${p.count} time(s) across ${p.affectedSessions.length} session(s)`,
|
|
33
|
+
data: {
|
|
34
|
+
pattern: p.pattern,
|
|
35
|
+
count: p.count,
|
|
36
|
+
firstSeen: p.firstSeen,
|
|
37
|
+
lastSeen: p.lastSeen,
|
|
38
|
+
affectedSessions: p.affectedSessions,
|
|
39
|
+
precedingTools: p.precedingTools,
|
|
40
|
+
},
|
|
41
|
+
confidence: Math.min(0.5 + p.count * 0.1, 1.0),
|
|
42
|
+
}));
|
|
43
|
+
return {
|
|
44
|
+
analysis: 'error_patterns',
|
|
45
|
+
insights,
|
|
46
|
+
metadata: {
|
|
47
|
+
sessionsAnalyzed: new Set(result.patterns.flatMap((p) => p.affectedSessions)).size,
|
|
48
|
+
eventsAnalyzed: result.metadata.eventsAnalyzed,
|
|
49
|
+
timeRange: result.metadata.timeRange,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function runToolSequences(store, opts) {
|
|
54
|
+
const result = await analyzeToolSequences(store, opts);
|
|
55
|
+
const insights = result.sequences.map((s) => ({
|
|
56
|
+
type: s.errorRate > 0 ? 'error_prone_sequence' : 'tool_sequence',
|
|
57
|
+
summary: `Sequence [${s.tools.join(' → ')}] used ${s.frequency} time(s) across ${s.sessions} session(s)${s.errorRate > 0 ? ` (${Math.round(s.errorRate * 100)}% error rate)` : ''}`,
|
|
58
|
+
data: {
|
|
59
|
+
tools: s.tools,
|
|
60
|
+
frequency: s.frequency,
|
|
61
|
+
sessions: s.sessions,
|
|
62
|
+
errorRate: s.errorRate,
|
|
63
|
+
},
|
|
64
|
+
confidence: Math.min(0.4 + s.frequency * 0.1, 1.0),
|
|
65
|
+
}));
|
|
66
|
+
return {
|
|
67
|
+
analysis: 'tool_sequences',
|
|
68
|
+
insights,
|
|
69
|
+
metadata: {
|
|
70
|
+
sessionsAnalyzed: result.stats.totalCalls > 0 ? result.sequences.reduce((max, s) => Math.max(max, s.sessions), 0) : 0,
|
|
71
|
+
eventsAnalyzed: result.metadata.eventsAnalyzed,
|
|
72
|
+
timeRange: result.metadata.timeRange,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function runCostAnalysis(store, opts) {
|
|
77
|
+
const model = opts.params?.model;
|
|
78
|
+
const result = await analyzeCosts(store, { ...opts, model });
|
|
79
|
+
const insights = [];
|
|
80
|
+
// Summary insight
|
|
81
|
+
insights.push({
|
|
82
|
+
type: 'cost_summary',
|
|
83
|
+
summary: `Total cost: $${result.summary.totalCost.toFixed(4)} across ${result.summary.totalSessions} session(s) (avg $${result.summary.avgPerSession.toFixed(4)}/session)`,
|
|
84
|
+
data: result.summary,
|
|
85
|
+
confidence: 1.0,
|
|
86
|
+
});
|
|
87
|
+
// Trend insight
|
|
88
|
+
insights.push({
|
|
89
|
+
type: 'cost_trend',
|
|
90
|
+
summary: `Cost trend is ${result.trend.direction}`,
|
|
91
|
+
data: {
|
|
92
|
+
direction: result.trend.direction,
|
|
93
|
+
bucketCount: result.trend.buckets.length,
|
|
94
|
+
},
|
|
95
|
+
confidence: result.trend.buckets.length >= 7 ? 0.8 : 0.5,
|
|
96
|
+
});
|
|
97
|
+
// Top model insights
|
|
98
|
+
for (const m of result.byModel.slice(0, 3)) {
|
|
99
|
+
insights.push({
|
|
100
|
+
type: 'cost_by_model',
|
|
101
|
+
summary: `Model "${m.model}": $${m.totalCost.toFixed(4)} (${m.callCount} calls, avg $${m.avgCostPerCall.toFixed(4)}/call)`,
|
|
102
|
+
data: m,
|
|
103
|
+
confidence: 0.9,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
analysis: 'cost_analysis',
|
|
108
|
+
insights,
|
|
109
|
+
metadata: {
|
|
110
|
+
sessionsAnalyzed: result.summary.totalSessions,
|
|
111
|
+
eventsAnalyzed: result.metadata.eventsAnalyzed,
|
|
112
|
+
timeRange: result.metadata.timeRange,
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
async function runPerformanceTrends(store, opts) {
|
|
117
|
+
const result = await analyzePerformance(store, opts);
|
|
118
|
+
const insights = [];
|
|
119
|
+
// Current performance insight
|
|
120
|
+
insights.push({
|
|
121
|
+
type: 'performance_current',
|
|
122
|
+
summary: `Current: ${Math.round(result.current.successRate * 100)}% success rate, avg ${result.current.avgDuration}ms duration, ${result.current.avgToolCalls} tool calls/session, ${result.current.avgErrors} errors/session`,
|
|
123
|
+
data: result.current,
|
|
124
|
+
confidence: result.metadata.sessionsAnalyzed >= 10 ? 0.9 : 0.6,
|
|
125
|
+
});
|
|
126
|
+
// Assessment insight
|
|
127
|
+
insights.push({
|
|
128
|
+
type: 'performance_assessment',
|
|
129
|
+
summary: `Performance trend: ${result.assessment}`,
|
|
130
|
+
data: { assessment: result.assessment },
|
|
131
|
+
confidence: result.trends.length >= 4 ? 0.8 : 0.5,
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
analysis: 'performance_trends',
|
|
135
|
+
insights,
|
|
136
|
+
metadata: result.metadata,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// Re-export individual analysis functions
|
|
140
|
+
export { analyzeErrorPatterns } from './error-patterns.js';
|
|
141
|
+
export { analyzeToolSequences } from './tool-sequences.js';
|
|
142
|
+
export { analyzeCosts } from './cost-analysis.js';
|
|
143
|
+
export { analyzePerformance } from './performance-trends.js';
|
|
144
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/analysis/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Trends Analysis (Story 4.4)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes sessions over time to calculate success rates, durations,
|
|
5
|
+
* tool call averages, and error averages, with trend detection.
|
|
6
|
+
*/
|
|
7
|
+
import type { IEventStore } from '@agentlensai/core';
|
|
8
|
+
import type { PerformanceTrendsResult } from '@agentlensai/core';
|
|
9
|
+
export interface PerformanceTrendsOpts {
|
|
10
|
+
agentId?: string;
|
|
11
|
+
from?: string;
|
|
12
|
+
to?: string;
|
|
13
|
+
limit?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Analyze performance trends across sessions.
|
|
17
|
+
*/
|
|
18
|
+
export declare function analyzePerformance(store: IEventStore, opts?: PerformanceTrendsOpts): Promise<PerformanceTrendsResult>;
|
|
19
|
+
//# sourceMappingURL=performance-trends.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-trends.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/performance-trends.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EACV,uBAAuB,EAGxB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CA6GlC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Trends Analysis (Story 4.4)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes sessions over time to calculate success rates, durations,
|
|
5
|
+
* tool call averages, and error averages, with trend detection.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Analyze performance trends across sessions.
|
|
9
|
+
*/
|
|
10
|
+
export async function analyzePerformance(store, opts = {}) {
|
|
11
|
+
// Query sessions
|
|
12
|
+
const sessionResult = await store.querySessions({
|
|
13
|
+
agentId: opts.agentId,
|
|
14
|
+
from: opts.from,
|
|
15
|
+
to: opts.to,
|
|
16
|
+
limit: 500,
|
|
17
|
+
});
|
|
18
|
+
const sessions = sessionResult.sessions;
|
|
19
|
+
const sessionsAnalyzed = sessions.length;
|
|
20
|
+
// Count events for metadata
|
|
21
|
+
const eventCount = await store.countEvents({
|
|
22
|
+
agentId: opts.agentId,
|
|
23
|
+
from: opts.from,
|
|
24
|
+
to: opts.to,
|
|
25
|
+
});
|
|
26
|
+
const timeRange = {
|
|
27
|
+
from: sessions.length > 0
|
|
28
|
+
? sessions.reduce((min, s) => (s.startedAt < min ? s.startedAt : min), sessions[0].startedAt)
|
|
29
|
+
: (opts.from ?? ''),
|
|
30
|
+
to: sessions.length > 0
|
|
31
|
+
? sessions.reduce((max, s) => (s.startedAt > max ? s.startedAt : max), sessions[0].startedAt)
|
|
32
|
+
: (opts.to ?? ''),
|
|
33
|
+
};
|
|
34
|
+
// Current aggregate metrics
|
|
35
|
+
const successCount = sessions.filter((s) => s.errorCount === 0).length;
|
|
36
|
+
const successRate = sessionsAnalyzed > 0 ? successCount / sessionsAnalyzed : 0;
|
|
37
|
+
const durations = sessions
|
|
38
|
+
.filter((s) => s.endedAt && s.startedAt)
|
|
39
|
+
.map((s) => new Date(s.endedAt).getTime() - new Date(s.startedAt).getTime());
|
|
40
|
+
const avgDuration = durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0;
|
|
41
|
+
const avgToolCalls = sessionsAnalyzed > 0
|
|
42
|
+
? sessions.reduce((sum, s) => sum + s.toolCallCount, 0) / sessionsAnalyzed
|
|
43
|
+
: 0;
|
|
44
|
+
const avgErrors = sessionsAnalyzed > 0
|
|
45
|
+
? sessions.reduce((sum, s) => sum + s.errorCount, 0) / sessionsAnalyzed
|
|
46
|
+
: 0;
|
|
47
|
+
// Bucket by day for trend lines
|
|
48
|
+
const dailyMap = new Map();
|
|
49
|
+
for (const session of sessions) {
|
|
50
|
+
const date = session.startedAt.slice(0, 10); // YYYY-MM-DD
|
|
51
|
+
const entry = dailyMap.get(date) ?? { sessions: [] };
|
|
52
|
+
entry.sessions.push(session);
|
|
53
|
+
dailyMap.set(date, entry);
|
|
54
|
+
}
|
|
55
|
+
const limit = opts.limit ?? 20;
|
|
56
|
+
const allBuckets = Array.from(dailyMap.entries())
|
|
57
|
+
.map(([date, data]) => {
|
|
58
|
+
const daySessions = data.sessions;
|
|
59
|
+
const daySuccess = daySessions.filter((s) => s.errorCount === 0).length;
|
|
60
|
+
const dayDurations = daySessions
|
|
61
|
+
.filter((s) => s.endedAt && s.startedAt)
|
|
62
|
+
.map((s) => new Date(s.endedAt).getTime() - new Date(s.startedAt).getTime());
|
|
63
|
+
return {
|
|
64
|
+
date,
|
|
65
|
+
successRate: daySessions.length > 0 ? daySuccess / daySessions.length : 0,
|
|
66
|
+
duration: dayDurations.length > 0
|
|
67
|
+
? dayDurations.reduce((a, b) => a + b, 0) / dayDurations.length
|
|
68
|
+
: 0,
|
|
69
|
+
toolCalls: daySessions.length > 0
|
|
70
|
+
? daySessions.reduce((sum, s) => sum + s.toolCallCount, 0) / daySessions.length
|
|
71
|
+
: 0,
|
|
72
|
+
errors: daySessions.length > 0
|
|
73
|
+
? daySessions.reduce((sum, s) => sum + s.errorCount, 0) / daySessions.length
|
|
74
|
+
: 0,
|
|
75
|
+
};
|
|
76
|
+
})
|
|
77
|
+
.sort((a, b) => a.date.localeCompare(b.date));
|
|
78
|
+
// Respect limit on trend buckets
|
|
79
|
+
const trends = allBuckets.slice(-limit);
|
|
80
|
+
// Trend assessment: compare recent half vs historical half
|
|
81
|
+
const assessment = detectPerformanceTrend(allBuckets);
|
|
82
|
+
return {
|
|
83
|
+
current: {
|
|
84
|
+
successRate: Math.round(successRate * 10000) / 10000,
|
|
85
|
+
avgDuration: Math.round(avgDuration),
|
|
86
|
+
avgToolCalls: Math.round(avgToolCalls * 100) / 100,
|
|
87
|
+
avgErrors: Math.round(avgErrors * 100) / 100,
|
|
88
|
+
},
|
|
89
|
+
trends,
|
|
90
|
+
assessment,
|
|
91
|
+
metadata: {
|
|
92
|
+
sessionsAnalyzed,
|
|
93
|
+
eventsAnalyzed: eventCount,
|
|
94
|
+
timeRange,
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Detect performance trend by comparing recent vs historical success rates.
|
|
100
|
+
*/
|
|
101
|
+
function detectPerformanceTrend(buckets) {
|
|
102
|
+
if (buckets.length < 2)
|
|
103
|
+
return 'stable';
|
|
104
|
+
const midpoint = Math.floor(buckets.length / 2);
|
|
105
|
+
const recent = buckets.slice(midpoint);
|
|
106
|
+
const historical = buckets.slice(0, midpoint);
|
|
107
|
+
if (historical.length === 0 || recent.length === 0)
|
|
108
|
+
return 'stable';
|
|
109
|
+
const recentAvgSuccess = recent.reduce((s, b) => s + b.successRate, 0) / recent.length;
|
|
110
|
+
const historicalAvgSuccess = historical.reduce((s, b) => s + b.successRate, 0) / historical.length;
|
|
111
|
+
const diff = recentAvgSuccess - historicalAvgSuccess;
|
|
112
|
+
if (diff > 0.05)
|
|
113
|
+
return 'improving';
|
|
114
|
+
if (diff < -0.05)
|
|
115
|
+
return 'degrading';
|
|
116
|
+
return 'stable';
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=performance-trends.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-trends.js","sourceRoot":"","sources":["../../../src/lib/analysis/performance-trends.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAkB,EAClB,OAA8B,EAAE;IAEhC,iBAAiB;IACjB,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC;QAC9C,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;IACxC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC;IAEzC,4BAA4B;IAC5B,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;QACzC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,EAAE,EAAE,IAAI,CAAC,EAAE;KACZ,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG;QAChB,IAAI,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;YACvB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC;YAC9F,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,EAAE,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;YACrB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC;YAC9F,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;KACpB,CAAC;IAEF,4BAA4B;IAC5B,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACvE,MAAM,WAAW,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/E,MAAM,SAAS,GAAG,QAAQ;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvG,MAAM,YAAY,GAAG,gBAAgB,GAAG,CAAC;QACvC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,gBAAgB;QAC1E,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,SAAS,GAAG,gBAAgB,GAAG,CAAC;QACpC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,gBAAgB;QACvE,CAAC,CAAC,CAAC,CAAC;IAEN,gCAAgC;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAKrB,CAAC;IAEJ,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa;QAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACrD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,UAAU,GAA6B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;SACxE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClC,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACxE,MAAM,YAAY,GAAG,WAAW;aAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,CAAC;aACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAEhF,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACzE,QAAQ,EACN,YAAY,CAAC,MAAM,GAAG,CAAC;gBACrB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM;gBAC/D,CAAC,CAAC,CAAC;YACP,SAAS,EACP,WAAW,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM;gBAC/E,CAAC,CAAC,CAAC;YACP,MAAM,EACJ,WAAW,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM;gBAC5E,CAAC,CAAC,CAAC;SACR,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,iCAAiC;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IAExC,2DAA2D;IAC3D,MAAM,UAAU,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAEtD,OAAO;QACL,OAAO,EAAE;YACP,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,KAAK;YACpD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YACpC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,GAAG;YAClD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG;SAC7C;QACD,MAAM;QACN,UAAU;QACV,QAAQ,EAAE;YACR,gBAAgB;YAChB,cAAc,EAAE,UAAU;YAC1B,SAAS;SACV;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAC7B,OAAiC;IAEjC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAExC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE9C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEpE,MAAM,gBAAgB,GACpB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAChE,MAAM,oBAAoB,GACxB,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAExE,MAAM,IAAI,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;IAErD,IAAI,IAAI,GAAG,IAAI;QAAE,OAAO,WAAW,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC,IAAI;QAAE,OAAO,WAAW,CAAC;IACrC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Sequence Analysis (Story 4.2)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes tool_call events to extract N-grams (2-grams and 3-grams)
|
|
5
|
+
* of tool sequences per session, and identifies error-prone sequences.
|
|
6
|
+
*/
|
|
7
|
+
import type { IEventStore } from '@agentlensai/core';
|
|
8
|
+
import type { ToolSequenceResult } from '@agentlensai/core';
|
|
9
|
+
export interface ToolSequenceOpts {
|
|
10
|
+
agentId?: string;
|
|
11
|
+
from?: string;
|
|
12
|
+
to?: string;
|
|
13
|
+
limit?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Analyze tool usage sequences across sessions.
|
|
17
|
+
*/
|
|
18
|
+
export declare function analyzeToolSequences(store: IEventStore, opts?: ToolSequenceOpts): Promise<ToolSequenceResult>;
|
|
19
|
+
//# sourceMappingURL=tool-sequences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-sequences.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/tool-sequences.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EACV,kBAAkB,EAGnB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CA8J7B"}
|