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