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
package/dist/lib/constants.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Constants for observability-toolkit MCP server
|
|
3
3
|
*/
|
|
4
|
-
import { join } from 'path';
|
|
5
|
-
import { existsSync } from 'fs';
|
|
4
|
+
import { join, resolve, dirname } from 'path';
|
|
5
|
+
import { existsSync, realpathSync, lstatSync, readlinkSync, openSync, fstatSync, closeSync, constants as fsConstants } from 'fs';
|
|
6
6
|
import { expandTilde } from './file-utils.js';
|
|
7
|
+
import { homedir } from 'os';
|
|
7
8
|
// Paths - expand tilde in case TELEMETRY_DIR is set to ~/... (tilde doesn't expand in JSON/env)
|
|
8
9
|
export const CLAUDE_HOME = join(process.env.HOME || '', '.claude');
|
|
9
10
|
export const TELEMETRY_DIR = expandTilde(process.env.TELEMETRY_DIR || '') || join(CLAUDE_HOME, 'telemetry');
|
|
@@ -13,9 +14,130 @@ const LOCAL_TELEMETRY_PATHS = [
|
|
|
13
14
|
'telemetry',
|
|
14
15
|
'.telemetry',
|
|
15
16
|
];
|
|
17
|
+
/**
|
|
18
|
+
* Atomically check and resolve a path, preventing TOCTOU race conditions.
|
|
19
|
+
* Returns { exists: false } if path doesn't exist or is inaccessible.
|
|
20
|
+
* Returns { exists: true, isSymlink, realPath } with atomically resolved data.
|
|
21
|
+
*
|
|
22
|
+
* Security: Uses file descriptor-based operations to prevent symlink swap attacks.
|
|
23
|
+
* For regular directories, opens with O_DIRECTORY to verify it's a directory.
|
|
24
|
+
* For symlinks, reads target directly then verifies the resolved target exists.
|
|
25
|
+
*/
|
|
26
|
+
function atomicPathCheck(path) {
|
|
27
|
+
let fd;
|
|
28
|
+
try {
|
|
29
|
+
// Step 1: Get lstat info (does not follow symlinks)
|
|
30
|
+
const lstats = lstatSync(path);
|
|
31
|
+
const isSymbolicLink = lstats.isSymbolicLink();
|
|
32
|
+
if (isSymbolicLink) {
|
|
33
|
+
// Step 2a: For symlinks, read and verify the target
|
|
34
|
+
const target = readlinkSync(path);
|
|
35
|
+
// Resolve the target (handles both relative and absolute paths)
|
|
36
|
+
const parentDir = dirname(path);
|
|
37
|
+
const resolvedTarget = resolve(parentDir, target);
|
|
38
|
+
// Verify the target exists and is a directory
|
|
39
|
+
try {
|
|
40
|
+
const targetStats = lstatSync(resolvedTarget);
|
|
41
|
+
// If target is also a symlink, we need to follow the chain
|
|
42
|
+
// Use realpathSync to get the final destination
|
|
43
|
+
const realPath = targetStats.isSymbolicLink()
|
|
44
|
+
? realpathSync(resolvedTarget)
|
|
45
|
+
: (targetStats.isDirectory() ? realpathSync(resolvedTarget) : null);
|
|
46
|
+
if (!realPath) {
|
|
47
|
+
return { exists: false };
|
|
48
|
+
}
|
|
49
|
+
// Final verification that the resolved path is a directory
|
|
50
|
+
const finalStats = lstatSync(realPath);
|
|
51
|
+
if (!finalStats.isDirectory()) {
|
|
52
|
+
return { exists: false };
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
exists: true,
|
|
56
|
+
isSymlink: true,
|
|
57
|
+
realPath,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return { exists: false };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Step 2b: For non-symlinks, use file descriptor for atomic verification
|
|
65
|
+
// Open with O_RDONLY | O_DIRECTORY to ensure it's a directory
|
|
66
|
+
try {
|
|
67
|
+
fd = openSync(path, fsConstants.O_RDONLY | fsConstants.O_DIRECTORY);
|
|
68
|
+
const fdStats = fstatSync(fd);
|
|
69
|
+
if (!fdStats.isDirectory()) {
|
|
70
|
+
return { exists: false };
|
|
71
|
+
}
|
|
72
|
+
// Path is verified to be a directory via file descriptor
|
|
73
|
+
// Resolve any parent symlinks (safe since we hold FD to the actual dir)
|
|
74
|
+
const realPath = realpathSync(path);
|
|
75
|
+
return {
|
|
76
|
+
exists: true,
|
|
77
|
+
isSymlink: false,
|
|
78
|
+
realPath,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
if (fd !== undefined) {
|
|
83
|
+
try {
|
|
84
|
+
closeSync(fd);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Ignore close errors
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return { exists: false };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Validate that a resolved path is within allowed base directories.
|
|
98
|
+
* Prevents symlink-based path traversal attacks.
|
|
99
|
+
*
|
|
100
|
+
* @param resolvedPath - The real path after resolving symlinks
|
|
101
|
+
* @param allowedBasePaths - Array of allowed base directories
|
|
102
|
+
* @returns true if the path is within allowed directories
|
|
103
|
+
*/
|
|
104
|
+
function isPathWithinAllowedBases(resolvedPath, allowedBasePaths) {
|
|
105
|
+
const sep = process.platform === 'win32' ? '\\' : '/';
|
|
106
|
+
for (const basePath of allowedBasePaths) {
|
|
107
|
+
try {
|
|
108
|
+
// Resolve the base path too in case it contains symlinks
|
|
109
|
+
const resolvedBase = existsSync(basePath) ? realpathSync(basePath) : resolve(basePath);
|
|
110
|
+
if (resolvedPath === resolvedBase || resolvedPath.startsWith(resolvedBase + sep)) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Skip invalid base paths
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get allowed base directories for local telemetry paths.
|
|
123
|
+
* Local telemetry must be within the working directory or home directory.
|
|
124
|
+
*/
|
|
125
|
+
function getAllowedLocalBases(workingDir) {
|
|
126
|
+
const home = homedir();
|
|
127
|
+
const resolvedWorkingDir = existsSync(workingDir) ? realpathSync(workingDir) : resolve(workingDir);
|
|
128
|
+
// Allow paths within the working directory or within home/.claude/
|
|
129
|
+
return [
|
|
130
|
+
resolvedWorkingDir,
|
|
131
|
+
join(home, '.claude'),
|
|
132
|
+
];
|
|
133
|
+
}
|
|
16
134
|
/**
|
|
17
135
|
* Get all telemetry directories (global + local project directories)
|
|
18
136
|
* Returns array of { path, source } objects
|
|
137
|
+
*
|
|
138
|
+
* Security: Validates paths to prevent symlink-based path traversal attacks.
|
|
139
|
+
* Local telemetry directories must resolve to paths within the working directory
|
|
140
|
+
* or ~/.claude/ to prevent accessing sensitive files via malicious symlinks.
|
|
19
141
|
*/
|
|
20
142
|
export function getTelemetryDirectories(cwd) {
|
|
21
143
|
const dirs = [];
|
|
@@ -25,11 +147,28 @@ export function getTelemetryDirectories(cwd) {
|
|
|
25
147
|
}
|
|
26
148
|
// Check for local project telemetry directories
|
|
27
149
|
const workingDir = cwd || process.cwd();
|
|
150
|
+
const allowedBases = getAllowedLocalBases(workingDir);
|
|
28
151
|
for (const localPath of LOCAL_TELEMETRY_PATHS) {
|
|
29
152
|
const fullPath = join(workingDir, localPath);
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
|
|
153
|
+
// Security: Atomically check existence, symlink status, and resolve path
|
|
154
|
+
// This prevents TOCTOU race conditions where symlink target could be swapped
|
|
155
|
+
// between check and use
|
|
156
|
+
const pathInfo = atomicPathCheck(fullPath);
|
|
157
|
+
if (!pathInfo.exists) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const { isSymlink: isSymbolicLink, realPath } = pathInfo;
|
|
161
|
+
// Security: Validate symlinks point to allowed directories
|
|
162
|
+
if (isSymbolicLink) {
|
|
163
|
+
if (!isPathWithinAllowedBases(realPath, allowedBases)) {
|
|
164
|
+
console.warn(`[SECURITY] Rejected symlink traversal: ${fullPath} -> ${realPath}`);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Use the atomically resolved real path
|
|
169
|
+
// Avoid adding duplicates
|
|
170
|
+
if (!dirs.some(d => d.path === realPath)) {
|
|
171
|
+
dirs.push({ path: realPath, source: 'local' });
|
|
33
172
|
}
|
|
34
173
|
}
|
|
35
174
|
return dirs;
|
|
@@ -47,15 +186,114 @@ export const CIRCUIT_BREAKER = {
|
|
|
47
186
|
MAX_FAILURES: parseInt(process.env.CIRCUIT_BREAKER_MAX_FAILURES || '3', 10),
|
|
48
187
|
RESET_MS: parseInt(process.env.CIRCUIT_BREAKER_RESET_MS || '60000', 10),
|
|
49
188
|
};
|
|
189
|
+
// Rate limiter configuration (token bucket)
|
|
190
|
+
export const RATE_LIMITER = {
|
|
191
|
+
/** Maximum tokens (burst capacity) */
|
|
192
|
+
MAX_TOKENS: parseInt(process.env.RATE_LIMIT_MAX_TOKENS || '60', 10),
|
|
193
|
+
/** Tokens to refill per second */
|
|
194
|
+
REFILL_RATE: parseInt(process.env.RATE_LIMIT_REFILL_RATE || '1', 10),
|
|
195
|
+
};
|
|
50
196
|
// Claude context window size (200K tokens)
|
|
51
197
|
export const CONTEXT_WINDOW_SIZE = 200000;
|
|
52
198
|
// Approximate tokens per character
|
|
53
199
|
export const TOKENS_PER_CHAR = 0.25;
|
|
54
|
-
|
|
200
|
+
/**
|
|
201
|
+
* Model pricing metadata for staleness detection
|
|
202
|
+
*/
|
|
203
|
+
export const MODEL_PRICING_METADATA = {
|
|
204
|
+
/** ISO date when pricing was last updated */
|
|
205
|
+
lastUpdated: '2026-01-30',
|
|
206
|
+
/** Days after which pricing is considered stale */
|
|
207
|
+
staleThresholdDays: 90,
|
|
208
|
+
/** Pricing sources for verification */
|
|
209
|
+
sources: {
|
|
210
|
+
anthropic: 'https://www.anthropic.com/pricing',
|
|
211
|
+
openai: 'https://openai.com/pricing',
|
|
212
|
+
google: 'https://ai.google.dev/pricing',
|
|
213
|
+
mistral: 'https://mistral.ai/pricing',
|
|
214
|
+
cohere: 'https://cohere.com/pricing',
|
|
215
|
+
groq: 'https://groq.com/pricing',
|
|
216
|
+
together: 'https://www.together.ai/pricing',
|
|
217
|
+
perplexity: 'https://www.perplexity.ai/pricing',
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* Check if pricing data is stale (>90 days old)
|
|
222
|
+
* @returns { isStale: boolean, daysSinceUpdate: number }
|
|
223
|
+
*/
|
|
224
|
+
export function checkPricingStaleness() {
|
|
225
|
+
const lastUpdate = new Date(MODEL_PRICING_METADATA.lastUpdated);
|
|
226
|
+
const now = new Date();
|
|
227
|
+
const daysSinceUpdate = Math.floor((now.getTime() - lastUpdate.getTime()) / (1000 * 60 * 60 * 24));
|
|
228
|
+
return {
|
|
229
|
+
isStale: daysSinceUpdate > MODEL_PRICING_METADATA.staleThresholdDays,
|
|
230
|
+
daysSinceUpdate,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
// Check pricing staleness on module load (M13 fix)
|
|
234
|
+
const pricingStatus = checkPricingStaleness();
|
|
235
|
+
if (pricingStatus.isStale) {
|
|
236
|
+
console.warn(`[WARN] Model pricing data is ${pricingStatus.daysSinceUpdate} days old (last updated: ${MODEL_PRICING_METADATA.lastUpdated}). Consider updating MODEL_PRICING in constants.ts.`);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Model pricing per 1M tokens (as of Jan 2026)
|
|
240
|
+
*
|
|
241
|
+
* Pricing sources:
|
|
242
|
+
* - Anthropic: https://www.anthropic.com/pricing
|
|
243
|
+
* - OpenAI: https://openai.com/pricing
|
|
244
|
+
* - Google: https://ai.google.dev/pricing
|
|
245
|
+
* - Mistral: https://mistral.ai/pricing
|
|
246
|
+
* - Cohere: https://cohere.com/pricing
|
|
247
|
+
*
|
|
248
|
+
* Note: Pricing changes frequently. These are approximate values for cost estimation.
|
|
249
|
+
* For batch API pricing, multiply by 0.5 (50% discount typically).
|
|
250
|
+
*
|
|
251
|
+
* @see MODEL_PRICING_METADATA.lastUpdated for when this data was last verified
|
|
252
|
+
*/
|
|
55
253
|
export const MODEL_PRICING = {
|
|
254
|
+
// Anthropic Claude models
|
|
56
255
|
'claude-opus-4-5-20251101': { input: 15.0, output: 75.0 },
|
|
57
256
|
'claude-sonnet-4-20250514': { input: 3.0, output: 15.0 },
|
|
58
257
|
'claude-3-5-haiku-20241022': { input: 0.80, output: 4.0 },
|
|
258
|
+
// Aliases for common model names
|
|
259
|
+
'claude-3-opus': { input: 15.0, output: 75.0 },
|
|
260
|
+
'claude-3-sonnet': { input: 3.0, output: 15.0 },
|
|
261
|
+
'claude-3-haiku': { input: 0.25, output: 1.25 },
|
|
262
|
+
// OpenAI GPT models
|
|
263
|
+
'gpt-4o': { input: 2.50, output: 10.0 },
|
|
264
|
+
'gpt-4o-mini': { input: 0.15, output: 0.60 },
|
|
265
|
+
'gpt-4-turbo': { input: 10.0, output: 30.0 },
|
|
266
|
+
'gpt-4': { input: 30.0, output: 60.0 },
|
|
267
|
+
'gpt-3.5-turbo': { input: 0.50, output: 1.50 },
|
|
268
|
+
'o1': { input: 15.0, output: 60.0 },
|
|
269
|
+
'o1-mini': { input: 3.0, output: 12.0 },
|
|
270
|
+
'o3-mini': { input: 1.10, output: 4.40 },
|
|
271
|
+
// Google Gemini models
|
|
272
|
+
'gemini-1.5-pro': { input: 1.25, output: 5.0 },
|
|
273
|
+
'gemini-1.5-flash': { input: 0.075, output: 0.30 },
|
|
274
|
+
'gemini-2.0-flash': { input: 0.10, output: 0.40 },
|
|
275
|
+
'gemini-1.0-pro': { input: 0.50, output: 1.50 },
|
|
276
|
+
// Mistral AI models
|
|
277
|
+
'mistral-large': { input: 2.0, output: 6.0 },
|
|
278
|
+
'mistral-medium': { input: 2.7, output: 8.1 },
|
|
279
|
+
'mistral-small': { input: 0.2, output: 0.6 },
|
|
280
|
+
'mixtral-8x7b': { input: 0.7, output: 0.7 },
|
|
281
|
+
'codestral': { input: 0.2, output: 0.6 },
|
|
282
|
+
// Cohere models
|
|
283
|
+
'command-r-plus': { input: 2.50, output: 10.0 },
|
|
284
|
+
'command-r': { input: 0.15, output: 0.60 },
|
|
285
|
+
'command': { input: 1.0, output: 2.0 },
|
|
286
|
+
'command-light': { input: 0.30, output: 0.60 },
|
|
287
|
+
// Groq models (competitive pricing)
|
|
288
|
+
'llama-3.3-70b': { input: 0.59, output: 0.79 },
|
|
289
|
+
'llama-3.1-8b': { input: 0.05, output: 0.08 },
|
|
290
|
+
'mixtral-8x7b-groq': { input: 0.24, output: 0.24 },
|
|
291
|
+
// Together AI models (approximate)
|
|
292
|
+
'llama-3-70b': { input: 0.90, output: 0.90 },
|
|
293
|
+
'llama-3-8b': { input: 0.20, output: 0.20 },
|
|
294
|
+
// Perplexity models
|
|
295
|
+
'sonar-pro': { input: 3.0, output: 15.0 },
|
|
296
|
+
'sonar': { input: 1.0, output: 1.0 },
|
|
59
297
|
};
|
|
60
298
|
// File patterns
|
|
61
299
|
export const TRACES_FILE_PATTERN = 'traces-*.jsonl';
|
|
@@ -101,4 +339,12 @@ export function escapeFilterValue(value) {
|
|
|
101
339
|
export const MAX_QUERY_LIMIT = 1000;
|
|
102
340
|
// Retention configuration (default 7 days)
|
|
103
341
|
export const RETENTION_DAYS = parseInt(process.env.RETENTION_DAYS || '7', 10);
|
|
342
|
+
// Memory limits for result processing
|
|
343
|
+
/** Hard cap on results held in memory to prevent OOM */
|
|
344
|
+
export const MAX_RESULTS_IN_MEMORY = 10000;
|
|
345
|
+
/** Switch to streaming aggregation when results exceed this threshold */
|
|
346
|
+
export const STREAMING_THRESHOLD = 5000;
|
|
347
|
+
// Duration limits for queries
|
|
348
|
+
/** Maximum duration filter value (24 hours in milliseconds) */
|
|
349
|
+
export const MAX_DURATION_MS = 86400000;
|
|
104
350
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"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"}
|