observability-toolkit 1.8.0 → 1.8.4
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.
- package/README.md +81 -3
- package/dist/backends/index.d.ts +119 -0
- package/dist/backends/index.d.ts.map +1 -1
- package/dist/backends/index.js +57 -0
- package/dist/backends/index.js.map +1 -1
- package/dist/backends/index.test.d.ts +5 -0
- package/dist/backends/index.test.d.ts.map +1 -0
- package/dist/backends/index.test.js +156 -0
- package/dist/backends/index.test.js.map +1 -0
- package/dist/backends/local-jsonl-boolean-search.test.js +8 -27
- package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
- package/dist/backends/local-jsonl-logs.test.d.ts +2 -0
- package/dist/backends/local-jsonl-logs.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-logs.test.js +603 -0
- package/dist/backends/local-jsonl-logs.test.js.map +1 -0
- package/dist/backends/local-jsonl-traces.test.d.ts +2 -0
- package/dist/backends/local-jsonl-traces.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-traces.test.js +1723 -0
- package/dist/backends/local-jsonl-traces.test.js.map +1 -0
- package/dist/backends/local-jsonl.d.ts +4 -1
- package/dist/backends/local-jsonl.d.ts.map +1 -1
- package/dist/backends/local-jsonl.js +185 -1
- package/dist/backends/local-jsonl.js.map +1 -1
- package/dist/backends/local-jsonl.test.js +723 -46
- package/dist/backends/local-jsonl.test.js.map +1 -1
- package/dist/backends/signoz-api.d.ts +32 -0
- package/dist/backends/signoz-api.d.ts.map +1 -1
- package/dist/backends/signoz-api.js +231 -33
- package/dist/backends/signoz-api.js.map +1 -1
- package/dist/backends/signoz-api.test.js +410 -63
- package/dist/backends/signoz-api.test.js.map +1 -1
- package/dist/lib/constants.d.ts +59 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +252 -6
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/constants.test.js +357 -21
- package/dist/lib/constants.test.js.map +1 -1
- package/dist/lib/edge-cases.test.d.ts +11 -0
- package/dist/lib/edge-cases.test.d.ts.map +1 -0
- package/dist/lib/edge-cases.test.js +634 -0
- package/dist/lib/edge-cases.test.js.map +1 -0
- package/dist/lib/error-sanitizer.d.ts +57 -0
- package/dist/lib/error-sanitizer.d.ts.map +1 -0
- package/dist/lib/error-sanitizer.js +207 -0
- package/dist/lib/error-sanitizer.js.map +1 -0
- package/dist/lib/error-sanitizer.test.d.ts +8 -0
- package/dist/lib/error-sanitizer.test.d.ts.map +1 -0
- package/dist/lib/error-sanitizer.test.js +369 -0
- package/dist/lib/error-sanitizer.test.js.map +1 -0
- package/dist/lib/file-utils.d.ts +134 -0
- package/dist/lib/file-utils.d.ts.map +1 -1
- package/dist/lib/file-utils.js +395 -9
- package/dist/lib/file-utils.js.map +1 -1
- package/dist/lib/file-utils.test.js +444 -3
- package/dist/lib/file-utils.test.js.map +1 -1
- package/dist/lib/indexer.d.ts +9 -1
- package/dist/lib/indexer.d.ts.map +1 -1
- package/dist/lib/indexer.js +51 -2
- package/dist/lib/indexer.js.map +1 -1
- package/dist/lib/indexer.test.js +138 -20
- package/dist/lib/indexer.test.js.map +1 -1
- package/dist/lib/input-validator.d.ts +103 -0
- package/dist/lib/input-validator.d.ts.map +1 -0
- package/dist/lib/input-validator.js +250 -0
- package/dist/lib/input-validator.js.map +1 -0
- package/dist/lib/input-validator.test.d.ts +2 -0
- package/dist/lib/input-validator.test.d.ts.map +1 -0
- package/dist/lib/input-validator.test.js +287 -0
- package/dist/lib/input-validator.test.js.map +1 -0
- package/dist/lib/query-sanitizer.d.ts +143 -0
- package/dist/lib/query-sanitizer.d.ts.map +1 -0
- package/dist/lib/query-sanitizer.js +261 -0
- package/dist/lib/query-sanitizer.js.map +1 -0
- package/dist/lib/query-sanitizer.test.d.ts +5 -0
- package/dist/lib/query-sanitizer.test.d.ts.map +1 -0
- package/dist/lib/query-sanitizer.test.js +400 -0
- package/dist/lib/query-sanitizer.test.js.map +1 -0
- package/dist/lib/server-utils.d.ts +80 -0
- package/dist/lib/server-utils.d.ts.map +1 -0
- package/dist/lib/server-utils.js +141 -0
- package/dist/lib/server-utils.js.map +1 -0
- package/dist/lib/shared-schemas.d.ts +59 -0
- package/dist/lib/shared-schemas.d.ts.map +1 -0
- package/dist/lib/shared-schemas.js +58 -0
- package/dist/lib/shared-schemas.js.map +1 -0
- package/dist/lib/shared-schemas.test.d.ts +5 -0
- package/dist/lib/shared-schemas.test.d.ts.map +1 -0
- package/dist/lib/shared-schemas.test.js +106 -0
- package/dist/lib/shared-schemas.test.js.map +1 -0
- package/dist/lib/toon-encoder.d.ts +21 -0
- package/dist/lib/toon-encoder.d.ts.map +1 -0
- package/dist/lib/toon-encoder.js +46 -0
- package/dist/lib/toon-encoder.js.map +1 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +155 -81
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +363 -0
- package/dist/server.test.js.map +1 -1
- package/dist/test-helpers/env-utils.d.ts +65 -0
- package/dist/test-helpers/env-utils.d.ts.map +1 -0
- package/dist/test-helpers/env-utils.js +94 -0
- package/dist/test-helpers/env-utils.js.map +1 -0
- package/dist/test-helpers/file-utils.d.ts +93 -0
- package/dist/test-helpers/file-utils.d.ts.map +1 -0
- package/dist/test-helpers/file-utils.js +206 -0
- package/dist/test-helpers/file-utils.js.map +1 -0
- package/dist/test-helpers/index.d.ts +10 -0
- package/dist/test-helpers/index.d.ts.map +1 -0
- package/dist/test-helpers/index.js +28 -0
- package/dist/test-helpers/index.js.map +1 -0
- package/dist/test-helpers/mock-backends.d.ts +139 -0
- package/dist/test-helpers/mock-backends.d.ts.map +1 -0
- package/dist/test-helpers/mock-backends.js +227 -0
- package/dist/test-helpers/mock-backends.js.map +1 -0
- package/dist/test-helpers/mock-backends.test.d.ts +5 -0
- package/dist/test-helpers/mock-backends.test.d.ts.map +1 -0
- package/dist/test-helpers/mock-backends.test.js +368 -0
- package/dist/test-helpers/mock-backends.test.js.map +1 -0
- package/dist/test-helpers/schema-validators.d.ts +32 -0
- package/dist/test-helpers/schema-validators.d.ts.map +1 -0
- package/dist/test-helpers/schema-validators.js +125 -0
- package/dist/test-helpers/schema-validators.js.map +1 -0
- package/dist/test-helpers/test-data-builders.d.ts +223 -0
- package/dist/test-helpers/test-data-builders.d.ts.map +1 -0
- package/dist/test-helpers/test-data-builders.js +288 -0
- package/dist/test-helpers/test-data-builders.js.map +1 -0
- package/dist/test-helpers/test-data-builders.test.d.ts +2 -0
- package/dist/test-helpers/test-data-builders.test.d.ts.map +1 -0
- package/dist/test-helpers/test-data-builders.test.js +306 -0
- package/dist/test-helpers/test-data-builders.test.js.map +1 -0
- package/dist/test-helpers/tool-validators.d.ts +28 -0
- package/dist/test-helpers/tool-validators.d.ts.map +1 -0
- package/dist/test-helpers/tool-validators.js +56 -0
- package/dist/test-helpers/tool-validators.js.map +1 -0
- package/dist/tools/context-stats.d.ts +1 -0
- package/dist/tools/context-stats.d.ts.map +1 -1
- package/dist/tools/context-stats.js +9 -5
- package/dist/tools/context-stats.js.map +1 -1
- package/dist/tools/context-stats.test.js +24 -10
- package/dist/tools/context-stats.test.js.map +1 -1
- package/dist/tools/get-trace-url.js +2 -2
- package/dist/tools/get-trace-url.js.map +1 -1
- package/dist/tools/health-check.js +2 -2
- package/dist/tools/health-check.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/query-evaluations.d.ts +186 -0
- package/dist/tools/query-evaluations.d.ts.map +1 -0
- package/dist/tools/query-evaluations.js +351 -0
- package/dist/tools/query-evaluations.js.map +1 -0
- package/dist/tools/query-evaluations.test.d.ts +5 -0
- package/dist/tools/query-evaluations.test.d.ts.map +1 -0
- package/dist/tools/query-evaluations.test.js +733 -0
- package/dist/tools/query-evaluations.test.js.map +1 -0
- package/dist/tools/query-llm-events.d.ts +24 -18
- package/dist/tools/query-llm-events.d.ts.map +1 -1
- package/dist/tools/query-llm-events.js +103 -60
- package/dist/tools/query-llm-events.js.map +1 -1
- package/dist/tools/query-llm-events.test.js +271 -9
- package/dist/tools/query-llm-events.test.js.map +1 -1
- package/dist/tools/query-logs.d.ts +28 -20
- package/dist/tools/query-logs.d.ts.map +1 -1
- package/dist/tools/query-logs.js +85 -61
- package/dist/tools/query-logs.js.map +1 -1
- package/dist/tools/query-logs.test.js +74 -145
- package/dist/tools/query-logs.test.js.map +1 -1
- package/dist/tools/query-metrics.d.ts +20 -20
- package/dist/tools/query-metrics.d.ts.map +1 -1
- package/dist/tools/query-metrics.js +109 -61
- package/dist/tools/query-metrics.js.map +1 -1
- package/dist/tools/query-metrics.test.js +26 -61
- package/dist/tools/query-metrics.test.js.map +1 -1
- package/dist/tools/query-traces.d.ts +24 -22
- package/dist/tools/query-traces.d.ts.map +1 -1
- package/dist/tools/query-traces.js +95 -70
- package/dist/tools/query-traces.js.map +1 -1
- package/dist/tools/query-traces.test.js +294 -90
- package/dist/tools/query-traces.test.js.map +1 -1
- package/dist/tools/setup-claudeignore.js +7 -7
- package/dist/tools/setup-claudeignore.js.map +1 -1
- package/dist/tools/setup-claudeignore.test.js +4 -25
- package/dist/tools/setup-claudeignore.test.js.map +1 -1
- package/package.json +3 -4
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server utilities - Rate limiter and error classes
|
|
3
|
+
*
|
|
4
|
+
* Extracted from server.ts to allow importing in tests without starting the MCP server.
|
|
5
|
+
*/
|
|
6
|
+
// Rate limiting configuration
|
|
7
|
+
export const RATE_LIMIT = {
|
|
8
|
+
windowMs: 60_000, // 1 minute window
|
|
9
|
+
maxRequests: 100, // max requests per window
|
|
10
|
+
bucketCount: 60, // 60 buckets for 1-second granularity
|
|
11
|
+
/** Maximum allowed bucketCount to prevent memory exhaustion */
|
|
12
|
+
maxBucketCount: 3600, // 1 hour max granularity
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Sliding window counter rate limiter with O(1) operations and bounded memory.
|
|
16
|
+
* Uses fixed-size bucket array to track request counts per time slice.
|
|
17
|
+
*
|
|
18
|
+
* Memory usage: O(bucketCount) - fixed regardless of request volume
|
|
19
|
+
* Time complexity: O(bucketCount) for sum, but bucketCount is constant (60)
|
|
20
|
+
*/
|
|
21
|
+
export class RateLimiter {
|
|
22
|
+
buckets;
|
|
23
|
+
bucketTimestamps;
|
|
24
|
+
bucketMs;
|
|
25
|
+
windowMs;
|
|
26
|
+
maxRequests;
|
|
27
|
+
bucketCount;
|
|
28
|
+
constructor(windowMs = RATE_LIMIT.windowMs, maxRequests = RATE_LIMIT.maxRequests, bucketCount = RATE_LIMIT.bucketCount) {
|
|
29
|
+
// Validate bounds to prevent memory exhaustion or invalid state
|
|
30
|
+
if (bucketCount < 1 || bucketCount > RATE_LIMIT.maxBucketCount) {
|
|
31
|
+
throw new Error(`bucketCount must be between 1 and ${RATE_LIMIT.maxBucketCount} (1 hour max granularity)`);
|
|
32
|
+
}
|
|
33
|
+
if (maxRequests < 1) {
|
|
34
|
+
throw new Error('maxRequests must be >= 1');
|
|
35
|
+
}
|
|
36
|
+
// Validate windowMs bounds: 1ms minimum, 86400000ms (1 day) maximum to prevent overflow
|
|
37
|
+
if (windowMs < 1 || windowMs > 86400000) {
|
|
38
|
+
throw new Error('windowMs must be between 1ms and 86400000ms (1 day)');
|
|
39
|
+
}
|
|
40
|
+
this.windowMs = windowMs;
|
|
41
|
+
this.maxRequests = maxRequests;
|
|
42
|
+
this.bucketCount = bucketCount;
|
|
43
|
+
this.bucketMs = Math.floor(windowMs / bucketCount);
|
|
44
|
+
// Pre-allocate fixed-size arrays
|
|
45
|
+
this.buckets = new Array(bucketCount).fill(0);
|
|
46
|
+
this.bucketTimestamps = new Array(bucketCount).fill(0);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the bucket index for a given timestamp.
|
|
50
|
+
* Uses modulo to create circular buffer behavior.
|
|
51
|
+
*/
|
|
52
|
+
getBucketIndex(timestamp) {
|
|
53
|
+
return Math.floor(timestamp / this.bucketMs) % this.bucketCount;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Clear expired buckets and return the current valid count.
|
|
57
|
+
* A bucket is expired if its timestamp is older than windowMs ago.
|
|
58
|
+
*/
|
|
59
|
+
cleanAndCount(now) {
|
|
60
|
+
const windowStart = now - this.windowMs;
|
|
61
|
+
let count = 0;
|
|
62
|
+
for (let i = 0; i < this.bucketCount; i++) {
|
|
63
|
+
if (this.bucketTimestamps[i] < windowStart) {
|
|
64
|
+
// Bucket is expired, reset it
|
|
65
|
+
this.buckets[i] = 0;
|
|
66
|
+
this.bucketTimestamps[i] = 0;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
count += this.buckets[i];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return count;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if a request is allowed and record it if so.
|
|
76
|
+
* O(bucketCount) time complexity where bucketCount is constant.
|
|
77
|
+
*/
|
|
78
|
+
isAllowed() {
|
|
79
|
+
const now = Date.now();
|
|
80
|
+
const currentCount = this.cleanAndCount(now);
|
|
81
|
+
if (currentCount >= this.maxRequests) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
// Record the request in the current bucket
|
|
85
|
+
const bucketIndex = this.getBucketIndex(now);
|
|
86
|
+
// If this bucket is from a different time period, reset it
|
|
87
|
+
const bucketWindowStart = now - this.windowMs;
|
|
88
|
+
if (this.bucketTimestamps[bucketIndex] < bucketWindowStart) {
|
|
89
|
+
this.buckets[bucketIndex] = 0;
|
|
90
|
+
}
|
|
91
|
+
this.buckets[bucketIndex]++;
|
|
92
|
+
this.bucketTimestamps[bucketIndex] = now;
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get the number of remaining allowed requests in the current window.
|
|
97
|
+
*/
|
|
98
|
+
getRemainingRequests() {
|
|
99
|
+
const now = Date.now();
|
|
100
|
+
const currentCount = this.cleanAndCount(now);
|
|
101
|
+
return Math.max(0, this.maxRequests - currentCount);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get the current memory footprint (for testing).
|
|
105
|
+
* Returns the fixed size of internal arrays.
|
|
106
|
+
*/
|
|
107
|
+
getMemoryFootprint() {
|
|
108
|
+
return {
|
|
109
|
+
bucketCount: this.bucketCount,
|
|
110
|
+
arraySize: this.buckets.length + this.bucketTimestamps.length,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Reset the rate limiter state.
|
|
115
|
+
* @internal For testing ONLY - not thread-safe, do not use in production
|
|
116
|
+
*/
|
|
117
|
+
reset() {
|
|
118
|
+
this.buckets.fill(0);
|
|
119
|
+
this.bucketTimestamps.fill(0);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Server initialization error with explicit step information.
|
|
124
|
+
*
|
|
125
|
+
* Steps:
|
|
126
|
+
* - tool-validation: Validating tool configuration
|
|
127
|
+
* - server-creation: Creating MCP server instance
|
|
128
|
+
* - handler-registration: Registering request handlers
|
|
129
|
+
* - transport-connection: Connecting stdio transport
|
|
130
|
+
*/
|
|
131
|
+
export class ServerInitError extends Error {
|
|
132
|
+
step;
|
|
133
|
+
cause;
|
|
134
|
+
constructor(step, cause, message) {
|
|
135
|
+
super(message || `Server initialization failed at step: ${step}`);
|
|
136
|
+
this.step = step;
|
|
137
|
+
this.cause = cause;
|
|
138
|
+
this.name = 'ServerInitError';
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=server-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-utils.js","sourceRoot":"","sources":["../../src/lib/server-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Zod schemas for common tool parameters
|
|
3
|
+
* Reduces token usage by centralizing repeated definitions
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Common date range parameters
|
|
8
|
+
*/
|
|
9
|
+
export declare const dateRangeSchema: {
|
|
10
|
+
startDate: z.ZodOptional<z.ZodString>;
|
|
11
|
+
endDate: z.ZodOptional<z.ZodString>;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Common pagination parameters
|
|
15
|
+
*/
|
|
16
|
+
export declare const paginationSchema: {
|
|
17
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Pagination with higher default for metrics
|
|
21
|
+
*/
|
|
22
|
+
export declare const metricsPaginationSchema: {
|
|
23
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Backend selection parameter
|
|
27
|
+
*/
|
|
28
|
+
export declare const backendSchema: {
|
|
29
|
+
backend: z.ZodDefault<z.ZodEnum<["local", "signoz", "auto"]>>;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Session ID filter parameter
|
|
33
|
+
*/
|
|
34
|
+
export declare const sessionSchema: {
|
|
35
|
+
sessionId: z.ZodOptional<z.ZodString>;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Trace ID filter parameter
|
|
39
|
+
*/
|
|
40
|
+
export declare const traceIdSchema: {
|
|
41
|
+
traceId: z.ZodOptional<z.ZodString>;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Combined common query parameters (backend + session + date range + pagination)
|
|
45
|
+
*/
|
|
46
|
+
export declare const commonQuerySchema: {
|
|
47
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
48
|
+
startDate: z.ZodOptional<z.ZodString>;
|
|
49
|
+
endDate: z.ZodOptional<z.ZodString>;
|
|
50
|
+
sessionId: z.ZodOptional<z.ZodString>;
|
|
51
|
+
backend: z.ZodDefault<z.ZodEnum<["local", "signoz", "auto"]>>;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* OTel GenAI operation name enum
|
|
55
|
+
*/
|
|
56
|
+
export declare const operationNameSchema: {
|
|
57
|
+
operationName: z.ZodOptional<z.ZodEnum<["chat", "embeddings", "invoke_agent", "execute_tool"]>>;
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=shared-schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-schemas.d.ts","sourceRoot":"","sources":["../../src/lib/shared-schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,eAAe;;;CAG3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;;CAE5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB;;CAEnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;CAEzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;CAEzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;CAEzB,CAAC;AAGF;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;CAK7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB;;CAE/B,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Zod schemas for common tool parameters
|
|
3
|
+
* Reduces token usage by centralizing repeated definitions
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Common date range parameters
|
|
8
|
+
*/
|
|
9
|
+
export const dateRangeSchema = {
|
|
10
|
+
startDate: z.string().optional().describe('Start (YYYY-MM-DD)'),
|
|
11
|
+
endDate: z.string().optional().describe('End (YYYY-MM-DD)'),
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Common pagination parameters
|
|
15
|
+
*/
|
|
16
|
+
export const paginationSchema = {
|
|
17
|
+
limit: z.number().max(1000).default(50).describe('Max results'),
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Pagination with higher default for metrics
|
|
21
|
+
*/
|
|
22
|
+
export const metricsPaginationSchema = {
|
|
23
|
+
limit: z.number().max(1000).default(100).describe('Max results'),
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Backend selection parameter
|
|
27
|
+
*/
|
|
28
|
+
export const backendSchema = {
|
|
29
|
+
backend: z.enum(['local', 'signoz', 'auto']).default('auto').describe('Backend (default: auto)'),
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Session ID filter parameter
|
|
33
|
+
*/
|
|
34
|
+
export const sessionSchema = {
|
|
35
|
+
sessionId: z.string().max(128).optional().describe('Session ID'),
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Trace ID filter parameter
|
|
39
|
+
*/
|
|
40
|
+
export const traceIdSchema = {
|
|
41
|
+
traceId: z.string().max(64).optional().describe('Trace ID'),
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Combined common query parameters (backend + session + date range + pagination)
|
|
45
|
+
*/
|
|
46
|
+
export const commonQuerySchema = {
|
|
47
|
+
...backendSchema,
|
|
48
|
+
...sessionSchema,
|
|
49
|
+
...dateRangeSchema,
|
|
50
|
+
...paginationSchema,
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* OTel GenAI operation name enum
|
|
54
|
+
*/
|
|
55
|
+
export const operationNameSchema = {
|
|
56
|
+
operationName: z.enum(['chat', 'embeddings', 'invoke_agent', 'execute_tool']).optional().describe('GenAI operation'),
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=shared-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-schemas.js","sourceRoot":"","sources":["../../src/lib/shared-schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC/D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CAC5D,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;CAChE,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;CACjE,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACjG,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;CACjE,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;CAC5D,CAAC;AAGF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,GAAG,eAAe;IAClB,GAAG,gBAAgB;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CACrH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-schemas.test.d.ts","sourceRoot":"","sources":["../../src/lib/shared-schemas.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for shared Zod schemas
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it } from 'node:test';
|
|
5
|
+
import assert from 'node:assert';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { traceIdSchema, sessionSchema, dateRangeSchema, paginationSchema, backendSchema, } from './shared-schemas.js';
|
|
8
|
+
describe('shared-schemas', () => {
|
|
9
|
+
describe('traceIdSchema', () => {
|
|
10
|
+
const schema = z.object(traceIdSchema);
|
|
11
|
+
it('should accept valid traceId', () => {
|
|
12
|
+
const result = schema.safeParse({ traceId: 'abc123' });
|
|
13
|
+
assert.strictEqual(result.success, true);
|
|
14
|
+
});
|
|
15
|
+
it('should accept traceId at max length (64)', () => {
|
|
16
|
+
const result = schema.safeParse({ traceId: 'a'.repeat(64) });
|
|
17
|
+
assert.strictEqual(result.success, true);
|
|
18
|
+
});
|
|
19
|
+
it('should reject traceId exceeding 64 characters', () => {
|
|
20
|
+
const result = schema.safeParse({ traceId: 'a'.repeat(65) });
|
|
21
|
+
assert.strictEqual(result.success, false);
|
|
22
|
+
});
|
|
23
|
+
it('should accept undefined traceId', () => {
|
|
24
|
+
const result = schema.safeParse({});
|
|
25
|
+
assert.strictEqual(result.success, true);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('sessionSchema', () => {
|
|
29
|
+
const schema = z.object(sessionSchema);
|
|
30
|
+
it('should accept valid sessionId', () => {
|
|
31
|
+
const result = schema.safeParse({ sessionId: 'session-123' });
|
|
32
|
+
assert.strictEqual(result.success, true);
|
|
33
|
+
});
|
|
34
|
+
it('should accept sessionId at max length (128)', () => {
|
|
35
|
+
const result = schema.safeParse({ sessionId: 'a'.repeat(128) });
|
|
36
|
+
assert.strictEqual(result.success, true);
|
|
37
|
+
});
|
|
38
|
+
it('should reject sessionId exceeding 128 characters', () => {
|
|
39
|
+
const result = schema.safeParse({ sessionId: 'a'.repeat(129) });
|
|
40
|
+
assert.strictEqual(result.success, false);
|
|
41
|
+
});
|
|
42
|
+
it('should accept undefined sessionId', () => {
|
|
43
|
+
const result = schema.safeParse({});
|
|
44
|
+
assert.strictEqual(result.success, true);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('dateRangeSchema', () => {
|
|
48
|
+
const schema = z.object(dateRangeSchema);
|
|
49
|
+
it('should accept valid date range', () => {
|
|
50
|
+
const result = schema.safeParse({
|
|
51
|
+
startDate: '2026-01-01',
|
|
52
|
+
endDate: '2026-01-31',
|
|
53
|
+
});
|
|
54
|
+
assert.strictEqual(result.success, true);
|
|
55
|
+
});
|
|
56
|
+
it('should accept partial date range', () => {
|
|
57
|
+
const result = schema.safeParse({ startDate: '2026-01-01' });
|
|
58
|
+
assert.strictEqual(result.success, true);
|
|
59
|
+
});
|
|
60
|
+
it('should accept empty object', () => {
|
|
61
|
+
const result = schema.safeParse({});
|
|
62
|
+
assert.strictEqual(result.success, true);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('paginationSchema', () => {
|
|
66
|
+
const schema = z.object(paginationSchema);
|
|
67
|
+
it('should default limit to 50', () => {
|
|
68
|
+
const result = schema.safeParse({});
|
|
69
|
+
assert.strictEqual(result.success, true);
|
|
70
|
+
if (result.success) {
|
|
71
|
+
assert.strictEqual(result.data.limit, 50);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
it('should accept valid limit', () => {
|
|
75
|
+
const result = schema.safeParse({ limit: 100 });
|
|
76
|
+
assert.strictEqual(result.success, true);
|
|
77
|
+
});
|
|
78
|
+
it('should reject limit exceeding 1000', () => {
|
|
79
|
+
const result = schema.safeParse({ limit: 1001 });
|
|
80
|
+
assert.strictEqual(result.success, false);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('backendSchema', () => {
|
|
84
|
+
const schema = z.object(backendSchema);
|
|
85
|
+
it('should default backend to auto', () => {
|
|
86
|
+
const result = schema.safeParse({});
|
|
87
|
+
assert.strictEqual(result.success, true);
|
|
88
|
+
if (result.success) {
|
|
89
|
+
assert.strictEqual(result.data.backend, 'auto');
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
it('should accept local backend', () => {
|
|
93
|
+
const result = schema.safeParse({ backend: 'local' });
|
|
94
|
+
assert.strictEqual(result.success, true);
|
|
95
|
+
});
|
|
96
|
+
it('should accept signoz backend', () => {
|
|
97
|
+
const result = schema.safeParse({ backend: 'signoz' });
|
|
98
|
+
assert.strictEqual(result.success, true);
|
|
99
|
+
});
|
|
100
|
+
it('should reject invalid backend', () => {
|
|
101
|
+
const result = schema.safeParse({ backend: 'invalid' });
|
|
102
|
+
assert.strictEqual(result.success, false);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=shared-schemas.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-schemas.test.js","sourceRoot":"","sources":["../../src/lib/shared-schemas.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOON (Token-Oriented Object Notation) encoding utilities
|
|
3
|
+
* Provides 40-60% token reduction for uniform array responses
|
|
4
|
+
*/
|
|
5
|
+
export type ResponseFormat = 'json' | 'toon';
|
|
6
|
+
/**
|
|
7
|
+
* Encode data to TOON format
|
|
8
|
+
* @param data - Data to encode (typically an array of objects)
|
|
9
|
+
* @returns TOON-encoded string
|
|
10
|
+
*
|
|
11
|
+
* Security: Logs encoding failures for debugging instead of silently falling back
|
|
12
|
+
*/
|
|
13
|
+
export declare function toToon<T>(data: T[]): string;
|
|
14
|
+
/**
|
|
15
|
+
* Check if TOON format is beneficial for the given data
|
|
16
|
+
* TOON works best with uniform arrays of objects
|
|
17
|
+
* @param data - Data to check
|
|
18
|
+
* @returns true if TOON would be beneficial
|
|
19
|
+
*/
|
|
20
|
+
export declare function isToonBeneficial(data: unknown[]): boolean;
|
|
21
|
+
//# sourceMappingURL=toon-encoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toon-encoder.d.ts","sourceRoot":"","sources":["../../src/lib/toon-encoder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAc3C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAazD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOON (Token-Oriented Object Notation) encoding utilities
|
|
3
|
+
* Provides 40-60% token reduction for uniform array responses
|
|
4
|
+
*/
|
|
5
|
+
import { encode as toonEncode } from '@toon-format/toon';
|
|
6
|
+
/**
|
|
7
|
+
* Encode data to TOON format
|
|
8
|
+
* @param data - Data to encode (typically an array of objects)
|
|
9
|
+
* @returns TOON-encoded string
|
|
10
|
+
*
|
|
11
|
+
* Security: Logs encoding failures for debugging instead of silently falling back
|
|
12
|
+
*/
|
|
13
|
+
export function toToon(data) {
|
|
14
|
+
if (Array.isArray(data) && data.length > 0) {
|
|
15
|
+
try {
|
|
16
|
+
return toonEncode(data);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
// Log warning for debugging - silent fallback makes issues hard to diagnose
|
|
20
|
+
console.warn('[TOON] Encoding failed, falling back to JSON:', error instanceof Error ? error.message : String(error));
|
|
21
|
+
return JSON.stringify(data);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return JSON.stringify(data);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if TOON format is beneficial for the given data
|
|
28
|
+
* TOON works best with uniform arrays of objects
|
|
29
|
+
* @param data - Data to check
|
|
30
|
+
* @returns true if TOON would be beneficial
|
|
31
|
+
*/
|
|
32
|
+
export function isToonBeneficial(data) {
|
|
33
|
+
if (!Array.isArray(data) || data.length < 2)
|
|
34
|
+
return false;
|
|
35
|
+
// Check if all items are objects with same keys
|
|
36
|
+
const firstItem = data[0];
|
|
37
|
+
if (typeof firstItem !== 'object' || firstItem === null)
|
|
38
|
+
return false;
|
|
39
|
+
const firstKeys = Object.keys(firstItem).sort().join(',');
|
|
40
|
+
return data.every(item => {
|
|
41
|
+
if (typeof item !== 'object' || item === null)
|
|
42
|
+
return false;
|
|
43
|
+
return Object.keys(item).sort().join(',') === firstKeys;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=toon-encoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toon-encoder.js","sourceRoot":"","sources":["../../src/lib/toon-encoder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIzD;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAI,IAAS;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4EAA4E;YAC5E,OAAO,CAAC,IAAI,CACV,+CAA+C,EAC/C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAe;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1D,gDAAgD;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAEtE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE1D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QACvB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAC5D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/server.d.ts
CHANGED
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AA8BH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|