@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.
Files changed (222) hide show
  1. package/dist/db/embedding-store.d.ts +74 -0
  2. package/dist/db/embedding-store.d.ts.map +1 -0
  3. package/dist/db/embedding-store.js +177 -0
  4. package/dist/db/embedding-store.js.map +1 -0
  5. package/dist/db/lesson-store.d.ts +57 -0
  6. package/dist/db/lesson-store.d.ts.map +1 -0
  7. package/dist/db/lesson-store.js +217 -0
  8. package/dist/db/lesson-store.js.map +1 -0
  9. package/dist/db/migrate.d.ts.map +1 -1
  10. package/dist/db/migrate.js +250 -4
  11. package/dist/db/migrate.js.map +1 -1
  12. package/dist/db/schema.sqlite.d.ts +881 -55
  13. package/dist/db/schema.sqlite.d.ts.map +1 -1
  14. package/dist/db/schema.sqlite.js +82 -4
  15. package/dist/db/schema.sqlite.js.map +1 -1
  16. package/dist/db/session-summary-store.d.ts +45 -0
  17. package/dist/db/session-summary-store.d.ts.map +1 -0
  18. package/dist/db/session-summary-store.js +112 -0
  19. package/dist/db/session-summary-store.js.map +1 -0
  20. package/dist/db/sqlite-store.d.ts +25 -13
  21. package/dist/db/sqlite-store.d.ts.map +1 -1
  22. package/dist/db/sqlite-store.js +224 -47
  23. package/dist/db/sqlite-store.js.map +1 -1
  24. package/dist/db/tenant-scoped-store.d.ts +61 -0
  25. package/dist/db/tenant-scoped-store.d.ts.map +1 -0
  26. package/dist/db/tenant-scoped-store.js +94 -0
  27. package/dist/db/tenant-scoped-store.js.map +1 -0
  28. package/dist/index.d.ts +25 -4
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +99 -5
  31. package/dist/index.js.map +1 -1
  32. package/dist/lib/alert-engine.d.ts +72 -0
  33. package/dist/lib/alert-engine.d.ts.map +1 -0
  34. package/dist/lib/alert-engine.js +318 -0
  35. package/dist/lib/alert-engine.js.map +1 -0
  36. package/dist/lib/analysis/cost-analysis.d.ts +20 -0
  37. package/dist/lib/analysis/cost-analysis.d.ts.map +1 -0
  38. package/dist/lib/analysis/cost-analysis.js +158 -0
  39. package/dist/lib/analysis/cost-analysis.js.map +1 -0
  40. package/dist/lib/analysis/error-patterns.d.ts +26 -0
  41. package/dist/lib/analysis/error-patterns.d.ts.map +1 -0
  42. package/dist/lib/analysis/error-patterns.js +155 -0
  43. package/dist/lib/analysis/error-patterns.js.map +1 -0
  44. package/dist/lib/analysis/index.d.ts +23 -0
  45. package/dist/lib/analysis/index.d.ts.map +1 -0
  46. package/dist/lib/analysis/index.js +144 -0
  47. package/dist/lib/analysis/index.js.map +1 -0
  48. package/dist/lib/analysis/performance-trends.d.ts +19 -0
  49. package/dist/lib/analysis/performance-trends.d.ts.map +1 -0
  50. package/dist/lib/analysis/performance-trends.js +118 -0
  51. package/dist/lib/analysis/performance-trends.js.map +1 -0
  52. package/dist/lib/analysis/tool-sequences.d.ts +19 -0
  53. package/dist/lib/analysis/tool-sequences.d.ts.map +1 -0
  54. package/dist/lib/analysis/tool-sequences.js +145 -0
  55. package/dist/lib/analysis/tool-sequences.js.map +1 -0
  56. package/dist/lib/context/index.d.ts +5 -0
  57. package/dist/lib/context/index.d.ts.map +1 -0
  58. package/dist/lib/context/index.js +5 -0
  59. package/dist/lib/context/index.js.map +1 -0
  60. package/dist/lib/context/retrieval.d.ts +56 -0
  61. package/dist/lib/context/retrieval.d.ts.map +1 -0
  62. package/dist/lib/context/retrieval.js +229 -0
  63. package/dist/lib/context/retrieval.js.map +1 -0
  64. package/dist/lib/embeddings/index.d.ts +31 -0
  65. package/dist/lib/embeddings/index.d.ts.map +1 -0
  66. package/dist/lib/embeddings/index.js +31 -0
  67. package/dist/lib/embeddings/index.js.map +1 -0
  68. package/dist/lib/embeddings/local.d.ts +15 -0
  69. package/dist/lib/embeddings/local.d.ts.map +1 -0
  70. package/dist/lib/embeddings/local.js +65 -0
  71. package/dist/lib/embeddings/local.js.map +1 -0
  72. package/dist/lib/embeddings/math.d.ts +13 -0
  73. package/dist/lib/embeddings/math.d.ts.map +1 -0
  74. package/dist/lib/embeddings/math.js +35 -0
  75. package/dist/lib/embeddings/math.js.map +1 -0
  76. package/dist/lib/embeddings/openai.d.ts +15 -0
  77. package/dist/lib/embeddings/openai.d.ts.map +1 -0
  78. package/dist/lib/embeddings/openai.js +58 -0
  79. package/dist/lib/embeddings/openai.js.map +1 -0
  80. package/dist/lib/embeddings/summarizer.d.ts +26 -0
  81. package/dist/lib/embeddings/summarizer.d.ts.map +1 -0
  82. package/dist/lib/embeddings/summarizer.js +181 -0
  83. package/dist/lib/embeddings/summarizer.js.map +1 -0
  84. package/dist/lib/embeddings/types.d.ts +17 -0
  85. package/dist/lib/embeddings/types.d.ts.map +1 -0
  86. package/dist/lib/embeddings/types.js +5 -0
  87. package/dist/lib/embeddings/types.js.map +1 -0
  88. package/dist/lib/embeddings/worker.d.ts +56 -0
  89. package/dist/lib/embeddings/worker.d.ts.map +1 -0
  90. package/dist/lib/embeddings/worker.js +109 -0
  91. package/dist/lib/embeddings/worker.js.map +1 -0
  92. package/dist/lib/event-bus.d.ts +48 -0
  93. package/dist/lib/event-bus.d.ts.map +1 -0
  94. package/dist/lib/event-bus.js +34 -0
  95. package/dist/lib/event-bus.js.map +1 -0
  96. package/dist/lib/retention.d.ts +1 -1
  97. package/dist/lib/retention.d.ts.map +1 -1
  98. package/dist/lib/sse.d.ts +22 -0
  99. package/dist/lib/sse.d.ts.map +1 -0
  100. package/dist/lib/sse.js +121 -0
  101. package/dist/lib/sse.js.map +1 -0
  102. package/dist/middleware/auth.d.ts +1 -0
  103. package/dist/middleware/auth.d.ts.map +1 -1
  104. package/dist/middleware/auth.js +2 -1
  105. package/dist/middleware/auth.js.map +1 -1
  106. package/dist/routes/agents.d.ts +1 -1
  107. package/dist/routes/agents.d.ts.map +1 -1
  108. package/dist/routes/agents.js +6 -3
  109. package/dist/routes/agents.js.map +1 -1
  110. package/dist/routes/alerts.d.ts +17 -0
  111. package/dist/routes/alerts.d.ts.map +1 -0
  112. package/dist/routes/alerts.js +141 -0
  113. package/dist/routes/alerts.js.map +1 -0
  114. package/dist/routes/analytics.d.ts +16 -0
  115. package/dist/routes/analytics.d.ts.map +1 -0
  116. package/dist/routes/analytics.js +307 -0
  117. package/dist/routes/analytics.js.map +1 -0
  118. package/dist/routes/api-keys.d.ts.map +1 -1
  119. package/dist/routes/api-keys.js +30 -5
  120. package/dist/routes/api-keys.js.map +1 -1
  121. package/dist/routes/config.d.ts +5 -0
  122. package/dist/routes/config.d.ts.map +1 -1
  123. package/dist/routes/config.js +27 -7
  124. package/dist/routes/config.js.map +1 -1
  125. package/dist/routes/context.d.ts +23 -0
  126. package/dist/routes/context.d.ts.map +1 -0
  127. package/dist/routes/context.js +52 -0
  128. package/dist/routes/context.js.map +1 -0
  129. package/dist/routes/events.d.ts +7 -2
  130. package/dist/routes/events.d.ts.map +1 -1
  131. package/dist/routes/events.js +76 -8
  132. package/dist/routes/events.js.map +1 -1
  133. package/dist/routes/ingest.d.ts +36 -0
  134. package/dist/routes/ingest.d.ts.map +1 -0
  135. package/dist/routes/ingest.js +280 -0
  136. package/dist/routes/ingest.js.map +1 -0
  137. package/dist/routes/lessons.d.ts +19 -0
  138. package/dist/routes/lessons.d.ts.map +1 -0
  139. package/dist/routes/lessons.js +164 -0
  140. package/dist/routes/lessons.js.map +1 -0
  141. package/dist/routes/recall.d.ts +20 -0
  142. package/dist/routes/recall.d.ts.map +1 -0
  143. package/dist/routes/recall.js +71 -0
  144. package/dist/routes/recall.js.map +1 -0
  145. package/dist/routes/reflect.d.ts +15 -0
  146. package/dist/routes/reflect.d.ts.map +1 -0
  147. package/dist/routes/reflect.js +55 -0
  148. package/dist/routes/reflect.js.map +1 -0
  149. package/dist/routes/sessions.d.ts +1 -1
  150. package/dist/routes/sessions.d.ts.map +1 -1
  151. package/dist/routes/sessions.js +9 -7
  152. package/dist/routes/sessions.js.map +1 -1
  153. package/dist/routes/stats.d.ts +1 -1
  154. package/dist/routes/stats.d.ts.map +1 -1
  155. package/dist/routes/stats.js +3 -1
  156. package/dist/routes/stats.js.map +1 -1
  157. package/dist/routes/stream.d.ts +23 -0
  158. package/dist/routes/stream.d.ts.map +1 -0
  159. package/dist/routes/stream.js +94 -0
  160. package/dist/routes/stream.js.map +1 -0
  161. package/dist/routes/tenant-helper.d.ts +20 -0
  162. package/dist/routes/tenant-helper.d.ts.map +1 -0
  163. package/dist/routes/tenant-helper.js +23 -0
  164. package/dist/routes/tenant-helper.js.map +1 -0
  165. package/package.json +11 -11
  166. package/LICENSE +0 -21
  167. package/dist/__tests__/agents-stats.test.d.ts +0 -5
  168. package/dist/__tests__/agents-stats.test.d.ts.map +0 -1
  169. package/dist/__tests__/agents-stats.test.js +0 -134
  170. package/dist/__tests__/agents-stats.test.js.map +0 -1
  171. package/dist/__tests__/api-keys.test.d.ts +0 -5
  172. package/dist/__tests__/api-keys.test.d.ts.map +0 -1
  173. package/dist/__tests__/api-keys.test.js +0 -118
  174. package/dist/__tests__/api-keys.test.js.map +0 -1
  175. package/dist/__tests__/auth-no-db.test.d.ts +0 -2
  176. package/dist/__tests__/auth-no-db.test.d.ts.map +0 -1
  177. package/dist/__tests__/auth-no-db.test.js +0 -43
  178. package/dist/__tests__/auth-no-db.test.js.map +0 -1
  179. package/dist/__tests__/auth.test.d.ts +0 -5
  180. package/dist/__tests__/auth.test.d.ts.map +0 -1
  181. package/dist/__tests__/auth.test.js +0 -86
  182. package/dist/__tests__/auth.test.js.map +0 -1
  183. package/dist/__tests__/config.test.d.ts +0 -2
  184. package/dist/__tests__/config.test.d.ts.map +0 -1
  185. package/dist/__tests__/config.test.js +0 -37
  186. package/dist/__tests__/config.test.js.map +0 -1
  187. package/dist/__tests__/events-ingest.test.d.ts +0 -5
  188. package/dist/__tests__/events-ingest.test.d.ts.map +0 -1
  189. package/dist/__tests__/events-ingest.test.js +0 -248
  190. package/dist/__tests__/events-ingest.test.js.map +0 -1
  191. package/dist/__tests__/events-query.test.d.ts +0 -5
  192. package/dist/__tests__/events-query.test.d.ts.map +0 -1
  193. package/dist/__tests__/events-query.test.js +0 -205
  194. package/dist/__tests__/events-query.test.js.map +0 -1
  195. package/dist/__tests__/health.test.d.ts +0 -5
  196. package/dist/__tests__/health.test.d.ts.map +0 -1
  197. package/dist/__tests__/health.test.js +0 -40
  198. package/dist/__tests__/health.test.js.map +0 -1
  199. package/dist/__tests__/sessions.test.d.ts +0 -5
  200. package/dist/__tests__/sessions.test.d.ts.map +0 -1
  201. package/dist/__tests__/sessions.test.js +0 -176
  202. package/dist/__tests__/sessions.test.js.map +0 -1
  203. package/dist/__tests__/test-helpers.d.ts +0 -24
  204. package/dist/__tests__/test-helpers.d.ts.map +0 -1
  205. package/dist/__tests__/test-helpers.js +0 -45
  206. package/dist/__tests__/test-helpers.js.map +0 -1
  207. package/dist/db/__tests__/init.test.d.ts +0 -2
  208. package/dist/db/__tests__/init.test.d.ts.map +0 -1
  209. package/dist/db/__tests__/init.test.js +0 -73
  210. package/dist/db/__tests__/init.test.js.map +0 -1
  211. package/dist/db/__tests__/sqlite-store-read.test.d.ts +0 -2
  212. package/dist/db/__tests__/sqlite-store-read.test.d.ts.map +0 -1
  213. package/dist/db/__tests__/sqlite-store-read.test.js +0 -749
  214. package/dist/db/__tests__/sqlite-store-read.test.js.map +0 -1
  215. package/dist/db/__tests__/sqlite-store-write.test.d.ts +0 -2
  216. package/dist/db/__tests__/sqlite-store-write.test.d.ts.map +0 -1
  217. package/dist/db/__tests__/sqlite-store-write.test.js +0 -418
  218. package/dist/db/__tests__/sqlite-store-write.test.js.map +0 -1
  219. package/dist/lib/__tests__/retention.test.d.ts +0 -2
  220. package/dist/lib/__tests__/retention.test.d.ts.map +0 -1
  221. package/dist/lib/__tests__/retention.test.js +0 -238
  222. 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":"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"}
@@ -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"}