@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
@@ -1,602 +0,0 @@
1
- /**
2
- * Tests for Epic 2: LLM Call Tracking — Server Ingest & Storage
3
- *
4
- * Stories covered:
5
- * - 2.1: Session materialization for LLM events
6
- * - 2.2: LLM-specific analytics queries
7
- * - 2.3: Server-side tests (this file)
8
- */
9
- import { describe, it, expect, beforeEach } from 'vitest';
10
- import { createTestApp, authHeaders } from './test-helpers.js';
11
- async function ingestEvents(app, apiKey, events) {
12
- return app.request('/api/events', {
13
- method: 'POST',
14
- headers: authHeaders(apiKey),
15
- body: JSON.stringify({ events }),
16
- });
17
- }
18
- // ─── Helper: Create a standard llm_call event payload ──────────
19
- function makeLlmCallPayload(callId, opts) {
20
- return {
21
- callId,
22
- provider: opts?.provider ?? 'anthropic',
23
- model: opts?.model ?? 'claude-sonnet-4-20250514',
24
- messages: [
25
- { role: 'user', content: 'Hello, how are you?' },
26
- ],
27
- };
28
- }
29
- // ─── Helper: Create a standard llm_response event payload ──────
30
- function makeLlmResponsePayload(callId, opts) {
31
- return {
32
- callId,
33
- provider: opts?.provider ?? 'anthropic',
34
- model: opts?.model ?? 'claude-sonnet-4-20250514',
35
- completion: 'I am doing well, thank you for asking!',
36
- finishReason: 'stop',
37
- usage: {
38
- inputTokens: opts?.inputTokens ?? 100,
39
- outputTokens: opts?.outputTokens ?? 50,
40
- totalTokens: (opts?.inputTokens ?? 100) + (opts?.outputTokens ?? 50),
41
- },
42
- costUsd: opts?.costUsd ?? 0.005,
43
- latencyMs: opts?.latencyMs ?? 1200,
44
- };
45
- }
46
- describe('LLM Call Tracking — Server Ingest & Storage (Epic 2)', () => {
47
- let app;
48
- let apiKey;
49
- beforeEach(() => {
50
- const ctx = createTestApp();
51
- app = ctx.app;
52
- apiKey = ctx.apiKey;
53
- });
54
- // ─── Story 2.1 + 2.3: Ingesting llm_call events ────────────
55
- describe('Ingesting llm_call events', () => {
56
- it('accepts a valid llm_call event', async () => {
57
- const res = await ingestEvents(app, apiKey, [
58
- {
59
- sessionId: 'sess_llm_001',
60
- agentId: 'agent_001',
61
- eventType: 'llm_call',
62
- timestamp: '2026-02-08T10:00:00Z',
63
- payload: makeLlmCallPayload('call-1'),
64
- },
65
- ]);
66
- expect(res.status).toBe(201);
67
- const body = await res.json();
68
- expect(body.ingested).toBe(1);
69
- });
70
- it('rejects llm_call with missing callId', async () => {
71
- const res = await ingestEvents(app, apiKey, [
72
- {
73
- sessionId: 'sess_llm_001',
74
- agentId: 'agent_001',
75
- eventType: 'llm_call',
76
- payload: {
77
- provider: 'anthropic',
78
- model: 'claude-sonnet-4-20250514',
79
- messages: [{ role: 'user', content: 'hi' }],
80
- // missing callId
81
- },
82
- },
83
- ]);
84
- expect(res.status).toBe(400);
85
- });
86
- it('rejects llm_call with empty messages array', async () => {
87
- const res = await ingestEvents(app, apiKey, [
88
- {
89
- sessionId: 'sess_llm_001',
90
- agentId: 'agent_001',
91
- eventType: 'llm_call',
92
- payload: {
93
- callId: 'call-1',
94
- provider: 'anthropic',
95
- model: 'claude-sonnet-4-20250514',
96
- messages: [], // must have at least 1
97
- },
98
- },
99
- ]);
100
- expect(res.status).toBe(400);
101
- });
102
- });
103
- // ─── Story 2.1 + 2.3: Ingesting llm_response events ────────
104
- describe('Ingesting llm_response events', () => {
105
- it('accepts a valid llm_response event', async () => {
106
- const res = await ingestEvents(app, apiKey, [
107
- {
108
- sessionId: 'sess_llm_001',
109
- agentId: 'agent_001',
110
- eventType: 'llm_response',
111
- timestamp: '2026-02-08T10:00:01Z',
112
- payload: makeLlmResponsePayload('call-1'),
113
- },
114
- ]);
115
- expect(res.status).toBe(201);
116
- const body = await res.json();
117
- expect(body.ingested).toBe(1);
118
- });
119
- it('rejects llm_response with missing usage', async () => {
120
- const res = await ingestEvents(app, apiKey, [
121
- {
122
- sessionId: 'sess_llm_001',
123
- agentId: 'agent_001',
124
- eventType: 'llm_response',
125
- payload: {
126
- callId: 'call-1',
127
- provider: 'anthropic',
128
- model: 'claude-sonnet-4-20250514',
129
- completion: 'Hello',
130
- finishReason: 'stop',
131
- // missing usage, costUsd, latencyMs
132
- },
133
- },
134
- ]);
135
- expect(res.status).toBe(400);
136
- });
137
- });
138
- // ─── Story 2.1 + 2.3: callId pairing ───────────────────────
139
- describe('callId pairing', () => {
140
- it('ingests paired llm_call and llm_response with matching callId', async () => {
141
- const callId = 'paired-call-001';
142
- const res = await ingestEvents(app, apiKey, [
143
- {
144
- sessionId: 'sess_llm_pair',
145
- agentId: 'agent_001',
146
- eventType: 'session_started',
147
- timestamp: '2026-02-08T10:00:00Z',
148
- payload: { agentName: 'Pair Agent', tags: [] },
149
- },
150
- {
151
- sessionId: 'sess_llm_pair',
152
- agentId: 'agent_001',
153
- eventType: 'llm_call',
154
- timestamp: '2026-02-08T10:00:01Z',
155
- payload: makeLlmCallPayload(callId),
156
- },
157
- {
158
- sessionId: 'sess_llm_pair',
159
- agentId: 'agent_001',
160
- eventType: 'llm_response',
161
- timestamp: '2026-02-08T10:00:02Z',
162
- payload: makeLlmResponsePayload(callId),
163
- },
164
- ]);
165
- expect(res.status).toBe(201);
166
- const body = await res.json();
167
- expect(body.ingested).toBe(3);
168
- // Retrieve the timeline and check callId pairing
169
- const timelineRes = await app.request('/api/sessions/sess_llm_pair/timeline', {
170
- headers: authHeaders(apiKey),
171
- });
172
- const timeline = await timelineRes.json();
173
- const llmEvents = timeline.events.filter((e) => e.eventType === 'llm_call' || e.eventType === 'llm_response');
174
- expect(llmEvents).toHaveLength(2);
175
- expect(llmEvents[0].payload.callId).toBe(callId);
176
- expect(llmEvents[1].payload.callId).toBe(callId);
177
- });
178
- it('supports multiple paired LLM calls in a single session', async () => {
179
- const res = await ingestEvents(app, apiKey, [
180
- {
181
- sessionId: 'sess_multi_llm',
182
- agentId: 'agent_001',
183
- eventType: 'session_started',
184
- timestamp: '2026-02-08T10:00:00Z',
185
- payload: { tags: [] },
186
- },
187
- {
188
- sessionId: 'sess_multi_llm',
189
- agentId: 'agent_001',
190
- eventType: 'llm_call',
191
- timestamp: '2026-02-08T10:00:01Z',
192
- payload: makeLlmCallPayload('call-a'),
193
- },
194
- {
195
- sessionId: 'sess_multi_llm',
196
- agentId: 'agent_001',
197
- eventType: 'llm_response',
198
- timestamp: '2026-02-08T10:00:02Z',
199
- payload: makeLlmResponsePayload('call-a'),
200
- },
201
- {
202
- sessionId: 'sess_multi_llm',
203
- agentId: 'agent_001',
204
- eventType: 'llm_call',
205
- timestamp: '2026-02-08T10:00:03Z',
206
- payload: makeLlmCallPayload('call-b', { model: 'gpt-4o', provider: 'openai' }),
207
- },
208
- {
209
- sessionId: 'sess_multi_llm',
210
- agentId: 'agent_001',
211
- eventType: 'llm_response',
212
- timestamp: '2026-02-08T10:00:04Z',
213
- payload: makeLlmResponsePayload('call-b', { model: 'gpt-4o', provider: 'openai' }),
214
- },
215
- ]);
216
- expect(res.status).toBe(201);
217
- const body = await res.json();
218
- expect(body.ingested).toBe(5);
219
- });
220
- });
221
- // ─── Story 2.1 + 2.3: Session materialization ──────────────
222
- describe('Session materialization from LLM events', () => {
223
- it('increments llmCallCount on llm_response ingest', async () => {
224
- await ingestEvents(app, apiKey, [
225
- {
226
- sessionId: 'sess_mat_001',
227
- agentId: 'agent_001',
228
- eventType: 'session_started',
229
- timestamp: '2026-02-08T10:00:00Z',
230
- payload: { tags: [] },
231
- },
232
- {
233
- sessionId: 'sess_mat_001',
234
- agentId: 'agent_001',
235
- eventType: 'llm_call',
236
- timestamp: '2026-02-08T10:00:01Z',
237
- payload: makeLlmCallPayload('call-1'),
238
- },
239
- {
240
- sessionId: 'sess_mat_001',
241
- agentId: 'agent_001',
242
- eventType: 'llm_response',
243
- timestamp: '2026-02-08T10:00:02Z',
244
- payload: makeLlmResponsePayload('call-1'),
245
- },
246
- ]);
247
- const sessionRes = await app.request('/api/sessions/sess_mat_001', {
248
- headers: authHeaders(apiKey),
249
- });
250
- const session = await sessionRes.json();
251
- expect(session.llmCallCount).toBe(1);
252
- });
253
- it('accumulates totalInputTokens and totalOutputTokens', async () => {
254
- await ingestEvents(app, apiKey, [
255
- {
256
- sessionId: 'sess_mat_002',
257
- agentId: 'agent_001',
258
- eventType: 'session_started',
259
- timestamp: '2026-02-08T10:00:00Z',
260
- payload: { tags: [] },
261
- },
262
- {
263
- sessionId: 'sess_mat_002',
264
- agentId: 'agent_001',
265
- eventType: 'llm_response',
266
- timestamp: '2026-02-08T10:00:01Z',
267
- payload: makeLlmResponsePayload('call-1', {
268
- inputTokens: 200,
269
- outputTokens: 80,
270
- }),
271
- },
272
- {
273
- sessionId: 'sess_mat_002',
274
- agentId: 'agent_001',
275
- eventType: 'llm_response',
276
- timestamp: '2026-02-08T10:00:02Z',
277
- payload: makeLlmResponsePayload('call-2', {
278
- inputTokens: 300,
279
- outputTokens: 120,
280
- }),
281
- },
282
- ]);
283
- const sessionRes = await app.request('/api/sessions/sess_mat_002', {
284
- headers: authHeaders(apiKey),
285
- });
286
- const session = await sessionRes.json();
287
- expect(session.llmCallCount).toBe(2);
288
- expect(session.totalInputTokens).toBe(500);
289
- expect(session.totalOutputTokens).toBe(200);
290
- });
291
- it('accumulates totalCostUsd from llm_response events', async () => {
292
- await ingestEvents(app, apiKey, [
293
- {
294
- sessionId: 'sess_mat_003',
295
- agentId: 'agent_001',
296
- eventType: 'session_started',
297
- timestamp: '2026-02-08T10:00:00Z',
298
- payload: { tags: [] },
299
- },
300
- {
301
- sessionId: 'sess_mat_003',
302
- agentId: 'agent_001',
303
- eventType: 'llm_response',
304
- timestamp: '2026-02-08T10:00:01Z',
305
- payload: makeLlmResponsePayload('call-1', { costUsd: 0.01 }),
306
- },
307
- {
308
- sessionId: 'sess_mat_003',
309
- agentId: 'agent_001',
310
- eventType: 'llm_response',
311
- timestamp: '2026-02-08T10:00:02Z',
312
- payload: makeLlmResponsePayload('call-2', { costUsd: 0.02 }),
313
- },
314
- ]);
315
- const sessionRes = await app.request('/api/sessions/sess_mat_003', {
316
- headers: authHeaders(apiKey),
317
- });
318
- const session = await sessionRes.json();
319
- expect(session.totalCostUsd).toBeCloseTo(0.03, 3);
320
- });
321
- it('both cost_tracked and llm_response accumulate into totalCostUsd', async () => {
322
- await ingestEvents(app, apiKey, [
323
- {
324
- sessionId: 'sess_mat_004',
325
- agentId: 'agent_001',
326
- eventType: 'session_started',
327
- timestamp: '2026-02-08T10:00:00Z',
328
- payload: { tags: [] },
329
- },
330
- {
331
- sessionId: 'sess_mat_004',
332
- agentId: 'agent_001',
333
- eventType: 'cost_tracked',
334
- timestamp: '2026-02-08T10:00:01Z',
335
- payload: {
336
- provider: 'openai',
337
- model: 'gpt-4',
338
- inputTokens: 50,
339
- outputTokens: 25,
340
- totalTokens: 75,
341
- costUsd: 0.005,
342
- },
343
- },
344
- {
345
- sessionId: 'sess_mat_004',
346
- agentId: 'agent_001',
347
- eventType: 'llm_response',
348
- timestamp: '2026-02-08T10:00:02Z',
349
- payload: makeLlmResponsePayload('call-1', { costUsd: 0.01 }),
350
- },
351
- ]);
352
- const sessionRes = await app.request('/api/sessions/sess_mat_004', {
353
- headers: authHeaders(apiKey),
354
- });
355
- const session = await sessionRes.json();
356
- expect(session.totalCostUsd).toBeCloseTo(0.015, 3);
357
- });
358
- it('session without LLM events shows zero for LLM fields', async () => {
359
- await ingestEvents(app, apiKey, [
360
- {
361
- sessionId: 'sess_mat_005',
362
- agentId: 'agent_001',
363
- eventType: 'session_started',
364
- timestamp: '2026-02-08T10:00:00Z',
365
- payload: { tags: [] },
366
- },
367
- {
368
- sessionId: 'sess_mat_005',
369
- agentId: 'agent_001',
370
- eventType: 'tool_call',
371
- timestamp: '2026-02-08T10:00:01Z',
372
- payload: { toolName: 'search', arguments: {}, callId: 'tc1' },
373
- },
374
- ]);
375
- const sessionRes = await app.request('/api/sessions/sess_mat_005', {
376
- headers: authHeaders(apiKey),
377
- });
378
- const session = await sessionRes.json();
379
- expect(session.llmCallCount).toBe(0);
380
- expect(session.totalInputTokens).toBe(0);
381
- expect(session.totalOutputTokens).toBe(0);
382
- });
383
- });
384
- // ─── Story 2.2 + 2.3: LLM Analytics endpoint ──────────────
385
- describe('GET /api/analytics/llm', () => {
386
- beforeEach(async () => {
387
- // Seed LLM events across two agents, two models
388
- await ingestEvents(app, apiKey, [
389
- {
390
- sessionId: 'sess_anl_001',
391
- agentId: 'agent_alpha',
392
- eventType: 'session_started',
393
- timestamp: '2026-02-08T10:00:00Z',
394
- payload: { agentName: 'Agent Alpha', tags: [] },
395
- },
396
- {
397
- sessionId: 'sess_anl_001',
398
- agentId: 'agent_alpha',
399
- eventType: 'llm_call',
400
- timestamp: '2026-02-08T10:00:01Z',
401
- payload: makeLlmCallPayload('anl-call-1', { provider: 'anthropic', model: 'claude-sonnet-4-20250514' }),
402
- },
403
- {
404
- sessionId: 'sess_anl_001',
405
- agentId: 'agent_alpha',
406
- eventType: 'llm_response',
407
- timestamp: '2026-02-08T10:00:02Z',
408
- payload: makeLlmResponsePayload('anl-call-1', {
409
- provider: 'anthropic',
410
- model: 'claude-sonnet-4-20250514',
411
- costUsd: 0.01,
412
- latencyMs: 1000,
413
- inputTokens: 100,
414
- outputTokens: 50,
415
- }),
416
- },
417
- {
418
- sessionId: 'sess_anl_001',
419
- agentId: 'agent_alpha',
420
- eventType: 'llm_call',
421
- timestamp: '2026-02-08T11:00:01Z',
422
- payload: makeLlmCallPayload('anl-call-2', { provider: 'openai', model: 'gpt-4o' }),
423
- },
424
- {
425
- sessionId: 'sess_anl_001',
426
- agentId: 'agent_alpha',
427
- eventType: 'llm_response',
428
- timestamp: '2026-02-08T11:00:02Z',
429
- payload: makeLlmResponsePayload('anl-call-2', {
430
- provider: 'openai',
431
- model: 'gpt-4o',
432
- costUsd: 0.02,
433
- latencyMs: 800,
434
- inputTokens: 200,
435
- outputTokens: 100,
436
- }),
437
- },
438
- ]);
439
- await ingestEvents(app, apiKey, [
440
- {
441
- sessionId: 'sess_anl_002',
442
- agentId: 'agent_beta',
443
- eventType: 'session_started',
444
- timestamp: '2026-02-08T12:00:00Z',
445
- payload: { agentName: 'Agent Beta', tags: [] },
446
- },
447
- {
448
- sessionId: 'sess_anl_002',
449
- agentId: 'agent_beta',
450
- eventType: 'llm_call',
451
- timestamp: '2026-02-08T12:00:01Z',
452
- payload: makeLlmCallPayload('anl-call-3', { provider: 'anthropic', model: 'claude-sonnet-4-20250514' }),
453
- },
454
- {
455
- sessionId: 'sess_anl_002',
456
- agentId: 'agent_beta',
457
- eventType: 'llm_response',
458
- timestamp: '2026-02-08T12:00:02Z',
459
- payload: makeLlmResponsePayload('anl-call-3', {
460
- provider: 'anthropic',
461
- model: 'claude-sonnet-4-20250514',
462
- costUsd: 0.015,
463
- latencyMs: 1500,
464
- inputTokens: 150,
465
- outputTokens: 75,
466
- }),
467
- },
468
- ]);
469
- });
470
- it('returns summary totals for all LLM calls', async () => {
471
- const res = await app.request('/api/analytics/llm?from=2026-02-08T00:00:00Z&to=2026-02-08T23:59:59Z', { headers: authHeaders(apiKey) });
472
- expect(res.status).toBe(200);
473
- const body = await res.json();
474
- expect(body.summary.totalCalls).toBe(3);
475
- expect(body.summary.totalCostUsd).toBeCloseTo(0.045, 3);
476
- expect(body.summary.totalInputTokens).toBe(450);
477
- expect(body.summary.totalOutputTokens).toBe(225);
478
- expect(body.summary.avgLatencyMs).toBeGreaterThan(0);
479
- expect(body.summary.avgCostPerCall).toBeCloseTo(0.015, 3);
480
- });
481
- it('returns byModel breakdown', async () => {
482
- const res = await app.request('/api/analytics/llm?from=2026-02-08T00:00:00Z&to=2026-02-08T23:59:59Z', { headers: authHeaders(apiKey) });
483
- const body = await res.json();
484
- expect(body.byModel).toBeInstanceOf(Array);
485
- expect(body.byModel.length).toBe(2);
486
- const anthropicModel = body.byModel.find((m) => m.model === 'claude-sonnet-4-20250514');
487
- expect(anthropicModel).toBeDefined();
488
- expect(anthropicModel.calls).toBe(2);
489
- expect(anthropicModel.provider).toBe('anthropic');
490
- expect(anthropicModel.costUsd).toBeCloseTo(0.025, 3);
491
- expect(anthropicModel.inputTokens).toBe(250);
492
- expect(anthropicModel.outputTokens).toBe(125);
493
- const openaiModel = body.byModel.find((m) => m.model === 'gpt-4o');
494
- expect(openaiModel).toBeDefined();
495
- expect(openaiModel.calls).toBe(1);
496
- expect(openaiModel.provider).toBe('openai');
497
- });
498
- it('returns byTime buckets', async () => {
499
- const res = await app.request('/api/analytics/llm?from=2026-02-08T00:00:00Z&to=2026-02-08T23:59:59Z&granularity=hour', { headers: authHeaders(apiKey) });
500
- const body = await res.json();
501
- expect(body.byTime).toBeInstanceOf(Array);
502
- expect(body.byTime.length).toBeGreaterThanOrEqual(2);
503
- // Check that buckets are ordered
504
- for (let i = 1; i < body.byTime.length; i++) {
505
- expect(body.byTime[i].bucket >= body.byTime[i - 1].bucket).toBe(true);
506
- }
507
- });
508
- it('filters by agentId', async () => {
509
- const res = await app.request('/api/analytics/llm?from=2026-02-08T00:00:00Z&to=2026-02-08T23:59:59Z&agentId=agent_alpha', { headers: authHeaders(apiKey) });
510
- const body = await res.json();
511
- expect(body.summary.totalCalls).toBe(2);
512
- expect(body.summary.totalCostUsd).toBeCloseTo(0.03, 3);
513
- });
514
- it('filters by model', async () => {
515
- const res = await app.request('/api/analytics/llm?from=2026-02-08T00:00:00Z&to=2026-02-08T23:59:59Z&model=gpt-4o', { headers: authHeaders(apiKey) });
516
- const body = await res.json();
517
- expect(body.summary.totalCalls).toBe(1);
518
- expect(body.summary.totalCostUsd).toBeCloseTo(0.02, 3);
519
- expect(body.byModel.length).toBe(1);
520
- expect(body.byModel[0].model).toBe('gpt-4o');
521
- });
522
- it('filters by provider', async () => {
523
- const res = await app.request('/api/analytics/llm?from=2026-02-08T00:00:00Z&to=2026-02-08T23:59:59Z&provider=anthropic', { headers: authHeaders(apiKey) });
524
- const body = await res.json();
525
- expect(body.summary.totalCalls).toBe(2);
526
- expect(body.summary.totalInputTokens).toBe(250);
527
- });
528
- it('returns empty results for time range with no data', async () => {
529
- const res = await app.request('/api/analytics/llm?from=2025-01-01T00:00:00Z&to=2025-01-01T23:59:59Z', { headers: authHeaders(apiKey) });
530
- const body = await res.json();
531
- expect(body.summary.totalCalls).toBe(0);
532
- expect(body.summary.totalCostUsd).toBe(0);
533
- expect(body.summary.avgCostPerCall).toBe(0);
534
- expect(body.byModel).toEqual([]);
535
- expect(body.byTime).toEqual([]);
536
- });
537
- it('rejects invalid granularity', async () => {
538
- const res = await app.request('/api/analytics/llm?from=2026-02-08T00:00:00Z&to=2026-02-08T23:59:59Z&granularity=minute', { headers: authHeaders(apiKey) });
539
- expect(res.status).toBe(400);
540
- });
541
- });
542
- // ─── Story 2.3: Full-text search on prompt content ─────────
543
- describe('Full-text search on LLM payload content', () => {
544
- it('finds llm_call events by prompt content via search', async () => {
545
- await ingestEvents(app, apiKey, [
546
- {
547
- sessionId: 'sess_search_001',
548
- agentId: 'agent_001',
549
- eventType: 'llm_call',
550
- timestamp: '2026-02-08T10:00:00Z',
551
- payload: {
552
- callId: 'search-call-1',
553
- provider: 'anthropic',
554
- model: 'claude-sonnet-4-20250514',
555
- messages: [
556
- { role: 'user', content: 'Tell me about quantum computing and its applications' },
557
- ],
558
- },
559
- },
560
- {
561
- sessionId: 'sess_search_001',
562
- agentId: 'agent_001',
563
- eventType: 'llm_response',
564
- timestamp: '2026-02-08T10:00:01Z',
565
- payload: makeLlmResponsePayload('search-call-1'),
566
- },
567
- ]);
568
- const res = await app.request('/api/events?search=quantum%20computing&eventType=llm_call', { headers: authHeaders(apiKey) });
569
- expect(res.status).toBe(200);
570
- const body = await res.json();
571
- expect(body.events.length).toBe(1);
572
- expect(body.events[0].eventType).toBe('llm_call');
573
- expect(body.events[0].payload.messages[0].content).toContain('quantum computing');
574
- });
575
- it('finds llm_response events by completion content via search', async () => {
576
- await ingestEvents(app, apiKey, [
577
- {
578
- sessionId: 'sess_search_002',
579
- agentId: 'agent_001',
580
- eventType: 'llm_response',
581
- timestamp: '2026-02-08T10:00:00Z',
582
- payload: {
583
- callId: 'search-call-2',
584
- provider: 'openai',
585
- model: 'gpt-4o',
586
- completion: 'The Fibonacci sequence is a series where each number is the sum of the two preceding ones.',
587
- finishReason: 'stop',
588
- usage: { inputTokens: 50, outputTokens: 30, totalTokens: 80 },
589
- costUsd: 0.003,
590
- latencyMs: 500,
591
- },
592
- },
593
- ]);
594
- const res = await app.request('/api/events?search=Fibonacci%20sequence', { headers: authHeaders(apiKey) });
595
- expect(res.status).toBe(200);
596
- const body = await res.json();
597
- expect(body.events.length).toBe(1);
598
- expect(body.events[0].payload.completion).toContain('Fibonacci sequence');
599
- });
600
- });
601
- });
602
- //# sourceMappingURL=llm-tracking.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm-tracking.test.js","sourceRoot":"","sources":["../../src/__tests__/llm-tracking.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for Story 4.6: Session Endpoints
3
- */
4
- export {};
5
- //# sourceMappingURL=sessions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessions.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sessions.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}