@agentlensai/server 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.
Files changed (118) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/agents-stats.test.d.ts +5 -0
  3. package/dist/__tests__/agents-stats.test.d.ts.map +1 -0
  4. package/dist/__tests__/agents-stats.test.js +134 -0
  5. package/dist/__tests__/agents-stats.test.js.map +1 -0
  6. package/dist/__tests__/api-keys.test.d.ts +5 -0
  7. package/dist/__tests__/api-keys.test.d.ts.map +1 -0
  8. package/dist/__tests__/api-keys.test.js +118 -0
  9. package/dist/__tests__/api-keys.test.js.map +1 -0
  10. package/dist/__tests__/auth-no-db.test.d.ts +2 -0
  11. package/dist/__tests__/auth-no-db.test.d.ts.map +1 -0
  12. package/dist/__tests__/auth-no-db.test.js +43 -0
  13. package/dist/__tests__/auth-no-db.test.js.map +1 -0
  14. package/dist/__tests__/auth.test.d.ts +5 -0
  15. package/dist/__tests__/auth.test.d.ts.map +1 -0
  16. package/dist/__tests__/auth.test.js +86 -0
  17. package/dist/__tests__/auth.test.js.map +1 -0
  18. package/dist/__tests__/config.test.d.ts +2 -0
  19. package/dist/__tests__/config.test.d.ts.map +1 -0
  20. package/dist/__tests__/config.test.js +37 -0
  21. package/dist/__tests__/config.test.js.map +1 -0
  22. package/dist/__tests__/events-ingest.test.d.ts +5 -0
  23. package/dist/__tests__/events-ingest.test.d.ts.map +1 -0
  24. package/dist/__tests__/events-ingest.test.js +248 -0
  25. package/dist/__tests__/events-ingest.test.js.map +1 -0
  26. package/dist/__tests__/events-query.test.d.ts +5 -0
  27. package/dist/__tests__/events-query.test.d.ts.map +1 -0
  28. package/dist/__tests__/events-query.test.js +205 -0
  29. package/dist/__tests__/events-query.test.js.map +1 -0
  30. package/dist/__tests__/health.test.d.ts +5 -0
  31. package/dist/__tests__/health.test.d.ts.map +1 -0
  32. package/dist/__tests__/health.test.js +40 -0
  33. package/dist/__tests__/health.test.js.map +1 -0
  34. package/dist/__tests__/sessions.test.d.ts +5 -0
  35. package/dist/__tests__/sessions.test.d.ts.map +1 -0
  36. package/dist/__tests__/sessions.test.js +176 -0
  37. package/dist/__tests__/sessions.test.js.map +1 -0
  38. package/dist/__tests__/test-helpers.d.ts +24 -0
  39. package/dist/__tests__/test-helpers.d.ts.map +1 -0
  40. package/dist/__tests__/test-helpers.js +45 -0
  41. package/dist/__tests__/test-helpers.js.map +1 -0
  42. package/dist/config.d.ts +20 -0
  43. package/dist/config.d.ts.map +1 -0
  44. package/dist/config.js +20 -0
  45. package/dist/config.js.map +1 -0
  46. package/dist/db/__tests__/init.test.d.ts +2 -0
  47. package/dist/db/__tests__/init.test.d.ts.map +1 -0
  48. package/dist/db/__tests__/init.test.js +73 -0
  49. package/dist/db/__tests__/init.test.js.map +1 -0
  50. package/dist/db/__tests__/sqlite-store-read.test.d.ts +2 -0
  51. package/dist/db/__tests__/sqlite-store-read.test.d.ts.map +1 -0
  52. package/dist/db/__tests__/sqlite-store-read.test.js +749 -0
  53. package/dist/db/__tests__/sqlite-store-read.test.js.map +1 -0
  54. package/dist/db/__tests__/sqlite-store-write.test.d.ts +2 -0
  55. package/dist/db/__tests__/sqlite-store-write.test.d.ts.map +1 -0
  56. package/dist/db/__tests__/sqlite-store-write.test.js +418 -0
  57. package/dist/db/__tests__/sqlite-store-write.test.js.map +1 -0
  58. package/dist/db/errors.d.ts +16 -0
  59. package/dist/db/errors.d.ts.map +1 -0
  60. package/dist/db/errors.js +22 -0
  61. package/dist/db/errors.js.map +1 -0
  62. package/dist/db/index.d.ts +33 -0
  63. package/dist/db/index.d.ts.map +1 -0
  64. package/dist/db/index.js +44 -0
  65. package/dist/db/index.js.map +1 -0
  66. package/dist/db/migrate.d.ts +26 -0
  67. package/dist/db/migrate.d.ts.map +1 -0
  68. package/dist/db/migrate.js +128 -0
  69. package/dist/db/migrate.js.map +1 -0
  70. package/dist/db/schema.sqlite.d.ts +1009 -0
  71. package/dist/db/schema.sqlite.d.ts.map +1 -0
  72. package/dist/db/schema.sqlite.js +96 -0
  73. package/dist/db/schema.sqlite.js.map +1 -0
  74. package/dist/db/sqlite-store.d.ts +68 -0
  75. package/dist/db/sqlite-store.d.ts.map +1 -0
  76. package/dist/db/sqlite-store.js +753 -0
  77. package/dist/db/sqlite-store.js.map +1 -0
  78. package/dist/index.d.ts +45 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +182 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/lib/__tests__/retention.test.d.ts +2 -0
  83. package/dist/lib/__tests__/retention.test.d.ts.map +1 -0
  84. package/dist/lib/__tests__/retention.test.js +238 -0
  85. package/dist/lib/__tests__/retention.test.js.map +1 -0
  86. package/dist/lib/retention.d.ts +31 -0
  87. package/dist/lib/retention.d.ts.map +1 -0
  88. package/dist/lib/retention.js +47 -0
  89. package/dist/lib/retention.js.map +1 -0
  90. package/dist/middleware/auth.d.ts +37 -0
  91. package/dist/middleware/auth.d.ts.map +1 -0
  92. package/dist/middleware/auth.js +78 -0
  93. package/dist/middleware/auth.js.map +1 -0
  94. package/dist/routes/agents.d.ts +13 -0
  95. package/dist/routes/agents.d.ts.map +1 -0
  96. package/dist/routes/agents.js +34 -0
  97. package/dist/routes/agents.js.map +1 -0
  98. package/dist/routes/api-keys.d.ts +14 -0
  99. package/dist/routes/api-keys.d.ts.map +1 -0
  100. package/dist/routes/api-keys.js +81 -0
  101. package/dist/routes/api-keys.js.map +1 -0
  102. package/dist/routes/config.d.ts +39 -0
  103. package/dist/routes/config.d.ts.map +1 -0
  104. package/dist/routes/config.js +97 -0
  105. package/dist/routes/config.js.map +1 -0
  106. package/dist/routes/events.d.ts +14 -0
  107. package/dist/routes/events.d.ts.map +1 -0
  108. package/dist/routes/events.js +164 -0
  109. package/dist/routes/events.js.map +1 -0
  110. package/dist/routes/sessions.d.ts +14 -0
  111. package/dist/routes/sessions.d.ts.map +1 -0
  112. package/dist/routes/sessions.js +72 -0
  113. package/dist/routes/sessions.js.map +1 -0
  114. package/dist/routes/stats.d.ts +12 -0
  115. package/dist/routes/stats.d.ts.map +1 -0
  116. package/dist/routes/stats.js +16 -0
  117. package/dist/routes/stats.js.map +1 -0
  118. package/package.json +61 -0
@@ -0,0 +1,176 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.test.js","sourceRoot":"","sources":["../../src/__tests__/sessions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,45 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Server configuration — reads from environment variables with sensible defaults.
3
+ */
4
+ export interface ServerConfig {
5
+ /** Port to listen on (default: 3400) */
6
+ port: number;
7
+ /** CORS allowed origin (default: '*') */
8
+ corsOrigin: string;
9
+ /** Whether auth is disabled — dev mode (default: false) */
10
+ authDisabled: boolean;
11
+ /** SQLite database path (default: './agentlens.db') */
12
+ dbPath: string;
13
+ /** Retention days (0 = keep forever, default: 90) */
14
+ retentionDays: number;
15
+ }
16
+ /**
17
+ * Read configuration from environment variables.
18
+ */
19
+ export declare function getConfig(): ServerConfig;
20
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,YAAY,EAAE,OAAO,CAAC;IACtB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,YAAY,CAYxC"}
package/dist/config.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Server configuration — reads from environment variables with sensible defaults.
3
+ */
4
+ /**
5
+ * Read configuration from environment variables.
6
+ */
7
+ export function getConfig() {
8
+ const port = parseInt(process.env['PORT'] ?? '3400', 10);
9
+ return {
10
+ port: isNaN(port) ? 3400 : port,
11
+ corsOrigin: process.env['CORS_ORIGIN'] ?? '*',
12
+ authDisabled: process.env['AUTH_DISABLED'] === 'true',
13
+ dbPath: process.env['DB_PATH'] ?? process.env['DATABASE_PATH'] ?? './agentlens.db',
14
+ retentionDays: (() => {
15
+ const parsed = parseInt(process.env['RETENTION_DAYS'] ?? '90', 10);
16
+ return isNaN(parsed) ? 90 : parsed;
17
+ })(),
18
+ };
19
+ }
20
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAC/B,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG;QAC7C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,MAAM;QACrD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,gBAAgB;QAClF,aAAa,EAAE,CAAC,GAAG,EAAE;YACnB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YACnE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACrC,CAAC,CAAC,EAAE;KACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=init.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.d.ts","sourceRoot":"","sources":["../../../src/db/__tests__/init.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { sql } from 'drizzle-orm';
3
+ import { createTestDb } from '../index.js';
4
+ import { runMigrations, verifyPragmas } from '../migrate.js';
5
+ describe('Database Initialization (Story 3.3)', () => {
6
+ let db;
7
+ beforeEach(() => {
8
+ db = createTestDb();
9
+ runMigrations(db);
10
+ });
11
+ afterEach(() => {
12
+ // Close the in-memory database
13
+ // @ts-expect-error accessing internal session for cleanup
14
+ db.$client?.close?.();
15
+ });
16
+ it('should create all tables', () => {
17
+ const tables = db.all(sql `SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`);
18
+ const tableNames = tables.map((t) => t.name);
19
+ expect(tableNames).toContain('events');
20
+ expect(tableNames).toContain('sessions');
21
+ expect(tableNames).toContain('agents');
22
+ expect(tableNames).toContain('alert_rules');
23
+ expect(tableNames).toContain('alert_history');
24
+ expect(tableNames).toContain('api_keys');
25
+ });
26
+ it('should create all indexes', () => {
27
+ const indexes = db.all(sql `SELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx_%' ORDER BY name`);
28
+ const indexNames = indexes.map((i) => i.name);
29
+ expect(indexNames).toContain('idx_events_timestamp');
30
+ expect(indexNames).toContain('idx_events_session_id');
31
+ expect(indexNames).toContain('idx_events_agent_id');
32
+ expect(indexNames).toContain('idx_events_type');
33
+ expect(indexNames).toContain('idx_events_session_ts');
34
+ expect(indexNames).toContain('idx_events_agent_type_ts');
35
+ expect(indexNames).toContain('idx_sessions_agent_id');
36
+ expect(indexNames).toContain('idx_sessions_started_at');
37
+ expect(indexNames).toContain('idx_sessions_status');
38
+ expect(indexNames).toContain('idx_api_keys_hash');
39
+ expect(indexNames).toContain('idx_alert_history_rule_id');
40
+ });
41
+ // Note: In-memory SQLite uses "memory" journal mode instead of WAL.
42
+ // WAL mode is verified with a file-based DB test below.
43
+ it('should set WAL journal mode (in-memory reports "memory")', () => {
44
+ const pragmas = verifyPragmas(db);
45
+ // In-memory databases can't use WAL, so they report "memory"
46
+ expect(pragmas.journalMode).toBe('memory');
47
+ });
48
+ it('should set synchronous to NORMAL', () => {
49
+ const pragmas = verifyPragmas(db);
50
+ expect(pragmas.synchronous).toBe('NORMAL');
51
+ });
52
+ it('should set cache_size to -64000 (64MB)', () => {
53
+ const pragmas = verifyPragmas(db);
54
+ expect(pragmas.cacheSize).toBe(-64000);
55
+ });
56
+ it('should set busy_timeout to 5000ms', () => {
57
+ const pragmas = verifyPragmas(db);
58
+ expect(pragmas.busyTimeout).toBe(5000);
59
+ });
60
+ it('should be idempotent (run migrations twice without error)', () => {
61
+ expect(() => runMigrations(db)).not.toThrow();
62
+ });
63
+ it('should throw for unsupported postgresql dialect', () => {
64
+ expect(() =>
65
+ // Dynamic import won't work here, test the function directly
66
+ createTestDb()).not.toThrow();
67
+ });
68
+ it('should have foreign_keys enabled (HIGH 3)', () => {
69
+ const pragmas = verifyPragmas(db);
70
+ expect(pragmas.foreignKeys).toBe(true);
71
+ });
72
+ });
73
+ //# sourceMappingURL=init.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../../src/db/__tests__/init.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sqlite-store-read.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store-read.test.d.ts","sourceRoot":"","sources":["../../../src/db/__tests__/sqlite-store-read.test.ts"],"names":[],"mappings":""}