@inso_web/els-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/README.md +482 -0
  2. package/dist/audit/prisma.d.ts +67 -0
  3. package/dist/audit/prisma.d.ts.map +1 -0
  4. package/dist/audit/prisma.js +65 -0
  5. package/dist/audit/prisma.js.map +1 -0
  6. package/dist/audit/service.d.ts +72 -0
  7. package/dist/audit/service.d.ts.map +1 -0
  8. package/dist/audit/service.js +137 -0
  9. package/dist/audit/service.js.map +1 -0
  10. package/dist/billing/limits.d.ts +34 -0
  11. package/dist/billing/limits.d.ts.map +1 -0
  12. package/dist/billing/limits.js +51 -0
  13. package/dist/billing/limits.js.map +1 -0
  14. package/dist/billing/tracker.d.ts +39 -0
  15. package/dist/billing/tracker.d.ts.map +1 -0
  16. package/dist/billing/tracker.js +92 -0
  17. package/dist/billing/tracker.js.map +1 -0
  18. package/dist/cache/cachedElsClient.d.ts +71 -0
  19. package/dist/cache/cachedElsClient.d.ts.map +1 -0
  20. package/dist/cache/cachedElsClient.js +167 -0
  21. package/dist/cache/cachedElsClient.js.map +1 -0
  22. package/dist/cache/index.d.ts +10 -0
  23. package/dist/cache/index.d.ts.map +1 -0
  24. package/dist/cache/index.js +6 -0
  25. package/dist/cache/index.js.map +1 -0
  26. package/dist/cache/policies.d.ts +60 -0
  27. package/dist/cache/policies.d.ts.map +1 -0
  28. package/dist/cache/policies.js +90 -0
  29. package/dist/cache/policies.js.map +1 -0
  30. package/dist/cache/redis.d.ts +52 -0
  31. package/dist/cache/redis.d.ts.map +1 -0
  32. package/dist/cache/redis.js +134 -0
  33. package/dist/cache/redis.js.map +1 -0
  34. package/dist/cache/types.d.ts +32 -0
  35. package/dist/cache/types.d.ts.map +1 -0
  36. package/dist/cache/types.js +32 -0
  37. package/dist/cache/types.js.map +1 -0
  38. package/dist/cache/wrapper.d.ts +38 -0
  39. package/dist/cache/wrapper.d.ts.map +1 -0
  40. package/dist/cache/wrapper.js +109 -0
  41. package/dist/cache/wrapper.js.map +1 -0
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +86 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/config.d.ts +105 -0
  47. package/dist/config.d.ts.map +1 -0
  48. package/dist/config.js +211 -0
  49. package/dist/config.js.map +1 -0
  50. package/dist/elsClient.d.ts +137 -0
  51. package/dist/elsClient.d.ts.map +1 -0
  52. package/dist/elsClient.js +285 -0
  53. package/dist/elsClient.js.map +1 -0
  54. package/dist/http/app.d.ts +40 -0
  55. package/dist/http/app.d.ts.map +1 -0
  56. package/dist/http/app.js +135 -0
  57. package/dist/http/app.js.map +1 -0
  58. package/dist/http/jwks.d.ts +8 -0
  59. package/dist/http/jwks.d.ts.map +1 -0
  60. package/dist/http/jwks.js +34 -0
  61. package/dist/http/jwks.js.map +1 -0
  62. package/dist/http/middleware/auth.d.ts +11 -0
  63. package/dist/http/middleware/auth.d.ts.map +1 -0
  64. package/dist/http/middleware/auth.js +225 -0
  65. package/dist/http/middleware/auth.js.map +1 -0
  66. package/dist/http/middleware/dcrRateLimit.d.ts +29 -0
  67. package/dist/http/middleware/dcrRateLimit.d.ts.map +1 -0
  68. package/dist/http/middleware/dcrRateLimit.js +59 -0
  69. package/dist/http/middleware/dcrRateLimit.js.map +1 -0
  70. package/dist/http/middleware/errorHandler.d.ts +12 -0
  71. package/dist/http/middleware/errorHandler.d.ts.map +1 -0
  72. package/dist/http/middleware/errorHandler.js +26 -0
  73. package/dist/http/middleware/errorHandler.js.map +1 -0
  74. package/dist/http/middleware/originGuard.d.ts +28 -0
  75. package/dist/http/middleware/originGuard.d.ts.map +1 -0
  76. package/dist/http/middleware/originGuard.js +55 -0
  77. package/dist/http/middleware/originGuard.js.map +1 -0
  78. package/dist/http/middleware/requestId.d.ts +19 -0
  79. package/dist/http/middleware/requestId.d.ts.map +1 -0
  80. package/dist/http/middleware/requestId.js +23 -0
  81. package/dist/http/middleware/requestId.js.map +1 -0
  82. package/dist/http/routes/health.d.ts +24 -0
  83. package/dist/http/routes/health.d.ts.map +1 -0
  84. package/dist/http/routes/health.js +73 -0
  85. package/dist/http/routes/health.js.map +1 -0
  86. package/dist/http/routes/metrics.d.ts +18 -0
  87. package/dist/http/routes/metrics.d.ts.map +1 -0
  88. package/dist/http/routes/metrics.js +42 -0
  89. package/dist/http/routes/metrics.js.map +1 -0
  90. package/dist/http/routes/wellKnown.d.ts +15 -0
  91. package/dist/http/routes/wellKnown.d.ts.map +1 -0
  92. package/dist/http/routes/wellKnown.js +43 -0
  93. package/dist/http/routes/wellKnown.js.map +1 -0
  94. package/dist/http/types.d.ts +40 -0
  95. package/dist/http/types.d.ts.map +1 -0
  96. package/dist/http/types.js +9 -0
  97. package/dist/http/types.js.map +1 -0
  98. package/dist/instrumentation.d.ts +22 -0
  99. package/dist/instrumentation.d.ts.map +1 -0
  100. package/dist/instrumentation.js +38 -0
  101. package/dist/instrumentation.js.map +1 -0
  102. package/dist/lib/cursor.d.ts +22 -0
  103. package/dist/lib/cursor.d.ts.map +1 -0
  104. package/dist/lib/cursor.js +95 -0
  105. package/dist/lib/cursor.js.map +1 -0
  106. package/dist/lib/errors.d.ts +49 -0
  107. package/dist/lib/errors.d.ts.map +1 -0
  108. package/dist/lib/errors.js +83 -0
  109. package/dist/lib/errors.js.map +1 -0
  110. package/dist/lib/responseFormat.d.ts +14 -0
  111. package/dist/lib/responseFormat.d.ts.map +1 -0
  112. package/dist/lib/responseFormat.js +74 -0
  113. package/dist/lib/responseFormat.js.map +1 -0
  114. package/dist/middleware/withMiddleware.d.ts +53 -0
  115. package/dist/middleware/withMiddleware.d.ts.map +1 -0
  116. package/dist/middleware/withMiddleware.js +190 -0
  117. package/dist/middleware/withMiddleware.js.map +1 -0
  118. package/dist/observability/health.d.ts +51 -0
  119. package/dist/observability/health.d.ts.map +1 -0
  120. package/dist/observability/health.js +77 -0
  121. package/dist/observability/health.js.map +1 -0
  122. package/dist/observability/index.d.ts +8 -0
  123. package/dist/observability/index.d.ts.map +1 -0
  124. package/dist/observability/index.js +5 -0
  125. package/dist/observability/index.js.map +1 -0
  126. package/dist/observability/logger.d.ts +45 -0
  127. package/dist/observability/logger.d.ts.map +1 -0
  128. package/dist/observability/logger.js +75 -0
  129. package/dist/observability/logger.js.map +1 -0
  130. package/dist/observability/metrics.d.ts +49 -0
  131. package/dist/observability/metrics.d.ts.map +1 -0
  132. package/dist/observability/metrics.js +184 -0
  133. package/dist/observability/metrics.js.map +1 -0
  134. package/dist/observability/tracing.d.ts +28 -0
  135. package/dist/observability/tracing.d.ts.map +1 -0
  136. package/dist/observability/tracing.js +56 -0
  137. package/dist/observability/tracing.js.map +1 -0
  138. package/dist/prompts/index.d.ts +20 -0
  139. package/dist/prompts/index.d.ts.map +1 -0
  140. package/dist/prompts/index.js +202 -0
  141. package/dist/prompts/index.js.map +1 -0
  142. package/dist/redaction/argsRedactor.d.ts +22 -0
  143. package/dist/redaction/argsRedactor.d.ts.map +1 -0
  144. package/dist/redaction/argsRedactor.js +97 -0
  145. package/dist/redaction/argsRedactor.js.map +1 -0
  146. package/dist/redaction/fields.d.ts +64 -0
  147. package/dist/redaction/fields.d.ts.map +1 -0
  148. package/dist/redaction/fields.js +155 -0
  149. package/dist/redaction/fields.js.map +1 -0
  150. package/dist/redaction/index.d.ts +52 -0
  151. package/dist/redaction/index.d.ts.map +1 -0
  152. package/dist/redaction/index.js +160 -0
  153. package/dist/redaction/index.js.map +1 -0
  154. package/dist/redaction/promptInjection.d.ts +32 -0
  155. package/dist/redaction/promptInjection.d.ts.map +1 -0
  156. package/dist/redaction/promptInjection.js +68 -0
  157. package/dist/redaction/promptInjection.js.map +1 -0
  158. package/dist/redaction/url.d.ts +8 -0
  159. package/dist/redaction/url.d.ts.map +1 -0
  160. package/dist/redaction/url.js +26 -0
  161. package/dist/redaction/url.js.map +1 -0
  162. package/dist/redaction/userAgent.d.ts +9 -0
  163. package/dist/redaction/userAgent.d.ts.map +1 -0
  164. package/dist/redaction/userAgent.js +39 -0
  165. package/dist/redaction/userAgent.js.map +1 -0
  166. package/dist/resources/index.d.ts +24 -0
  167. package/dist/resources/index.d.ts.map +1 -0
  168. package/dist/resources/index.js +150 -0
  169. package/dist/resources/index.js.map +1 -0
  170. package/dist/server.d.ts +37 -0
  171. package/dist/server.d.ts.map +1 -0
  172. package/dist/server.js +35 -0
  173. package/dist/server.js.map +1 -0
  174. package/dist/tools/baselineCompare.d.ts +36 -0
  175. package/dist/tools/baselineCompare.d.ts.map +1 -0
  176. package/dist/tools/baselineCompare.js +69 -0
  177. package/dist/tools/baselineCompare.js.map +1 -0
  178. package/dist/tools/errorHeatmap.d.ts +40 -0
  179. package/dist/tools/errorHeatmap.d.ts.map +1 -0
  180. package/dist/tools/errorHeatmap.js +69 -0
  181. package/dist/tools/errorHeatmap.js.map +1 -0
  182. package/dist/tools/errorHistogram.d.ts +39 -0
  183. package/dist/tools/errorHistogram.d.ts.map +1 -0
  184. package/dist/tools/errorHistogram.js +61 -0
  185. package/dist/tools/errorHistogram.js.map +1 -0
  186. package/dist/tools/errorStatsBreakdown.d.ts +43 -0
  187. package/dist/tools/errorStatsBreakdown.d.ts.map +1 -0
  188. package/dist/tools/errorStatsBreakdown.js +77 -0
  189. package/dist/tools/errorStatsBreakdown.js.map +1 -0
  190. package/dist/tools/errorsInSession.d.ts +44 -0
  191. package/dist/tools/errorsInSession.d.ts.map +1 -0
  192. package/dist/tools/errorsInSession.js +91 -0
  193. package/dist/tools/errorsInSession.js.map +1 -0
  194. package/dist/tools/explainError.d.ts +35 -0
  195. package/dist/tools/explainError.d.ts.map +1 -0
  196. package/dist/tools/explainError.js +98 -0
  197. package/dist/tools/explainError.js.map +1 -0
  198. package/dist/tools/findCorrelatedErrors.d.ts +43 -0
  199. package/dist/tools/findCorrelatedErrors.d.ts.map +1 -0
  200. package/dist/tools/findCorrelatedErrors.js +59 -0
  201. package/dist/tools/findCorrelatedErrors.js.map +1 -0
  202. package/dist/tools/findSimilarErrors.d.ts +44 -0
  203. package/dist/tools/findSimilarErrors.d.ts.map +1 -0
  204. package/dist/tools/findSimilarErrors.js +59 -0
  205. package/dist/tools/findSimilarErrors.js.map +1 -0
  206. package/dist/tools/getLogDetails.d.ts +30 -0
  207. package/dist/tools/getLogDetails.d.ts.map +1 -0
  208. package/dist/tools/getLogDetails.js +49 -0
  209. package/dist/tools/getLogDetails.js.map +1 -0
  210. package/dist/tools/groupedErrors.d.ts +46 -0
  211. package/dist/tools/groupedErrors.d.ts.map +1 -0
  212. package/dist/tools/groupedErrors.js +71 -0
  213. package/dist/tools/groupedErrors.js.map +1 -0
  214. package/dist/tools/impactAnalysis.d.ts +42 -0
  215. package/dist/tools/impactAnalysis.d.ts.map +1 -0
  216. package/dist/tools/impactAnalysis.js +61 -0
  217. package/dist/tools/impactAnalysis.js.map +1 -0
  218. package/dist/tools/index.d.ts +41 -0
  219. package/dist/tools/index.d.ts.map +1 -0
  220. package/dist/tools/index.js +83 -0
  221. package/dist/tools/index.js.map +1 -0
  222. package/dist/tools/listApps.d.ts +27 -0
  223. package/dist/tools/listApps.d.ts.map +1 -0
  224. package/dist/tools/listApps.js +78 -0
  225. package/dist/tools/listApps.js.map +1 -0
  226. package/dist/tools/queryLogsJql.d.ts +44 -0
  227. package/dist/tools/queryLogsJql.d.ts.map +1 -0
  228. package/dist/tools/queryLogsJql.js +107 -0
  229. package/dist/tools/queryLogsJql.js.map +1 -0
  230. package/dist/tools/searchLogs.d.ts +60 -0
  231. package/dist/tools/searchLogs.d.ts.map +1 -0
  232. package/dist/tools/searchLogs.js +127 -0
  233. package/dist/tools/searchLogs.js.map +1 -0
  234. package/dist/tools/topErrorMessages.d.ts +42 -0
  235. package/dist/tools/topErrorMessages.d.ts.map +1 -0
  236. package/dist/tools/topErrorMessages.js +63 -0
  237. package/dist/tools/topErrorMessages.js.map +1 -0
  238. package/dist/tools/trafficStats.d.ts +39 -0
  239. package/dist/tools/trafficStats.d.ts.map +1 -0
  240. package/dist/tools/trafficStats.js +57 -0
  241. package/dist/tools/trafficStats.js.map +1 -0
  242. package/dist/tools/triageRecentCritical.d.ts +26 -0
  243. package/dist/tools/triageRecentCritical.d.ts.map +1 -0
  244. package/dist/tools/triageRecentCritical.js +81 -0
  245. package/dist/tools/triageRecentCritical.js.map +1 -0
  246. package/dist/tools/versionRegression.d.ts +29 -0
  247. package/dist/tools/versionRegression.d.ts.map +1 -0
  248. package/dist/tools/versionRegression.js +80 -0
  249. package/dist/tools/versionRegression.js.map +1 -0
  250. package/dist/transports/http-server.d.ts +25 -0
  251. package/dist/transports/http-server.d.ts.map +1 -0
  252. package/dist/transports/http-server.js +84 -0
  253. package/dist/transports/http-server.js.map +1 -0
  254. package/dist/transports/http.d.ts +71 -0
  255. package/dist/transports/http.d.ts.map +1 -0
  256. package/dist/transports/http.js +315 -0
  257. package/dist/transports/http.js.map +1 -0
  258. package/dist/transports/stdio.d.ts +13 -0
  259. package/dist/transports/stdio.d.ts.map +1 -0
  260. package/dist/transports/stdio.js +16 -0
  261. package/dist/transports/stdio.js.map +1 -0
  262. package/dist/types.d.ts +150 -0
  263. package/dist/types.d.ts.map +1 -0
  264. package/dist/types.js +8 -0
  265. package/dist/types.js.map +1 -0
  266. package/package.json +95 -0
@@ -0,0 +1,60 @@
1
+ import { z } from 'zod';
2
+ import type { ElsClient } from '../elsClient.js';
3
+ import type { ResponseFormat, ToolResult } from '../types.js';
4
+ declare const ELS_SORT_BY: readonly ["receivedAt", "timestamp", "level", "message"];
5
+ export declare const searchLogsInputShape: {
6
+ from: z.ZodOptional<z.ZodString>;
7
+ to: z.ZodOptional<z.ZodString>;
8
+ level: z.ZodOptional<z.ZodArray<z.ZodEnum<["TRACE", "DEBUG", "INFO", "WARN", "WARNING", "ERROR", "FATAL", "CRITICAL"]>, "many">>;
9
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
10
+ appVersion: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
11
+ url: z.ZodOptional<z.ZodString>;
12
+ fingerprint: z.ZodOptional<z.ZodString>;
13
+ sessionId: z.ZodOptional<z.ZodString>;
14
+ search: z.ZodOptional<z.ZodString>;
15
+ cursor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
16
+ limit: z.ZodDefault<z.ZodNumber>;
17
+ sortBy: z.ZodDefault<z.ZodEnum<["receivedAt", "timestamp", "level", "message"]>>;
18
+ sortOrder: z.ZodDefault<z.ZodEnum<["asc", "desc"]>>;
19
+ response_format: z.ZodDefault<z.ZodEnum<["compact", "full", "summary"]>>;
20
+ };
21
+ export declare const searchLogsToolDef: {
22
+ name: string;
23
+ title: string;
24
+ description: string;
25
+ inputShape: {
26
+ from: z.ZodOptional<z.ZodString>;
27
+ to: z.ZodOptional<z.ZodString>;
28
+ level: z.ZodOptional<z.ZodArray<z.ZodEnum<["TRACE", "DEBUG", "INFO", "WARN", "WARNING", "ERROR", "FATAL", "CRITICAL"]>, "many">>;
29
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
30
+ appVersion: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
31
+ url: z.ZodOptional<z.ZodString>;
32
+ fingerprint: z.ZodOptional<z.ZodString>;
33
+ sessionId: z.ZodOptional<z.ZodString>;
34
+ search: z.ZodOptional<z.ZodString>;
35
+ cursor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
36
+ limit: z.ZodDefault<z.ZodNumber>;
37
+ sortBy: z.ZodDefault<z.ZodEnum<["receivedAt", "timestamp", "level", "message"]>>;
38
+ sortOrder: z.ZodDefault<z.ZodEnum<["asc", "desc"]>>;
39
+ response_format: z.ZodDefault<z.ZodEnum<["compact", "full", "summary"]>>;
40
+ };
41
+ };
42
+ type SearchArgs = {
43
+ from?: string;
44
+ to?: string;
45
+ level?: readonly string[];
46
+ serviceName?: readonly string[];
47
+ appVersion?: readonly string[];
48
+ url?: string;
49
+ fingerprint?: string;
50
+ sessionId?: string;
51
+ search?: string;
52
+ cursor?: string | null;
53
+ limit: number;
54
+ sortBy: typeof ELS_SORT_BY[number];
55
+ sortOrder: 'asc' | 'desc';
56
+ response_format: ResponseFormat;
57
+ };
58
+ export declare function handleSearchLogs(args: SearchArgs, client: ElsClient): Promise<ToolResult>;
59
+ export {};
60
+ //# sourceMappingURL=searchLogs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchLogs.d.ts","sourceRoot":"","sources":["../../src/tools/searchLogs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,OAAO,KAAK,EAAE,cAAc,EAAuC,UAAU,EAAE,MAAM,aAAa,CAAC;AAgBnG,QAAA,MAAM,WAAW,0DAA2D,CAAC;AAE7E,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;CAgBhC,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;CAM7B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;IAC1B,eAAe,EAAE,cAAc,CAAC;CACjC,CAAC;AA0BF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CA4E/F"}
@@ -0,0 +1,127 @@
1
+ import { z } from 'zod';
2
+ import { ToolError } from '../lib/errors.js';
3
+ import { encodeCursor, decodeCursor } from '../lib/cursor.js';
4
+ import { applyResponseFormat } from '../lib/responseFormat.js';
5
+ /**
6
+ * Tool: search_logs
7
+ *
8
+ * Mapping: GET /errors → error-logs-service/src/routes/analytics.routes.ts:33
9
+ * Zod schema (upstream): QueryErrorsSchema (page+limit+filters+sort).
10
+ *
11
+ * Phase 1 особенности:
12
+ * - cursor wraps offset/page (ELS пока offset-based).
13
+ * - `level`/`serviceName`/`appVersion` upstream — comma-separated strings,
14
+ * поэтому мы плющим массивы tool-input через `.join(',')`.
15
+ * - response_format=compact (default) урезает stack/userAgent и message ≤ 200ch.
16
+ */
17
+ const LEVELS = ['TRACE', 'DEBUG', 'INFO', 'WARN', 'WARNING', 'ERROR', 'FATAL', 'CRITICAL'];
18
+ const ELS_SORT_BY = ['receivedAt', 'timestamp', 'level', 'message'];
19
+ export const searchLogsInputShape = {
20
+ from: z.string().optional().describe('ISO timestamp lower bound. Default: 1h ago.'),
21
+ to: z.string().optional().describe('ISO timestamp upper bound. Default: now.'),
22
+ level: z.array(z.enum(LEVELS)).optional().describe('Filter by error level(s).'),
23
+ serviceName: z.array(z.string().max(255)).optional().describe('Filter by service name(s).'),
24
+ appVersion: z.array(z.string().max(64)).optional().describe('Filter by app version(s).'),
25
+ url: z.string().max(2048).optional(),
26
+ fingerprint: z.string().max(128).optional(),
27
+ sessionId: z.string().max(128).optional(),
28
+ search: z.string().max(500).optional().describe('Full-text search in message + stack.'),
29
+ cursor: z.string().nullable().optional().describe('Opaque seek-cursor. Pass null/omit for first page.'),
30
+ limit: z.number().int().min(1).max(200).default(20),
31
+ sortBy: z.enum(ELS_SORT_BY).default('receivedAt'),
32
+ sortOrder: z.enum(['asc', 'desc']).default('desc'),
33
+ // eslint-disable-next-line camelcase
34
+ response_format: z.enum(['compact', 'full', 'summary']).default('compact'),
35
+ };
36
+ export const searchLogsToolDef = {
37
+ name: 'search_logs',
38
+ title: 'Search error logs',
39
+ description: 'Search error logs with facet filters (level, serviceName, appVersion, url, fingerprint, sessionId, time range). Returns paginated items + facets + histogram. Default: last 1 hour, limit 20, compact format.',
40
+ inputShape: searchLogsInputShape,
41
+ };
42
+ /**
43
+ * Канонические filters для cursor.filtersHash — должны быть детерминированы
44
+ * относительно input (без page/cursor/limit/response_format).
45
+ */
46
+ function filtersFromArgs(args) {
47
+ return {
48
+ from: args.from,
49
+ to: args.to,
50
+ level: args.level?.slice().sort(),
51
+ serviceName: args.serviceName?.slice().sort(),
52
+ appVersion: args.appVersion?.slice().sort(),
53
+ url: args.url,
54
+ fingerprint: args.fingerprint,
55
+ sessionId: args.sessionId,
56
+ search: args.search,
57
+ sortBy: args.sortBy,
58
+ sortOrder: args.sortOrder,
59
+ };
60
+ }
61
+ function defaultFrom() {
62
+ return new Date(Date.now() - 60 * 60 * 1000).toISOString();
63
+ }
64
+ export async function handleSearchLogs(args, client) {
65
+ try {
66
+ const filters = filtersFromArgs(args);
67
+ let page = 1;
68
+ if (args.cursor && args.cursor.length > 0) {
69
+ const decoded = decodeCursor(args.cursor, filters);
70
+ page = decoded.page ?? 1;
71
+ }
72
+ const upstreamParams = {
73
+ page,
74
+ limit: args.limit,
75
+ sortBy: args.sortBy,
76
+ sortOrder: args.sortOrder,
77
+ from: args.from ?? defaultFrom(),
78
+ to: args.to,
79
+ search: args.search,
80
+ url: args.url,
81
+ fingerprint: args.fingerprint,
82
+ sessionId: args.sessionId,
83
+ levels: args.level?.join(','),
84
+ serviceName: args.serviceName?.join(','),
85
+ appVersion: args.appVersion?.join(','),
86
+ };
87
+ const { data, elsRequestId } = await client.searchLogs(upstreamParams);
88
+ const raw = data;
89
+ const { items: formattedItems, truncated } = applyResponseFormat(raw.items, args.response_format);
90
+ const hasMore = raw.page * raw.limit < raw.total;
91
+ let nextCursor = null;
92
+ if (hasMore && raw.items.length > 0) {
93
+ const lastItem = raw.items[raw.items.length - 1];
94
+ nextCursor = encodeCursor({ receivedAt: lastItem.receivedAt, id: lastItem.id }, filters, raw.page + 1, raw.limit);
95
+ }
96
+ const meta = {
97
+ elsRequestId,
98
+ cached: false,
99
+ ttlSec: 15,
100
+ redactionApplied: false,
101
+ truncated,
102
+ };
103
+ const structured = {
104
+ items: formattedItems,
105
+ total: raw.total,
106
+ facets: raw.facets,
107
+ histogram: raw.histogram,
108
+ nextCursor,
109
+ _meta: meta,
110
+ };
111
+ return {
112
+ structuredContent: structured,
113
+ content: [
114
+ {
115
+ type: 'text',
116
+ text: `Found ${raw.total} matching error logs (showing ${formattedItems.length}, page ${raw.page}/${raw.totalPages}).`,
117
+ },
118
+ ],
119
+ };
120
+ }
121
+ catch (err) {
122
+ if (err instanceof ToolError)
123
+ return err.toToolResult();
124
+ throw err;
125
+ }
126
+ }
127
+ //# sourceMappingURL=searchLogs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchLogs.js","sourceRoot":"","sources":["../../src/tools/searchLogs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAU,CAAC;AACpG,MAAM,WAAW,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAU,CAAC;AAE7E,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;IACnF,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IAC9E,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC/E,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAC3F,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACxF,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC3C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACvF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;IACvG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACnD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IACjD,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAClD,qCAAqC;IACrC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;CAC3E,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EACT,+MAA+M;IACjN,UAAU,EAAE,oBAAoB;CACjC,CAAC;AAmBF;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAgB;IACvC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE;QACjC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE;QAC7C,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE;QAC3C,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAgB,EAAE,MAAiB;IACxE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAEtC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,cAAc,GAAgD;YAClE,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE;YAChC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC;YACxC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC;SACvC,CAAC;QAEF,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAEvE,MAAM,GAAG,GAA0B,IAAI,CAAC;QACxC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAC9D,GAAG,CAAC,KAAK,EACT,IAAI,CAAC,eAAe,CACrB,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QACjD,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;YAClD,UAAU,GAAG,YAAY,CACvB,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,EACpD,OAAO,EACP,GAAG,CAAC,IAAI,GAAG,CAAC,EACZ,GAAG,CAAC,KAAK,CACV,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAiB;YACzB,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,EAAE;YACV,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACV,CAAC;QAEF,MAAM,UAAU,GAAG;YACjB,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU;YACV,KAAK,EAAE,IAAI;SACZ,CAAC;QAEF,OAAO;YACL,iBAAiB,EAAE,UAAU;YAC7B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS,GAAG,CAAC,KAAK,iCAAiC,cAAc,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,UAAU,IAAI;iBACvH;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,SAAS;YAAE,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC;QACxD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+ import type { ElsClient } from '../elsClient.js';
3
+ import type { ToolResult } from '../types.js';
4
+ /**
5
+ * Tool: top_error_messages
6
+ * Mapping: GET /analytics/top-messages → analytics.routes.ts:302
7
+ * Upstream Zod: TopMessagesSchema (take, from, to, +filters).
8
+ *
9
+ * Defaults: take=20.
10
+ */
11
+ export declare const topErrorMessagesInputShape: {
12
+ from: z.ZodOptional<z.ZodString>;
13
+ to: z.ZodOptional<z.ZodString>;
14
+ level: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
15
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
16
+ take: z.ZodDefault<z.ZodNumber>;
17
+ dedupeBy: z.ZodDefault<z.ZodEnum<["message", "fingerprint"]>>;
18
+ };
19
+ export declare const topErrorMessagesToolDef: {
20
+ name: string;
21
+ title: string;
22
+ description: string;
23
+ inputShape: {
24
+ from: z.ZodOptional<z.ZodString>;
25
+ to: z.ZodOptional<z.ZodString>;
26
+ level: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
27
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
28
+ take: z.ZodDefault<z.ZodNumber>;
29
+ dedupeBy: z.ZodDefault<z.ZodEnum<["message", "fingerprint"]>>;
30
+ };
31
+ };
32
+ type Args = {
33
+ from?: string;
34
+ to?: string;
35
+ level?: string[];
36
+ serviceName?: string[];
37
+ take: number;
38
+ dedupeBy: 'message' | 'fingerprint';
39
+ };
40
+ export declare function handleTopErrorMessages(args: Args, client: ElsClient): Promise<ToolResult>;
41
+ export {};
42
+ //# sourceMappingURL=topErrorMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topErrorMessages.d.ts","sourceRoot":"","sources":["../../src/tools/topErrorMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;GAMG;AAEH,eAAO,MAAM,0BAA0B;;;;;;;CAOtC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;CAMnC,CAAC;AAEF,KAAK,IAAI,GAAG;IACV,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,GAAG,aAAa,CAAC;CACrC,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAuC/F"}
@@ -0,0 +1,63 @@
1
+ import { z } from 'zod';
2
+ import { ToolError } from '../lib/errors.js';
3
+ /**
4
+ * Tool: top_error_messages
5
+ * Mapping: GET /analytics/top-messages → analytics.routes.ts:302
6
+ * Upstream Zod: TopMessagesSchema (take, from, to, +filters).
7
+ *
8
+ * Defaults: take=20.
9
+ */
10
+ export const topErrorMessagesInputShape = {
11
+ from: z.string().optional(),
12
+ to: z.string().optional(),
13
+ level: z.array(z.string().max(16)).optional(),
14
+ serviceName: z.array(z.string().max(255)).optional(),
15
+ take: z.number().int().min(1).max(100).default(20),
16
+ dedupeBy: z.enum(['message', 'fingerprint']).default('fingerprint'),
17
+ };
18
+ export const topErrorMessagesToolDef = {
19
+ name: 'top_error_messages',
20
+ title: 'Top error messages by occurrence',
21
+ description: 'Returns most-frequent error messages (deduplicated) for a given period. Use to answer "what are the worst offenders right now?".',
22
+ inputShape: topErrorMessagesInputShape,
23
+ };
24
+ export async function handleTopErrorMessages(args, client) {
25
+ try {
26
+ const params = {
27
+ take: args.take,
28
+ from: args.from,
29
+ to: args.to,
30
+ levels: args.level?.join(','),
31
+ serviceName: args.serviceName?.join(','),
32
+ };
33
+ const { data, elsRequestId } = await client.topErrorMessages(params);
34
+ const meta = {
35
+ elsRequestId,
36
+ cached: false,
37
+ ttlSec: 60,
38
+ redactionApplied: false,
39
+ };
40
+ const items = Array.isArray(data?.data) ? data.data : [];
41
+ return {
42
+ structuredContent: {
43
+ take: args.take,
44
+ data: items,
45
+ dedupeBy: args.dedupeBy,
46
+ nextCursor: null,
47
+ _meta: meta,
48
+ },
49
+ content: [
50
+ {
51
+ type: 'text',
52
+ text: `Top ${items.length} error message groups (dedupeBy=${args.dedupeBy}).`,
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ catch (err) {
58
+ if (err instanceof ToolError)
59
+ return err.toToolResult();
60
+ throw err;
61
+ }
62
+ }
63
+ //# sourceMappingURL=topErrorMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topErrorMessages.js","sourceRoot":"","sources":["../../src/tools/topErrorMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAClD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;CACpE,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,kCAAkC;IACzC,WAAW,EACT,kIAAkI;IACpI,UAAU,EAAE,0BAA0B;CACvC,CAAC;AAWF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAU,EAAE,MAAiB;IACxE,IAAI,CAAC;QACH,MAAM,MAAM,GAAgD;YAC1D,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC;SACzC,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAErE,MAAM,IAAI,GAAiB;YACzB,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,EAAE;YACV,gBAAgB,EAAE,KAAK;SACxB,CAAC;QAEF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzD,OAAO;YACL,iBAAiB,EAAE;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,KAAK;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,IAAI;aACZ;YACD,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO,KAAK,CAAC,MAAM,mCAAmC,IAAI,CAAC,QAAQ,IAAI;iBAC9E;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,SAAS;YAAE,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC;QACxD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ import type { ElsClient } from '../elsClient.js';
3
+ import type { ToolResult } from '../types.js';
4
+ /**
5
+ * Tool: traffic_stats
6
+ * Mapping: GET /analytics/traffic → analytics.routes.ts:268
7
+ * Upstream Zod: HistogramSchema (тот же что и histogram — from+to+фильтры).
8
+ *
9
+ * Возвращает perService с RPM-сериями и latency p50/p95/p99 + summary.
10
+ */
11
+ export declare const trafficStatsInputShape: {
12
+ from: z.ZodString;
13
+ to: z.ZodString;
14
+ level: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
15
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
16
+ appVersion: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
17
+ };
18
+ export declare const trafficStatsToolDef: {
19
+ name: string;
20
+ title: string;
21
+ description: string;
22
+ inputShape: {
23
+ from: z.ZodString;
24
+ to: z.ZodString;
25
+ level: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
26
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
27
+ appVersion: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
28
+ };
29
+ };
30
+ type Args = {
31
+ from: string;
32
+ to: string;
33
+ level?: string[];
34
+ serviceName?: string[];
35
+ appVersion?: string[];
36
+ };
37
+ export declare function handleTrafficStats(args: Args, client: ElsClient): Promise<ToolResult>;
38
+ export {};
39
+ //# sourceMappingURL=trafficStats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trafficStats.d.ts","sourceRoot":"","sources":["../../src/tools/trafficStats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;GAMG;AAEH,eAAO,MAAM,sBAAsB;;;;;;CAMlC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;CAM/B,CAAC;AAEF,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAkC3F"}
@@ -0,0 +1,57 @@
1
+ import { z } from 'zod';
2
+ import { ToolError } from '../lib/errors.js';
3
+ /**
4
+ * Tool: traffic_stats
5
+ * Mapping: GET /analytics/traffic → analytics.routes.ts:268
6
+ * Upstream Zod: HistogramSchema (тот же что и histogram — from+to+фильтры).
7
+ *
8
+ * Возвращает perService с RPM-сериями и latency p50/p95/p99 + summary.
9
+ */
10
+ export const trafficStatsInputShape = {
11
+ from: z.string().min(1),
12
+ to: z.string().min(1),
13
+ level: z.array(z.string().max(16)).optional(),
14
+ serviceName: z.array(z.string().max(255)).optional(),
15
+ appVersion: z.array(z.string().max(64)).optional(),
16
+ };
17
+ export const trafficStatsToolDef = {
18
+ name: 'traffic_stats',
19
+ title: 'Traffic + latency stats per service',
20
+ description: 'Returns RPM time-series per service + latency percentiles (p50/p95/p99) + summary. Use for capacity planning / "is service X overloaded?".',
21
+ inputShape: trafficStatsInputShape,
22
+ };
23
+ export async function handleTrafficStats(args, client) {
24
+ try {
25
+ const params = {
26
+ from: args.from,
27
+ to: args.to,
28
+ levels: args.level?.join(','),
29
+ serviceName: args.serviceName?.join(','),
30
+ appVersion: args.appVersion?.join(','),
31
+ };
32
+ const { data, elsRequestId } = await client.trafficStats(params);
33
+ const meta = {
34
+ elsRequestId,
35
+ cached: false,
36
+ ttlSec: 30,
37
+ redactionApplied: false,
38
+ };
39
+ const body = (data ?? {});
40
+ const perService = Array.isArray(body.perService) ? body.perService : [];
41
+ return {
42
+ structuredContent: { ...body, _meta: meta },
43
+ content: [
44
+ {
45
+ type: 'text',
46
+ text: `Traffic stats for ${perService.length} service(s), from ${args.from} to ${args.to}.`,
47
+ },
48
+ ],
49
+ };
50
+ }
51
+ catch (err) {
52
+ if (err instanceof ToolError)
53
+ return err.toToolResult();
54
+ throw err;
55
+ }
56
+ }
57
+ //# sourceMappingURL=trafficStats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trafficStats.js","sourceRoot":"","sources":["../../src/tools/trafficStats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpD,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,qCAAqC;IAC5C,WAAW,EACT,4IAA4I;IAC9I,UAAU,EAAE,sBAAsB;CACnC,CAAC;AAUF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAU,EAAE,MAAiB;IACpE,IAAI,CAAC;QACH,MAAM,MAAM,GAAuC;YACjD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC;YACxC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC;SACvC,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAEjE,MAAM,IAAI,GAAiB;YACzB,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,EAAE;YACV,gBAAgB,EAAE,KAAK;SACxB,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QACrD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzE,OAAO;YACL,iBAAiB,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YAC3C,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qBAAqB,UAAU,CAAC,MAAM,qBAAqB,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,GAAG;iBAC5F;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,SAAS;YAAE,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC;QACxD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ import type { ElsClient } from '../elsClient.js';
3
+ import type { ToolResult } from '../types.js';
4
+ export declare const triageRecentCriticalInputShape: {
5
+ minutesBack: z.ZodDefault<z.ZodNumber>;
6
+ serviceName: z.ZodOptional<z.ZodString>;
7
+ sampleSize: z.ZodDefault<z.ZodNumber>;
8
+ };
9
+ export declare const triageRecentCriticalToolDef: {
10
+ name: string;
11
+ title: string;
12
+ description: string;
13
+ inputShape: {
14
+ minutesBack: z.ZodDefault<z.ZodNumber>;
15
+ serviceName: z.ZodOptional<z.ZodString>;
16
+ sampleSize: z.ZodDefault<z.ZodNumber>;
17
+ };
18
+ };
19
+ type Args = {
20
+ minutesBack: number;
21
+ serviceName?: string;
22
+ sampleSize: number;
23
+ };
24
+ export declare function handleTriageRecentCritical(args: Args, client: ElsClient): Promise<ToolResult>;
25
+ export {};
26
+ //# sourceMappingURL=triageRecentCritical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triageRecentCritical.d.ts","sourceRoot":"","sources":["../../src/tools/triageRecentCritical.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,KAAK,EAAuC,UAAU,EAAE,MAAM,aAAa,CAAC;AAenF,eAAO,MAAM,8BAA8B;;;;CAI1C,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;;;;;;CAMvC,CAAC;AAEF,KAAK,IAAI,GAAG;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAyDnG"}
@@ -0,0 +1,81 @@
1
+ import { z } from 'zod';
2
+ import { ToolError } from '../lib/errors.js';
3
+ import { applyResponseFormat } from '../lib/responseFormat.js';
4
+ /**
5
+ * Tool: triage_recent_critical (composite)
6
+ *
7
+ * Convenience-wrapper для on-call triage. Под капотом:
8
+ * 1. search_logs(level=CRITICAL, from=now-Nmin) — sample + histogram + total
9
+ * 2. analytics/top-messages (тот же window) — top fingerprints
10
+ *
11
+ * Возвращает: windowMinutes, totalCritical, topFingerprints, samples, histogram.
12
+ * НЕ требует cursor (берём sampleSize самых свежих).
13
+ */
14
+ const DEFAULT_MINUTES = 60;
15
+ export const triageRecentCriticalInputShape = {
16
+ minutesBack: z.number().int().min(1).max(1440).default(DEFAULT_MINUTES),
17
+ serviceName: z.string().max(255).optional(),
18
+ sampleSize: z.number().int().min(1).max(20).default(5),
19
+ };
20
+ export const triageRecentCriticalToolDef = {
21
+ name: 'triage_recent_critical',
22
+ title: 'Triage recent CRITICAL errors',
23
+ description: 'On-call triage helper. Returns count of CRITICAL errors in last N minutes, top fingerprints, sample traces, and histogram. Saves LLM context vs manual search_logs + grouped_errors chain.',
24
+ inputShape: triageRecentCriticalInputShape,
25
+ };
26
+ export async function handleTriageRecentCritical(args, client) {
27
+ try {
28
+ const fromIso = new Date(Date.now() - args.minutesBack * 60 * 1000).toISOString();
29
+ const toIso = new Date().toISOString();
30
+ const searchParams = {
31
+ page: 1,
32
+ limit: args.sampleSize,
33
+ sortBy: 'receivedAt',
34
+ sortOrder: 'desc',
35
+ from: fromIso,
36
+ to: toIso,
37
+ levels: 'CRITICAL',
38
+ serviceName: args.serviceName,
39
+ };
40
+ const { data: searchData, elsRequestId } = await client.searchLogs(searchParams);
41
+ const raw = searchData;
42
+ const topParams = {
43
+ from: fromIso,
44
+ to: toIso,
45
+ take: 5,
46
+ levels: 'CRITICAL',
47
+ serviceName: args.serviceName,
48
+ };
49
+ const { data: topData } = await client.topErrorMessages(topParams);
50
+ const topFingerprints = Array.isArray(topData?.data) ? topData.data : [];
51
+ const { items: samples } = applyResponseFormat(raw.items ?? [], 'compact');
52
+ const meta = {
53
+ elsRequestId,
54
+ cached: false,
55
+ ttlSec: 15,
56
+ redactionApplied: false,
57
+ };
58
+ return {
59
+ structuredContent: {
60
+ windowMinutes: args.minutesBack,
61
+ totalCritical: Number(raw.total ?? 0),
62
+ topFingerprints,
63
+ samples,
64
+ histogram: raw.histogram ?? [],
65
+ _meta: meta,
66
+ },
67
+ content: [
68
+ {
69
+ type: 'text',
70
+ text: `Triage window=${args.minutesBack}min: ${raw.total ?? 0} CRITICAL, ${topFingerprints.length} top fingerprints, ${samples.length} samples.`,
71
+ },
72
+ ],
73
+ };
74
+ }
75
+ catch (err) {
76
+ if (err instanceof ToolError)
77
+ return err.toToolResult();
78
+ throw err;
79
+ }
80
+ }
81
+ //# sourceMappingURL=triageRecentCritical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triageRecentCritical.js","sourceRoot":"","sources":["../../src/tools/triageRecentCritical.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ import type { ElsClient } from '../elsClient.js';
3
+ import type { ToolResult } from '../types.js';
4
+ export declare const versionRegressionInputShape: {
5
+ baselineVersion: z.ZodString;
6
+ candidateVersion: z.ZodString;
7
+ serviceName: z.ZodOptional<z.ZodString>;
8
+ windowDays: z.ZodDefault<z.ZodNumber>;
9
+ };
10
+ export declare const versionRegressionToolDef: {
11
+ name: string;
12
+ title: string;
13
+ description: string;
14
+ inputShape: {
15
+ baselineVersion: z.ZodString;
16
+ candidateVersion: z.ZodString;
17
+ serviceName: z.ZodOptional<z.ZodString>;
18
+ windowDays: z.ZodDefault<z.ZodNumber>;
19
+ };
20
+ };
21
+ type Args = {
22
+ baselineVersion: string;
23
+ candidateVersion: string;
24
+ serviceName?: string;
25
+ windowDays: number;
26
+ };
27
+ export declare function handleVersionRegression(args: Args, client: ElsClient): Promise<ToolResult>;
28
+ export {};
29
+ //# sourceMappingURL=versionRegression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versionRegression.d.ts","sourceRoot":"","sources":["../../src/tools/versionRegression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAC;AAe5D,eAAO,MAAM,2BAA2B;;;;;CAKvC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;CAMpC,CAAC;AAEF,KAAK,IAAI,GAAG;IACV,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAMF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAoDhG"}