@agentlensai/mcp 0.2.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.
@@ -0,0 +1,366 @@
1
+ /**
2
+ * Tests for MCP Tool Handlers (Stories 5.2–5.5)
3
+ */
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
7
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
8
+ import { registerTools } from './tools.js';
9
+ import { AgentLensTransport } from './transport.js';
10
+ // Mock global fetch for the transport layer
11
+ const mockFetch = vi.fn();
12
+ beforeEach(() => {
13
+ vi.stubGlobal('fetch', mockFetch);
14
+ mockFetch.mockReset();
15
+ });
16
+ afterEach(() => {
17
+ vi.unstubAllGlobals();
18
+ });
19
+ function okResponse(data = {}) {
20
+ return new Response(JSON.stringify(data), {
21
+ status: 200,
22
+ headers: { 'Content-Type': 'application/json' },
23
+ });
24
+ }
25
+ function errorResponse(status, body) {
26
+ return new Response(body, { status });
27
+ }
28
+ /**
29
+ * Helper to create connected MCP server + client pair for testing.
30
+ */
31
+ async function createTestSetup() {
32
+ const transport = new AgentLensTransport({
33
+ baseUrl: 'http://localhost:3400',
34
+ apiKey: 'test-key',
35
+ });
36
+ const server = new McpServer({ name: 'agentlens-test', version: '0.0.0' }, { capabilities: { tools: {} } });
37
+ registerTools(server, transport);
38
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
39
+ const client = new Client({ name: 'test-client', version: '1.0.0' });
40
+ await server.connect(serverTransport);
41
+ await client.connect(clientTransport);
42
+ return { server, client, transport };
43
+ }
44
+ describe('Tool Registration (Story 5.1)', () => {
45
+ it('registers all 4 tools', async () => {
46
+ const { client } = await createTestSetup();
47
+ const result = await client.listTools();
48
+ const toolNames = result.tools.map((t) => t.name).sort();
49
+ expect(toolNames).toEqual([
50
+ 'agentlens_log_event',
51
+ 'agentlens_query_events',
52
+ 'agentlens_session_end',
53
+ 'agentlens_session_start',
54
+ ]);
55
+ });
56
+ it('each tool has a description', async () => {
57
+ const { client } = await createTestSetup();
58
+ const result = await client.listTools();
59
+ for (const tool of result.tools) {
60
+ expect(tool.description).toBeTruthy();
61
+ }
62
+ });
63
+ it('agentlens_session_start has correct input schema', async () => {
64
+ const { client } = await createTestSetup();
65
+ const result = await client.listTools();
66
+ const tool = result.tools.find((t) => t.name === 'agentlens_session_start');
67
+ expect(tool).toBeDefined();
68
+ expect(tool.inputSchema.properties).toHaveProperty('agentId');
69
+ expect(tool.inputSchema.required).toContain('agentId');
70
+ });
71
+ });
72
+ describe('agentlens_session_start (Story 5.2)', () => {
73
+ it('creates a session and returns sessionId', async () => {
74
+ mockFetch.mockResolvedValue(okResponse({ id: 'evt_1' }));
75
+ const { client } = await createTestSetup();
76
+ const result = await client.callTool({
77
+ name: 'agentlens_session_start',
78
+ arguments: { agentId: 'agent-1', agentName: 'Test Agent', tags: ['dev'] },
79
+ });
80
+ expect(result.isError).toBeFalsy();
81
+ const content = result.content;
82
+ const parsed = JSON.parse(content[0].text);
83
+ expect(parsed.sessionId).toMatch(/^ses_/);
84
+ });
85
+ it('sends session_started event to API server in batch format', async () => {
86
+ mockFetch.mockResolvedValue(okResponse());
87
+ const { client } = await createTestSetup();
88
+ await client.callTool({
89
+ name: 'agentlens_session_start',
90
+ arguments: { agentId: 'agent-1' },
91
+ });
92
+ expect(mockFetch).toHaveBeenCalledWith('http://localhost:3400/api/events', expect.objectContaining({
93
+ method: 'POST',
94
+ body: expect.stringContaining('"events"'),
95
+ }));
96
+ // Verify the body contains session_started in the events array
97
+ const body = JSON.parse(mockFetch.mock.calls[0][1].body);
98
+ expect(body.events).toHaveLength(1);
99
+ expect(body.events[0].eventType).toBe('session_started');
100
+ });
101
+ it('returns error when server is unreachable', async () => {
102
+ mockFetch.mockRejectedValue(new Error('Connection refused'));
103
+ const { client } = await createTestSetup();
104
+ const result = await client.callTool({
105
+ name: 'agentlens_session_start',
106
+ arguments: { agentId: 'agent-1' },
107
+ });
108
+ expect(result.isError).toBe(true);
109
+ const content = result.content;
110
+ expect(content[0].text).toContain('Connection refused');
111
+ });
112
+ it('returns error when server responds with error', async () => {
113
+ mockFetch.mockResolvedValue(errorResponse(500, 'Internal Server Error'));
114
+ const { client } = await createTestSetup();
115
+ const result = await client.callTool({
116
+ name: 'agentlens_session_start',
117
+ arguments: { agentId: 'agent-1' },
118
+ });
119
+ expect(result.isError).toBe(true);
120
+ const content = result.content;
121
+ expect(content[0].text).toContain('500');
122
+ });
123
+ });
124
+ describe('agentId propagation (Issue 3)', () => {
125
+ it('session_start stores agentId, log_event uses it', async () => {
126
+ mockFetch.mockResolvedValue(okResponse());
127
+ const { client } = await createTestSetup();
128
+ // Start session
129
+ const startResult = await client.callTool({
130
+ name: 'agentlens_session_start',
131
+ arguments: { agentId: 'my-agent' },
132
+ });
133
+ const content = startResult.content;
134
+ const { sessionId } = JSON.parse(content[0].text);
135
+ // Log event
136
+ await client.callTool({
137
+ name: 'agentlens_log_event',
138
+ arguments: {
139
+ sessionId,
140
+ eventType: 'custom',
141
+ payload: { type: 'test', data: {} },
142
+ },
143
+ });
144
+ // Check that the log_event call used the correct agentId
145
+ const logBody = JSON.parse(mockFetch.mock.calls[1][1].body);
146
+ expect(logBody.events[0].agentId).toBe('my-agent');
147
+ });
148
+ it('session_end uses stored agentId and cleans up mapping', async () => {
149
+ mockFetch.mockResolvedValue(okResponse());
150
+ const { client } = await createTestSetup();
151
+ // Start session
152
+ const startResult = await client.callTool({
153
+ name: 'agentlens_session_start',
154
+ arguments: { agentId: 'my-agent' },
155
+ });
156
+ const content = startResult.content;
157
+ const { sessionId } = JSON.parse(content[0].text);
158
+ // End session
159
+ await client.callTool({
160
+ name: 'agentlens_session_end',
161
+ arguments: { sessionId, reason: 'completed' },
162
+ });
163
+ // Check that session_end used the correct agentId
164
+ const endBody = JSON.parse(mockFetch.mock.calls[1][1].body);
165
+ expect(endBody.events[0].agentId).toBe('my-agent');
166
+ });
167
+ it('log_event falls back to empty string for unknown session', async () => {
168
+ mockFetch.mockResolvedValue(okResponse());
169
+ const { client } = await createTestSetup();
170
+ await client.callTool({
171
+ name: 'agentlens_log_event',
172
+ arguments: {
173
+ sessionId: 'unknown-session',
174
+ eventType: 'custom',
175
+ payload: { type: 'test', data: {} },
176
+ },
177
+ });
178
+ const body = JSON.parse(mockFetch.mock.calls[0][1].body);
179
+ expect(body.events[0].agentId).toBe('');
180
+ });
181
+ });
182
+ describe('agentlens_log_event (Story 5.3)', () => {
183
+ it('logs an event and returns confirmation', async () => {
184
+ mockFetch.mockResolvedValue(okResponse({ id: 'evt_2' }));
185
+ const { client } = await createTestSetup();
186
+ const result = await client.callTool({
187
+ name: 'agentlens_log_event',
188
+ arguments: {
189
+ sessionId: 'ses_123',
190
+ eventType: 'tool_call',
191
+ payload: { toolName: 'search', callId: 'c1', arguments: { q: 'hello' } },
192
+ severity: 'info',
193
+ },
194
+ });
195
+ expect(result.isError).toBeFalsy();
196
+ const content = result.content;
197
+ expect(content[0].text).toContain('Event logged: tool_call');
198
+ expect(content[0].text).toContain('severity: info');
199
+ });
200
+ it('POSTs event to /api/events', async () => {
201
+ mockFetch.mockResolvedValue(okResponse());
202
+ const { client } = await createTestSetup();
203
+ await client.callTool({
204
+ name: 'agentlens_log_event',
205
+ arguments: {
206
+ sessionId: 'ses_123',
207
+ eventType: 'custom',
208
+ payload: { type: 'test', data: {} },
209
+ },
210
+ });
211
+ expect(mockFetch).toHaveBeenCalledWith('http://localhost:3400/api/events', expect.objectContaining({
212
+ method: 'POST',
213
+ }));
214
+ });
215
+ it('defaults severity to info', async () => {
216
+ mockFetch.mockResolvedValue(okResponse());
217
+ const { client } = await createTestSetup();
218
+ const result = await client.callTool({
219
+ name: 'agentlens_log_event',
220
+ arguments: {
221
+ sessionId: 'ses_123',
222
+ eventType: 'custom',
223
+ payload: { type: 'test', data: {} },
224
+ },
225
+ });
226
+ const content = result.content;
227
+ expect(content[0].text).toContain('severity: info');
228
+ });
229
+ it('handles server errors', async () => {
230
+ mockFetch.mockResolvedValue(errorResponse(400, 'Bad Request'));
231
+ const { client } = await createTestSetup();
232
+ const result = await client.callTool({
233
+ name: 'agentlens_log_event',
234
+ arguments: {
235
+ sessionId: 'ses_123',
236
+ eventType: 'custom',
237
+ payload: { type: 'test', data: {} },
238
+ },
239
+ });
240
+ expect(result.isError).toBe(true);
241
+ });
242
+ });
243
+ describe('agentlens_session_end (Story 5.4)', () => {
244
+ it('ends a session with reason', async () => {
245
+ mockFetch.mockResolvedValue(okResponse());
246
+ const { client } = await createTestSetup();
247
+ const result = await client.callTool({
248
+ name: 'agentlens_session_end',
249
+ arguments: {
250
+ sessionId: 'ses_123',
251
+ reason: 'completed',
252
+ summary: 'All tasks done',
253
+ },
254
+ });
255
+ expect(result.isError).toBeFalsy();
256
+ const content = result.content;
257
+ expect(content[0].text).toContain('ses_123');
258
+ expect(content[0].text).toContain('completed');
259
+ });
260
+ it('sends session_ended event with correct payload', async () => {
261
+ mockFetch.mockResolvedValue(okResponse());
262
+ const { client } = await createTestSetup();
263
+ await client.callTool({
264
+ name: 'agentlens_session_end',
265
+ arguments: {
266
+ sessionId: 'ses_123',
267
+ reason: 'error',
268
+ },
269
+ });
270
+ const wrapper = JSON.parse(mockFetch.mock.calls[0][1].body);
271
+ const body = wrapper.events[0];
272
+ expect(body.eventType).toBe('session_ended');
273
+ expect(body.payload.reason).toBe('error');
274
+ expect(body.severity).toBe('error');
275
+ });
276
+ it('sets severity to error when reason is error', async () => {
277
+ mockFetch.mockResolvedValue(okResponse());
278
+ const { client } = await createTestSetup();
279
+ await client.callTool({
280
+ name: 'agentlens_session_end',
281
+ arguments: { sessionId: 'ses_123', reason: 'error' },
282
+ });
283
+ const wrapper = JSON.parse(mockFetch.mock.calls[0][1].body);
284
+ expect(wrapper.events[0].severity).toBe('error');
285
+ });
286
+ it('handles server errors', async () => {
287
+ mockFetch.mockRejectedValue(new Error('Network error'));
288
+ const { client } = await createTestSetup();
289
+ const result = await client.callTool({
290
+ name: 'agentlens_session_end',
291
+ arguments: { sessionId: 'ses_123', reason: 'manual' },
292
+ });
293
+ expect(result.isError).toBe(true);
294
+ });
295
+ });
296
+ describe('agentlens_query_events (Story 5.5)', () => {
297
+ it('queries events and returns summarized format', async () => {
298
+ const events = [
299
+ {
300
+ eventType: 'tool_call',
301
+ timestamp: '2025-01-01T00:00:00Z',
302
+ severity: 'info',
303
+ payload: { toolName: 'search', callId: 'c1', arguments: { q: 'hello' } },
304
+ },
305
+ {
306
+ eventType: 'tool_response',
307
+ timestamp: '2025-01-01T00:00:01Z',
308
+ severity: 'info',
309
+ payload: { callId: 'c1', toolName: 'search', result: 'found', durationMs: 100 },
310
+ },
311
+ ];
312
+ mockFetch.mockResolvedValue(okResponse({ events }));
313
+ const { client } = await createTestSetup();
314
+ const result = await client.callTool({
315
+ name: 'agentlens_query_events',
316
+ arguments: { sessionId: 'ses_123' },
317
+ });
318
+ expect(result.isError).toBeFalsy();
319
+ const content = result.content;
320
+ expect(content[0].text).toContain('Found 2 event(s)');
321
+ expect(content[0].text).toContain('tool_call');
322
+ expect(content[0].text).toContain('tool_response');
323
+ });
324
+ it('passes query params to transport', async () => {
325
+ mockFetch.mockResolvedValue(okResponse({ events: [] }));
326
+ const { client } = await createTestSetup();
327
+ await client.callTool({
328
+ name: 'agentlens_query_events',
329
+ arguments: { sessionId: 'ses_123', limit: 10, eventType: 'tool_call' },
330
+ });
331
+ const url = mockFetch.mock.calls[0][0];
332
+ expect(url).toContain('sessionId=ses_123');
333
+ expect(url).toContain('limit=10');
334
+ expect(url).toContain('eventType=tool_call');
335
+ });
336
+ it('returns message when no events found', async () => {
337
+ mockFetch.mockResolvedValue(okResponse({ events: [] }));
338
+ const { client } = await createTestSetup();
339
+ const result = await client.callTool({
340
+ name: 'agentlens_query_events',
341
+ arguments: { sessionId: 'ses_123' },
342
+ });
343
+ const content = result.content;
344
+ expect(content[0].text).toContain('No events found');
345
+ });
346
+ it('defaults limit to 50', async () => {
347
+ mockFetch.mockResolvedValue(okResponse({ events: [] }));
348
+ const { client } = await createTestSetup();
349
+ await client.callTool({
350
+ name: 'agentlens_query_events',
351
+ arguments: { sessionId: 'ses_123' },
352
+ });
353
+ const url = mockFetch.mock.calls[0][0];
354
+ expect(url).toContain('limit=50');
355
+ });
356
+ it('handles server errors', async () => {
357
+ mockFetch.mockResolvedValue(errorResponse(500, 'Server error'));
358
+ const { client } = await createTestSetup();
359
+ const result = await client.callTool({
360
+ name: 'agentlens_query_events',
361
+ arguments: { sessionId: 'ses_123' },
362
+ });
363
+ expect(result.isError).toBe(true);
364
+ });
365
+ });
366
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../src/tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @agentlens/mcp — HTTP Transport Layer (Story 5.6)
3
+ *
4
+ * HTTP client wrapping native fetch() for communicating with the AgentLens API server.
5
+ * Includes an in-memory event buffer with automatic flush and graceful shutdown.
6
+ */
7
+ export interface TransportConfig {
8
+ /** Base URL for the AgentLens API server */
9
+ baseUrl: string;
10
+ /** API key for authentication */
11
+ apiKey?: string;
12
+ }
13
+ export interface BufferedEvent {
14
+ sessionId: string;
15
+ agentId: string;
16
+ eventType: string;
17
+ severity?: string;
18
+ payload: Record<string, unknown>;
19
+ metadata?: Record<string, unknown>;
20
+ timestamp?: string;
21
+ }
22
+ export interface QueryEventsParams {
23
+ sessionId: string;
24
+ limit?: number;
25
+ eventType?: string;
26
+ }
27
+ export declare class AgentLensTransport {
28
+ private readonly baseUrl;
29
+ private readonly apiKey?;
30
+ private buffer;
31
+ private bufferBytes;
32
+ private flushing;
33
+ private shutdownHandlersInstalled;
34
+ /**
35
+ * Maps sessionId → agentId for sessions started via this transport.
36
+ * Populated by session_start, used by log_event and session_end.
37
+ */
38
+ private sessionAgentMap;
39
+ constructor(config: TransportConfig);
40
+ /**
41
+ * Install SIGTERM/SIGINT handlers for graceful shutdown.
42
+ * Safe to call multiple times — only installs once.
43
+ */
44
+ installShutdownHandlers(): void;
45
+ /**
46
+ * Send events to the API server. Events are buffered and flushed
47
+ * when the buffer exceeds capacity or when flush() is called explicitly.
48
+ */
49
+ sendEvents(events: BufferedEvent[]): Promise<void>;
50
+ /**
51
+ * Send a single event immediately (no buffering).
52
+ * Used for critical events like session_start/session_end.
53
+ * Wraps the event in the { events: [...] } batch format expected by the server.
54
+ */
55
+ sendEventImmediate(event: BufferedEvent): Promise<Response>;
56
+ /**
57
+ * Query events from the API server.
58
+ */
59
+ queryEvents(params: QueryEventsParams): Promise<Response>;
60
+ /**
61
+ * Flush all buffered events to the API server.
62
+ */
63
+ flush(): Promise<void>;
64
+ /**
65
+ * Get the current number of buffered events (for testing/monitoring).
66
+ */
67
+ get bufferedCount(): number;
68
+ /**
69
+ * Get the current buffer size in bytes (for testing/monitoring).
70
+ */
71
+ get bufferedBytes(): number;
72
+ /**
73
+ * Register an agentId for a session (called when session_start succeeds).
74
+ */
75
+ setSessionAgent(sessionId: string, agentId: string): void;
76
+ /**
77
+ * Retrieve the agentId for a session (returns empty string if unknown).
78
+ */
79
+ getSessionAgent(sessionId: string): string;
80
+ /**
81
+ * Remove a session's agentId mapping (called when session_end succeeds).
82
+ */
83
+ clearSessionAgent(sessionId: string): void;
84
+ private buildHeaders;
85
+ }
86
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,yBAAyB,CAAS;IAE1C;;;OAGG;IACH,OAAO,CAAC,eAAe,CAA6B;gBAExC,MAAM,EAAE,eAAe;IAKnC;;;OAGG;IACH,uBAAuB,IAAI,IAAI;IAa/B;;;OAGG;IACG,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxD;;;;OAIG;IACG,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;IAUjE;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkB/D;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC5B;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIzD;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI1C;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI1C,OAAO,CAAC,YAAY;CASrB"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * @agentlens/mcp — HTTP Transport Layer (Story 5.6)
3
+ *
4
+ * HTTP client wrapping native fetch() for communicating with the AgentLens API server.
5
+ * Includes an in-memory event buffer with automatic flush and graceful shutdown.
6
+ */
7
+ /** Maximum number of events to buffer before forcing a flush */
8
+ const MAX_BUFFER_COUNT = 10_000;
9
+ /** Maximum buffer size in bytes before forcing a flush (~10MB) */
10
+ const MAX_BUFFER_BYTES = 10 * 1024 * 1024;
11
+ export class AgentLensTransport {
12
+ baseUrl;
13
+ apiKey;
14
+ buffer = [];
15
+ bufferBytes = 0;
16
+ flushing = false;
17
+ shutdownHandlersInstalled = false;
18
+ /**
19
+ * Maps sessionId → agentId for sessions started via this transport.
20
+ * Populated by session_start, used by log_event and session_end.
21
+ */
22
+ sessionAgentMap = new Map();
23
+ constructor(config) {
24
+ this.baseUrl = config.baseUrl.replace(/\/+$/, '');
25
+ this.apiKey = config.apiKey;
26
+ }
27
+ /**
28
+ * Install SIGTERM/SIGINT handlers for graceful shutdown.
29
+ * Safe to call multiple times — only installs once.
30
+ */
31
+ installShutdownHandlers() {
32
+ if (this.shutdownHandlersInstalled)
33
+ return;
34
+ this.shutdownHandlersInstalled = true;
35
+ const handler = async () => {
36
+ await this.flush();
37
+ process.exit(0);
38
+ };
39
+ process.on('SIGTERM', handler);
40
+ process.on('SIGINT', handler);
41
+ }
42
+ /**
43
+ * Send events to the API server. Events are buffered and flushed
44
+ * when the buffer exceeds capacity or when flush() is called explicitly.
45
+ */
46
+ async sendEvents(events) {
47
+ for (const event of events) {
48
+ const size = JSON.stringify(event).length;
49
+ this.buffer.push(event);
50
+ this.bufferBytes += size;
51
+ }
52
+ if (this.buffer.length >= MAX_BUFFER_COUNT || this.bufferBytes >= MAX_BUFFER_BYTES) {
53
+ await this.flush();
54
+ }
55
+ }
56
+ /**
57
+ * Send a single event immediately (no buffering).
58
+ * Used for critical events like session_start/session_end.
59
+ * Wraps the event in the { events: [...] } batch format expected by the server.
60
+ */
61
+ async sendEventImmediate(event) {
62
+ const url = `${this.baseUrl}/api/events`;
63
+ const response = await fetch(url, {
64
+ method: 'POST',
65
+ headers: this.buildHeaders(),
66
+ body: JSON.stringify({ events: [event] }),
67
+ });
68
+ return response;
69
+ }
70
+ /**
71
+ * Query events from the API server.
72
+ */
73
+ async queryEvents(params) {
74
+ const searchParams = new URLSearchParams();
75
+ searchParams.set('sessionId', params.sessionId);
76
+ if (params.limit !== undefined) {
77
+ searchParams.set('limit', String(params.limit));
78
+ }
79
+ if (params.eventType) {
80
+ searchParams.set('eventType', params.eventType);
81
+ }
82
+ const url = `${this.baseUrl}/api/events?${searchParams.toString()}`;
83
+ const response = await fetch(url, {
84
+ method: 'GET',
85
+ headers: this.buildHeaders(),
86
+ });
87
+ return response;
88
+ }
89
+ /**
90
+ * Flush all buffered events to the API server.
91
+ */
92
+ async flush() {
93
+ if (this.buffer.length === 0 || this.flushing)
94
+ return;
95
+ this.flushing = true;
96
+ const eventsToFlush = [...this.buffer];
97
+ this.buffer = [];
98
+ this.bufferBytes = 0;
99
+ try {
100
+ // Send events in batches to the API server (same endpoint as immediate)
101
+ const url = `${this.baseUrl}/api/events`;
102
+ const response = await fetch(url, {
103
+ method: 'POST',
104
+ headers: this.buildHeaders(),
105
+ body: JSON.stringify({ events: eventsToFlush }),
106
+ });
107
+ if (!response.ok) {
108
+ // Re-buffer events on failure (up to capacity)
109
+ const remaining = MAX_BUFFER_COUNT - this.buffer.length;
110
+ const requeue = eventsToFlush.slice(0, remaining);
111
+ this.buffer.unshift(...requeue);
112
+ for (const event of requeue) {
113
+ this.bufferBytes += JSON.stringify(event).length;
114
+ }
115
+ }
116
+ }
117
+ catch {
118
+ // Re-buffer events on network failure
119
+ const remaining = MAX_BUFFER_COUNT - this.buffer.length;
120
+ const requeue = eventsToFlush.slice(0, remaining);
121
+ this.buffer.unshift(...requeue);
122
+ for (const event of requeue) {
123
+ this.bufferBytes += JSON.stringify(event).length;
124
+ }
125
+ }
126
+ finally {
127
+ this.flushing = false;
128
+ }
129
+ }
130
+ /**
131
+ * Get the current number of buffered events (for testing/monitoring).
132
+ */
133
+ get bufferedCount() {
134
+ return this.buffer.length;
135
+ }
136
+ /**
137
+ * Get the current buffer size in bytes (for testing/monitoring).
138
+ */
139
+ get bufferedBytes() {
140
+ return this.bufferBytes;
141
+ }
142
+ /**
143
+ * Register an agentId for a session (called when session_start succeeds).
144
+ */
145
+ setSessionAgent(sessionId, agentId) {
146
+ this.sessionAgentMap.set(sessionId, agentId);
147
+ }
148
+ /**
149
+ * Retrieve the agentId for a session (returns empty string if unknown).
150
+ */
151
+ getSessionAgent(sessionId) {
152
+ return this.sessionAgentMap.get(sessionId) ?? '';
153
+ }
154
+ /**
155
+ * Remove a session's agentId mapping (called when session_end succeeds).
156
+ */
157
+ clearSessionAgent(sessionId) {
158
+ this.sessionAgentMap.delete(sessionId);
159
+ }
160
+ buildHeaders() {
161
+ const headers = {
162
+ 'Content-Type': 'application/json',
163
+ };
164
+ if (this.apiKey) {
165
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
166
+ }
167
+ return headers;
168
+ }
169
+ }
170
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyBH,gEAAgE;AAChE,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,kEAAkE;AAClE,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C,MAAM,OAAO,kBAAkB;IACZ,OAAO,CAAS;IAChB,MAAM,CAAU;IACzB,MAAM,GAAoB,EAAE,CAAC;IAC7B,WAAW,GAAG,CAAC,CAAC;IAChB,QAAQ,GAAG,KAAK,CAAC;IACjB,yBAAyB,GAAG,KAAK,CAAC;IAE1C;;;OAGG;IACK,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEpD,YAAY,MAAuB;QACjC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,uBAAuB;QACrB,IAAI,IAAI,CAAC,yBAAyB;YAAE,OAAO;QAC3C,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;QAEtC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,MAAuB;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,gBAAgB,IAAI,IAAI,CAAC,WAAW,IAAI,gBAAgB,EAAE,CAAC;YACnF,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CAAC,KAAoB;QAC3C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,aAAa,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;YAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,eAAe,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;QACpE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;SAC7B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAErB,IAAI,CAAC;YACH,wEAAwE;YACxE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,aAAa,CAAC;YACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;aAChD,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,+CAA+C;gBAC/C,MAAM,SAAS,GAAG,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBACxD,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBAClD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;gBAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;YACtC,MAAM,SAAS,GAAG,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACxD,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YACnD,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,SAAiB,EAAE,OAAe;QAChD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,SAAiB;QAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,SAAiB;QACjC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAEO,YAAY;QAClB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.test.d.ts","sourceRoot":"","sources":["../src/transport.test.ts"],"names":[],"mappings":""}