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.
Files changed (186) hide show
  1. package/README.md +81 -3
  2. package/dist/backends/index.d.ts +119 -0
  3. package/dist/backends/index.d.ts.map +1 -1
  4. package/dist/backends/index.js +57 -0
  5. package/dist/backends/index.js.map +1 -1
  6. package/dist/backends/index.test.d.ts +5 -0
  7. package/dist/backends/index.test.d.ts.map +1 -0
  8. package/dist/backends/index.test.js +156 -0
  9. package/dist/backends/index.test.js.map +1 -0
  10. package/dist/backends/local-jsonl-boolean-search.test.js +8 -27
  11. package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
  12. package/dist/backends/local-jsonl-logs.test.d.ts +2 -0
  13. package/dist/backends/local-jsonl-logs.test.d.ts.map +1 -0
  14. package/dist/backends/local-jsonl-logs.test.js +603 -0
  15. package/dist/backends/local-jsonl-logs.test.js.map +1 -0
  16. package/dist/backends/local-jsonl-traces.test.d.ts +2 -0
  17. package/dist/backends/local-jsonl-traces.test.d.ts.map +1 -0
  18. package/dist/backends/local-jsonl-traces.test.js +1723 -0
  19. package/dist/backends/local-jsonl-traces.test.js.map +1 -0
  20. package/dist/backends/local-jsonl.d.ts +4 -1
  21. package/dist/backends/local-jsonl.d.ts.map +1 -1
  22. package/dist/backends/local-jsonl.js +185 -1
  23. package/dist/backends/local-jsonl.js.map +1 -1
  24. package/dist/backends/local-jsonl.test.js +723 -46
  25. package/dist/backends/local-jsonl.test.js.map +1 -1
  26. package/dist/backends/signoz-api.d.ts +32 -0
  27. package/dist/backends/signoz-api.d.ts.map +1 -1
  28. package/dist/backends/signoz-api.js +231 -33
  29. package/dist/backends/signoz-api.js.map +1 -1
  30. package/dist/backends/signoz-api.test.js +410 -63
  31. package/dist/backends/signoz-api.test.js.map +1 -1
  32. package/dist/lib/constants.d.ts +59 -0
  33. package/dist/lib/constants.d.ts.map +1 -1
  34. package/dist/lib/constants.js +252 -6
  35. package/dist/lib/constants.js.map +1 -1
  36. package/dist/lib/constants.test.js +357 -21
  37. package/dist/lib/constants.test.js.map +1 -1
  38. package/dist/lib/edge-cases.test.d.ts +11 -0
  39. package/dist/lib/edge-cases.test.d.ts.map +1 -0
  40. package/dist/lib/edge-cases.test.js +634 -0
  41. package/dist/lib/edge-cases.test.js.map +1 -0
  42. package/dist/lib/error-sanitizer.d.ts +57 -0
  43. package/dist/lib/error-sanitizer.d.ts.map +1 -0
  44. package/dist/lib/error-sanitizer.js +207 -0
  45. package/dist/lib/error-sanitizer.js.map +1 -0
  46. package/dist/lib/error-sanitizer.test.d.ts +8 -0
  47. package/dist/lib/error-sanitizer.test.d.ts.map +1 -0
  48. package/dist/lib/error-sanitizer.test.js +369 -0
  49. package/dist/lib/error-sanitizer.test.js.map +1 -0
  50. package/dist/lib/file-utils.d.ts +134 -0
  51. package/dist/lib/file-utils.d.ts.map +1 -1
  52. package/dist/lib/file-utils.js +395 -9
  53. package/dist/lib/file-utils.js.map +1 -1
  54. package/dist/lib/file-utils.test.js +444 -3
  55. package/dist/lib/file-utils.test.js.map +1 -1
  56. package/dist/lib/indexer.d.ts +9 -1
  57. package/dist/lib/indexer.d.ts.map +1 -1
  58. package/dist/lib/indexer.js +51 -2
  59. package/dist/lib/indexer.js.map +1 -1
  60. package/dist/lib/indexer.test.js +138 -20
  61. package/dist/lib/indexer.test.js.map +1 -1
  62. package/dist/lib/input-validator.d.ts +103 -0
  63. package/dist/lib/input-validator.d.ts.map +1 -0
  64. package/dist/lib/input-validator.js +250 -0
  65. package/dist/lib/input-validator.js.map +1 -0
  66. package/dist/lib/input-validator.test.d.ts +2 -0
  67. package/dist/lib/input-validator.test.d.ts.map +1 -0
  68. package/dist/lib/input-validator.test.js +287 -0
  69. package/dist/lib/input-validator.test.js.map +1 -0
  70. package/dist/lib/query-sanitizer.d.ts +143 -0
  71. package/dist/lib/query-sanitizer.d.ts.map +1 -0
  72. package/dist/lib/query-sanitizer.js +261 -0
  73. package/dist/lib/query-sanitizer.js.map +1 -0
  74. package/dist/lib/query-sanitizer.test.d.ts +5 -0
  75. package/dist/lib/query-sanitizer.test.d.ts.map +1 -0
  76. package/dist/lib/query-sanitizer.test.js +400 -0
  77. package/dist/lib/query-sanitizer.test.js.map +1 -0
  78. package/dist/lib/server-utils.d.ts +80 -0
  79. package/dist/lib/server-utils.d.ts.map +1 -0
  80. package/dist/lib/server-utils.js +141 -0
  81. package/dist/lib/server-utils.js.map +1 -0
  82. package/dist/lib/shared-schemas.d.ts +59 -0
  83. package/dist/lib/shared-schemas.d.ts.map +1 -0
  84. package/dist/lib/shared-schemas.js +58 -0
  85. package/dist/lib/shared-schemas.js.map +1 -0
  86. package/dist/lib/shared-schemas.test.d.ts +5 -0
  87. package/dist/lib/shared-schemas.test.d.ts.map +1 -0
  88. package/dist/lib/shared-schemas.test.js +106 -0
  89. package/dist/lib/shared-schemas.test.js.map +1 -0
  90. package/dist/lib/toon-encoder.d.ts +21 -0
  91. package/dist/lib/toon-encoder.d.ts.map +1 -0
  92. package/dist/lib/toon-encoder.js +46 -0
  93. package/dist/lib/toon-encoder.js.map +1 -0
  94. package/dist/server.d.ts +1 -1
  95. package/dist/server.d.ts.map +1 -1
  96. package/dist/server.js +155 -81
  97. package/dist/server.js.map +1 -1
  98. package/dist/server.test.js +363 -0
  99. package/dist/server.test.js.map +1 -1
  100. package/dist/test-helpers/env-utils.d.ts +65 -0
  101. package/dist/test-helpers/env-utils.d.ts.map +1 -0
  102. package/dist/test-helpers/env-utils.js +94 -0
  103. package/dist/test-helpers/env-utils.js.map +1 -0
  104. package/dist/test-helpers/file-utils.d.ts +93 -0
  105. package/dist/test-helpers/file-utils.d.ts.map +1 -0
  106. package/dist/test-helpers/file-utils.js +206 -0
  107. package/dist/test-helpers/file-utils.js.map +1 -0
  108. package/dist/test-helpers/index.d.ts +10 -0
  109. package/dist/test-helpers/index.d.ts.map +1 -0
  110. package/dist/test-helpers/index.js +28 -0
  111. package/dist/test-helpers/index.js.map +1 -0
  112. package/dist/test-helpers/mock-backends.d.ts +139 -0
  113. package/dist/test-helpers/mock-backends.d.ts.map +1 -0
  114. package/dist/test-helpers/mock-backends.js +227 -0
  115. package/dist/test-helpers/mock-backends.js.map +1 -0
  116. package/dist/test-helpers/mock-backends.test.d.ts +5 -0
  117. package/dist/test-helpers/mock-backends.test.d.ts.map +1 -0
  118. package/dist/test-helpers/mock-backends.test.js +368 -0
  119. package/dist/test-helpers/mock-backends.test.js.map +1 -0
  120. package/dist/test-helpers/schema-validators.d.ts +32 -0
  121. package/dist/test-helpers/schema-validators.d.ts.map +1 -0
  122. package/dist/test-helpers/schema-validators.js +125 -0
  123. package/dist/test-helpers/schema-validators.js.map +1 -0
  124. package/dist/test-helpers/test-data-builders.d.ts +223 -0
  125. package/dist/test-helpers/test-data-builders.d.ts.map +1 -0
  126. package/dist/test-helpers/test-data-builders.js +288 -0
  127. package/dist/test-helpers/test-data-builders.js.map +1 -0
  128. package/dist/test-helpers/test-data-builders.test.d.ts +2 -0
  129. package/dist/test-helpers/test-data-builders.test.d.ts.map +1 -0
  130. package/dist/test-helpers/test-data-builders.test.js +306 -0
  131. package/dist/test-helpers/test-data-builders.test.js.map +1 -0
  132. package/dist/test-helpers/tool-validators.d.ts +28 -0
  133. package/dist/test-helpers/tool-validators.d.ts.map +1 -0
  134. package/dist/test-helpers/tool-validators.js +56 -0
  135. package/dist/test-helpers/tool-validators.js.map +1 -0
  136. package/dist/tools/context-stats.d.ts +1 -0
  137. package/dist/tools/context-stats.d.ts.map +1 -1
  138. package/dist/tools/context-stats.js +9 -5
  139. package/dist/tools/context-stats.js.map +1 -1
  140. package/dist/tools/context-stats.test.js +24 -10
  141. package/dist/tools/context-stats.test.js.map +1 -1
  142. package/dist/tools/get-trace-url.js +2 -2
  143. package/dist/tools/get-trace-url.js.map +1 -1
  144. package/dist/tools/health-check.js +2 -2
  145. package/dist/tools/health-check.js.map +1 -1
  146. package/dist/tools/index.d.ts +1 -0
  147. package/dist/tools/index.d.ts.map +1 -1
  148. package/dist/tools/index.js +1 -0
  149. package/dist/tools/index.js.map +1 -1
  150. package/dist/tools/query-evaluations.d.ts +186 -0
  151. package/dist/tools/query-evaluations.d.ts.map +1 -0
  152. package/dist/tools/query-evaluations.js +351 -0
  153. package/dist/tools/query-evaluations.js.map +1 -0
  154. package/dist/tools/query-evaluations.test.d.ts +5 -0
  155. package/dist/tools/query-evaluations.test.d.ts.map +1 -0
  156. package/dist/tools/query-evaluations.test.js +733 -0
  157. package/dist/tools/query-evaluations.test.js.map +1 -0
  158. package/dist/tools/query-llm-events.d.ts +24 -18
  159. package/dist/tools/query-llm-events.d.ts.map +1 -1
  160. package/dist/tools/query-llm-events.js +103 -60
  161. package/dist/tools/query-llm-events.js.map +1 -1
  162. package/dist/tools/query-llm-events.test.js +271 -9
  163. package/dist/tools/query-llm-events.test.js.map +1 -1
  164. package/dist/tools/query-logs.d.ts +28 -20
  165. package/dist/tools/query-logs.d.ts.map +1 -1
  166. package/dist/tools/query-logs.js +85 -61
  167. package/dist/tools/query-logs.js.map +1 -1
  168. package/dist/tools/query-logs.test.js +74 -145
  169. package/dist/tools/query-logs.test.js.map +1 -1
  170. package/dist/tools/query-metrics.d.ts +20 -20
  171. package/dist/tools/query-metrics.d.ts.map +1 -1
  172. package/dist/tools/query-metrics.js +109 -61
  173. package/dist/tools/query-metrics.js.map +1 -1
  174. package/dist/tools/query-metrics.test.js +26 -61
  175. package/dist/tools/query-metrics.test.js.map +1 -1
  176. package/dist/tools/query-traces.d.ts +24 -22
  177. package/dist/tools/query-traces.d.ts.map +1 -1
  178. package/dist/tools/query-traces.js +95 -70
  179. package/dist/tools/query-traces.js.map +1 -1
  180. package/dist/tools/query-traces.test.js +294 -90
  181. package/dist/tools/query-traces.test.js.map +1 -1
  182. package/dist/tools/setup-claudeignore.js +7 -7
  183. package/dist/tools/setup-claudeignore.js.map +1 -1
  184. package/dist/tools/setup-claudeignore.test.js +4 -25
  185. package/dist/tools/setup-claudeignore.test.js.map +1 -1
  186. package/package.json +3 -4
@@ -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
- // Avoid adding duplicates (in case local path resolves to same as global)
31
- if (existsSync(fullPath) && !dirs.some(d => d.path === fullPath)) {
32
- dirs.push({ path: fullPath, source: 'local' });
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
- // Model pricing per 1M tokens (as of Jan 2026)
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":"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"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,IAAI,CAAC;AACjI,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,gGAAgG;AAChG,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAE5G,+CAA+C;AAC/C,MAAM,qBAAqB,GAAG;IAC5B,mBAAmB;IACnB,WAAW;IACX,YAAY;CACb,CAAC;AAEF;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,IAAY;IAOnC,IAAI,EAAsB,CAAC;IAE3B,IAAI,CAAC;QACH,oDAAoD;QACpD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QAE/C,IAAI,cAAc,EAAE,CAAC;YACnB,oDAAoD;YACpD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAElC,gEAAgE;YAChE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAElD,8CAA8C;YAC9C,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;gBAC9C,2DAA2D;gBAC3D,gDAAgD;gBAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,EAAE;oBAC3C,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC;oBAC9B,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAEtE,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;gBAC3B,CAAC;gBAED,2DAA2D;gBAC3D,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC9B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;gBAC3B,CAAC;gBAED,OAAO;oBACL,MAAM,EAAE,IAAI;oBACZ,SAAS,EAAE,IAAI;oBACf,QAAQ;iBACT,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,yEAAyE;QACzE,8DAA8D;QAC9D,IAAI,CAAC;YACH,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;YAE9B,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC3B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC3B,CAAC;YAED,yDAAyD;YACzD,wEAAwE;YACxE,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAEpC,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,KAAK;gBAChB,QAAQ;aACT,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACH,SAAS,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;gBAAC,MAAM,CAAC;oBACP,sBAAsB;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,wBAAwB,CAAC,YAAoB,EAAE,gBAA0B;IAChF,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAEtD,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,yDAAyD;YACzD,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAEvF,IAAI,YAAY,KAAK,YAAY,IAAI,YAAY,CAAC,UAAU,CAAC,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC;gBACjF,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;YAC1B,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,kBAAkB,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEnG,mEAAmE;IACnE,OAAO;QACL,kBAAkB;QAClB,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;KACtB,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAY;IAClD,MAAM,IAAI,GAAwD,EAAE,CAAC;IAErE,4CAA4C;IAC5C,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,gDAAgD;IAChD,MAAM,UAAU,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACxC,MAAM,YAAY,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAEtD,KAAK,MAAM,SAAS,IAAI,qBAAqB,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAE7C,yEAAyE;QACzE,6EAA6E;QAC7E,wBAAwB;QACxB,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;QAEzD,2DAA2D;QAC3D,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,0CAA0C,QAAQ,OAAO,QAAQ,EAAE,CAAC,CAAC;gBAClF,SAAS;YACX,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,0BAA0B;QAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uBAAuB;AACvB,kDAAkD;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAAC;AAClG,2DAA2D;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;AACnE,gGAAgG;AAChG,wEAAwE;AACxE,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;AAE/D,gCAAgC;AAChC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,GAAG,EAAE,EAAE,CAAC;IAC3E,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,EAAE,EAAE,CAAC;CAC/D,CAAC;AAEX,4CAA4C;AAC5C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,sCAAsC;IACtC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,IAAI,EAAE,EAAE,CAAC;IACnE,kCAAkC;IAClC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,GAAG,EAAE,EAAE,CAAC;CAC5D,CAAC;AAEX,2CAA2C;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAE1C,mCAAmC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,6CAA6C;IAC7C,WAAW,EAAE,YAAY;IACzB,mDAAmD;IACnD,kBAAkB,EAAE,EAAE;IACtB,uCAAuC;IACvC,OAAO,EAAE;QACP,SAAS,EAAE,mCAAmC;QAC9C,MAAM,EAAE,4BAA4B;QACpC,MAAM,EAAE,+BAA+B;QACvC,OAAO,EAAE,4BAA4B;QACrC,MAAM,EAAE,4BAA4B;QACpC,IAAI,EAAE,0BAA0B;QAChC,QAAQ,EAAE,iCAAiC;QAC3C,UAAU,EAAE,mCAAmC;KAChD;CACO,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACnG,OAAO;QACL,OAAO,EAAE,eAAe,GAAG,sBAAsB,CAAC,kBAAkB;QACpE,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,mDAAmD;AACnD,MAAM,aAAa,GAAG,qBAAqB,EAAE,CAAC;AAC9C,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,gCAAgC,aAAa,CAAC,eAAe,4BAA4B,sBAAsB,CAAC,WAAW,qDAAqD,CAAC,CAAC;AACjM,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,aAAa,GAAsD;IAC9E,0BAA0B;IAC1B,0BAA0B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACzD,0BAA0B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACxD,2BAA2B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IACzD,iCAAiC;IACjC,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9C,iBAAiB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAC/C,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAE/C,oBAAoB;IACpB,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACvC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC5C,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC5C,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACtC,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9C,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACnC,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACvC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAExC,uBAAuB;IACvB,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC9C,kBAAkB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;IAClD,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACjD,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAE/C,oBAAoB;IACpB,eAAe,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5C,gBAAgB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAC7C,eAAe,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5C,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAC3C,WAAW,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAExC,gBAAgB;IAChB,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC/C,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC1C,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IACtC,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAE9C,oCAAoC;IACpC,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9C,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC7C,mBAAmB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAElD,mCAAmC;IACnC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC5C,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAE3C,oBAAoB;IACpB,WAAW,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACzC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CACrC,CAAC;AAEF,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD,sDAAsD;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAE5F;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAwB;IAClD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,wDAAwD;AACxD,iEAAiE;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAU,CAAC;AAG9D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,uDAAuD;IACvD,sEAAsE;IACtE,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,eAAe;AACf,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,2CAA2C;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AAE9E,sCAAsC;AACtC,wDAAwD;AACxD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,yEAAyE;AACzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC,8BAA8B;AAC9B,+DAA+D;AAC/D,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC"}