observability-toolkit 1.0.0 → 1.3.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 (98) hide show
  1. package/README.md +24 -13
  2. package/dist/backends/index.d.ts +13 -0
  3. package/dist/backends/index.d.ts.map +1 -1
  4. package/dist/backends/local-jsonl.d.ts +2 -1
  5. package/dist/backends/local-jsonl.d.ts.map +1 -1
  6. package/dist/backends/local-jsonl.js +62 -2
  7. package/dist/backends/local-jsonl.js.map +1 -1
  8. package/dist/backends/local-jsonl.test.d.ts +2 -0
  9. package/dist/backends/local-jsonl.test.d.ts.map +1 -0
  10. package/dist/backends/local-jsonl.test.js +558 -0
  11. package/dist/backends/local-jsonl.test.js.map +1 -0
  12. package/dist/backends/signoz-api.d.ts +9 -2
  13. package/dist/backends/signoz-api.d.ts.map +1 -1
  14. package/dist/backends/signoz-api.js +181 -106
  15. package/dist/backends/signoz-api.js.map +1 -1
  16. package/dist/backends/signoz-api.test.d.ts +2 -0
  17. package/dist/backends/signoz-api.test.d.ts.map +1 -0
  18. package/dist/backends/signoz-api.test.js +904 -0
  19. package/dist/backends/signoz-api.test.js.map +1 -0
  20. package/dist/lib/constants.d.ts +1 -0
  21. package/dist/lib/constants.d.ts.map +1 -1
  22. package/dist/lib/constants.js +6 -2
  23. package/dist/lib/constants.js.map +1 -1
  24. package/dist/lib/constants.test.d.ts +5 -0
  25. package/dist/lib/constants.test.d.ts.map +1 -0
  26. package/dist/lib/constants.test.js +199 -0
  27. package/dist/lib/constants.test.js.map +1 -0
  28. package/dist/lib/file-utils.d.ts +5 -0
  29. package/dist/lib/file-utils.d.ts.map +1 -1
  30. package/dist/lib/file-utils.js +14 -0
  31. package/dist/lib/file-utils.js.map +1 -1
  32. package/dist/lib/file-utils.test.d.ts +2 -0
  33. package/dist/lib/file-utils.test.d.ts.map +1 -0
  34. package/dist/lib/file-utils.test.js +422 -0
  35. package/dist/lib/file-utils.test.js.map +1 -0
  36. package/dist/server.js +6 -1
  37. package/dist/server.js.map +1 -1
  38. package/dist/tools/context-stats.d.ts +2 -2
  39. package/dist/tools/context-stats.d.ts.map +1 -1
  40. package/dist/tools/context-stats.js +2 -1
  41. package/dist/tools/context-stats.js.map +1 -1
  42. package/dist/tools/context-stats.test.d.ts +5 -0
  43. package/dist/tools/context-stats.test.d.ts.map +1 -0
  44. package/dist/tools/context-stats.test.js +339 -0
  45. package/dist/tools/context-stats.test.js.map +1 -0
  46. package/dist/tools/get-trace-url.test.d.ts +5 -0
  47. package/dist/tools/get-trace-url.test.d.ts.map +1 -0
  48. package/dist/tools/get-trace-url.test.js +423 -0
  49. package/dist/tools/get-trace-url.test.js.map +1 -0
  50. package/dist/tools/health-check.test.d.ts +5 -0
  51. package/dist/tools/health-check.test.d.ts.map +1 -0
  52. package/dist/tools/health-check.test.js +393 -0
  53. package/dist/tools/health-check.test.js.map +1 -0
  54. package/dist/tools/index.d.ts +2 -0
  55. package/dist/tools/index.d.ts.map +1 -1
  56. package/dist/tools/index.js +2 -0
  57. package/dist/tools/index.js.map +1 -1
  58. package/dist/tools/query-llm-events.d.ts +82 -0
  59. package/dist/tools/query-llm-events.d.ts.map +1 -0
  60. package/dist/tools/query-llm-events.js +60 -0
  61. package/dist/tools/query-llm-events.js.map +1 -0
  62. package/dist/tools/query-llm-events.test.d.ts +5 -0
  63. package/dist/tools/query-llm-events.test.d.ts.map +1 -0
  64. package/dist/tools/query-llm-events.test.js +111 -0
  65. package/dist/tools/query-llm-events.test.js.map +1 -0
  66. package/dist/tools/query-logs.d.ts +7 -2
  67. package/dist/tools/query-logs.d.ts.map +1 -1
  68. package/dist/tools/query-logs.js +7 -6
  69. package/dist/tools/query-logs.js.map +1 -1
  70. package/dist/tools/query-logs.test.d.ts +5 -0
  71. package/dist/tools/query-logs.test.d.ts.map +1 -0
  72. package/dist/tools/query-logs.test.js +668 -0
  73. package/dist/tools/query-logs.test.js.map +1 -0
  74. package/dist/tools/query-metrics.d.ts +2 -2
  75. package/dist/tools/query-metrics.d.ts.map +1 -1
  76. package/dist/tools/query-metrics.js +2 -1
  77. package/dist/tools/query-metrics.js.map +1 -1
  78. package/dist/tools/query-metrics.test.d.ts +5 -0
  79. package/dist/tools/query-metrics.test.d.ts.map +1 -0
  80. package/dist/tools/query-metrics.test.js +559 -0
  81. package/dist/tools/query-metrics.test.js.map +1 -0
  82. package/dist/tools/query-traces.d.ts +8 -2
  83. package/dist/tools/query-traces.d.ts.map +1 -1
  84. package/dist/tools/query-traces.js +4 -1
  85. package/dist/tools/query-traces.js.map +1 -1
  86. package/dist/tools/query-traces.test.d.ts +5 -0
  87. package/dist/tools/query-traces.test.d.ts.map +1 -0
  88. package/dist/tools/query-traces.test.js +547 -0
  89. package/dist/tools/query-traces.test.js.map +1 -0
  90. package/dist/tools/setup-claudeignore.d.ts +45 -0
  91. package/dist/tools/setup-claudeignore.d.ts.map +1 -0
  92. package/dist/tools/setup-claudeignore.js +72 -0
  93. package/dist/tools/setup-claudeignore.js.map +1 -0
  94. package/dist/tools/setup-claudeignore.test.d.ts +2 -0
  95. package/dist/tools/setup-claudeignore.test.d.ts.map +1 -0
  96. package/dist/tools/setup-claudeignore.test.js +236 -0
  97. package/dist/tools/setup-claudeignore.test.js.map +1 -0
  98. package/package.json +1 -1
@@ -0,0 +1,393 @@
1
+ /**
2
+ * Unit tests for health-check tool
3
+ */
4
+ import { describe, it } from 'node:test';
5
+ import * as assert from 'node:assert';
6
+ import { healthCheck, healthCheckSchema, healthCheckTool } from './health-check.js';
7
+ describe('health-check tool', () => {
8
+ // Test the schema validation
9
+ describe('healthCheckSchema', () => {
10
+ it('should validate input with verbose=true', () => {
11
+ const result = healthCheckSchema.parse({ verbose: true });
12
+ assert.deepStrictEqual(result, { verbose: true });
13
+ });
14
+ it('should validate input with verbose=false', () => {
15
+ const result = healthCheckSchema.parse({ verbose: false });
16
+ assert.deepStrictEqual(result, { verbose: false });
17
+ });
18
+ it('should default verbose to false when not provided', () => {
19
+ const result = healthCheckSchema.parse({});
20
+ assert.deepStrictEqual(result, { verbose: false });
21
+ });
22
+ it('should reject non-boolean verbose values', () => {
23
+ assert.throws(() => healthCheckSchema.parse({ verbose: 'yes' }), { name: 'ZodError' });
24
+ });
25
+ });
26
+ // Test health check handler function
27
+ describe('healthCheck handler', () => {
28
+ it('should return object with required fields', async () => {
29
+ const result = await healthCheck({ verbose: false });
30
+ assert.ok(result);
31
+ assert.ok(result.status);
32
+ assert.ok(result.backends);
33
+ assert.ok(result.telemetryDir);
34
+ assert.ok(result.today);
35
+ assert.ok(result.summary);
36
+ });
37
+ it('should return valid status value', async () => {
38
+ const result = await healthCheck({ verbose: false });
39
+ const validStatuses = ['healthy', 'degraded', 'unhealthy'];
40
+ assert.ok(validStatuses.includes(result.status));
41
+ });
42
+ it('should include telemetry directory in result', async () => {
43
+ const result = await healthCheck({ verbose: false });
44
+ assert.ok(result.telemetryDir);
45
+ assert.strictEqual(typeof result.telemetryDir, 'string');
46
+ assert.ok(result.telemetryDir.length > 0);
47
+ });
48
+ it('should include today date string in YYYY-MM-DD format', async () => {
49
+ const result = await healthCheck({ verbose: false });
50
+ assert.ok(result.today);
51
+ assert.match(result.today, /^\d{4}-\d{2}-\d{2}$/);
52
+ });
53
+ it('should have local backend with status field', async () => {
54
+ const result = await healthCheck({ verbose: false });
55
+ assert.ok(result.backends.local);
56
+ assert.ok(result.backends.local.status);
57
+ const validLocalStatuses = ['ok', 'error', 'unknown'];
58
+ assert.ok(validLocalStatuses.includes(result.backends.local.status));
59
+ });
60
+ it('should have local backend with optional message', async () => {
61
+ const result = await healthCheck({ verbose: false });
62
+ if (result.backends.local.message) {
63
+ assert.strictEqual(typeof result.backends.local.message, 'string');
64
+ }
65
+ });
66
+ it('should have signoz backend with status field', async () => {
67
+ const result = await healthCheck({ verbose: false });
68
+ assert.ok(result.backends.signoz);
69
+ assert.ok(result.backends.signoz.status);
70
+ const validSignozStatuses = ['ok', 'error', 'not_configured', 'unknown'];
71
+ assert.ok(validSignozStatuses.includes(result.backends.signoz.status));
72
+ });
73
+ it('should have signoz backend configured flag', async () => {
74
+ const result = await healthCheck({ verbose: false });
75
+ assert.strictEqual(typeof result.backends.signoz.configured, 'boolean');
76
+ });
77
+ it('should have signoz optional message', async () => {
78
+ const result = await healthCheck({ verbose: false });
79
+ if (result.backends.signoz.message) {
80
+ assert.strictEqual(typeof result.backends.signoz.message, 'string');
81
+ }
82
+ });
83
+ it('should generate summary text', async () => {
84
+ const result = await healthCheck({ verbose: false });
85
+ assert.ok(result.summary);
86
+ assert.strictEqual(typeof result.summary, 'string');
87
+ assert.ok(result.summary.length > 0);
88
+ });
89
+ it('should not include files when verbose is false', async () => {
90
+ const result = await healthCheck({ verbose: false });
91
+ // When verbose is false, files should not be present or should be undefined
92
+ if (result.backends.local.files !== undefined) {
93
+ assert.ok(Array.isArray(result.backends.local.files));
94
+ }
95
+ });
96
+ it('should optionally include files when verbose is true', async () => {
97
+ const result = await healthCheck({ verbose: true });
98
+ // files can be undefined or an array
99
+ if (result.backends.local.files !== undefined) {
100
+ assert.ok(Array.isArray(result.backends.local.files));
101
+ }
102
+ });
103
+ it('should limit files to 10 entries maximum in verbose mode', async () => {
104
+ const result = await healthCheck({ verbose: true });
105
+ if (result.backends.local.files) {
106
+ assert.ok(result.backends.local.files.length <= 10);
107
+ }
108
+ });
109
+ it('should include file stats with required fields', async () => {
110
+ const result = await healthCheck({ verbose: true });
111
+ if (result.backends.local.files && result.backends.local.files.length > 0) {
112
+ for (const file of result.backends.local.files) {
113
+ assert.ok(file.name);
114
+ assert.strictEqual(typeof file.name, 'string');
115
+ assert.ok(file.name.length > 0);
116
+ assert.strictEqual(typeof file.size, 'number');
117
+ assert.ok(file.size >= 0);
118
+ assert.ok(file.modified);
119
+ assert.strictEqual(typeof file.modified, 'string');
120
+ // Should be ISO format timestamp
121
+ assert.ok(new Date(file.modified).getTime() > 0);
122
+ }
123
+ }
124
+ });
125
+ it('should sort files by modification time descending in verbose mode', async () => {
126
+ const result = await healthCheck({ verbose: true });
127
+ if (result.backends.local.files && result.backends.local.files.length > 1) {
128
+ for (let i = 1; i < result.backends.local.files.length; i++) {
129
+ const curr = new Date(result.backends.local.files[i].modified).getTime();
130
+ const prev = new Date(result.backends.local.files[i - 1].modified).getTime();
131
+ assert.ok(prev >= curr, 'Files should be sorted by modification time (newest first)');
132
+ }
133
+ }
134
+ });
135
+ it('should not throw with missing telemetry directory', async () => {
136
+ // Should handle gracefully if telemetry directory doesn't exist
137
+ const result = await healthCheck({ verbose: false });
138
+ assert.ok(result);
139
+ assert.ok(result.status);
140
+ });
141
+ it('should not throw when listing files in verbose mode', async () => {
142
+ // Should handle errors gracefully
143
+ const result = await healthCheck({ verbose: true });
144
+ assert.ok(result);
145
+ assert.ok(result.status);
146
+ });
147
+ });
148
+ describe('healthCheckTool export', () => {
149
+ it('should have correct tool name', () => {
150
+ assert.strictEqual(healthCheckTool.name, 'obs_health_check');
151
+ });
152
+ it('should have description string', () => {
153
+ assert.ok(healthCheckTool.description);
154
+ assert.strictEqual(typeof healthCheckTool.description, 'string');
155
+ assert.ok(healthCheckTool.description.length > 0);
156
+ });
157
+ it('should have inputSchema property', () => {
158
+ assert.ok(healthCheckTool.inputSchema);
159
+ });
160
+ it('should have handler function', () => {
161
+ assert.strictEqual(typeof healthCheckTool.handler, 'function');
162
+ assert.strictEqual(healthCheckTool.handler, healthCheck);
163
+ });
164
+ it('should call handler with valid input', async () => {
165
+ const result = await healthCheckTool.handler({ verbose: false });
166
+ assert.ok(result);
167
+ assert.ok(result.status);
168
+ });
169
+ it('should call handler with verbose=true', async () => {
170
+ const result = await healthCheckTool.handler({ verbose: true });
171
+ assert.ok(result);
172
+ assert.ok(result.status);
173
+ });
174
+ });
175
+ describe('status determination', () => {
176
+ it('should use healthy as initial status', async () => {
177
+ const result = await healthCheck({ verbose: false });
178
+ // Initial is healthy, may change based on backend health
179
+ assert.ok(['healthy', 'degraded', 'unhealthy'].includes(result.status));
180
+ });
181
+ it('should only set degraded/unhealthy based on backend errors', async () => {
182
+ const result = await healthCheck({ verbose: false });
183
+ // Status should reflect backend health correctly
184
+ if (result.backends.local.status === 'ok' && result.backends.signoz.status === 'ok') {
185
+ // Both ok should give healthy
186
+ assert.strictEqual(result.status, 'healthy');
187
+ }
188
+ });
189
+ });
190
+ describe('signoz configuration handling', () => {
191
+ it('should set configured=false when signoz not configured', async () => {
192
+ const result = await healthCheck({ verbose: false });
193
+ if (!result.backends.signoz.configured) {
194
+ assert.strictEqual(result.backends.signoz.status, 'not_configured');
195
+ if (result.backends.signoz.message) {
196
+ assert.ok(result.backends.signoz.message.includes('environment variables'));
197
+ }
198
+ }
199
+ });
200
+ it('should set configured=true when signoz env vars exist', async () => {
201
+ const result = await healthCheck({ verbose: false });
202
+ if (result.backends.signoz.configured) {
203
+ // Should have attempted connection
204
+ assert.ok(['ok', 'error'].includes(result.backends.signoz.status));
205
+ }
206
+ });
207
+ it('should attempt signoz health check when configured', async () => {
208
+ const result = await healthCheck({ verbose: false });
209
+ if (result.backends.signoz.configured) {
210
+ assert.ok(result.backends.signoz.status);
211
+ assert.ok(['ok', 'error'].includes(result.backends.signoz.status));
212
+ }
213
+ });
214
+ });
215
+ describe('summary generation', () => {
216
+ it('should include Local status in summary', async () => {
217
+ const result = await healthCheck({ verbose: false });
218
+ assert.ok(result.summary);
219
+ assert.ok(result.summary.includes('Local'));
220
+ });
221
+ it('should use pipe separator for multiple components', async () => {
222
+ const result = await healthCheck({ verbose: false });
223
+ if (result.backends.signoz.configured) {
224
+ // If signoz is configured, summary should have pipe separator
225
+ if (result.summary?.includes('SigNoz')) {
226
+ assert.ok(result.summary?.includes('|'));
227
+ }
228
+ }
229
+ });
230
+ it('should show local status as OK when healthy', async () => {
231
+ const result = await healthCheck({ verbose: false });
232
+ if (result.backends.local.status === 'ok') {
233
+ assert.ok(result.summary?.includes('Local: OK'));
234
+ }
235
+ });
236
+ it('should include file count when local is ok with files', async () => {
237
+ const result = await healthCheck({ verbose: true });
238
+ if (result.backends.local.status === 'ok' && result.backends.local.files?.length) {
239
+ assert.ok(result.summary?.includes('files'));
240
+ }
241
+ });
242
+ it('should show connection status for signoz when configured', async () => {
243
+ const result = await healthCheck({ verbose: false });
244
+ if (result.backends.signoz.configured) {
245
+ assert.ok(result.summary?.includes('SigNoz'));
246
+ }
247
+ });
248
+ });
249
+ describe('verbose mode', () => {
250
+ it('should not populate files when verbose=false', async () => {
251
+ const result = await healthCheck({ verbose: false });
252
+ // files might be undefined when not verbose
253
+ if (result.backends.local.files) {
254
+ // If present, should still be valid
255
+ assert.ok(Array.isArray(result.backends.local.files));
256
+ }
257
+ });
258
+ it('should filter only .jsonl files', async () => {
259
+ const result = await healthCheck({ verbose: true });
260
+ if (result.backends.local.files) {
261
+ for (const file of result.backends.local.files) {
262
+ // All files should be jsonl (if we have files)
263
+ assert.ok(file.name);
264
+ }
265
+ }
266
+ });
267
+ it('should provide modification timestamps for files', async () => {
268
+ const result = await healthCheck({ verbose: true });
269
+ if (result.backends.local.files) {
270
+ for (const file of result.backends.local.files) {
271
+ assert.ok(file.modified);
272
+ // Should be valid ISO timestamp
273
+ const timestamp = new Date(file.modified);
274
+ assert.ok(timestamp.getTime() > 0);
275
+ }
276
+ }
277
+ });
278
+ it('should provide file sizes in bytes', async () => {
279
+ const result = await healthCheck({ verbose: true });
280
+ if (result.backends.local.files) {
281
+ for (const file of result.backends.local.files) {
282
+ assert.strictEqual(typeof file.size, 'number');
283
+ assert.ok(file.size >= 0);
284
+ }
285
+ }
286
+ });
287
+ });
288
+ describe('connection status', () => {
289
+ it('should report local backend status', async () => {
290
+ const result = await healthCheck({ verbose: false });
291
+ assert.ok(result.backends.local.status);
292
+ assert.ok(['ok', 'error', 'unknown'].includes(result.backends.local.status));
293
+ });
294
+ it('should report local backend message', async () => {
295
+ const result = await healthCheck({ verbose: false });
296
+ if (result.backends.local.message) {
297
+ assert.strictEqual(typeof result.backends.local.message, 'string');
298
+ assert.ok(result.backends.local.message.length > 0);
299
+ }
300
+ });
301
+ it('should report signoz backend status', async () => {
302
+ const result = await healthCheck({ verbose: false });
303
+ assert.ok(result.backends.signoz.status);
304
+ assert.ok(['ok', 'error', 'not_configured', 'unknown'].includes(result.backends.signoz.status));
305
+ });
306
+ it('should report signoz backend message', async () => {
307
+ const result = await healthCheck({ verbose: false });
308
+ if (result.backends.signoz.message) {
309
+ assert.strictEqual(typeof result.backends.signoz.message, 'string');
310
+ assert.ok(result.backends.signoz.message.length > 0);
311
+ }
312
+ });
313
+ });
314
+ describe('file size reporting', () => {
315
+ it('should report correct file size in bytes', async () => {
316
+ const result = await healthCheck({ verbose: true });
317
+ if (result.backends.local.files) {
318
+ for (const file of result.backends.local.files) {
319
+ assert.strictEqual(typeof file.size, 'number');
320
+ assert.ok(Number.isInteger(file.size));
321
+ assert.ok(file.size >= 0);
322
+ }
323
+ }
324
+ });
325
+ it('should handle large file sizes', async () => {
326
+ const result = await healthCheck({ verbose: true });
327
+ if (result.backends.local.files) {
328
+ for (const file of result.backends.local.files) {
329
+ // Should handle any positive number
330
+ assert.ok(file.size >= 0);
331
+ }
332
+ }
333
+ });
334
+ it('should handle zero-byte files', async () => {
335
+ const result = await healthCheck({ verbose: true });
336
+ if (result.backends.local.files) {
337
+ // Should include files even if 0 bytes
338
+ for (const file of result.backends.local.files) {
339
+ assert.ok(file.size >= 0);
340
+ }
341
+ }
342
+ });
343
+ });
344
+ describe('error handling', () => {
345
+ it('should not throw on missing telemetry directory', async () => {
346
+ // Should handle gracefully
347
+ const result = await healthCheck({ verbose: true });
348
+ assert.ok(result);
349
+ assert.ok(result.status);
350
+ });
351
+ it('should not throw on permission denied', async () => {
352
+ // Should handle file access errors
353
+ const result = await healthCheck({ verbose: true });
354
+ assert.ok(result);
355
+ });
356
+ it('should not throw on invalid filenames', async () => {
357
+ // Should skip invalid files
358
+ const result = await healthCheck({ verbose: true });
359
+ assert.ok(result);
360
+ });
361
+ it('should handle empty telemetry directory', async () => {
362
+ const result = await healthCheck({ verbose: true });
363
+ if (result.backends.local.files) {
364
+ assert.ok(Array.isArray(result.backends.local.files));
365
+ }
366
+ });
367
+ it('should handle corrupt jsonl files', async () => {
368
+ // Shouldn't crash even with corrupt files
369
+ const result = await healthCheck({ verbose: true });
370
+ assert.ok(result);
371
+ assert.ok(result.status);
372
+ });
373
+ });
374
+ describe('output consistency', () => {
375
+ it('should have consistent result structure on multiple calls', async () => {
376
+ const result1 = await healthCheck({ verbose: false });
377
+ const result2 = await healthCheck({ verbose: false });
378
+ // Both should have same structure
379
+ assert.ok(result1.status);
380
+ assert.ok(result2.status);
381
+ assert.ok(result1.backends);
382
+ assert.ok(result2.backends);
383
+ assert.ok(result1.telemetryDir);
384
+ assert.ok(result2.telemetryDir);
385
+ });
386
+ it('should maintain telemetryDir consistency', async () => {
387
+ const result1 = await healthCheck({ verbose: false });
388
+ const result2 = await healthCheck({ verbose: false });
389
+ assert.strictEqual(result1.telemetryDir, result2.telemetryDir);
390
+ });
391
+ });
392
+ });
393
+ //# sourceMappingURL=health-check.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-check.test.js","sourceRoot":"","sources":["../../src/tools/health-check.test.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,9 @@
4
4
  export { queryTracesTool } from './query-traces.js';
5
5
  export { queryMetricsTool } from './query-metrics.js';
6
6
  export { queryLogsTool } from './query-logs.js';
7
+ export { queryLLMEventsTool } from './query-llm-events.js';
7
8
  export { healthCheckTool } from './health-check.js';
8
9
  export { contextStatsTool } from './context-stats.js';
9
10
  export { getTraceUrlTool } from './get-trace-url.js';
11
+ export { setupClaudeignoreTool } from './setup-claudeignore.js';
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -4,7 +4,9 @@
4
4
  export { queryTracesTool } from './query-traces.js';
5
5
  export { queryMetricsTool } from './query-metrics.js';
6
6
  export { queryLogsTool } from './query-logs.js';
7
+ export { queryLLMEventsTool } from './query-llm-events.js';
7
8
  export { healthCheckTool } from './health-check.js';
8
9
  export { contextStatsTool } from './context-stats.js';
9
10
  export { getTraceUrlTool } from './get-trace-url.js';
11
+ export { setupClaudeignoreTool } from './setup-claudeignore.js';
10
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Query LLM events from local JSONL files
3
+ */
4
+ import { z } from 'zod';
5
+ export declare const queryLLMEventsSchema: z.ZodObject<{
6
+ eventName: z.ZodOptional<z.ZodString>;
7
+ model: z.ZodOptional<z.ZodString>;
8
+ provider: z.ZodOptional<z.ZodString>;
9
+ search: z.ZodOptional<z.ZodString>;
10
+ startDate: z.ZodOptional<z.ZodString>;
11
+ endDate: z.ZodOptional<z.ZodString>;
12
+ limit: z.ZodDefault<z.ZodNumber>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ limit: number;
15
+ search?: string | undefined;
16
+ eventName?: string | undefined;
17
+ model?: string | undefined;
18
+ provider?: string | undefined;
19
+ startDate?: string | undefined;
20
+ endDate?: string | undefined;
21
+ }, {
22
+ search?: string | undefined;
23
+ eventName?: string | undefined;
24
+ model?: string | undefined;
25
+ provider?: string | undefined;
26
+ startDate?: string | undefined;
27
+ endDate?: string | undefined;
28
+ limit?: number | undefined;
29
+ }>;
30
+ export type QueryLLMEventsInput = z.input<typeof queryLLMEventsSchema>;
31
+ export declare function queryLLMEvents(rawInput: QueryLLMEventsInput): Promise<{
32
+ count: number;
33
+ summary: {
34
+ byEventName: {
35
+ [k: string]: number;
36
+ };
37
+ byModel: {
38
+ [k: string]: number;
39
+ };
40
+ };
41
+ events: {
42
+ timestamp: string;
43
+ name: string;
44
+ model: unknown;
45
+ provider: unknown;
46
+ inputTokens: unknown;
47
+ outputTokens: unknown;
48
+ durationMs: unknown;
49
+ success: unknown;
50
+ }[];
51
+ }>;
52
+ export declare const queryLLMEventsTool: {
53
+ name: string;
54
+ description: string;
55
+ inputSchema: z.ZodObject<{
56
+ eventName: z.ZodOptional<z.ZodString>;
57
+ model: z.ZodOptional<z.ZodString>;
58
+ provider: z.ZodOptional<z.ZodString>;
59
+ search: z.ZodOptional<z.ZodString>;
60
+ startDate: z.ZodOptional<z.ZodString>;
61
+ endDate: z.ZodOptional<z.ZodString>;
62
+ limit: z.ZodDefault<z.ZodNumber>;
63
+ }, "strip", z.ZodTypeAny, {
64
+ limit: number;
65
+ search?: string | undefined;
66
+ eventName?: string | undefined;
67
+ model?: string | undefined;
68
+ provider?: string | undefined;
69
+ startDate?: string | undefined;
70
+ endDate?: string | undefined;
71
+ }, {
72
+ search?: string | undefined;
73
+ eventName?: string | undefined;
74
+ model?: string | undefined;
75
+ provider?: string | undefined;
76
+ startDate?: string | undefined;
77
+ endDate?: string | undefined;
78
+ limit?: number | undefined;
79
+ }>;
80
+ handler: typeof queryLLMEvents;
81
+ };
82
+ //# sourceMappingURL=query-llm-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-llm-events.d.ts","sourceRoot":"","sources":["../../src/tools/query-llm-events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;EAQ/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,wBAAsB,cAAc,CAAC,QAAQ,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;GA0CjE;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAK9B,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Query LLM events from local JSONL files
3
+ */
4
+ import { z } from 'zod';
5
+ import { LocalJsonlBackend } from '../backends/local-jsonl.js';
6
+ export const queryLLMEventsSchema = z.object({
7
+ eventName: z.string().optional().describe('Filter by event name (substring match)'),
8
+ model: z.string().optional().describe('Filter by model (e.g., "claude-3-opus", "gpt-4")'),
9
+ provider: z.string().optional().describe('Filter by provider (e.g., "anthropic", "openai")'),
10
+ search: z.string().optional().describe('Search in event attributes'),
11
+ startDate: z.string().optional().describe('Start date (YYYY-MM-DD)'),
12
+ endDate: z.string().optional().describe('End date (YYYY-MM-DD)'),
13
+ limit: z.number().default(50).describe('Maximum number of results'),
14
+ });
15
+ export async function queryLLMEvents(rawInput) {
16
+ const input = queryLLMEventsSchema.parse(rawInput);
17
+ const options = {
18
+ eventName: input.eventName,
19
+ model: input.model,
20
+ provider: input.provider,
21
+ search: input.search,
22
+ startDate: input.startDate,
23
+ endDate: input.endDate,
24
+ limit: input.limit,
25
+ };
26
+ const local = new LocalJsonlBackend();
27
+ const events = await local.queryLLMEvents(options);
28
+ // Summarize by event name and model
29
+ const byName = new Map();
30
+ const byModel = new Map();
31
+ for (const event of events) {
32
+ byName.set(event.name, (byName.get(event.name) || 0) + 1);
33
+ const model = (event.attributes?.['gen_ai.request.model'] || event.attributes?.['model'] || 'unknown');
34
+ byModel.set(model, (byModel.get(model) || 0) + 1);
35
+ }
36
+ return {
37
+ count: events.length,
38
+ summary: {
39
+ byEventName: Object.fromEntries(byName),
40
+ byModel: Object.fromEntries(byModel),
41
+ },
42
+ events: events.slice(0, 20).map(e => ({
43
+ timestamp: e.timestamp,
44
+ name: e.name,
45
+ model: e.attributes?.['gen_ai.request.model'] || e.attributes?.['model'],
46
+ provider: e.attributes?.['gen_ai.system'] || e.attributes?.['provider'],
47
+ inputTokens: e.attributes?.['gen_ai.usage.input_tokens'],
48
+ outputTokens: e.attributes?.['gen_ai.usage.output_tokens'],
49
+ durationMs: e.attributes?.['duration_ms'],
50
+ success: e.attributes?.['success'],
51
+ })),
52
+ };
53
+ }
54
+ export const queryLLMEventsTool = {
55
+ name: 'obs_query_llm_events',
56
+ description: 'Query LLM events from local JSONL files. Filter by event name, model, provider, and search text. Returns token usage and duration metrics.',
57
+ inputSchema: queryLLMEventsSchema,
58
+ handler: queryLLMEvents,
59
+ };
60
+ //# sourceMappingURL=query-llm-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-llm-events.js","sourceRoot":"","sources":["../../src/tools/query-llm-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for query-llm-events tool
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=query-llm-events.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-llm-events.test.d.ts","sourceRoot":"","sources":["../../src/tools/query-llm-events.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}