@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.
Files changed (259) 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/health-snapshot-store.d.ts +33 -0
  6. package/dist/db/health-snapshot-store.d.ts.map +1 -0
  7. package/dist/db/health-snapshot-store.js +112 -0
  8. package/dist/db/health-snapshot-store.js.map +1 -0
  9. package/dist/db/lesson-store.d.ts +57 -0
  10. package/dist/db/lesson-store.d.ts.map +1 -0
  11. package/dist/db/lesson-store.js +217 -0
  12. package/dist/db/lesson-store.js.map +1 -0
  13. package/dist/db/migrate.d.ts.map +1 -1
  14. package/dist/db/migrate.js +256 -8
  15. package/dist/db/migrate.js.map +1 -1
  16. package/dist/db/schema.sqlite.d.ts +822 -47
  17. package/dist/db/schema.sqlite.d.ts.map +1 -1
  18. package/dist/db/schema.sqlite.js +79 -4
  19. package/dist/db/schema.sqlite.js.map +1 -1
  20. package/dist/db/session-summary-store.d.ts +45 -0
  21. package/dist/db/session-summary-store.d.ts.map +1 -0
  22. package/dist/db/session-summary-store.js +112 -0
  23. package/dist/db/session-summary-store.js.map +1 -0
  24. package/dist/db/sqlite-store.d.ts +19 -12
  25. package/dist/db/sqlite-store.d.ts.map +1 -1
  26. package/dist/db/sqlite-store.js +145 -44
  27. package/dist/db/sqlite-store.js.map +1 -1
  28. package/dist/db/tenant-scoped-store.d.ts +61 -0
  29. package/dist/db/tenant-scoped-store.d.ts.map +1 -0
  30. package/dist/db/tenant-scoped-store.js +94 -0
  31. package/dist/db/tenant-scoped-store.js.map +1 -0
  32. package/dist/index.d.ts +18 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +78 -5
  35. package/dist/index.js.map +1 -1
  36. package/dist/lib/alert-engine.d.ts +11 -0
  37. package/dist/lib/alert-engine.d.ts.map +1 -1
  38. package/dist/lib/alert-engine.js +65 -24
  39. package/dist/lib/alert-engine.js.map +1 -1
  40. package/dist/lib/analysis/cost-analysis.d.ts +20 -0
  41. package/dist/lib/analysis/cost-analysis.d.ts.map +1 -0
  42. package/dist/lib/analysis/cost-analysis.js +161 -0
  43. package/dist/lib/analysis/cost-analysis.js.map +1 -0
  44. package/dist/lib/analysis/error-patterns.d.ts +26 -0
  45. package/dist/lib/analysis/error-patterns.d.ts.map +1 -0
  46. package/dist/lib/analysis/error-patterns.js +158 -0
  47. package/dist/lib/analysis/error-patterns.js.map +1 -0
  48. package/dist/lib/analysis/index.d.ts +23 -0
  49. package/dist/lib/analysis/index.d.ts.map +1 -0
  50. package/dist/lib/analysis/index.js +144 -0
  51. package/dist/lib/analysis/index.js.map +1 -0
  52. package/dist/lib/analysis/performance-trends.d.ts +19 -0
  53. package/dist/lib/analysis/performance-trends.d.ts.map +1 -0
  54. package/dist/lib/analysis/performance-trends.js +121 -0
  55. package/dist/lib/analysis/performance-trends.js.map +1 -0
  56. package/dist/lib/analysis/tool-sequences.d.ts +19 -0
  57. package/dist/lib/analysis/tool-sequences.d.ts.map +1 -0
  58. package/dist/lib/analysis/tool-sequences.js +148 -0
  59. package/dist/lib/analysis/tool-sequences.js.map +1 -0
  60. package/dist/lib/context/index.d.ts +5 -0
  61. package/dist/lib/context/index.d.ts.map +1 -0
  62. package/dist/lib/context/index.js +5 -0
  63. package/dist/lib/context/index.js.map +1 -0
  64. package/dist/lib/context/retrieval.d.ts +60 -0
  65. package/dist/lib/context/retrieval.d.ts.map +1 -0
  66. package/dist/lib/context/retrieval.js +233 -0
  67. package/dist/lib/context/retrieval.js.map +1 -0
  68. package/dist/lib/embeddings/index.d.ts +31 -0
  69. package/dist/lib/embeddings/index.d.ts.map +1 -0
  70. package/dist/lib/embeddings/index.js +31 -0
  71. package/dist/lib/embeddings/index.js.map +1 -0
  72. package/dist/lib/embeddings/local.d.ts +15 -0
  73. package/dist/lib/embeddings/local.d.ts.map +1 -0
  74. package/dist/lib/embeddings/local.js +65 -0
  75. package/dist/lib/embeddings/local.js.map +1 -0
  76. package/dist/lib/embeddings/math.d.ts +13 -0
  77. package/dist/lib/embeddings/math.d.ts.map +1 -0
  78. package/dist/lib/embeddings/math.js +35 -0
  79. package/dist/lib/embeddings/math.js.map +1 -0
  80. package/dist/lib/embeddings/openai.d.ts +15 -0
  81. package/dist/lib/embeddings/openai.d.ts.map +1 -0
  82. package/dist/lib/embeddings/openai.js +58 -0
  83. package/dist/lib/embeddings/openai.js.map +1 -0
  84. package/dist/lib/embeddings/summarizer.d.ts +26 -0
  85. package/dist/lib/embeddings/summarizer.d.ts.map +1 -0
  86. package/dist/lib/embeddings/summarizer.js +181 -0
  87. package/dist/lib/embeddings/summarizer.js.map +1 -0
  88. package/dist/lib/embeddings/types.d.ts +17 -0
  89. package/dist/lib/embeddings/types.d.ts.map +1 -0
  90. package/dist/lib/embeddings/types.js +5 -0
  91. package/dist/lib/embeddings/types.js.map +1 -0
  92. package/dist/lib/embeddings/worker.d.ts +56 -0
  93. package/dist/lib/embeddings/worker.d.ts.map +1 -0
  94. package/dist/lib/embeddings/worker.js +109 -0
  95. package/dist/lib/embeddings/worker.js.map +1 -0
  96. package/dist/lib/health/computer.d.ts +28 -0
  97. package/dist/lib/health/computer.d.ts.map +1 -0
  98. package/dist/lib/health/computer.js +270 -0
  99. package/dist/lib/health/computer.js.map +1 -0
  100. package/dist/lib/optimization/classifier.d.ts +34 -0
  101. package/dist/lib/optimization/classifier.d.ts.map +1 -0
  102. package/dist/lib/optimization/classifier.js +108 -0
  103. package/dist/lib/optimization/classifier.js.map +1 -0
  104. package/dist/lib/optimization/engine.d.ts +24 -0
  105. package/dist/lib/optimization/engine.d.ts.map +1 -0
  106. package/dist/lib/optimization/engine.js +202 -0
  107. package/dist/lib/optimization/engine.js.map +1 -0
  108. package/dist/lib/optimization/index.d.ts +10 -0
  109. package/dist/lib/optimization/index.d.ts.map +1 -0
  110. package/dist/lib/optimization/index.js +9 -0
  111. package/dist/lib/optimization/index.js.map +1 -0
  112. package/dist/lib/sse.d.ts +1 -0
  113. package/dist/lib/sse.d.ts.map +1 -1
  114. package/dist/lib/sse.js +8 -1
  115. package/dist/lib/sse.js.map +1 -1
  116. package/dist/middleware/auth.d.ts +1 -0
  117. package/dist/middleware/auth.d.ts.map +1 -1
  118. package/dist/middleware/auth.js +2 -1
  119. package/dist/middleware/auth.js.map +1 -1
  120. package/dist/routes/agents.d.ts.map +1 -1
  121. package/dist/routes/agents.js +6 -3
  122. package/dist/routes/agents.js.map +1 -1
  123. package/dist/routes/alerts.d.ts.map +1 -1
  124. package/dist/routes/alerts.js +15 -7
  125. package/dist/routes/alerts.js.map +1 -1
  126. package/dist/routes/analytics.d.ts.map +1 -1
  127. package/dist/routes/analytics.js +16 -2
  128. package/dist/routes/analytics.js.map +1 -1
  129. package/dist/routes/api-keys.d.ts.map +1 -1
  130. package/dist/routes/api-keys.js +30 -5
  131. package/dist/routes/api-keys.js.map +1 -1
  132. package/dist/routes/context.d.ts +23 -0
  133. package/dist/routes/context.d.ts.map +1 -0
  134. package/dist/routes/context.js +52 -0
  135. package/dist/routes/context.js.map +1 -0
  136. package/dist/routes/events.d.ts +6 -1
  137. package/dist/routes/events.d.ts.map +1 -1
  138. package/dist/routes/events.js +61 -6
  139. package/dist/routes/events.js.map +1 -1
  140. package/dist/routes/health.d.ts +21 -0
  141. package/dist/routes/health.d.ts.map +1 -0
  142. package/dist/routes/health.js +142 -0
  143. package/dist/routes/health.js.map +1 -0
  144. package/dist/routes/ingest.d.ts +6 -0
  145. package/dist/routes/ingest.d.ts.map +1 -1
  146. package/dist/routes/ingest.js +23 -4
  147. package/dist/routes/ingest.js.map +1 -1
  148. package/dist/routes/lessons.d.ts +19 -0
  149. package/dist/routes/lessons.d.ts.map +1 -0
  150. package/dist/routes/lessons.js +164 -0
  151. package/dist/routes/lessons.js.map +1 -0
  152. package/dist/routes/optimize.d.ts +15 -0
  153. package/dist/routes/optimize.d.ts.map +1 -0
  154. package/dist/routes/optimize.js +55 -0
  155. package/dist/routes/optimize.js.map +1 -0
  156. package/dist/routes/recall.d.ts +22 -0
  157. package/dist/routes/recall.d.ts.map +1 -0
  158. package/dist/routes/recall.js +91 -0
  159. package/dist/routes/recall.js.map +1 -0
  160. package/dist/routes/reflect.d.ts +15 -0
  161. package/dist/routes/reflect.d.ts.map +1 -0
  162. package/dist/routes/reflect.js +54 -0
  163. package/dist/routes/reflect.js.map +1 -0
  164. package/dist/routes/sessions.d.ts.map +1 -1
  165. package/dist/routes/sessions.js +8 -6
  166. package/dist/routes/sessions.js.map +1 -1
  167. package/dist/routes/stats.d.ts.map +1 -1
  168. package/dist/routes/stats.js +3 -1
  169. package/dist/routes/stats.js.map +1 -1
  170. package/dist/routes/stream.d.ts +9 -2
  171. package/dist/routes/stream.d.ts.map +1 -1
  172. package/dist/routes/stream.js +55 -2
  173. package/dist/routes/stream.js.map +1 -1
  174. package/dist/routes/tenant-helper.d.ts +20 -0
  175. package/dist/routes/tenant-helper.d.ts.map +1 -0
  176. package/dist/routes/tenant-helper.js +35 -0
  177. package/dist/routes/tenant-helper.js.map +1 -0
  178. package/package.json +11 -11
  179. package/LICENSE +0 -21
  180. package/dist/__tests__/agents-stats.test.d.ts +0 -5
  181. package/dist/__tests__/agents-stats.test.d.ts.map +0 -1
  182. package/dist/__tests__/agents-stats.test.js +0 -134
  183. package/dist/__tests__/agents-stats.test.js.map +0 -1
  184. package/dist/__tests__/alerts.test.d.ts +0 -5
  185. package/dist/__tests__/alerts.test.d.ts.map +0 -1
  186. package/dist/__tests__/alerts.test.js +0 -245
  187. package/dist/__tests__/alerts.test.js.map +0 -1
  188. package/dist/__tests__/analytics.test.d.ts +0 -5
  189. package/dist/__tests__/analytics.test.d.ts.map +0 -1
  190. package/dist/__tests__/analytics.test.js +0 -218
  191. package/dist/__tests__/analytics.test.js.map +0 -1
  192. package/dist/__tests__/api-keys.test.d.ts +0 -5
  193. package/dist/__tests__/api-keys.test.d.ts.map +0 -1
  194. package/dist/__tests__/api-keys.test.js +0 -118
  195. package/dist/__tests__/api-keys.test.js.map +0 -1
  196. package/dist/__tests__/auth-no-db.test.d.ts +0 -2
  197. package/dist/__tests__/auth-no-db.test.d.ts.map +0 -1
  198. package/dist/__tests__/auth-no-db.test.js +0 -43
  199. package/dist/__tests__/auth-no-db.test.js.map +0 -1
  200. package/dist/__tests__/auth.test.d.ts +0 -5
  201. package/dist/__tests__/auth.test.d.ts.map +0 -1
  202. package/dist/__tests__/auth.test.js +0 -86
  203. package/dist/__tests__/auth.test.js.map +0 -1
  204. package/dist/__tests__/config.test.d.ts +0 -2
  205. package/dist/__tests__/config.test.d.ts.map +0 -1
  206. package/dist/__tests__/config.test.js +0 -37
  207. package/dist/__tests__/config.test.js.map +0 -1
  208. package/dist/__tests__/events-ingest.test.d.ts +0 -5
  209. package/dist/__tests__/events-ingest.test.d.ts.map +0 -1
  210. package/dist/__tests__/events-ingest.test.js +0 -248
  211. package/dist/__tests__/events-ingest.test.js.map +0 -1
  212. package/dist/__tests__/events-query.test.d.ts +0 -5
  213. package/dist/__tests__/events-query.test.d.ts.map +0 -1
  214. package/dist/__tests__/events-query.test.js +0 -205
  215. package/dist/__tests__/events-query.test.js.map +0 -1
  216. package/dist/__tests__/health.test.d.ts +0 -5
  217. package/dist/__tests__/health.test.d.ts.map +0 -1
  218. package/dist/__tests__/health.test.js +0 -40
  219. package/dist/__tests__/health.test.js.map +0 -1
  220. package/dist/__tests__/ingest.test.d.ts +0 -8
  221. package/dist/__tests__/ingest.test.d.ts.map +0 -1
  222. package/dist/__tests__/ingest.test.js +0 -469
  223. package/dist/__tests__/ingest.test.js.map +0 -1
  224. package/dist/__tests__/llm-tracking.test.d.ts +0 -10
  225. package/dist/__tests__/llm-tracking.test.d.ts.map +0 -1
  226. package/dist/__tests__/llm-tracking.test.js +0 -602
  227. package/dist/__tests__/llm-tracking.test.js.map +0 -1
  228. package/dist/__tests__/sessions.test.d.ts +0 -5
  229. package/dist/__tests__/sessions.test.d.ts.map +0 -1
  230. package/dist/__tests__/sessions.test.js +0 -176
  231. package/dist/__tests__/sessions.test.js.map +0 -1
  232. package/dist/__tests__/stream.test.d.ts +0 -5
  233. package/dist/__tests__/stream.test.d.ts.map +0 -1
  234. package/dist/__tests__/stream.test.js +0 -352
  235. package/dist/__tests__/stream.test.js.map +0 -1
  236. package/dist/__tests__/test-helpers.d.ts +0 -24
  237. package/dist/__tests__/test-helpers.d.ts.map +0 -1
  238. package/dist/__tests__/test-helpers.js +0 -45
  239. package/dist/__tests__/test-helpers.js.map +0 -1
  240. package/dist/db/__tests__/init.test.d.ts +0 -2
  241. package/dist/db/__tests__/init.test.d.ts.map +0 -1
  242. package/dist/db/__tests__/init.test.js +0 -73
  243. package/dist/db/__tests__/init.test.js.map +0 -1
  244. package/dist/db/__tests__/sqlite-store-read.test.d.ts +0 -2
  245. package/dist/db/__tests__/sqlite-store-read.test.d.ts.map +0 -1
  246. package/dist/db/__tests__/sqlite-store-read.test.js +0 -749
  247. package/dist/db/__tests__/sqlite-store-read.test.js.map +0 -1
  248. package/dist/db/__tests__/sqlite-store-write.test.d.ts +0 -2
  249. package/dist/db/__tests__/sqlite-store-write.test.d.ts.map +0 -1
  250. package/dist/db/__tests__/sqlite-store-write.test.js +0 -418
  251. package/dist/db/__tests__/sqlite-store-write.test.js.map +0 -1
  252. package/dist/lib/__tests__/alert-engine.test.d.ts +0 -5
  253. package/dist/lib/__tests__/alert-engine.test.d.ts.map +0 -1
  254. package/dist/lib/__tests__/alert-engine.test.js +0 -211
  255. package/dist/lib/__tests__/alert-engine.test.js.map +0 -1
  256. package/dist/lib/__tests__/retention.test.d.ts +0 -2
  257. package/dist/lib/__tests__/retention.test.d.ts.map +0 -1
  258. package/dist/lib/__tests__/retention.test.js +0 -238
  259. package/dist/lib/__tests__/retention.test.js.map +0 -1
@@ -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,CAiHlC"}
@@ -0,0 +1,121 @@
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: 1000,
17
+ });
18
+ // Track whether the query hit its limit (results may be truncated)
19
+ const possiblyTruncated = sessionResult.sessions.length === 1000;
20
+ const sessions = sessionResult.sessions;
21
+ const sessionsAnalyzed = sessions.length;
22
+ // Count events for metadata
23
+ const eventCount = await store.countEvents({
24
+ agentId: opts.agentId,
25
+ from: opts.from,
26
+ to: opts.to,
27
+ });
28
+ const timeRange = {
29
+ from: sessions.length > 0
30
+ ? sessions.reduce((min, s) => (s.startedAt < min ? s.startedAt : min), sessions[0].startedAt)
31
+ : (opts.from ?? ''),
32
+ to: sessions.length > 0
33
+ ? sessions.reduce((max, s) => (s.startedAt > max ? s.startedAt : max), sessions[0].startedAt)
34
+ : (opts.to ?? ''),
35
+ };
36
+ // Current aggregate metrics
37
+ const successCount = sessions.filter((s) => s.errorCount === 0).length;
38
+ const successRate = sessionsAnalyzed > 0 ? successCount / sessionsAnalyzed : 0;
39
+ const durations = sessions
40
+ .filter((s) => s.endedAt && s.startedAt)
41
+ .map((s) => new Date(s.endedAt).getTime() - new Date(s.startedAt).getTime());
42
+ const avgDuration = durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0;
43
+ const avgToolCalls = sessionsAnalyzed > 0
44
+ ? sessions.reduce((sum, s) => sum + s.toolCallCount, 0) / sessionsAnalyzed
45
+ : 0;
46
+ const avgErrors = sessionsAnalyzed > 0
47
+ ? sessions.reduce((sum, s) => sum + s.errorCount, 0) / sessionsAnalyzed
48
+ : 0;
49
+ // Bucket by day for trend lines
50
+ const dailyMap = new Map();
51
+ for (const session of sessions) {
52
+ const date = session.startedAt.slice(0, 10); // YYYY-MM-DD
53
+ const entry = dailyMap.get(date) ?? { sessions: [] };
54
+ entry.sessions.push(session);
55
+ dailyMap.set(date, entry);
56
+ }
57
+ const limit = opts.limit ?? 20;
58
+ const allBuckets = Array.from(dailyMap.entries())
59
+ .map(([date, data]) => {
60
+ const daySessions = data.sessions;
61
+ const daySuccess = daySessions.filter((s) => s.errorCount === 0).length;
62
+ const dayDurations = daySessions
63
+ .filter((s) => s.endedAt && s.startedAt)
64
+ .map((s) => new Date(s.endedAt).getTime() - new Date(s.startedAt).getTime());
65
+ return {
66
+ date,
67
+ successRate: daySessions.length > 0 ? daySuccess / daySessions.length : 0,
68
+ duration: dayDurations.length > 0
69
+ ? dayDurations.reduce((a, b) => a + b, 0) / dayDurations.length
70
+ : 0,
71
+ toolCalls: daySessions.length > 0
72
+ ? daySessions.reduce((sum, s) => sum + s.toolCallCount, 0) / daySessions.length
73
+ : 0,
74
+ errors: daySessions.length > 0
75
+ ? daySessions.reduce((sum, s) => sum + s.errorCount, 0) / daySessions.length
76
+ : 0,
77
+ };
78
+ })
79
+ .sort((a, b) => a.date.localeCompare(b.date));
80
+ // Respect limit on trend buckets
81
+ const trends = allBuckets.slice(-limit);
82
+ // Trend assessment: compare recent half vs historical half
83
+ const assessment = detectPerformanceTrend(allBuckets);
84
+ return {
85
+ current: {
86
+ successRate: Math.round(successRate * 10000) / 10000,
87
+ avgDuration: Math.round(avgDuration),
88
+ avgToolCalls: Math.round(avgToolCalls * 100) / 100,
89
+ avgErrors: Math.round(avgErrors * 100) / 100,
90
+ },
91
+ trends,
92
+ assessment,
93
+ metadata: {
94
+ sessionsAnalyzed,
95
+ eventsAnalyzed: eventCount,
96
+ timeRange,
97
+ ...(possiblyTruncated ? { truncated: true, note: 'Results may be incomplete — query limit reached' } : {}),
98
+ },
99
+ };
100
+ }
101
+ /**
102
+ * Detect performance trend by comparing recent vs historical success rates.
103
+ */
104
+ function detectPerformanceTrend(buckets) {
105
+ if (buckets.length < 2)
106
+ return 'stable';
107
+ const midpoint = Math.floor(buckets.length / 2);
108
+ const recent = buckets.slice(midpoint);
109
+ const historical = buckets.slice(0, midpoint);
110
+ if (historical.length === 0 || recent.length === 0)
111
+ return 'stable';
112
+ const recentAvgSuccess = recent.reduce((s, b) => s + b.successRate, 0) / recent.length;
113
+ const historicalAvgSuccess = historical.reduce((s, b) => s + b.successRate, 0) / historical.length;
114
+ const diff = recentAvgSuccess - historicalAvgSuccess;
115
+ if (diff > 0.05)
116
+ return 'improving';
117
+ if (diff < -0.05)
118
+ return 'degrading';
119
+ return 'stable';
120
+ }
121
+ //# 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,CAmK7B"}
@@ -0,0 +1,148 @@
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
+ /**
8
+ * Analyze tool usage sequences across sessions.
9
+ */
10
+ export async function analyzeToolSequences(store, opts = {}) {
11
+ const limit = opts.limit ?? 20;
12
+ // Query tool_call events
13
+ const toolCallResult = await store.queryEvents({
14
+ agentId: opts.agentId,
15
+ from: opts.from,
16
+ to: opts.to,
17
+ eventType: 'tool_call',
18
+ limit: 1000,
19
+ order: 'asc',
20
+ });
21
+ // Also query tool_error events to identify error-prone sequences
22
+ const toolErrorResult = await store.queryEvents({
23
+ agentId: opts.agentId,
24
+ from: opts.from,
25
+ to: opts.to,
26
+ eventType: 'tool_error',
27
+ limit: 1000,
28
+ order: 'asc',
29
+ });
30
+ // Track whether either query hit its limit (results may be truncated)
31
+ const possiblyTruncated = toolCallResult.events.length === 1000 || toolErrorResult.events.length === 1000;
32
+ const allToolCalls = toolCallResult.events;
33
+ const allToolErrors = toolErrorResult.events;
34
+ const eventsAnalyzed = allToolCalls.length + allToolErrors.length;
35
+ const timeRange = {
36
+ from: allToolCalls.length > 0 ? allToolCalls[0].timestamp : (opts.from ?? ''),
37
+ to: allToolCalls.length > 0 ? allToolCalls[allToolCalls.length - 1].timestamp : (opts.to ?? ''),
38
+ };
39
+ // Group tool_call events by session
40
+ const sessionToolCalls = new Map();
41
+ for (const event of allToolCalls) {
42
+ const list = sessionToolCalls.get(event.sessionId) ?? [];
43
+ list.push(event);
44
+ sessionToolCalls.set(event.sessionId, list);
45
+ }
46
+ // Group tool_error events by session for error-prone detection
47
+ const sessionErrors = new Map();
48
+ for (const event of allToolErrors) {
49
+ const list = sessionErrors.get(event.sessionId) ?? [];
50
+ list.push(event);
51
+ sessionErrors.set(event.sessionId, list);
52
+ }
53
+ // Extract tool names per session (ordered by timestamp)
54
+ const uniqueToolsSet = new Set();
55
+ let totalCalls = 0;
56
+ const sessionToolNames = new Map();
57
+ for (const [sessionId, calls] of sessionToolCalls) {
58
+ const names = calls.map((e) => {
59
+ const p = e.payload;
60
+ const name = String(p.toolName ?? 'unknown');
61
+ uniqueToolsSet.add(name);
62
+ return name;
63
+ });
64
+ sessionToolNames.set(sessionId, names);
65
+ totalCalls += names.length;
66
+ }
67
+ // Extract N-grams and count frequencies
68
+ // key = tools joined by "→", value = { frequency across sessions, set of sessions, errorFollowed count }
69
+ const ngramMap = new Map();
70
+ for (const [sessionId, toolNames] of sessionToolNames) {
71
+ const sessionErrorEvents = sessionErrors.get(sessionId) ?? [];
72
+ // Get the full session timeline for error-proximity checks
73
+ const sessionCalls = sessionToolCalls.get(sessionId) ?? [];
74
+ // Extract 2-grams and 3-grams
75
+ const seenInSession = new Set(); // Avoid counting same ngram twice per session
76
+ for (const n of [2, 3]) {
77
+ for (let i = 0; i <= toolNames.length - n; i++) {
78
+ const ngram = toolNames.slice(i, i + n);
79
+ const key = ngram.join('→');
80
+ if (!seenInSession.has(key)) {
81
+ seenInSession.add(key);
82
+ let entry = ngramMap.get(key);
83
+ if (!entry) {
84
+ entry = { tools: ngram, frequency: 0, sessions: new Set(), errorFollowed: 0 };
85
+ ngramMap.set(key, entry);
86
+ }
87
+ entry.frequency++;
88
+ entry.sessions.add(sessionId);
89
+ }
90
+ // Check if this ngram is followed by an error within 2 events
91
+ // The last event of the ngram is at index i + n - 1 in sessionCalls
92
+ const lastCallInNgram = sessionCalls[i + n - 1];
93
+ if (lastCallInNgram) {
94
+ const isErrorFollowed = sessionErrorEvents.some((errEvt) => {
95
+ // Error must be after the last tool call in ngram
96
+ // and within 2 "event positions" (by timestamp)
97
+ if (errEvt.timestamp < lastCallInNgram.timestamp)
98
+ return false;
99
+ // Count how many tool_call events are between the last ngram call and the error
100
+ const callsAfter = sessionCalls.filter((c) => c.timestamp > lastCallInNgram.timestamp && c.timestamp <= errEvt.timestamp);
101
+ return callsAfter.length <= 2;
102
+ });
103
+ if (isErrorFollowed) {
104
+ // We only count this once per session per ngram for error rate calculation
105
+ // But we need to track total occurrences vs error-followed
106
+ let entry = ngramMap.get(key);
107
+ // Track on first occurrence in session
108
+ if (seenInSession.has(`${key}:error-checked`))
109
+ continue;
110
+ seenInSession.add(`${key}:error-checked`);
111
+ entry.errorFollowed++;
112
+ }
113
+ }
114
+ }
115
+ }
116
+ }
117
+ // Calculate stats
118
+ const sessionLengths = Array.from(sessionToolNames.values()).map((n) => n.length);
119
+ const avgSequenceLength = sessionLengths.length > 0
120
+ ? sessionLengths.reduce((a, b) => a + b, 0) / sessionLengths.length
121
+ : 0;
122
+ // Build sorted results
123
+ const sequences = Array.from(ngramMap.values())
124
+ .map((entry) => ({
125
+ tools: entry.tools,
126
+ frequency: entry.frequency,
127
+ sessions: entry.sessions.size,
128
+ errorRate: entry.sessions.size > 0
129
+ ? entry.errorFollowed / entry.sessions.size
130
+ : 0,
131
+ }))
132
+ .sort((a, b) => b.frequency - a.frequency)
133
+ .slice(0, limit);
134
+ return {
135
+ sequences,
136
+ stats: {
137
+ avgSequenceLength: Math.round(avgSequenceLength * 100) / 100,
138
+ uniqueTools: uniqueToolsSet.size,
139
+ totalCalls,
140
+ },
141
+ metadata: {
142
+ eventsAnalyzed,
143
+ timeRange,
144
+ ...(possiblyTruncated ? { truncated: true, note: 'Results may be incomplete — query limit reached' } : {}),
145
+ },
146
+ };
147
+ }
148
+ //# sourceMappingURL=tool-sequences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-sequences.js","sourceRoot":"","sources":["../../../src/lib/analysis/tool-sequences.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAkB,EAClB,OAAyB,EAAE;IAE3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAE/B,yBAAyB;IACzB,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;QAC7C,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,iEAAiE;IACjE,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;QAC9C,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,sEAAsE;IACtE,MAAM,iBAAiB,GACrB,cAAc,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;IAElF,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC;IAC3C,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC;IAE7C,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;IAClE,MAAM,SAAS,GAAG;QAChB,IAAI,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9E,EAAE,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;KACjG,CAAC;IAEF,oCAAoC;IACpC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC7D,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,+DAA+D;IAC/D,MAAM,aAAa,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,wDAAwD;IACxD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAErD,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAkC,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;YAC7C,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvC,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,wCAAwC;IACxC,yGAAyG;IACzG,MAAM,QAAQ,GAAG,IAAI,GAAG,EAGrB,CAAC;IAEJ,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACtD,MAAM,kBAAkB,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAE9D,2DAA2D;QAC3D,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAE3D,8BAA8B;QAC9B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC,CAAC,8CAA8C;QACvF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAE5B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACvB,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;wBAC9E,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBAC3B,CAAC;oBACD,KAAK,CAAC,SAAS,EAAE,CAAC;oBAClB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAChC,CAAC;gBAED,8DAA8D;gBAC9D,oEAAoE;gBACpE,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChD,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,eAAe,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;wBACzD,kDAAkD;wBAClD,gDAAgD;wBAChD,IAAI,MAAM,CAAC,SAAS,GAAG,eAAe,CAAC,SAAS;4BAAE,OAAO,KAAK,CAAC;wBAE/D,gFAAgF;wBAChF,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,eAAe,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAClF,CAAC;wBACF,OAAO,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;oBAChC,CAAC,CAAC,CAAC;oBAEH,IAAI,eAAe,EAAE,CAAC;wBACpB,2EAA2E;wBAC3E,2DAA2D;wBAC3D,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;wBAC/B,uCAAuC;wBACvC,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,GAAG,gBAAgB,CAAC;4BAAE,SAAS;wBACxD,aAAa,CAAC,GAAG,CAAC,GAAG,GAAG,gBAAgB,CAAC,CAAC;wBAC1C,KAAK,CAAC,aAAa,EAAE,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAClF,MAAM,iBAAiB,GACrB,cAAc,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM;QACnE,CAAC,CAAC,CAAC,CAAC;IAER,uBAAuB;IACvB,MAAM,SAAS,GAAmB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;SAC5D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACf,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;QAC7B,SAAS,EACP,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;YACrB,CAAC,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI;YAC3C,CAAC,CAAC,CAAC;KACR,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;SACzC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnB,OAAO;QACL,SAAS;QACT,KAAK,EAAE;YACL,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,GAAG,CAAC,GAAG,GAAG;YAC5D,WAAW,EAAE,cAAc,CAAC,IAAI;YAChC,UAAU;SACX;QACD,QAAQ,EAAE;YACR,cAAc;YACd,SAAS;YACT,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,iDAAiD,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3G;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Context Retrieval — exports (Epic 5)
3
+ */
4
+ export { ContextRetriever } from './retrieval.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/context/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Context Retrieval — exports (Epic 5)
3
+ */
4
+ export { ContextRetriever } from './retrieval.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/context/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Context Retriever (Story 5.2)
3
+ *
4
+ * Combines semantic search over session summaries, lesson search,
5
+ * and key event retrieval to build cross-session context.
6
+ *
7
+ * Falls back to text search when embeddings are unavailable.
8
+ */
9
+ import type { ContextQuery, ContextResult } from '@agentlensai/core';
10
+ import type { EmbeddingStore } from '../../db/embedding-store.js';
11
+ import type { EmbeddingService } from '../embeddings/index.js';
12
+ import type { SessionSummaryStore } from '../../db/session-summary-store.js';
13
+ import type { LessonStore } from '../../db/lesson-store.js';
14
+ import type { IEventStore } from '@agentlensai/core';
15
+ export declare class ContextRetriever {
16
+ private readonly embeddingStore;
17
+ private readonly embeddingService;
18
+ private readonly sessionSummaryStore;
19
+ private readonly lessonStore;
20
+ private readonly eventStore;
21
+ constructor(embeddingStore: EmbeddingStore | null, embeddingService: EmbeddingService | null, sessionSummaryStore: SessionSummaryStore, lessonStore: LessonStore, eventStore: IEventStore);
22
+ /**
23
+ * Retrieve cross-session context by combining:
24
+ * 1. Semantic search over session summary embeddings
25
+ * 2. Lesson search (semantic or text-based)
26
+ * 3. Key events for matching sessions
27
+ * 4. Ranking by relevance + recency
28
+ *
29
+ * TODO: userId filtering is accepted in the ContextQuery type but not yet
30
+ * implemented. Requires schema changes to associate sessions/events with
31
+ * a userId before we can filter here. Deferred to a future release.
32
+ */
33
+ retrieve(tenantId: string, query: ContextQuery): Promise<ContextResult>;
34
+ /**
35
+ * Find relevant sessions using semantic search (with text search fallback).
36
+ */
37
+ private findRelevantSessions;
38
+ /**
39
+ * Filter semantic search results by agentId/userId and rank by relevance + recency.
40
+ */
41
+ private filterAndRankSessions;
42
+ /**
43
+ * Text search fallback when embeddings are unavailable.
44
+ */
45
+ private textSearchSessions;
46
+ /**
47
+ * Find relevant lessons using semantic search (with text search fallback).
48
+ */
49
+ private findRelevantLessons;
50
+ /**
51
+ * Enrich a session result with key events from the timeline.
52
+ */
53
+ private enrichSessionWithEvents;
54
+ /**
55
+ * Compute a recency boost (0-1) based on how recent the content is.
56
+ * Items from the last 24h get ~1.0, items from 30+ days ago get ~0.0.
57
+ */
58
+ private computeRecencyBoost;
59
+ }
60
+ //# sourceMappingURL=retrieval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrieval.d.ts","sourceRoot":"","sources":["../../../src/lib/context/retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAkD,MAAM,mBAAmB,CAAC;AACrH,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAwB,MAAM,mCAAmC,CAAC;AACnG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AASrD,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAJV,cAAc,EAAE,cAAc,GAAG,IAAI,EACrC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,EACzC,mBAAmB,EAAE,mBAAmB,EACxC,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,WAAW;IAG1C;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAsB7E;;OAEG;YACW,oBAAoB;IA6BlC;;OAEG;YACW,qBAAqB;IAwCnC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;YACW,mBAAmB;IAwDjC;;OAEG;YACW,uBAAuB;IA+CrC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAU5B"}