@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,233 @@
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 { summarizeEvent } from '../embeddings/summarizer.js';
10
+ /** Default maximum results */
11
+ const DEFAULT_LIMIT = 10;
12
+ /** Maximum key events per session in results */
13
+ const MAX_KEY_EVENTS = 5;
14
+ export class ContextRetriever {
15
+ embeddingStore;
16
+ embeddingService;
17
+ sessionSummaryStore;
18
+ lessonStore;
19
+ eventStore;
20
+ constructor(embeddingStore, embeddingService, sessionSummaryStore, lessonStore, eventStore) {
21
+ this.embeddingStore = embeddingStore;
22
+ this.embeddingService = embeddingService;
23
+ this.sessionSummaryStore = sessionSummaryStore;
24
+ this.lessonStore = lessonStore;
25
+ this.eventStore = eventStore;
26
+ }
27
+ /**
28
+ * Retrieve cross-session context by combining:
29
+ * 1. Semantic search over session summary embeddings
30
+ * 2. Lesson search (semantic or text-based)
31
+ * 3. Key events for matching sessions
32
+ * 4. Ranking by relevance + recency
33
+ *
34
+ * TODO: userId filtering is accepted in the ContextQuery type but not yet
35
+ * implemented. Requires schema changes to associate sessions/events with
36
+ * a userId before we can filter here. Deferred to a future release.
37
+ */
38
+ async retrieve(tenantId, query) {
39
+ const limit = query.limit ?? DEFAULT_LIMIT;
40
+ // Step 1: Find relevant sessions
41
+ const sessionResults = await this.findRelevantSessions(tenantId, query, limit);
42
+ // Step 2: Find relevant lessons
43
+ const lessonResults = await this.findRelevantLessons(tenantId, query, limit);
44
+ // Step 3: For each matching session, get key events
45
+ const sessionsWithEvents = await Promise.all(sessionResults.map((s) => this.enrichSessionWithEvents(tenantId, s)));
46
+ return {
47
+ topic: query.topic,
48
+ sessions: sessionsWithEvents,
49
+ lessons: lessonResults,
50
+ totalSessions: sessionsWithEvents.length,
51
+ };
52
+ }
53
+ /**
54
+ * Find relevant sessions using semantic search (with text search fallback).
55
+ */
56
+ async findRelevantSessions(tenantId, query, limit) {
57
+ // Try semantic search first
58
+ if (this.embeddingService && this.embeddingStore) {
59
+ try {
60
+ const queryVector = await this.embeddingService.embed(query.topic);
61
+ const results = this.embeddingStore.similaritySearch(tenantId, queryVector, {
62
+ sourceType: 'session',
63
+ from: query.from,
64
+ to: query.to,
65
+ limit: limit * 2, // over-fetch for post-filtering
66
+ minScore: 0.3,
67
+ });
68
+ if (results.length > 0) {
69
+ return this.filterAndRankSessions(tenantId, results, query, limit);
70
+ }
71
+ }
72
+ catch {
73
+ // Fall through to text search
74
+ }
75
+ }
76
+ // Fallback: text search on session summaries
77
+ return this.textSearchSessions(tenantId, query, limit);
78
+ }
79
+ /**
80
+ * Filter semantic search results by agentId/userId and rank by relevance + recency.
81
+ */
82
+ async filterAndRankSessions(tenantId, results, query, limit) {
83
+ const sessions = [];
84
+ for (const result of results) {
85
+ // sourceId is the sessionId for session-scope embeddings
86
+ const sessionId = result.sourceId;
87
+ // Filter by agentId if provided
88
+ if (query.agentId) {
89
+ const session = await this.eventStore.getSession(sessionId);
90
+ if (!session || session.agentId !== query.agentId)
91
+ continue;
92
+ }
93
+ // Get the summary text from the store (richer than embedding text)
94
+ const summaryRecord = this.sessionSummaryStore.get(tenantId, sessionId);
95
+ const summary = summaryRecord?.summary ?? result.text;
96
+ // Recency boost: more recent sessions score slightly higher
97
+ const recencyBoost = this.computeRecencyBoost(result.createdAt);
98
+ const adjustedScore = result.score * 0.85 + recencyBoost * 0.15;
99
+ sessions.push({
100
+ sessionId,
101
+ summary,
102
+ relevanceScore: Math.round(adjustedScore * 10000) / 10000,
103
+ });
104
+ if (sessions.length >= limit)
105
+ break;
106
+ }
107
+ // Sort by adjusted score descending
108
+ sessions.sort((a, b) => b.relevanceScore - a.relevanceScore);
109
+ return sessions.slice(0, limit);
110
+ }
111
+ /**
112
+ * Text search fallback when embeddings are unavailable.
113
+ */
114
+ textSearchSessions(tenantId, query, limit) {
115
+ const results = this.sessionSummaryStore.search(tenantId, query.topic, limit * 2);
116
+ let filtered = results;
117
+ // If agentId filter is needed, we need to cross-reference sessions
118
+ // For text search, we can't easily filter by agentId synchronously here,
119
+ // so we'll skip that filter for the text fallback (best effort)
120
+ return filtered.slice(0, limit).map((r, index) => ({
121
+ sessionId: r.sessionId,
122
+ summary: r.summary,
123
+ // Assign a decreasing relevance score for text search results (1.0 → 0.5)
124
+ relevanceScore: Math.round((1.0 - index * (0.5 / Math.max(limit, 1))) * 10000) / 10000,
125
+ }));
126
+ }
127
+ /**
128
+ * Find relevant lessons using semantic search (with text search fallback).
129
+ */
130
+ async findRelevantLessons(tenantId, query, limit) {
131
+ // Try semantic search first
132
+ if (this.embeddingService && this.embeddingStore) {
133
+ try {
134
+ const queryVector = await this.embeddingService.embed(query.topic);
135
+ const results = this.embeddingStore.similaritySearch(tenantId, queryVector, {
136
+ sourceType: 'lesson',
137
+ limit,
138
+ minScore: 0.3,
139
+ });
140
+ if (results.length > 0) {
141
+ const lessons = [];
142
+ for (const result of results) {
143
+ const lesson = this.lessonStore.get(tenantId, result.sourceId);
144
+ if (lesson) {
145
+ lessons.push({
146
+ id: lesson.id,
147
+ title: lesson.title,
148
+ content: lesson.content,
149
+ category: lesson.category,
150
+ importance: lesson.importance,
151
+ relevanceScore: Math.round(result.score * 10000) / 10000,
152
+ });
153
+ }
154
+ }
155
+ return lessons;
156
+ }
157
+ }
158
+ catch {
159
+ // Fall through to text search
160
+ }
161
+ }
162
+ // Fallback: text search on lessons
163
+ const textResults = this.lessonStore.list(tenantId, {
164
+ search: query.topic,
165
+ limit,
166
+ });
167
+ return textResults.map((lesson, index) => ({
168
+ id: lesson.id,
169
+ title: lesson.title,
170
+ content: lesson.content,
171
+ category: lesson.category,
172
+ importance: lesson.importance,
173
+ // Assign decreasing scores for text search results
174
+ relevanceScore: Math.round((1.0 - index * (0.5 / Math.max(limit, 1))) * 10000) / 10000,
175
+ }));
176
+ }
177
+ /**
178
+ * Enrich a session result with key events from the timeline.
179
+ */
180
+ async enrichSessionWithEvents(tenantId, session) {
181
+ // Get session metadata for startedAt/endedAt/agentId
182
+ const sessionRecord = await this.eventStore.getSession(session.sessionId);
183
+ // Get timeline events for key event extraction
184
+ let keyEvents = [];
185
+ try {
186
+ const timeline = await this.eventStore.getSessionTimeline(session.sessionId);
187
+ // Extract key events: errors, tool calls, session boundaries
188
+ const significant = timeline.filter((e) => e.eventType === 'tool_error' ||
189
+ e.eventType === 'tool_call' ||
190
+ e.eventType === 'session_started' ||
191
+ e.eventType === 'session_ended' ||
192
+ e.severity === 'error' ||
193
+ e.severity === 'critical');
194
+ keyEvents = significant.slice(0, MAX_KEY_EVENTS).map((e) => {
195
+ const eventSummary = summarizeEvent(e) ?? `${e.eventType}`;
196
+ return {
197
+ id: e.id,
198
+ eventType: e.eventType,
199
+ summary: eventSummary,
200
+ timestamp: e.timestamp,
201
+ };
202
+ });
203
+ }
204
+ catch {
205
+ // Non-critical — return session without events
206
+ }
207
+ return {
208
+ sessionId: session.sessionId,
209
+ agentId: sessionRecord?.agentId ?? '',
210
+ summary: session.summary,
211
+ relevanceScore: session.relevanceScore,
212
+ startedAt: sessionRecord?.startedAt ?? '',
213
+ endedAt: sessionRecord?.endedAt,
214
+ keyEvents,
215
+ };
216
+ }
217
+ /**
218
+ * Compute a recency boost (0-1) based on how recent the content is.
219
+ * Items from the last 24h get ~1.0, items from 30+ days ago get ~0.0.
220
+ */
221
+ computeRecencyBoost(createdAt) {
222
+ const now = Date.now();
223
+ const created = new Date(createdAt).getTime();
224
+ const ageMs = now - created;
225
+ const thirtyDaysMs = 30 * 24 * 60 * 60 * 1000;
226
+ if (ageMs <= 0)
227
+ return 1.0;
228
+ if (ageMs >= thirtyDaysMs)
229
+ return 0.0;
230
+ return 1.0 - ageMs / thirtyDaysMs;
231
+ }
232
+ }
233
+ //# sourceMappingURL=retrieval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrieval.js","sourceRoot":"","sources":["../../../src/lib/context/retrieval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Embedding Service — interface and factory (Story 2.1)
3
+ *
4
+ * Supports local (Xenova/transformers.js ONNX) and OpenAI backends.
5
+ */
6
+ import type { EmbeddingServiceConfig } from './types.js';
7
+ export type { EmbeddingVector, EmbeddingBackend, EmbeddingServiceConfig } from './types.js';
8
+ export { cosineSimilarity } from './math.js';
9
+ /**
10
+ * Embedding service interface — embed text into vector space.
11
+ */
12
+ export interface EmbeddingService {
13
+ /** Embed a single text string */
14
+ embed(text: string): Promise<Float32Array>;
15
+ /** Embed a batch of texts */
16
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
17
+ /** Dimensionality of the output vectors */
18
+ readonly dimensions: number;
19
+ /** Name of the model used */
20
+ readonly modelName: string;
21
+ }
22
+ /**
23
+ * Create an embedding service from config or environment variables.
24
+ *
25
+ * Environment variables:
26
+ * - AGENTLENS_EMBEDDING_BACKEND: 'local' | 'openai' (default: 'local')
27
+ * - AGENTLENS_EMBEDDING_MODEL: model name override
28
+ * - OPENAI_API_KEY: required for 'openai' backend
29
+ */
30
+ export declare function createEmbeddingService(config?: Partial<EmbeddingServiceConfig>): EmbeddingService;
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAIzD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE3C,6BAA6B;IAC7B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAErD,2CAA2C;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,6BAA6B;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,gBAAgB,CAgBjG"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Embedding Service — interface and factory (Story 2.1)
3
+ *
4
+ * Supports local (Xenova/transformers.js ONNX) and OpenAI backends.
5
+ */
6
+ import { createLocalEmbeddingService } from './local.js';
7
+ import { createOpenAIEmbeddingService } from './openai.js';
8
+ export { cosineSimilarity } from './math.js';
9
+ /**
10
+ * Create an embedding service from config or environment variables.
11
+ *
12
+ * Environment variables:
13
+ * - AGENTLENS_EMBEDDING_BACKEND: 'local' | 'openai' (default: 'local')
14
+ * - AGENTLENS_EMBEDDING_MODEL: model name override
15
+ * - OPENAI_API_KEY: required for 'openai' backend
16
+ */
17
+ export function createEmbeddingService(config) {
18
+ const backend = config?.backend ??
19
+ process.env['AGENTLENS_EMBEDDING_BACKEND'] ??
20
+ 'local';
21
+ const modelName = config?.modelName ?? process.env['AGENTLENS_EMBEDDING_MODEL'];
22
+ switch (backend) {
23
+ case 'local':
24
+ return createLocalEmbeddingService(modelName);
25
+ case 'openai':
26
+ return createOpenAIEmbeddingService(config?.openaiApiKey, modelName);
27
+ default:
28
+ throw new Error(`Unknown embedding backend: ${backend}. Use 'local' or 'openai'.`);
29
+ }
30
+ }
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAG3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAmB7C;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAwC;IAC7E,MAAM,OAAO,GACX,MAAM,EAAE,OAAO;QACd,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAoC;QAC9E,OAAO,CAAC;IAEV,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEhF,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,2BAA2B,CAAC,SAAS,CAAC,CAAC;QAChD,KAAK,QAAQ;YACX,OAAO,4BAA4B,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QACvE;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAiB,4BAA4B,CAAC,CAAC;IACjG,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Local embedding service using @xenova/transformers (ONNX) (Story 2.1)
3
+ *
4
+ * Uses all-MiniLM-L6-v2 model (384 dimensions) by default.
5
+ * Model is loaded once and cached for subsequent calls.
6
+ */
7
+ import type { EmbeddingService } from './index.js';
8
+ /**
9
+ * Create a local embedding service backed by @xenova/transformers.
10
+ *
11
+ * The @xenova/transformers package is dynamically imported, so it's
12
+ * not a hard dependency. If not installed, a clear error is thrown.
13
+ */
14
+ export declare function createLocalEmbeddingService(modelName?: string): EmbeddingService;
15
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/local.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKnD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAwDhF"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Local embedding service using @xenova/transformers (ONNX) (Story 2.1)
3
+ *
4
+ * Uses all-MiniLM-L6-v2 model (384 dimensions) by default.
5
+ * Model is loaded once and cached for subsequent calls.
6
+ */
7
+ const DEFAULT_MODEL = 'Xenova/all-MiniLM-L6-v2';
8
+ const DEFAULT_DIMENSIONS = 384;
9
+ /**
10
+ * Create a local embedding service backed by @xenova/transformers.
11
+ *
12
+ * The @xenova/transformers package is dynamically imported, so it's
13
+ * not a hard dependency. If not installed, a clear error is thrown.
14
+ */
15
+ export function createLocalEmbeddingService(modelName) {
16
+ const model = modelName ?? DEFAULT_MODEL;
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ let pipelinePromise = null;
19
+ async function getPipeline() {
20
+ if (!pipelinePromise) {
21
+ pipelinePromise = (async () => {
22
+ try {
23
+ // Dynamic import — @xenova/transformers may not be installed
24
+ // Use a variable to prevent TypeScript/bundlers from resolving at compile time
25
+ const moduleName = '@xenova/transformers';
26
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
+ const mod = await import(moduleName);
28
+ const { pipeline } = mod;
29
+ return await pipeline('feature-extraction', model);
30
+ }
31
+ catch (err) {
32
+ pipelinePromise = null; // Reset so user can retry after install
33
+ if (err instanceof Error &&
34
+ (err.message.includes('Cannot find module') ||
35
+ err.message.includes('Cannot find package') ||
36
+ err.message.includes('ERR_MODULE_NOT_FOUND'))) {
37
+ throw new Error('Local embedding backend requires @xenova/transformers. ' +
38
+ 'Install it with: pnpm add @xenova/transformers');
39
+ }
40
+ throw err;
41
+ }
42
+ })();
43
+ }
44
+ return pipelinePromise;
45
+ }
46
+ return {
47
+ dimensions: DEFAULT_DIMENSIONS,
48
+ modelName: model,
49
+ async embed(text) {
50
+ const pipe = await getPipeline();
51
+ const output = await pipe(text, { pooling: 'mean', normalize: true });
52
+ return new Float32Array(output.data);
53
+ },
54
+ async embedBatch(texts) {
55
+ const pipe = await getPipeline();
56
+ const results = [];
57
+ for (const text of texts) {
58
+ const output = await pipe(text, { pooling: 'mean', normalize: true });
59
+ results.push(new Float32Array(output.data));
60
+ }
61
+ return results;
62
+ },
63
+ };
64
+ }
65
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/lib/embeddings/local.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAChD,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,SAAkB;IAC5D,MAAM,KAAK,GAAG,SAAS,IAAI,aAAa,CAAC;IACzC,8DAA8D;IAC9D,IAAI,eAAe,GAAwB,IAAI,CAAC;IAEhD,KAAK,UAAU,WAAW;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC5B,IAAI,CAAC;oBACH,6DAA6D;oBAC7D,+EAA+E;oBAC/E,MAAM,UAAU,GAAG,sBAAsB,CAAC;oBAC1C,8DAA8D;oBAC9D,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;oBAC1C,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;oBACzB,OAAO,MAAM,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;gBACrD,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACtB,eAAe,GAAG,IAAI,CAAC,CAAC,wCAAwC;oBAChE,IACE,GAAG,YAAY,KAAK;wBACpB,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;4BACzC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC;4BAC3C,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,EAC/C,CAAC;wBACD,MAAM,IAAI,KAAK,CACb,yDAAyD;4BACvD,gDAAgD,CACnD,CAAC;oBACJ,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,OAAO;QACL,UAAU,EAAE,kBAAkB;QAC9B,SAAS,EAAE,KAAK;QAEhB,KAAK,CAAC,KAAK,CAAC,IAAY;YACtB,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,KAAe;YAC9B,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;YACjC,MAAM,OAAO,GAAmB,EAAE,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtE,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Vector math utilities for embeddings (Story 2.1)
3
+ */
4
+ /**
5
+ * Compute cosine similarity between two vectors.
6
+ *
7
+ * Returns a value between -1 and 1, where 1 means identical direction,
8
+ * 0 means orthogonal, and -1 means opposite direction.
9
+ *
10
+ * @throws Error if vectors have different lengths or are zero-length
11
+ */
12
+ export declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
13
+ //# sourceMappingURL=math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/math.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CA0BzE"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Vector math utilities for embeddings (Story 2.1)
3
+ */
4
+ /**
5
+ * Compute cosine similarity between two vectors.
6
+ *
7
+ * Returns a value between -1 and 1, where 1 means identical direction,
8
+ * 0 means orthogonal, and -1 means opposite direction.
9
+ *
10
+ * @throws Error if vectors have different lengths or are zero-length
11
+ */
12
+ export function cosineSimilarity(a, b) {
13
+ if (a.length !== b.length) {
14
+ throw new Error(`Vector dimension mismatch: ${a.length} vs ${b.length}`);
15
+ }
16
+ if (a.length === 0) {
17
+ throw new Error('Cannot compute cosine similarity of zero-length vectors');
18
+ }
19
+ let dotProduct = 0;
20
+ let normA = 0;
21
+ let normB = 0;
22
+ for (let i = 0; i < a.length; i++) {
23
+ const ai = a[i];
24
+ const bi = b[i];
25
+ dotProduct += ai * bi;
26
+ normA += ai * ai;
27
+ normB += bi * bi;
28
+ }
29
+ const denominator = Math.sqrt(normA) * Math.sqrt(normB);
30
+ if (denominator === 0) {
31
+ return 0; // zero vector(s)
32
+ }
33
+ return dotProduct / denominator;
34
+ }
35
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../../src/lib/embeddings/math.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC/D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,UAAU,IAAI,EAAE,GAAG,EAAE,CAAC;QACtB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC,CAAC,iBAAiB;IAC7B,CAAC;IAED,OAAO,UAAU,GAAG,WAAW,CAAC;AAClC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * OpenAI embedding service (Story 2.1)
3
+ *
4
+ * Uses text-embedding-3-small (1536 dimensions) by default.
5
+ * Simple fetch-based client — no SDK dependency.
6
+ */
7
+ import type { EmbeddingService } from './index.js';
8
+ /**
9
+ * Create an OpenAI embedding service.
10
+ *
11
+ * @param apiKey - OpenAI API key (falls back to OPENAI_API_KEY env var)
12
+ * @param modelName - Model to use (default: text-embedding-3-small)
13
+ */
14
+ export declare function createOpenAIEmbeddingService(apiKey?: string, modelName?: string): EmbeddingService;
15
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/openai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkBnD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,gBAAgB,CAiDlB"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * OpenAI embedding service (Story 2.1)
3
+ *
4
+ * Uses text-embedding-3-small (1536 dimensions) by default.
5
+ * Simple fetch-based client — no SDK dependency.
6
+ */
7
+ const DEFAULT_MODEL = 'text-embedding-3-small';
8
+ const DEFAULT_DIMENSIONS = 1536;
9
+ const OPENAI_EMBEDDINGS_URL = 'https://api.openai.com/v1/embeddings';
10
+ /**
11
+ * Create an OpenAI embedding service.
12
+ *
13
+ * @param apiKey - OpenAI API key (falls back to OPENAI_API_KEY env var)
14
+ * @param modelName - Model to use (default: text-embedding-3-small)
15
+ */
16
+ export function createOpenAIEmbeddingService(apiKey, modelName) {
17
+ const key = apiKey ?? process.env['OPENAI_API_KEY'];
18
+ const model = modelName ?? DEFAULT_MODEL;
19
+ if (!key) {
20
+ throw new Error('OpenAI embedding backend requires an API key. ' +
21
+ 'Set OPENAI_API_KEY environment variable or pass apiKey to config.');
22
+ }
23
+ async function callOpenAI(input) {
24
+ const response = await fetch(OPENAI_EMBEDDINGS_URL, {
25
+ method: 'POST',
26
+ headers: {
27
+ Authorization: `Bearer ${key}`,
28
+ 'Content-Type': 'application/json',
29
+ },
30
+ body: JSON.stringify({
31
+ input,
32
+ model,
33
+ }),
34
+ });
35
+ if (!response.ok) {
36
+ const errorBody = await response.text();
37
+ throw new Error(`OpenAI embeddings API error (${response.status}): ${errorBody}`);
38
+ }
39
+ const json = (await response.json());
40
+ // Sort by index to ensure order matches input
41
+ return json.data.sort((a, b) => a.index - b.index).map((d) => d.embedding);
42
+ }
43
+ return {
44
+ dimensions: DEFAULT_DIMENSIONS,
45
+ modelName: model,
46
+ async embed(text) {
47
+ const [embedding] = await callOpenAI(text);
48
+ return new Float32Array(embedding);
49
+ },
50
+ async embedBatch(texts) {
51
+ if (texts.length === 0)
52
+ return [];
53
+ const embeddings = await callOpenAI(texts);
54
+ return embeddings.map((e) => new Float32Array(e));
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/lib/embeddings/openai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,qBAAqB,GAAG,sCAAsC,CAAC;AAcrE;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,MAAe,EACf,SAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,SAAS,IAAI,aAAa,CAAC;IAEzC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,gDAAgD;YAC9C,mEAAmE,CACtE,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,KAAwB;QAChD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qBAAqB,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,GAAG,EAAE;gBAC9B,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,KAAK;aACN,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QAChE,8CAA8C;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO;QACL,UAAU,EAAE,kBAAkB;QAC9B,SAAS,EAAE,KAAK;QAEhB,KAAK,CAAC,KAAK,CAAC,IAAY;YACtB,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,IAAI,YAAY,CAAC,SAAU,CAAC,CAAC;QACtC,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,KAAe;YAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Event & Session Summarizer (Story 2.3)
3
+ *
4
+ * Produces concise text summaries suitable for embedding.
5
+ * - summarizeEvent(): returns embedding text for events worth embedding, or null to skip
6
+ * - summarizeSession(): produces a heuristic session summary
7
+ */
8
+ import type { AgentLensEvent, Session } from '@agentlensai/core';
9
+ /**
10
+ * Summarize a single event into text suitable for embedding.
11
+ * Returns null if the event should be skipped (not worth embedding).
12
+ */
13
+ export declare function summarizeEvent(event: AgentLensEvent): string | null;
14
+ export type SessionOutcome = 'success' | 'partial' | 'failure';
15
+ export interface SessionSummary {
16
+ summary: string;
17
+ topics: string[];
18
+ toolSequence: string[];
19
+ errorSummary: string;
20
+ outcome: SessionOutcome;
21
+ }
22
+ /**
23
+ * Produce a heuristic summary of a session from its metadata and events.
24
+ */
25
+ export declare function summarizeSession(session: Session, events: AgentLensEvent[]): SessionSummary;
26
+ //# sourceMappingURL=summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/summarizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,OAAO,EAOR,MAAM,mBAAmB,CAAC;AAuB3B;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAuDnE;AAID,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,cAAc,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,cAAc,EAAE,GACvB,cAAc,CAmGhB"}