@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,176 +0,0 @@
1
- /**
2
- * Tests for Story 4.6: Session Endpoints
3
- */
4
- import { describe, it, expect, beforeEach } from 'vitest';
5
- import { createTestApp, authHeaders } from './test-helpers.js';
6
- async function ingestEvents(app, apiKey, events) {
7
- return app.request('/api/events', {
8
- method: 'POST',
9
- headers: authHeaders(apiKey),
10
- body: JSON.stringify({ events }),
11
- });
12
- }
13
- describe('Session Endpoints (Story 4.6)', () => {
14
- let app;
15
- let apiKey;
16
- beforeEach(async () => {
17
- const ctx = createTestApp();
18
- app = ctx.app;
19
- apiKey = ctx.apiKey;
20
- // Session 1: active with events
21
- await ingestEvents(app, apiKey, [
22
- {
23
- sessionId: 'sess_001',
24
- agentId: 'agent_001',
25
- eventType: 'session_started',
26
- timestamp: '2026-01-01T10:00:00Z',
27
- payload: { agentName: 'Agent One', tags: ['prod', 'v2'] },
28
- },
29
- {
30
- sessionId: 'sess_001',
31
- agentId: 'agent_001',
32
- eventType: 'tool_call',
33
- timestamp: '2026-01-01T10:01:00Z',
34
- payload: { toolName: 'search', arguments: {}, callId: 'c1' },
35
- },
36
- ]);
37
- // Session 2: completed
38
- await ingestEvents(app, apiKey, [
39
- {
40
- sessionId: 'sess_002',
41
- agentId: 'agent_002',
42
- eventType: 'session_started',
43
- timestamp: '2026-01-02T10:00:00Z',
44
- payload: { agentName: 'Agent Two', tags: ['staging'] },
45
- },
46
- {
47
- sessionId: 'sess_002',
48
- agentId: 'agent_002',
49
- eventType: 'session_ended',
50
- timestamp: '2026-01-02T11:00:00Z',
51
- payload: { reason: 'completed', summary: 'Done' },
52
- },
53
- ]);
54
- });
55
- describe('GET /api/sessions', () => {
56
- it('lists sessions with pagination', async () => {
57
- const res = await app.request('/api/sessions', {
58
- headers: authHeaders(apiKey),
59
- });
60
- expect(res.status).toBe(200);
61
- const body = await res.json();
62
- expect(body.sessions).toBeInstanceOf(Array);
63
- expect(body.sessions.length).toBe(2);
64
- expect(body.total).toBe(2);
65
- expect(body.hasMore).toBe(false);
66
- });
67
- it('filters by agentId', async () => {
68
- const res = await app.request('/api/sessions?agentId=agent_001', {
69
- headers: authHeaders(apiKey),
70
- });
71
- const body = await res.json();
72
- expect(body.sessions.length).toBe(1);
73
- expect(body.sessions[0].agentId).toBe('agent_001');
74
- });
75
- it('filters by status', async () => {
76
- const res = await app.request('/api/sessions?status=completed', {
77
- headers: authHeaders(apiKey),
78
- });
79
- const body = await res.json();
80
- expect(body.sessions.length).toBe(1);
81
- expect(body.sessions[0].id).toBe('sess_002');
82
- });
83
- it('filters by time range', async () => {
84
- const res = await app.request('/api/sessions?from=2026-01-02T00:00:00Z&to=2026-01-03T00:00:00Z', { headers: authHeaders(apiKey) });
85
- const body = await res.json();
86
- expect(body.sessions.length).toBe(1);
87
- expect(body.sessions[0].id).toBe('sess_002');
88
- });
89
- it('filters by tags', async () => {
90
- const res = await app.request('/api/sessions?tags=prod', {
91
- headers: authHeaders(apiKey),
92
- });
93
- const body = await res.json();
94
- expect(body.sessions.length).toBe(1);
95
- expect(body.sessions[0].id).toBe('sess_001');
96
- });
97
- it('clamps negative limit to 1', async () => {
98
- const res = await app.request('/api/sessions?limit=-5', {
99
- headers: authHeaders(apiKey),
100
- });
101
- expect(res.status).toBe(200);
102
- const body = await res.json();
103
- expect(body.sessions.length).toBeGreaterThanOrEqual(1);
104
- });
105
- it('clamps negative offset to 0', async () => {
106
- const res = await app.request('/api/sessions?offset=-10', {
107
- headers: authHeaders(apiKey),
108
- });
109
- expect(res.status).toBe(200);
110
- const body = await res.json();
111
- expect(body.sessions.length).toBe(2);
112
- });
113
- it('respects limit and offset', async () => {
114
- const res = await app.request('/api/sessions?limit=1', {
115
- headers: authHeaders(apiKey),
116
- });
117
- const body = await res.json();
118
- expect(body.sessions.length).toBe(1);
119
- expect(body.total).toBe(2);
120
- expect(body.hasMore).toBe(true);
121
- });
122
- });
123
- describe('GET /api/sessions/:id', () => {
124
- it('returns session detail with aggregates', async () => {
125
- const res = await app.request('/api/sessions/sess_001', {
126
- headers: authHeaders(apiKey),
127
- });
128
- expect(res.status).toBe(200);
129
- const body = await res.json();
130
- expect(body.id).toBe('sess_001');
131
- expect(body.agentId).toBe('agent_001');
132
- expect(body.agentName).toBe('Agent One');
133
- expect(body.status).toBe('active');
134
- expect(body.eventCount).toBe(2);
135
- expect(body.toolCallCount).toBe(1);
136
- expect(body.tags).toEqual(['prod', 'v2']);
137
- });
138
- it('returns 404 for non-existent session', async () => {
139
- const res = await app.request('/api/sessions/nonexistent', {
140
- headers: authHeaders(apiKey),
141
- });
142
- expect(res.status).toBe(404);
143
- const body = await res.json();
144
- expect(body.error).toBe('Session not found');
145
- });
146
- });
147
- describe('GET /api/sessions/:id/timeline', () => {
148
- it('returns all events ascending with chainValid', async () => {
149
- const res = await app.request('/api/sessions/sess_001/timeline', {
150
- headers: authHeaders(apiKey),
151
- });
152
- expect(res.status).toBe(200);
153
- const body = await res.json();
154
- expect(body.events).toBeInstanceOf(Array);
155
- expect(body.events.length).toBe(2);
156
- expect(typeof body.chainValid).toBe('boolean');
157
- expect(body.chainValid).toBe(true);
158
- // Events should be ascending
159
- expect(body.events[0].timestamp <= body.events[1].timestamp).toBe(true);
160
- });
161
- it('returns 404 for non-existent session', async () => {
162
- const res = await app.request('/api/sessions/nonexistent/timeline', {
163
- headers: authHeaders(apiKey),
164
- });
165
- expect(res.status).toBe(404);
166
- });
167
- it('returns chainValid=true for valid chain', async () => {
168
- const res = await app.request('/api/sessions/sess_002/timeline', {
169
- headers: authHeaders(apiKey),
170
- });
171
- const body = await res.json();
172
- expect(body.chainValid).toBe(true);
173
- });
174
- });
175
- });
176
- //# sourceMappingURL=sessions.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessions.test.js","sourceRoot":"","sources":["../../src/__tests__/sessions.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for Story 14.1: SSE Stream Endpoint
3
- */
4
- export {};
5
- //# sourceMappingURL=stream.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stream.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,352 +0,0 @@
1
- /**
2
- * Tests for Story 14.1: SSE Stream Endpoint
3
- */
4
- import { describe, it, expect, afterEach } from 'vitest';
5
- import { createTestApp, authHeaders } from './test-helpers.js';
6
- import { eventBus } from '../lib/event-bus.js';
7
- // Helper to create a mock AgentLensEvent
8
- function mockEvent(overrides = {}) {
9
- return {
10
- id: 'evt_001',
11
- timestamp: new Date().toISOString(),
12
- sessionId: 'sess_001',
13
- agentId: 'agent_001',
14
- eventType: 'tool_call',
15
- severity: 'info',
16
- payload: { toolName: 'search', arguments: {}, callId: 'c1' },
17
- metadata: {},
18
- prevHash: null,
19
- hash: 'abc123',
20
- ...overrides,
21
- };
22
- }
23
- // Helper to create a mock Session
24
- function mockSession(overrides = {}) {
25
- return {
26
- id: 'sess_001',
27
- agentId: 'agent_001',
28
- agentName: 'Test Agent',
29
- startedAt: new Date().toISOString(),
30
- status: 'active',
31
- eventCount: 1,
32
- toolCallCount: 0,
33
- errorCount: 0,
34
- totalCostUsd: 0,
35
- llmCallCount: 0,
36
- totalInputTokens: 0,
37
- totalOutputTokens: 0,
38
- tags: [],
39
- ...overrides,
40
- };
41
- }
42
- /**
43
- * Parse SSE text into individual messages.
44
- */
45
- function parseSSEMessages(text) {
46
- const messages = [];
47
- const blocks = text.split('\n\n').filter(Boolean);
48
- for (const block of blocks) {
49
- const lines = block.split('\n');
50
- let event = '';
51
- let data = '';
52
- for (const line of lines) {
53
- if (line.startsWith('event: '))
54
- event = line.slice(7);
55
- if (line.startsWith('data: '))
56
- data = line.slice(6);
57
- }
58
- if (event || data) {
59
- messages.push({ event, data });
60
- }
61
- }
62
- return messages;
63
- }
64
- /**
65
- * Helper: make an SSE request, optionally emit bus events, then read the streamed chunks.
66
- * Uses ReadableStream reader to collect chunks, then cancels.
67
- */
68
- async function sseRequest(app, url, opts) {
69
- const controller = new AbortController();
70
- const resultOrPromise = app.request(url, { signal: controller.signal });
71
- const res = resultOrPromise instanceof Promise
72
- ? await resultOrPromise
73
- : resultOrPromise;
74
- const headers = res.headers;
75
- // Wait for connection to establish
76
- await new Promise((r) => setTimeout(r, 50));
77
- // Emit events if provided
78
- if (opts?.emitAfter) {
79
- opts.emitAfter();
80
- }
81
- // Wait for events to be delivered
82
- await new Promise((r) => setTimeout(r, opts?.delayMs ?? 100));
83
- // Read accumulated chunks from the stream
84
- let text = '';
85
- const decoder = new TextDecoder();
86
- if (res.body) {
87
- const reader = res.body.getReader();
88
- // Read all available chunks with a timeout
89
- const readChunks = async () => {
90
- let accumulated = '';
91
- // eslint-disable-next-line no-constant-condition
92
- while (true) {
93
- // Race between read and a small timeout
94
- const result = await Promise.race([
95
- reader.read(),
96
- new Promise((resolve) => setTimeout(() => resolve({ done: true, value: undefined }), 200)),
97
- ]);
98
- if (result.value) {
99
- accumulated += decoder.decode(result.value, { stream: true });
100
- }
101
- if (result.done)
102
- break;
103
- }
104
- await reader.cancel().catch(() => { });
105
- return accumulated;
106
- };
107
- text = await readChunks();
108
- }
109
- controller.abort();
110
- return { text, messages: parseSSEMessages(text), headers };
111
- }
112
- describe('SSE Stream — GET /api/stream (Story 14.1)', () => {
113
- afterEach(() => {
114
- eventBus.removeAllListeners();
115
- });
116
- it('returns SSE content-type headers', async () => {
117
- const { app } = createTestApp({ authDisabled: true });
118
- const { headers } = await sseRequest(app, '/api/stream');
119
- expect(headers.get('Content-Type')).toBe('text/event-stream');
120
- expect(headers.get('Cache-Control')).toBe('no-cache');
121
- });
122
- it('sends initial heartbeat on connection', async () => {
123
- const { app } = createTestApp({ authDisabled: true });
124
- const { messages } = await sseRequest(app, '/api/stream');
125
- const heartbeats = messages.filter((m) => m.event === 'heartbeat');
126
- expect(heartbeats.length).toBeGreaterThanOrEqual(1);
127
- if (heartbeats[0]) {
128
- const data = JSON.parse(heartbeats[0].data);
129
- expect(data).toHaveProperty('time');
130
- }
131
- });
132
- it('streams events from EventBus to SSE clients', async () => {
133
- const { app } = createTestApp({ authDisabled: true });
134
- const event = mockEvent();
135
- const { messages } = await sseRequest(app, '/api/stream', {
136
- emitAfter: () => {
137
- eventBus.emit({
138
- type: 'event_ingested',
139
- event,
140
- timestamp: new Date().toISOString(),
141
- });
142
- },
143
- });
144
- const eventMessages = messages.filter((m) => m.event === 'event');
145
- expect(eventMessages.length).toBeGreaterThanOrEqual(1);
146
- if (eventMessages[0]) {
147
- const data = JSON.parse(eventMessages[0].data);
148
- expect(data.id).toBe('evt_001');
149
- expect(data.eventType).toBe('tool_call');
150
- }
151
- });
152
- it('filters events by sessionId', async () => {
153
- const { app } = createTestApp({ authDisabled: true });
154
- const { messages } = await sseRequest(app, '/api/stream?sessionId=sess_002', {
155
- emitAfter: () => {
156
- // Emit event for sess_001 (should be filtered out)
157
- eventBus.emit({
158
- type: 'event_ingested',
159
- event: mockEvent({ sessionId: 'sess_001' }),
160
- timestamp: new Date().toISOString(),
161
- });
162
- // Emit event for sess_002 (should pass through)
163
- eventBus.emit({
164
- type: 'event_ingested',
165
- event: mockEvent({ id: 'evt_002', sessionId: 'sess_002' }),
166
- timestamp: new Date().toISOString(),
167
- });
168
- },
169
- });
170
- const eventMessages = messages.filter((m) => m.event === 'event');
171
- expect(eventMessages.length).toBe(1);
172
- if (eventMessages[0]) {
173
- const data = JSON.parse(eventMessages[0].data);
174
- expect(data.sessionId).toBe('sess_002');
175
- }
176
- });
177
- it('filters events by agentId', async () => {
178
- const { app } = createTestApp({ authDisabled: true });
179
- const { messages } = await sseRequest(app, '/api/stream?agentId=agent_002', {
180
- emitAfter: () => {
181
- eventBus.emit({
182
- type: 'event_ingested',
183
- event: mockEvent({ agentId: 'agent_001' }),
184
- timestamp: new Date().toISOString(),
185
- });
186
- eventBus.emit({
187
- type: 'event_ingested',
188
- event: mockEvent({ id: 'evt_002', agentId: 'agent_002' }),
189
- timestamp: new Date().toISOString(),
190
- });
191
- },
192
- });
193
- const eventMessages = messages.filter((m) => m.event === 'event');
194
- expect(eventMessages.length).toBe(1);
195
- if (eventMessages[0]) {
196
- const data = JSON.parse(eventMessages[0].data);
197
- expect(data.agentId).toBe('agent_002');
198
- }
199
- });
200
- it('filters events by eventType', async () => {
201
- const { app } = createTestApp({ authDisabled: true });
202
- const { messages } = await sseRequest(app, '/api/stream?eventType=tool_error', {
203
- emitAfter: () => {
204
- eventBus.emit({
205
- type: 'event_ingested',
206
- event: mockEvent({ eventType: 'tool_call' }),
207
- timestamp: new Date().toISOString(),
208
- });
209
- eventBus.emit({
210
- type: 'event_ingested',
211
- event: mockEvent({ id: 'evt_err', eventType: 'tool_error' }),
212
- timestamp: new Date().toISOString(),
213
- });
214
- },
215
- });
216
- const eventMessages = messages.filter((m) => m.event === 'event');
217
- expect(eventMessages.length).toBe(1);
218
- if (eventMessages[0]) {
219
- const data = JSON.parse(eventMessages[0].data);
220
- expect(data.eventType).toBe('tool_error');
221
- }
222
- });
223
- it('streams session_update events', async () => {
224
- const { app } = createTestApp({ authDisabled: true });
225
- const { messages } = await sseRequest(app, '/api/stream', {
226
- emitAfter: () => {
227
- eventBus.emit({
228
- type: 'session_updated',
229
- session: mockSession(),
230
- timestamp: new Date().toISOString(),
231
- });
232
- },
233
- });
234
- const sessionMessages = messages.filter((m) => m.event === 'session_update');
235
- expect(sessionMessages.length).toBeGreaterThanOrEqual(1);
236
- if (sessionMessages[0]) {
237
- const data = JSON.parse(sessionMessages[0].data);
238
- expect(data.id).toBe('sess_001');
239
- expect(data.status).toBe('active');
240
- }
241
- });
242
- it('streams alert events to all clients', async () => {
243
- const { app } = createTestApp({ authDisabled: true });
244
- const { messages } = await sseRequest(app, '/api/stream?sessionId=sess_specific', {
245
- emitAfter: () => {
246
- eventBus.emit({
247
- type: 'alert_triggered',
248
- rule: {
249
- id: 'rule_001',
250
- name: 'High Error Rate',
251
- enabled: true,
252
- condition: 'error_rate_exceeds',
253
- threshold: 0.1,
254
- windowMinutes: 5,
255
- scope: {},
256
- notifyChannels: [],
257
- createdAt: new Date().toISOString(),
258
- updatedAt: new Date().toISOString(),
259
- },
260
- history: {
261
- id: 'hist_001',
262
- ruleId: 'rule_001',
263
- triggeredAt: new Date().toISOString(),
264
- currentValue: 0.25,
265
- threshold: 0.1,
266
- message: 'Error rate is 25% (threshold: 10%)',
267
- },
268
- timestamp: new Date().toISOString(),
269
- });
270
- },
271
- });
272
- const alertMessages = messages.filter((m) => m.event === 'alert');
273
- expect(alertMessages.length).toBeGreaterThanOrEqual(1);
274
- if (alertMessages[0]) {
275
- const data = JSON.parse(alertMessages[0].data);
276
- expect(data.ruleId).toBe('rule_001');
277
- expect(data.name).toBe('High Error Rate');
278
- }
279
- });
280
- it('supports comma-separated eventType filter', async () => {
281
- const { app } = createTestApp({ authDisabled: true });
282
- const { messages } = await sseRequest(app, '/api/stream?eventType=tool_call,tool_error', {
283
- emitAfter: () => {
284
- eventBus.emit({
285
- type: 'event_ingested',
286
- event: mockEvent({ id: 'e1', eventType: 'tool_call' }),
287
- timestamp: new Date().toISOString(),
288
- });
289
- eventBus.emit({
290
- type: 'event_ingested',
291
- event: mockEvent({ id: 'e2', eventType: 'session_started' }),
292
- timestamp: new Date().toISOString(),
293
- });
294
- eventBus.emit({
295
- type: 'event_ingested',
296
- event: mockEvent({ id: 'e3', eventType: 'tool_error' }),
297
- timestamp: new Date().toISOString(),
298
- });
299
- },
300
- });
301
- const eventMessages = messages.filter((m) => m.event === 'event');
302
- expect(eventMessages.length).toBe(2);
303
- });
304
- });
305
- describe('EventBus emission on ingestion (Story 14.1)', () => {
306
- afterEach(() => {
307
- eventBus.removeAllListeners();
308
- });
309
- it('emits event_ingested when events are POST-ed to /api/events', async () => {
310
- const { app, apiKey } = createTestApp();
311
- const emittedEvents = [];
312
- eventBus.on('event_ingested', (e) => emittedEvents.push(e));
313
- const res = await app.request('/api/events', {
314
- method: 'POST',
315
- headers: authHeaders(apiKey),
316
- body: JSON.stringify({
317
- events: [
318
- {
319
- sessionId: 'sess_bus_test',
320
- agentId: 'agent_001',
321
- eventType: 'session_started',
322
- payload: { agentName: 'Test', tags: [] },
323
- },
324
- ],
325
- }),
326
- });
327
- expect(res.status).toBe(201);
328
- expect(emittedEvents.length).toBe(1);
329
- });
330
- it('emits session_updated after event ingestion', async () => {
331
- const { app, apiKey } = createTestApp();
332
- const emittedSessions = [];
333
- eventBus.on('session_updated', (e) => emittedSessions.push(e));
334
- const res = await app.request('/api/events', {
335
- method: 'POST',
336
- headers: authHeaders(apiKey),
337
- body: JSON.stringify({
338
- events: [
339
- {
340
- sessionId: 'sess_bus_test_2',
341
- agentId: 'agent_001',
342
- eventType: 'session_started',
343
- payload: { agentName: 'Test', tags: [] },
344
- },
345
- ],
346
- }),
347
- });
348
- expect(res.status).toBe(201);
349
- expect(emittedSessions.length).toBe(1);
350
- });
351
- });
352
- //# sourceMappingURL=stream.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream.test.js","sourceRoot":"","sources":["../../src/__tests__/stream.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,yCAAyC;AACzC,SAAS,SAAS,CAAC,YAAqC,EAAE;IACxD,OAAO;QACL,EAAE,EAAE,SAAS;QACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAC5D,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,QAAQ;QACd,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,kCAAkC;AAClC,SAAS,WAAW,CAAC,YAA8B,EAAE;IACnD,OAAO;QACL,EAAE,EAAE,UAAU;QACd,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,YAAY;QACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,CAAC;QACb,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,CAAC;QACnB,iBAAiB,EAAE,CAAC;QACpB,IAAI,EAAE,EAAE;QACR,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,QAAQ,GAA2C,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,UAAU,CACvB,GAA4C,EAC5C,GAAW,EACX,IAGC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IAEzC,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,MAAM,GAAG,GAAG,eAAe,YAAY,OAAO;QAC5C,CAAC,CAAC,MAAM,eAAe;QACvB,CAAC,CAAC,eAAe,CAAC;IAEpB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAE5B,mCAAmC;IACnC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAE5C,0BAA0B;IAC1B,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,kCAAkC;IAClC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC;IAE9D,0CAA0C;IAC1C,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpC,2CAA2C;QAC3C,MAAM,UAAU,GAAG,KAAK,IAAqB,EAAE;YAC7C,IAAI,WAAW,GAAG,EAAE,CAAC;YACrB,iDAAiD;YACjD,OAAO,IAAI,EAAE,CAAC;gBACZ,wCAAwC;gBACxC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBAChC,MAAM,CAAC,IAAI,EAAE;oBACb,IAAI,OAAO,CAAmC,CAAC,OAAO,EAAE,EAAE,CACxD,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,CACjE;iBACF,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChE,CAAC;gBACD,IAAI,MAAM,CAAC,IAAI;oBAAE,MAAM;YACzB,CAAC;YACD,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACtC,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC;QACF,IAAI,GAAG,MAAM,UAAU,EAAE,CAAC;IAC5B,CAAC;IAED,UAAU,CAAC,KAAK,EAAE,CAAC;IAEnB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;AAC7D,CAAC;AAED,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAE1D,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC;QACnE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAEpD,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAE1B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,aAAa,EAAE;YACxD,SAAS,EAAE,GAAG,EAAE;gBACd,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,KAAK;oBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAEvD,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,gCAAgC,EAAE;YAC3E,SAAS,EAAE,GAAG,EAAE;gBACd,mDAAmD;gBACnD,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;oBAC3C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;gBACH,gDAAgD;gBAChD,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;oBAC1D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,+BAA+B,EAAE;YAC1E,SAAS,EAAE,GAAG,EAAE;gBACd,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;oBAC1C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;oBACzD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,kCAAkC,EAAE;YAC7E,SAAS,EAAE,GAAG,EAAE;gBACd,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;oBAC5C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;oBAC5D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,aAAa,EAAE;YACxD,SAAS,EAAE,GAAG,EAAE;gBACd,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,WAAW,EAAE;oBACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,gBAAgB,CAAC,CAAC;QAC7E,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAEzD,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,qCAAqC,EAAE;YAChF,SAAS,EAAE,GAAG,EAAE;gBACd,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE;wBACJ,EAAE,EAAE,UAAU;wBACd,IAAI,EAAE,iBAAiB;wBACvB,OAAO,EAAE,IAAI;wBACb,SAAS,EAAE,oBAAoB;wBAC/B,SAAS,EAAE,GAAG;wBACd,aAAa,EAAE,CAAC;wBAChB,KAAK,EAAE,EAAE;wBACT,cAAc,EAAE,EAAE;wBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACpC;oBACD,OAAO,EAAE;wBACP,EAAE,EAAE,UAAU;wBACd,MAAM,EAAE,UAAU;wBAClB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACrC,YAAY,EAAE,IAAI;wBAClB,SAAS,EAAE,GAAG;wBACd,OAAO,EAAE,oCAAoC;qBAC9C;oBACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAEvD,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,4CAA4C,EAAE;YACvF,SAAS,EAAE,GAAG,EAAE;gBACd,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;oBACtD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;oBAC5D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;oBACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IAC3D,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAExC,MAAM,aAAa,GAAc,EAAE,CAAC;QACpC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC;YAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE;oBACN;wBACE,SAAS,EAAE,eAAe;wBAC1B,OAAO,EAAE,WAAW;wBACpB,SAAS,EAAE,iBAAiB;wBAC5B,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;qBACzC;iBACF;aACF,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAExC,MAAM,eAAe,GAAc,EAAE,CAAC;QACtC,QAAQ,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC;YAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE;oBACN;wBACE,SAAS,EAAE,iBAAiB;wBAC5B,OAAO,EAAE,WAAW;wBACpB,SAAS,EAAE,iBAAiB;wBAC5B,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;qBACzC;iBACF;aACF,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Shared test helpers for API tests.
3
- */
4
- import { type SqliteDb } from '../db/index.js';
5
- import { SqliteEventStore } from '../db/sqlite-store.js';
6
- import type { Hono } from 'hono';
7
- export interface TestContext {
8
- app: Hono;
9
- db: SqliteDb;
10
- store: SqliteEventStore;
11
- apiKey: string;
12
- }
13
- /**
14
- * Create a test app with an in-memory database and a pre-created API key.
15
- * Auth is NOT disabled — use the returned apiKey for Bearer auth.
16
- */
17
- export declare function createTestApp(opts?: {
18
- authDisabled?: boolean;
19
- }): TestContext;
20
- /**
21
- * Make a request with auth header.
22
- */
23
- export declare function authHeaders(apiKey: string): Record<string, string>;
24
- //# sourceMappingURL=test-helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../src/__tests__/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,IAAI,CAAC;IACV,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,WAAW,CAyB5E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKlE"}
@@ -1,45 +0,0 @@
1
- /**
2
- * Shared test helpers for API tests.
3
- */
4
- import { createApp } from '../index.js';
5
- import { createTestDb } from '../db/index.js';
6
- import { runMigrations } from '../db/migrate.js';
7
- import { SqliteEventStore } from '../db/sqlite-store.js';
8
- import { hashApiKey } from '../middleware/auth.js';
9
- import { apiKeys } from '../db/schema.sqlite.js';
10
- /**
11
- * Create a test app with an in-memory database and a pre-created API key.
12
- * Auth is NOT disabled — use the returned apiKey for Bearer auth.
13
- */
14
- export function createTestApp(opts) {
15
- const db = createTestDb();
16
- runMigrations(db);
17
- const store = new SqliteEventStore(db);
18
- const rawKey = 'als_testkey123456789abcdef0123456789abcdef0123456789abcdef012345';
19
- // Pre-insert an API key
20
- db.insert(apiKeys)
21
- .values({
22
- id: 'test-key-id',
23
- keyHash: hashApiKey(rawKey),
24
- name: 'Test Key',
25
- scopes: JSON.stringify(['*']),
26
- createdAt: Math.floor(Date.now() / 1000),
27
- })
28
- .run();
29
- const app = createApp(store, {
30
- authDisabled: opts?.authDisabled ?? false,
31
- db,
32
- corsOrigin: '*',
33
- });
34
- return { app: app, db, store, apiKey: rawKey };
35
- }
36
- /**
37
- * Make a request with auth header.
38
- */
39
- export function authHeaders(apiKey) {
40
- return {
41
- Authorization: `Bearer ${apiKey}`,
42
- 'Content-Type': 'application/json',
43
- };
44
- }
45
- //# sourceMappingURL=test-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../src/__tests__/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAiB,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAUjD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAiC;IAC7D,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,MAAM,KAAK,GAAG,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,kEAAkE,CAAC;IAElF,wBAAwB;IACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC;QACN,EAAE,EAAE,aAAa;QACjB,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;KACzC,CAAC;SACD,GAAG,EAAE,CAAC;IAET,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE;QAC3B,YAAY,EAAE,IAAI,EAAE,YAAY,IAAI,KAAK;QACzC,EAAE;QACF,UAAU,EAAE,GAAG;KAChB,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,EAAE,GAAsB,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO;QACL,aAAa,EAAE,UAAU,MAAM,EAAE;QACjC,cAAc,EAAE,kBAAkB;KACnC,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=init.test.d.ts.map