observability-toolkit 1.8.2 → 1.8.5

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 (259) hide show
  1. package/README.md +60 -0
  2. package/dist/backends/index.d.ts +43 -0
  3. package/dist/backends/index.d.ts.map +1 -1
  4. package/dist/backends/index.js +41 -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 +15 -12
  11. package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
  12. package/dist/backends/local-jsonl-cache.test.d.ts +2 -0
  13. package/dist/backends/local-jsonl-cache.test.d.ts.map +1 -0
  14. package/dist/backends/local-jsonl-cache.test.js +295 -0
  15. package/dist/backends/local-jsonl-cache.test.js.map +1 -0
  16. package/dist/backends/local-jsonl-circuit-breaker.test.d.ts +2 -0
  17. package/dist/backends/local-jsonl-circuit-breaker.test.d.ts.map +1 -0
  18. package/dist/backends/local-jsonl-circuit-breaker.test.js +180 -0
  19. package/dist/backends/local-jsonl-circuit-breaker.test.js.map +1 -0
  20. package/dist/backends/local-jsonl-export.test.d.ts +2 -0
  21. package/dist/backends/local-jsonl-export.test.d.ts.map +1 -0
  22. package/dist/backends/local-jsonl-export.test.js +704 -0
  23. package/dist/backends/local-jsonl-export.test.js.map +1 -0
  24. package/dist/backends/local-jsonl-index.test.d.ts +2 -0
  25. package/dist/backends/local-jsonl-index.test.d.ts.map +1 -0
  26. package/dist/backends/local-jsonl-index.test.js +554 -0
  27. package/dist/backends/local-jsonl-index.test.js.map +1 -0
  28. package/dist/backends/local-jsonl-logs.test.d.ts +2 -0
  29. package/dist/backends/local-jsonl-logs.test.d.ts.map +1 -0
  30. package/dist/backends/local-jsonl-logs.test.js +612 -0
  31. package/dist/backends/local-jsonl-logs.test.js.map +1 -0
  32. package/dist/backends/local-jsonl-metrics.test.d.ts +2 -0
  33. package/dist/backends/local-jsonl-metrics.test.d.ts.map +1 -0
  34. package/dist/backends/local-jsonl-metrics.test.js +876 -0
  35. package/dist/backends/local-jsonl-metrics.test.js.map +1 -0
  36. package/dist/backends/local-jsonl-traces.test.d.ts +2 -0
  37. package/dist/backends/local-jsonl-traces.test.d.ts.map +1 -0
  38. package/dist/backends/local-jsonl-traces.test.js +1729 -0
  39. package/dist/backends/local-jsonl-traces.test.js.map +1 -0
  40. package/dist/backends/local-jsonl.d.ts +9 -0
  41. package/dist/backends/local-jsonl.d.ts.map +1 -1
  42. package/dist/backends/local-jsonl.js +348 -227
  43. package/dist/backends/local-jsonl.js.map +1 -1
  44. package/dist/backends/local-jsonl.test.js +290 -21
  45. package/dist/backends/local-jsonl.test.js.map +1 -1
  46. package/dist/backends/signoz-api-circuit-breaker.test.d.ts +6 -0
  47. package/dist/backends/signoz-api-circuit-breaker.test.d.ts.map +1 -0
  48. package/dist/backends/signoz-api-circuit-breaker.test.js +548 -0
  49. package/dist/backends/signoz-api-circuit-breaker.test.js.map +1 -0
  50. package/dist/backends/signoz-api-rate-limiter.test.d.ts +6 -0
  51. package/dist/backends/signoz-api-rate-limiter.test.d.ts.map +1 -0
  52. package/dist/backends/signoz-api-rate-limiter.test.js +389 -0
  53. package/dist/backends/signoz-api-rate-limiter.test.js.map +1 -0
  54. package/dist/backends/signoz-api-ssrf.test.d.ts +6 -0
  55. package/dist/backends/signoz-api-ssrf.test.d.ts.map +1 -0
  56. package/dist/backends/signoz-api-ssrf.test.js +216 -0
  57. package/dist/backends/signoz-api-ssrf.test.js.map +1 -0
  58. package/dist/backends/signoz-api-test-helpers.d.ts +80 -0
  59. package/dist/backends/signoz-api-test-helpers.d.ts.map +1 -0
  60. package/dist/backends/signoz-api-test-helpers.js +79 -0
  61. package/dist/backends/signoz-api-test-helpers.js.map +1 -0
  62. package/dist/backends/signoz-api.d.ts +16 -0
  63. package/dist/backends/signoz-api.d.ts.map +1 -1
  64. package/dist/backends/signoz-api.js +71 -9
  65. package/dist/backends/signoz-api.js.map +1 -1
  66. package/dist/backends/signoz-api.test.d.ts +9 -0
  67. package/dist/backends/signoz-api.test.d.ts.map +1 -1
  68. package/dist/backends/signoz-api.test.js +14 -1027
  69. package/dist/backends/signoz-api.test.js.map +1 -1
  70. package/dist/lib/cache.d.ts +47 -1
  71. package/dist/lib/cache.d.ts.map +1 -1
  72. package/dist/lib/cache.js +40 -3
  73. package/dist/lib/cache.js.map +1 -1
  74. package/dist/lib/circuit-breaker.d.ts +83 -0
  75. package/dist/lib/circuit-breaker.d.ts.map +1 -0
  76. package/dist/lib/circuit-breaker.js +125 -0
  77. package/dist/lib/circuit-breaker.js.map +1 -0
  78. package/dist/lib/circuit-breaker.test.d.ts +2 -0
  79. package/dist/lib/circuit-breaker.test.d.ts.map +1 -0
  80. package/dist/lib/circuit-breaker.test.js +263 -0
  81. package/dist/lib/circuit-breaker.test.js.map +1 -0
  82. package/dist/lib/constants-symlink.test.d.ts +12 -0
  83. package/dist/lib/constants-symlink.test.d.ts.map +1 -0
  84. package/dist/lib/constants-symlink.test.js +357 -0
  85. package/dist/lib/constants-symlink.test.js.map +1 -0
  86. package/dist/lib/constants.d.ts +43 -0
  87. package/dist/lib/constants.d.ts.map +1 -1
  88. package/dist/lib/constants.js +154 -24
  89. package/dist/lib/constants.js.map +1 -1
  90. package/dist/lib/constants.test.js +156 -7
  91. package/dist/lib/constants.test.js.map +1 -1
  92. package/dist/lib/edge-cases.test.d.ts +11 -0
  93. package/dist/lib/edge-cases.test.d.ts.map +1 -0
  94. package/dist/lib/edge-cases.test.js +634 -0
  95. package/dist/lib/edge-cases.test.js.map +1 -0
  96. package/dist/lib/error-sanitizer.d.ts.map +1 -1
  97. package/dist/lib/error-sanitizer.js +62 -26
  98. package/dist/lib/error-sanitizer.js.map +1 -1
  99. package/dist/lib/error-sanitizer.test.js +186 -0
  100. package/dist/lib/error-sanitizer.test.js.map +1 -1
  101. package/dist/lib/error-types.d.ts +54 -0
  102. package/dist/lib/error-types.d.ts.map +1 -0
  103. package/dist/lib/error-types.js +154 -0
  104. package/dist/lib/error-types.js.map +1 -0
  105. package/dist/lib/error-types.test.d.ts +2 -0
  106. package/dist/lib/error-types.test.d.ts.map +1 -0
  107. package/dist/lib/error-types.test.js +196 -0
  108. package/dist/lib/error-types.test.js.map +1 -0
  109. package/dist/lib/file-utils.test.js +3 -3
  110. package/dist/lib/file-utils.test.js.map +1 -1
  111. package/dist/lib/indexer.test.js +157 -24
  112. package/dist/lib/indexer.test.js.map +1 -1
  113. package/dist/lib/input-validator.d.ts +17 -0
  114. package/dist/lib/input-validator.d.ts.map +1 -1
  115. package/dist/lib/input-validator.fuzz.test.d.ts +12 -0
  116. package/dist/lib/input-validator.fuzz.test.d.ts.map +1 -0
  117. package/dist/lib/input-validator.fuzz.test.js +290 -0
  118. package/dist/lib/input-validator.fuzz.test.js.map +1 -0
  119. package/dist/lib/input-validator.js +62 -3
  120. package/dist/lib/input-validator.js.map +1 -1
  121. package/dist/lib/input-validator.test.js +129 -1
  122. package/dist/lib/input-validator.test.js.map +1 -1
  123. package/dist/lib/logger.d.ts +46 -0
  124. package/dist/lib/logger.d.ts.map +1 -0
  125. package/dist/lib/logger.js +81 -0
  126. package/dist/lib/logger.js.map +1 -0
  127. package/dist/lib/logger.test.d.ts +2 -0
  128. package/dist/lib/logger.test.d.ts.map +1 -0
  129. package/dist/lib/logger.test.js +122 -0
  130. package/dist/lib/logger.test.js.map +1 -0
  131. package/dist/lib/query-sanitizer.d.ts +51 -3
  132. package/dist/lib/query-sanitizer.d.ts.map +1 -1
  133. package/dist/lib/query-sanitizer.js +105 -31
  134. package/dist/lib/query-sanitizer.js.map +1 -1
  135. package/dist/lib/query-sanitizer.test.js +102 -1
  136. package/dist/lib/query-sanitizer.test.js.map +1 -1
  137. package/dist/lib/server-utils.d.ts +88 -0
  138. package/dist/lib/server-utils.d.ts.map +1 -0
  139. package/dist/lib/server-utils.js +173 -0
  140. package/dist/lib/server-utils.js.map +1 -0
  141. package/dist/lib/shared-schemas.d.ts +81 -0
  142. package/dist/lib/shared-schemas.d.ts.map +1 -0
  143. package/dist/lib/shared-schemas.js +80 -0
  144. package/dist/lib/shared-schemas.js.map +1 -0
  145. package/dist/lib/shared-schemas.test.d.ts +5 -0
  146. package/dist/lib/shared-schemas.test.d.ts.map +1 -0
  147. package/dist/lib/shared-schemas.test.js +106 -0
  148. package/dist/lib/shared-schemas.test.js.map +1 -0
  149. package/dist/lib/toon-encoder.d.ts +26 -0
  150. package/dist/lib/toon-encoder.d.ts.map +1 -0
  151. package/dist/lib/toon-encoder.js +61 -0
  152. package/dist/lib/toon-encoder.js.map +1 -0
  153. package/dist/lib/toon-encoder.test.d.ts +5 -0
  154. package/dist/lib/toon-encoder.test.d.ts.map +1 -0
  155. package/dist/lib/toon-encoder.test.js +85 -0
  156. package/dist/lib/toon-encoder.test.js.map +1 -0
  157. package/dist/server.d.ts +1 -49
  158. package/dist/server.d.ts.map +1 -1
  159. package/dist/server.js +154 -162
  160. package/dist/server.js.map +1 -1
  161. package/dist/server.test.js +198 -7
  162. package/dist/server.test.js.map +1 -1
  163. package/dist/test-helpers/env-utils.d.ts +87 -0
  164. package/dist/test-helpers/env-utils.d.ts.map +1 -0
  165. package/dist/test-helpers/env-utils.js +132 -0
  166. package/dist/test-helpers/env-utils.js.map +1 -0
  167. package/dist/test-helpers/file-utils.d.ts +67 -0
  168. package/dist/test-helpers/file-utils.d.ts.map +1 -1
  169. package/dist/test-helpers/file-utils.js +165 -2
  170. package/dist/test-helpers/file-utils.js.map +1 -1
  171. package/dist/test-helpers/fuzz-generators.d.ts +58 -0
  172. package/dist/test-helpers/fuzz-generators.d.ts.map +1 -0
  173. package/dist/test-helpers/fuzz-generators.js +216 -0
  174. package/dist/test-helpers/fuzz-generators.js.map +1 -0
  175. package/dist/test-helpers/index.d.ts +11 -0
  176. package/dist/test-helpers/index.d.ts.map +1 -0
  177. package/dist/test-helpers/index.js +30 -0
  178. package/dist/test-helpers/index.js.map +1 -0
  179. package/dist/test-helpers/memfs-utils.d.ts +181 -0
  180. package/dist/test-helpers/memfs-utils.d.ts.map +1 -0
  181. package/dist/test-helpers/memfs-utils.js +292 -0
  182. package/dist/test-helpers/memfs-utils.js.map +1 -0
  183. package/dist/test-helpers/memfs-utils.test.d.ts +5 -0
  184. package/dist/test-helpers/memfs-utils.test.d.ts.map +1 -0
  185. package/dist/test-helpers/memfs-utils.test.js +338 -0
  186. package/dist/test-helpers/memfs-utils.test.js.map +1 -0
  187. package/dist/test-helpers/mock-backends.d.ts +113 -2
  188. package/dist/test-helpers/mock-backends.d.ts.map +1 -1
  189. package/dist/test-helpers/mock-backends.js +199 -3
  190. package/dist/test-helpers/mock-backends.js.map +1 -1
  191. package/dist/test-helpers/mock-backends.test.d.ts +5 -0
  192. package/dist/test-helpers/mock-backends.test.d.ts.map +1 -0
  193. package/dist/test-helpers/mock-backends.test.js +368 -0
  194. package/dist/test-helpers/mock-backends.test.js.map +1 -0
  195. package/dist/test-helpers/race-condition-helpers.d.ts +85 -0
  196. package/dist/test-helpers/race-condition-helpers.d.ts.map +1 -0
  197. package/dist/test-helpers/race-condition-helpers.js +279 -0
  198. package/dist/test-helpers/race-condition-helpers.js.map +1 -0
  199. package/dist/test-helpers/schema-validators.d.ts +32 -0
  200. package/dist/test-helpers/schema-validators.d.ts.map +1 -0
  201. package/dist/test-helpers/schema-validators.js +125 -0
  202. package/dist/test-helpers/schema-validators.js.map +1 -0
  203. package/dist/test-helpers/test-data-builders.d.ts +260 -0
  204. package/dist/test-helpers/test-data-builders.d.ts.map +1 -0
  205. package/dist/test-helpers/test-data-builders.js +337 -0
  206. package/dist/test-helpers/test-data-builders.js.map +1 -0
  207. package/dist/test-helpers/test-data-builders.test.d.ts +2 -0
  208. package/dist/test-helpers/test-data-builders.test.d.ts.map +1 -0
  209. package/dist/test-helpers/test-data-builders.test.js +306 -0
  210. package/dist/test-helpers/test-data-builders.test.js.map +1 -0
  211. package/dist/test-helpers/tool-validators.d.ts +28 -0
  212. package/dist/test-helpers/tool-validators.d.ts.map +1 -0
  213. package/dist/test-helpers/tool-validators.js +71 -0
  214. package/dist/test-helpers/tool-validators.js.map +1 -0
  215. package/dist/tools/context-stats.d.ts +1 -0
  216. package/dist/tools/context-stats.d.ts.map +1 -1
  217. package/dist/tools/context-stats.js +9 -5
  218. package/dist/tools/context-stats.js.map +1 -1
  219. package/dist/tools/context-stats.test.js +24 -10
  220. package/dist/tools/context-stats.test.js.map +1 -1
  221. package/dist/tools/get-trace-url.js +2 -2
  222. package/dist/tools/get-trace-url.js.map +1 -1
  223. package/dist/tools/health-check.js +2 -2
  224. package/dist/tools/health-check.js.map +1 -1
  225. package/dist/tools/query-evaluations.d.ts +21 -18
  226. package/dist/tools/query-evaluations.d.ts.map +1 -1
  227. package/dist/tools/query-evaluations.js +33 -19
  228. package/dist/tools/query-evaluations.js.map +1 -1
  229. package/dist/tools/query-evaluations.test.js +60 -63
  230. package/dist/tools/query-evaluations.test.js.map +1 -1
  231. package/dist/tools/query-llm-events.d.ts +19 -15
  232. package/dist/tools/query-llm-events.d.ts.map +1 -1
  233. package/dist/tools/query-llm-events.js +31 -15
  234. package/dist/tools/query-llm-events.js.map +1 -1
  235. package/dist/tools/query-llm-events.test.js +277 -12
  236. package/dist/tools/query-llm-events.test.js.map +1 -1
  237. package/dist/tools/query-logs.d.ts +22 -22
  238. package/dist/tools/query-logs.d.ts.map +1 -1
  239. package/dist/tools/query-logs.js +9 -9
  240. package/dist/tools/query-logs.js.map +1 -1
  241. package/dist/tools/query-logs.test.js +19 -72
  242. package/dist/tools/query-logs.test.js.map +1 -1
  243. package/dist/tools/query-metrics.d.ts +14 -14
  244. package/dist/tools/query-metrics.d.ts.map +1 -1
  245. package/dist/tools/query-metrics.js +9 -9
  246. package/dist/tools/query-metrics.js.map +1 -1
  247. package/dist/tools/query-metrics.test.js +12 -25
  248. package/dist/tools/query-metrics.test.js.map +1 -1
  249. package/dist/tools/query-traces.d.ts +28 -28
  250. package/dist/tools/query-traces.d.ts.map +1 -1
  251. package/dist/tools/query-traces.js +18 -18
  252. package/dist/tools/query-traces.js.map +1 -1
  253. package/dist/tools/query-traces.test.js +58 -54
  254. package/dist/tools/query-traces.test.js.map +1 -1
  255. package/dist/tools/setup-claudeignore.js +7 -7
  256. package/dist/tools/setup-claudeignore.js.map +1 -1
  257. package/dist/tools/setup-claudeignore.test.js +4 -25
  258. package/dist/tools/setup-claudeignore.test.js.map +1 -1
  259. package/package.json +4 -2
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Error categorization types for observability-toolkit MCP server
3
+ *
4
+ * Classifies errors by source to enable appropriate handling:
5
+ * - User errors: Bad input, should return helpful message
6
+ * - System errors: Internal failures, may need alerting
7
+ * - Network errors: Connectivity issues, typically retryable
8
+ * - Config errors: Misconfiguration, requires operator action
9
+ */
10
+ /**
11
+ * Error codes by category.
12
+ */
13
+ export const ErrorCodes = {
14
+ // User errors (4xx-like)
15
+ INVALID_INPUT: 'INVALID_INPUT',
16
+ INVALID_DATE_RANGE: 'INVALID_DATE_RANGE',
17
+ INVALID_REGEX: 'INVALID_REGEX',
18
+ LIMIT_EXCEEDED: 'LIMIT_EXCEEDED',
19
+ INVALID_CURSOR: 'INVALID_CURSOR',
20
+ // System errors (5xx-like)
21
+ INTERNAL_ERROR: 'INTERNAL_ERROR',
22
+ PARSE_ERROR: 'PARSE_ERROR',
23
+ MEMORY_ERROR: 'MEMORY_ERROR',
24
+ INIT_FAILED: 'INIT_FAILED',
25
+ // Network errors
26
+ TIMEOUT: 'TIMEOUT',
27
+ CONNECTION_FAILED: 'CONNECTION_FAILED',
28
+ API_ERROR: 'API_ERROR',
29
+ CIRCUIT_OPEN: 'CIRCUIT_OPEN',
30
+ // Config errors
31
+ MISSING_CONFIG: 'MISSING_CONFIG',
32
+ INVALID_CONFIG: 'INVALID_CONFIG',
33
+ SSRF_BLOCKED: 'SSRF_BLOCKED',
34
+ };
35
+ /**
36
+ * Create a categorized error from an error code and message.
37
+ */
38
+ export function createCategorizedError(code, message, cause) {
39
+ const category = getErrorCategory(code);
40
+ const retryable = isRetryable(code);
41
+ return {
42
+ category,
43
+ code,
44
+ message,
45
+ retryable,
46
+ cause,
47
+ };
48
+ }
49
+ /**
50
+ * Determine the category for an error code.
51
+ */
52
+ function getErrorCategory(code) {
53
+ switch (code) {
54
+ case ErrorCodes.INVALID_INPUT:
55
+ case ErrorCodes.INVALID_DATE_RANGE:
56
+ case ErrorCodes.INVALID_REGEX:
57
+ case ErrorCodes.LIMIT_EXCEEDED:
58
+ case ErrorCodes.INVALID_CURSOR:
59
+ return 'user';
60
+ case ErrorCodes.INTERNAL_ERROR:
61
+ case ErrorCodes.PARSE_ERROR:
62
+ case ErrorCodes.MEMORY_ERROR:
63
+ case ErrorCodes.INIT_FAILED:
64
+ return 'system';
65
+ case ErrorCodes.TIMEOUT:
66
+ case ErrorCodes.CONNECTION_FAILED:
67
+ case ErrorCodes.API_ERROR:
68
+ case ErrorCodes.CIRCUIT_OPEN:
69
+ return 'network';
70
+ case ErrorCodes.MISSING_CONFIG:
71
+ case ErrorCodes.INVALID_CONFIG:
72
+ case ErrorCodes.SSRF_BLOCKED:
73
+ return 'config';
74
+ default:
75
+ return 'system';
76
+ }
77
+ }
78
+ /**
79
+ * Determine if an error is retryable.
80
+ */
81
+ function isRetryable(code) {
82
+ switch (code) {
83
+ // Network errors are typically retryable
84
+ case ErrorCodes.TIMEOUT:
85
+ case ErrorCodes.CONNECTION_FAILED:
86
+ case ErrorCodes.API_ERROR:
87
+ return true;
88
+ // Circuit breaker needs time before retry
89
+ case ErrorCodes.CIRCUIT_OPEN:
90
+ return true;
91
+ // User and config errors are not retryable without changes
92
+ case ErrorCodes.INVALID_INPUT:
93
+ case ErrorCodes.INVALID_DATE_RANGE:
94
+ case ErrorCodes.INVALID_REGEX:
95
+ case ErrorCodes.LIMIT_EXCEEDED:
96
+ case ErrorCodes.MISSING_CONFIG:
97
+ case ErrorCodes.INVALID_CONFIG:
98
+ case ErrorCodes.SSRF_BLOCKED:
99
+ return false;
100
+ // System errors are generally not retryable
101
+ case ErrorCodes.INTERNAL_ERROR:
102
+ case ErrorCodes.PARSE_ERROR:
103
+ case ErrorCodes.MEMORY_ERROR:
104
+ case ErrorCodes.INIT_FAILED:
105
+ case ErrorCodes.INVALID_CURSOR:
106
+ return false;
107
+ default:
108
+ return false;
109
+ }
110
+ }
111
+ /**
112
+ * Type guard to check if an error is a CategorizedError.
113
+ */
114
+ export function isCategorizedError(error) {
115
+ return (typeof error === 'object' &&
116
+ error !== null &&
117
+ 'category' in error &&
118
+ 'code' in error &&
119
+ 'message' in error &&
120
+ 'retryable' in error);
121
+ }
122
+ /**
123
+ * Wrap an unknown error into a CategorizedError.
124
+ * Attempts to infer the category from the error message.
125
+ */
126
+ export function categorizeError(error) {
127
+ if (isCategorizedError(error)) {
128
+ return error;
129
+ }
130
+ const message = error instanceof Error ? error.message : String(error);
131
+ const cause = error instanceof Error ? error : undefined;
132
+ // Infer category from message patterns
133
+ if (message.includes('timeout') || message.includes('Timeout')) {
134
+ return createCategorizedError(ErrorCodes.TIMEOUT, message, cause);
135
+ }
136
+ if (message.includes('Circuit breaker')) {
137
+ return createCategorizedError(ErrorCodes.CIRCUIT_OPEN, message, cause);
138
+ }
139
+ if (message.includes('Rate limit')) {
140
+ return createCategorizedError(ErrorCodes.LIMIT_EXCEEDED, message, cause);
141
+ }
142
+ if (message.includes('SSRF') || message.includes('not allowed')) {
143
+ return createCategorizedError(ErrorCodes.SSRF_BLOCKED, message, cause);
144
+ }
145
+ if (message.includes('not configured') || message.includes('missing')) {
146
+ return createCategorizedError(ErrorCodes.MISSING_CONFIG, message, cause);
147
+ }
148
+ if (message.includes('Invalid') || message.includes('Validation')) {
149
+ return createCategorizedError(ErrorCodes.INVALID_INPUT, message, cause);
150
+ }
151
+ // Default to system error
152
+ return createCategorizedError(ErrorCodes.INTERNAL_ERROR, message, cause);
153
+ }
154
+ //# sourceMappingURL=error-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-types.js","sourceRoot":"","sources":["../../src/lib/error-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=error-types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-types.test.d.ts","sourceRoot":"","sources":["../../src/lib/error-types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,196 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert';
3
+ import { ErrorCodes, createCategorizedError, categorizeError, isCategorizedError, } from './error-types.js';
4
+ describe('error-types', () => {
5
+ describe('createCategorizedError()', () => {
6
+ describe('user errors', () => {
7
+ it('categorizes INVALID_INPUT as user error', () => {
8
+ const error = createCategorizedError(ErrorCodes.INVALID_INPUT, 'bad input');
9
+ assert.strictEqual(error.category, 'user');
10
+ assert.strictEqual(error.retryable, false);
11
+ });
12
+ it('categorizes INVALID_DATE_RANGE as user error', () => {
13
+ const error = createCategorizedError(ErrorCodes.INVALID_DATE_RANGE, 'bad date');
14
+ assert.strictEqual(error.category, 'user');
15
+ assert.strictEqual(error.retryable, false);
16
+ });
17
+ it('categorizes INVALID_REGEX as user error', () => {
18
+ const error = createCategorizedError(ErrorCodes.INVALID_REGEX, 'bad regex');
19
+ assert.strictEqual(error.category, 'user');
20
+ assert.strictEqual(error.retryable, false);
21
+ });
22
+ it('categorizes LIMIT_EXCEEDED as user error', () => {
23
+ const error = createCategorizedError(ErrorCodes.LIMIT_EXCEEDED, 'too many');
24
+ assert.strictEqual(error.category, 'user');
25
+ assert.strictEqual(error.retryable, false);
26
+ });
27
+ it('categorizes INVALID_CURSOR as user error', () => {
28
+ const error = createCategorizedError(ErrorCodes.INVALID_CURSOR, 'bad cursor');
29
+ assert.strictEqual(error.category, 'user');
30
+ assert.strictEqual(error.retryable, false);
31
+ });
32
+ });
33
+ describe('system errors', () => {
34
+ it('categorizes INTERNAL_ERROR as system error', () => {
35
+ const error = createCategorizedError(ErrorCodes.INTERNAL_ERROR, 'oops');
36
+ assert.strictEqual(error.category, 'system');
37
+ assert.strictEqual(error.retryable, false);
38
+ });
39
+ it('categorizes PARSE_ERROR as system error', () => {
40
+ const error = createCategorizedError(ErrorCodes.PARSE_ERROR, 'bad json');
41
+ assert.strictEqual(error.category, 'system');
42
+ assert.strictEqual(error.retryable, false);
43
+ });
44
+ it('categorizes MEMORY_ERROR as system error', () => {
45
+ const error = createCategorizedError(ErrorCodes.MEMORY_ERROR, 'oom');
46
+ assert.strictEqual(error.category, 'system');
47
+ assert.strictEqual(error.retryable, false);
48
+ });
49
+ it('categorizes INIT_FAILED as system error', () => {
50
+ const error = createCategorizedError(ErrorCodes.INIT_FAILED, 'startup failed');
51
+ assert.strictEqual(error.category, 'system');
52
+ assert.strictEqual(error.retryable, false);
53
+ });
54
+ });
55
+ describe('network errors', () => {
56
+ it('categorizes TIMEOUT as network error and retryable', () => {
57
+ const error = createCategorizedError(ErrorCodes.TIMEOUT, 'timed out');
58
+ assert.strictEqual(error.category, 'network');
59
+ assert.strictEqual(error.retryable, true);
60
+ });
61
+ it('categorizes CONNECTION_FAILED as network error and retryable', () => {
62
+ const error = createCategorizedError(ErrorCodes.CONNECTION_FAILED, 'refused');
63
+ assert.strictEqual(error.category, 'network');
64
+ assert.strictEqual(error.retryable, true);
65
+ });
66
+ it('categorizes API_ERROR as network error and retryable', () => {
67
+ const error = createCategorizedError(ErrorCodes.API_ERROR, '500 error');
68
+ assert.strictEqual(error.category, 'network');
69
+ assert.strictEqual(error.retryable, true);
70
+ });
71
+ it('categorizes CIRCUIT_OPEN as network error and retryable', () => {
72
+ const error = createCategorizedError(ErrorCodes.CIRCUIT_OPEN, 'breaker open');
73
+ assert.strictEqual(error.category, 'network');
74
+ assert.strictEqual(error.retryable, true);
75
+ });
76
+ });
77
+ describe('config errors', () => {
78
+ it('categorizes MISSING_CONFIG as config error', () => {
79
+ const error = createCategorizedError(ErrorCodes.MISSING_CONFIG, 'no env var');
80
+ assert.strictEqual(error.category, 'config');
81
+ assert.strictEqual(error.retryable, false);
82
+ });
83
+ it('categorizes INVALID_CONFIG as config error', () => {
84
+ const error = createCategorizedError(ErrorCodes.INVALID_CONFIG, 'bad value');
85
+ assert.strictEqual(error.category, 'config');
86
+ assert.strictEqual(error.retryable, false);
87
+ });
88
+ it('categorizes SSRF_BLOCKED as config error', () => {
89
+ const error = createCategorizedError(ErrorCodes.SSRF_BLOCKED, 'ssrf attempt');
90
+ assert.strictEqual(error.category, 'config');
91
+ assert.strictEqual(error.retryable, false);
92
+ });
93
+ });
94
+ it('preserves cause when provided', () => {
95
+ const cause = new Error('original');
96
+ const error = createCategorizedError(ErrorCodes.INTERNAL_ERROR, 'wrapped', cause);
97
+ assert.strictEqual(error.cause, cause);
98
+ });
99
+ });
100
+ describe('categorizeError()', () => {
101
+ it('returns existing CategorizedError unchanged', () => {
102
+ const existing = {
103
+ category: 'user',
104
+ code: 'INVALID_INPUT',
105
+ message: 'test',
106
+ retryable: false,
107
+ };
108
+ assert.strictEqual(categorizeError(existing), existing);
109
+ });
110
+ it('infers TIMEOUT from message', () => {
111
+ const result = categorizeError(new Error('Request timeout after 5000ms'));
112
+ assert.strictEqual(result.code, 'TIMEOUT');
113
+ assert.strictEqual(result.category, 'network');
114
+ assert.strictEqual(result.retryable, true);
115
+ });
116
+ it('infers CIRCUIT_OPEN from message', () => {
117
+ const result = categorizeError(new Error('Circuit breaker is open'));
118
+ assert.strictEqual(result.code, 'CIRCUIT_OPEN');
119
+ assert.strictEqual(result.category, 'network');
120
+ });
121
+ it('infers LIMIT_EXCEEDED from Rate limit message', () => {
122
+ const result = categorizeError(new Error('Rate limit exceeded'));
123
+ assert.strictEqual(result.code, 'LIMIT_EXCEEDED');
124
+ assert.strictEqual(result.category, 'user');
125
+ });
126
+ it('infers SSRF_BLOCKED from SSRF message', () => {
127
+ const result = categorizeError(new Error('SSRF attempt blocked'));
128
+ assert.strictEqual(result.code, 'SSRF_BLOCKED');
129
+ assert.strictEqual(result.category, 'config');
130
+ });
131
+ it('infers MISSING_CONFIG from not configured message', () => {
132
+ const result = categorizeError(new Error('SigNoz is not configured'));
133
+ assert.strictEqual(result.code, 'MISSING_CONFIG');
134
+ assert.strictEqual(result.category, 'config');
135
+ });
136
+ it('infers INVALID_INPUT from Invalid message', () => {
137
+ const result = categorizeError(new Error('Invalid date format'));
138
+ assert.strictEqual(result.code, 'INVALID_INPUT');
139
+ assert.strictEqual(result.category, 'user');
140
+ });
141
+ it('infers INVALID_INPUT from Validation message', () => {
142
+ const result = categorizeError(new Error('Validation failed'));
143
+ assert.strictEqual(result.code, 'INVALID_INPUT');
144
+ assert.strictEqual(result.category, 'user');
145
+ });
146
+ it('defaults to INTERNAL_ERROR for unknown messages', () => {
147
+ const result = categorizeError(new Error('Something went wrong'));
148
+ assert.strictEqual(result.code, 'INTERNAL_ERROR');
149
+ assert.strictEqual(result.category, 'system');
150
+ });
151
+ it('handles string errors', () => {
152
+ const result = categorizeError('string error');
153
+ assert.strictEqual(result.message, 'string error');
154
+ assert.strictEqual(result.cause, undefined);
155
+ });
156
+ it('preserves Error as cause', () => {
157
+ const original = new Error('original');
158
+ const result = categorizeError(original);
159
+ assert.strictEqual(result.cause, original);
160
+ });
161
+ });
162
+ describe('isCategorizedError()', () => {
163
+ it('returns true for valid CategorizedError', () => {
164
+ const error = {
165
+ category: 'user',
166
+ code: 'INVALID_INPUT',
167
+ message: 'test',
168
+ retryable: false,
169
+ };
170
+ assert.strictEqual(isCategorizedError(error), true);
171
+ });
172
+ it('returns false for plain Error', () => {
173
+ assert.strictEqual(isCategorizedError(new Error('test')), false);
174
+ });
175
+ it('returns false for null', () => {
176
+ assert.strictEqual(isCategorizedError(null), false);
177
+ });
178
+ it('returns false for undefined', () => {
179
+ assert.strictEqual(isCategorizedError(undefined), false);
180
+ });
181
+ it('returns false for partial object', () => {
182
+ assert.strictEqual(isCategorizedError({ category: 'user' }), false);
183
+ assert.strictEqual(isCategorizedError({ category: 'user', code: 'X' }), false);
184
+ });
185
+ });
186
+ describe('ErrorCodes', () => {
187
+ it('has all expected codes', () => {
188
+ assert.strictEqual(ErrorCodes.INVALID_INPUT, 'INVALID_INPUT');
189
+ assert.strictEqual(ErrorCodes.TIMEOUT, 'TIMEOUT');
190
+ assert.strictEqual(ErrorCodes.CIRCUIT_OPEN, 'CIRCUIT_OPEN');
191
+ assert.strictEqual(ErrorCodes.MISSING_CONFIG, 'MISSING_CONFIG');
192
+ assert.strictEqual(ErrorCodes.INTERNAL_ERROR, 'INTERNAL_ERROR');
193
+ });
194
+ });
195
+ });
196
+ //# sourceMappingURL=error-types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-types.test.js","sourceRoot":"","sources":["../../src/lib/error-types.test.ts"],"names":[],"mappings":"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"}
@@ -1036,13 +1036,13 @@ describe('file-utils', () => {
1036
1036
  assert.strictEqual(aggregator.getResult('sum'), (50000 * 50001) / 2);
1037
1037
  assert.strictEqual(aggregator.getResult('min'), 1);
1038
1038
  assert.strictEqual(aggregator.getResult('max'), 50000);
1039
- // Percentiles should be approximately correct (within 5% error due to sampling)
1039
+ // Percentiles should be approximately correct (within 10% error due to sampling)
1040
1040
  const p50 = aggregator.getResult('p50');
1041
1041
  assert.ok(p50 !== undefined);
1042
- assert.ok(Math.abs(p50 - 25000) / 25000 < 0.05);
1042
+ assert.ok(Math.abs(p50 - 25000) / 25000 < 0.10);
1043
1043
  const p95 = aggregator.getResult('p95');
1044
1044
  assert.ok(p95 !== undefined);
1045
- assert.ok(Math.abs(p95 - 47500) / 47500 < 0.05);
1045
+ assert.ok(Math.abs(p95 - 47500) / 47500 < 0.10);
1046
1046
  });
1047
1047
  it('should handle decimal values', () => {
1048
1048
  const aggregator = new StreamingAggregator();