@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,91 @@
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: errors_in_session (composite)
7
+ *
8
+ * Wrapper над search_logs с фиксированным sessionId, sortBy=receivedAt asc.
9
+ * Используется когда саппорту дали session-ID — нужно посмотреть всю
10
+ * хронологию ошибок этого пользователя.
11
+ *
12
+ * Cursor — passthrough из search_logs (offset-based wrapper в Phase 1).
13
+ */
14
+ export const errorsInSessionInputShape = {
15
+ sessionId: z.string().min(1).max(128),
16
+ from: z.string().optional(),
17
+ to: z.string().optional(),
18
+ limit: z.number().int().min(1).max(200).default(20),
19
+ cursor: z.string().nullable().optional(),
20
+ // eslint-disable-next-line camelcase
21
+ response_format: z.enum(['compact', 'full', 'summary']).default('compact'),
22
+ };
23
+ export const errorsInSessionToolDef = {
24
+ name: 'errors_in_session',
25
+ title: 'All errors in a user session',
26
+ description: 'Return chronologically-ordered errors for a single session/user. Use when support gives you a session-ID and asks "what happened in this session?".',
27
+ inputShape: errorsInSessionInputShape,
28
+ };
29
+ function filtersFromArgs(args) {
30
+ return {
31
+ sessionId: args.sessionId,
32
+ from: args.from,
33
+ to: args.to,
34
+ };
35
+ }
36
+ export async function handleErrorsInSession(args, client) {
37
+ try {
38
+ const filters = filtersFromArgs(args);
39
+ let page = 1;
40
+ if (args.cursor && args.cursor.length > 0) {
41
+ const decoded = decodeCursor(args.cursor, filters);
42
+ page = decoded.page ?? 1;
43
+ }
44
+ const params = {
45
+ page,
46
+ limit: args.limit,
47
+ sortBy: 'receivedAt',
48
+ sortOrder: 'asc',
49
+ sessionId: args.sessionId,
50
+ from: args.from,
51
+ to: args.to,
52
+ };
53
+ const { data, elsRequestId } = await client.searchLogs(params);
54
+ const raw = data;
55
+ const { items: formattedItems, truncated } = applyResponseFormat(raw.items ?? [], args.response_format);
56
+ const hasMore = raw.page * raw.limit < raw.total;
57
+ let nextCursor = null;
58
+ if (hasMore && raw.items.length > 0) {
59
+ const lastItem = raw.items[raw.items.length - 1];
60
+ nextCursor = encodeCursor({ receivedAt: lastItem.receivedAt, id: lastItem.id }, filters, raw.page + 1, raw.limit);
61
+ }
62
+ const meta = {
63
+ elsRequestId,
64
+ cached: false,
65
+ ttlSec: 30,
66
+ redactionApplied: false,
67
+ truncated,
68
+ };
69
+ return {
70
+ structuredContent: {
71
+ sessionId: args.sessionId,
72
+ total: raw.total,
73
+ items: formattedItems,
74
+ nextCursor,
75
+ _meta: meta,
76
+ },
77
+ content: [
78
+ {
79
+ type: 'text',
80
+ text: `Session ${args.sessionId}: ${raw.total} error(s) total, returning ${formattedItems.length}.`,
81
+ },
82
+ ],
83
+ };
84
+ }
85
+ catch (err) {
86
+ if (err instanceof ToolError)
87
+ return err.toToolResult();
88
+ throw err;
89
+ }
90
+ }
91
+ //# sourceMappingURL=errorsInSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorsInSession.js","sourceRoot":"","sources":["../../src/tools/errorsInSession.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ import type { ElsClient } from '../elsClient.js';
3
+ import type { ToolResult } from '../types.js';
4
+ /**
5
+ * Tool: explain_error (composite + STUB AI)
6
+ *
7
+ * Phase 2 — без Mistral. Возвращаем детали лога + (опционально) контекст
8
+ * similar/correlated + `meta.aiAvailable: false`. Это позволяет LLM-клиенту
9
+ * самому сформулировать explanation на основе собранного контекста.
10
+ *
11
+ * Phase 5 подключит Mistral: добавим summary/likelyCauses/nextSteps.
12
+ */
13
+ export declare const explainErrorInputShape: {
14
+ traceId: z.ZodString;
15
+ locale: z.ZodDefault<z.ZodEnum<["ru", "en"]>>;
16
+ includeRelated: z.ZodDefault<z.ZodBoolean>;
17
+ };
18
+ export declare const explainErrorToolDef: {
19
+ name: string;
20
+ title: string;
21
+ description: string;
22
+ inputShape: {
23
+ traceId: z.ZodString;
24
+ locale: z.ZodDefault<z.ZodEnum<["ru", "en"]>>;
25
+ includeRelated: z.ZodDefault<z.ZodBoolean>;
26
+ };
27
+ };
28
+ type Args = {
29
+ traceId: string;
30
+ locale: 'ru' | 'en';
31
+ includeRelated: boolean;
32
+ };
33
+ export declare function handleExplainError(args: Args, client: ElsClient): Promise<ToolResult>;
34
+ export {};
35
+ //# sourceMappingURL=explainError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainError.d.ts","sourceRoot":"","sources":["../../src/tools/explainError.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;;;;;;;;GAQG;AAEH,eAAO,MAAM,sBAAsB;;;;CAIlC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;CAM/B,CAAC;AAEF,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAuE3F"}
@@ -0,0 +1,98 @@
1
+ import { z } from 'zod';
2
+ import { ToolError } from '../lib/errors.js';
3
+ /**
4
+ * Tool: explain_error (composite + STUB AI)
5
+ *
6
+ * Phase 2 — без Mistral. Возвращаем детали лога + (опционально) контекст
7
+ * similar/correlated + `meta.aiAvailable: false`. Это позволяет LLM-клиенту
8
+ * самому сформулировать explanation на основе собранного контекста.
9
+ *
10
+ * Phase 5 подключит Mistral: добавим summary/likelyCauses/nextSteps.
11
+ */
12
+ export const explainErrorInputShape = {
13
+ traceId: z.string().min(1).max(128),
14
+ locale: z.enum(['ru', 'en']).default('ru'),
15
+ includeRelated: z.boolean().default(true),
16
+ };
17
+ export const explainErrorToolDef = {
18
+ name: 'explain_error',
19
+ title: 'AI-assisted explanation of an error (Phase 2: details + context, no AI)',
20
+ description: 'Fetch error details and optional related-context (similar + correlated). Phase 2 returns aiAvailable=false (no Mistral wrap yet) — the LLM client should write the explanation from the returned context.',
21
+ inputShape: explainErrorInputShape,
22
+ };
23
+ export async function handleExplainError(args, client) {
24
+ try {
25
+ const { data: details, elsRequestId } = await client.getLogDetails(args.traceId);
26
+ let similarCount24h;
27
+ let correlatedTraces;
28
+ const warnings = [];
29
+ if (args.includeRelated) {
30
+ try {
31
+ const { data: similar } = await client.findSimilarErrors(args.traceId, {});
32
+ const sim = (similar ?? {});
33
+ if (typeof sim.last24h === 'number')
34
+ similarCount24h = sim.last24h;
35
+ }
36
+ catch (err) {
37
+ if (err instanceof ToolError) {
38
+ warnings.push(`find_similar_errors failed: ${err.code}`);
39
+ }
40
+ else {
41
+ warnings.push('find_similar_errors failed: INTERNAL');
42
+ }
43
+ }
44
+ try {
45
+ const { data: correlated } = await client.findCorrelatedErrors(args.traceId, {});
46
+ const corr = (correlated ?? {});
47
+ const list = Array.isArray(corr.correlated) ? corr.correlated : [];
48
+ correlatedTraces = list
49
+ .map((c) => (typeof c.traceId === 'string' ? c.traceId : null))
50
+ .filter((t) => t !== null)
51
+ .slice(0, 10);
52
+ }
53
+ catch (err) {
54
+ if (err instanceof ToolError) {
55
+ warnings.push(`find_correlated_errors failed: ${err.code}`);
56
+ }
57
+ else {
58
+ warnings.push('find_correlated_errors failed: INTERNAL');
59
+ }
60
+ }
61
+ }
62
+ const meta = {
63
+ elsRequestId,
64
+ cached: false,
65
+ ttlSec: 60,
66
+ redactionApplied: false,
67
+ degraded: true,
68
+ ...(warnings.length > 0 ? { warnings: [...warnings, 'AI provider not connected (Phase 2 stub).'] } : { warnings: ['AI provider not connected (Phase 2 stub).'] }),
69
+ };
70
+ return {
71
+ structuredContent: {
72
+ traceId: args.traceId,
73
+ summary: null,
74
+ likelyCauses: [],
75
+ nextSteps: [],
76
+ details,
77
+ related: {
78
+ ...(similarCount24h !== undefined ? { similarCount24h } : {}),
79
+ ...(correlatedTraces !== undefined ? { correlatedTraces } : {}),
80
+ },
81
+ meta: { model: null, aiAvailable: false },
82
+ _meta: meta,
83
+ },
84
+ content: [
85
+ {
86
+ type: 'text',
87
+ text: `[explain_error stub] traceId=${args.traceId}: details fetched, AI summary unavailable in Phase 2. The LLM should synthesize an explanation from the returned context.`,
88
+ },
89
+ ],
90
+ };
91
+ }
92
+ catch (err) {
93
+ if (err instanceof ToolError)
94
+ return err.toToolResult();
95
+ throw err;
96
+ }
97
+ }
98
+ //# sourceMappingURL=explainError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainError.js","sourceRoot":"","sources":["../../src/tools/explainError.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { z } from 'zod';
2
+ import type { ElsClient } from '../elsClient.js';
3
+ import type { ToolResult } from '../types.js';
4
+ /**
5
+ * Tool: find_correlated_errors
6
+ * Mapping: GET /errors/:traceId/correlated → analytics.routes.ts:188
7
+ *
8
+ * Возвращает другие ошибки в ±windowMinutes от данной — для поиска
9
+ * каскадных сбоев. ELS endpoint принимает: windowMinutes, limit, +
10
+ * фасет-фильтры из QueryErrorsSchema (levels, serviceName, ...).
11
+ */
12
+ export declare const findCorrelatedErrorsInputShape: {
13
+ traceId: z.ZodString;
14
+ windowMinutes: z.ZodDefault<z.ZodNumber>;
15
+ limit: z.ZodDefault<z.ZodNumber>;
16
+ level: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
17
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
18
+ response_format: z.ZodDefault<z.ZodEnum<["compact", "full", "summary"]>>;
19
+ };
20
+ export declare const findCorrelatedErrorsToolDef: {
21
+ name: string;
22
+ title: string;
23
+ description: string;
24
+ inputShape: {
25
+ traceId: z.ZodString;
26
+ windowMinutes: z.ZodDefault<z.ZodNumber>;
27
+ limit: z.ZodDefault<z.ZodNumber>;
28
+ level: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
29
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
30
+ response_format: z.ZodDefault<z.ZodEnum<["compact", "full", "summary"]>>;
31
+ };
32
+ };
33
+ type Args = {
34
+ traceId: string;
35
+ windowMinutes: number;
36
+ limit: number;
37
+ level?: string[];
38
+ serviceName?: string[];
39
+ response_format: 'compact' | 'full' | 'summary';
40
+ };
41
+ export declare function handleFindCorrelatedErrors(args: Args, client: ElsClient): Promise<ToolResult>;
42
+ export {};
43
+ //# sourceMappingURL=findCorrelatedErrors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findCorrelatedErrors.d.ts","sourceRoot":"","sources":["../../src/tools/findCorrelatedErrors.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;;;;;;;GAOG;AAEH,eAAO,MAAM,8BAA8B;;;;;;;CAQ1C,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;CAMvC,CAAC;AAEF,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;CACjD,CAAC;AAEF,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,UAAU,CAAC,CAiCrB"}
@@ -0,0 +1,59 @@
1
+ import { z } from 'zod';
2
+ import { ToolError } from '../lib/errors.js';
3
+ /**
4
+ * Tool: find_correlated_errors
5
+ * Mapping: GET /errors/:traceId/correlated → analytics.routes.ts:188
6
+ *
7
+ * Возвращает другие ошибки в ±windowMinutes от данной — для поиска
8
+ * каскадных сбоев. ELS endpoint принимает: windowMinutes, limit, +
9
+ * фасет-фильтры из QueryErrorsSchema (levels, serviceName, ...).
10
+ */
11
+ export const findCorrelatedErrorsInputShape = {
12
+ traceId: z.string().min(1).max(128),
13
+ windowMinutes: z.number().int().min(1).max(1440).default(15),
14
+ limit: z.number().int().min(1).max(100).default(20),
15
+ level: z.array(z.string().max(16)).optional(),
16
+ serviceName: z.array(z.string().max(255)).optional(),
17
+ // eslint-disable-next-line camelcase
18
+ response_format: z.enum(['compact', 'full', 'summary']).default('compact'),
19
+ };
20
+ export const findCorrelatedErrorsToolDef = {
21
+ name: 'find_correlated_errors',
22
+ title: 'Find errors that co-occur in time around a traceId',
23
+ description: 'Given a traceId, returns other errors within ±windowMinutes (default 15) in the same app. Useful for finding cascading failures.',
24
+ inputShape: findCorrelatedErrorsInputShape,
25
+ };
26
+ export async function handleFindCorrelatedErrors(args, client) {
27
+ try {
28
+ const params = {
29
+ windowMinutes: args.windowMinutes,
30
+ limit: args.limit,
31
+ levels: args.level?.join(','),
32
+ serviceName: args.serviceName?.join(','),
33
+ };
34
+ const { data, elsRequestId } = await client.findCorrelatedErrors(args.traceId, params);
35
+ const meta = {
36
+ elsRequestId,
37
+ cached: false,
38
+ ttlSec: 60,
39
+ redactionApplied: false,
40
+ };
41
+ const result = (data ?? {});
42
+ const correlated = Array.isArray(result.correlated) ? result.correlated : [];
43
+ return {
44
+ structuredContent: { ...result, _meta: meta },
45
+ content: [
46
+ {
47
+ type: 'text',
48
+ text: `Found ${correlated.length} correlated errors within ±${args.windowMinutes}min of ${args.traceId}.`,
49
+ },
50
+ ],
51
+ };
52
+ }
53
+ catch (err) {
54
+ if (err instanceof ToolError)
55
+ return err.toToolResult();
56
+ throw err;
57
+ }
58
+ }
59
+ //# sourceMappingURL=findCorrelatedErrors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findCorrelatedErrors.js","sourceRoot":"","sources":["../../src/tools/findCorrelatedErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACnC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5D,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,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,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,2BAA2B,GAAG;IACzC,IAAI,EAAE,wBAAwB;IAC9B,KAAK,EAAE,oDAAoD;IAC3D,WAAW,EACT,kIAAkI;IACpI,UAAU,EAAE,8BAA8B;CAC3C,CAAC;AAWF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAU,EACV,MAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAgD;YAC1D,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,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,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEvF,MAAM,IAAI,GAAiB;YACzB,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,EAAE;YACV,gBAAgB,EAAE,KAAK;SACxB,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QACvD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAE7E,OAAO;YACL,iBAAiB,EAAE,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;YAC7C,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS,UAAU,CAAC,MAAM,8BAA8B,IAAI,CAAC,aAAa,UAAU,IAAI,CAAC,OAAO,GAAG;iBAC1G;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,44 @@
1
+ import { z } from 'zod';
2
+ import type { ElsClient } from '../elsClient.js';
3
+ import type { ToolResult } from '../types.js';
4
+ /**
5
+ * Tool: find_similar_errors
6
+ * Mapping: GET /errors/:traceId/similar → analytics.routes.ts:159
7
+ *
8
+ * Возвращает агрегаты (totalOccurrences, lastHour/24h/7d, topUrls, topIPs,
9
+ * sourceSplit) для ошибок с похожим message/fingerprint.
10
+ *
11
+ * ELS endpoint принимает query: `levels` (csv), `serviceName`, `appVersion`.
12
+ */
13
+ export declare const findSimilarErrorsInputShape: {
14
+ traceId: z.ZodString;
15
+ levels: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
16
+ serviceName: z.ZodOptional<z.ZodString>;
17
+ appVersion: z.ZodOptional<z.ZodString>;
18
+ limit: z.ZodDefault<z.ZodNumber>;
19
+ response_format: z.ZodDefault<z.ZodEnum<["compact", "full", "summary"]>>;
20
+ };
21
+ export declare const findSimilarErrorsToolDef: {
22
+ name: string;
23
+ title: string;
24
+ description: string;
25
+ inputShape: {
26
+ traceId: z.ZodString;
27
+ levels: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
28
+ serviceName: z.ZodOptional<z.ZodString>;
29
+ appVersion: z.ZodOptional<z.ZodString>;
30
+ limit: z.ZodDefault<z.ZodNumber>;
31
+ response_format: z.ZodDefault<z.ZodEnum<["compact", "full", "summary"]>>;
32
+ };
33
+ };
34
+ type Args = {
35
+ traceId: string;
36
+ levels?: string[];
37
+ serviceName?: string;
38
+ appVersion?: string;
39
+ limit: number;
40
+ response_format: 'compact' | 'full' | 'summary';
41
+ };
42
+ export declare function handleFindSimilarErrors(args: Args, client: ElsClient): Promise<ToolResult>;
43
+ export {};
44
+ //# sourceMappingURL=findSimilarErrors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findSimilarErrors.d.ts","sourceRoot":"","sources":["../../src/tools/findSimilarErrors.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;;;;;;;;GAQG;AAEH,eAAO,MAAM,2BAA2B;;;;;;;CAQvC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;CAMpC,CAAC;AAEF,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;CACjD,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAgChG"}
@@ -0,0 +1,59 @@
1
+ import { z } from 'zod';
2
+ import { ToolError } from '../lib/errors.js';
3
+ /**
4
+ * Tool: find_similar_errors
5
+ * Mapping: GET /errors/:traceId/similar → analytics.routes.ts:159
6
+ *
7
+ * Возвращает агрегаты (totalOccurrences, lastHour/24h/7d, topUrls, topIPs,
8
+ * sourceSplit) для ошибок с похожим message/fingerprint.
9
+ *
10
+ * ELS endpoint принимает query: `levels` (csv), `serviceName`, `appVersion`.
11
+ */
12
+ export const findSimilarErrorsInputShape = {
13
+ traceId: z.string().min(1).max(128),
14
+ levels: z.array(z.string().max(16)).optional(),
15
+ serviceName: z.string().max(255).optional(),
16
+ appVersion: z.string().max(64).optional(),
17
+ limit: z.number().int().min(1).max(200).default(20),
18
+ // eslint-disable-next-line camelcase
19
+ response_format: z.enum(['compact', 'full', 'summary']).default('compact'),
20
+ };
21
+ export const findSimilarErrorsToolDef = {
22
+ name: 'find_similar_errors',
23
+ title: 'Find errors similar to a given traceId',
24
+ description: 'Given a traceId, returns aggregated stats about similar errors (by message/fingerprint): totalOccurrences, lastHour/24h/7d, firstSeen, lastSeen, topUrls, topIPs, sourceSplit.',
25
+ inputShape: findSimilarErrorsInputShape,
26
+ };
27
+ export async function handleFindSimilarErrors(args, client) {
28
+ try {
29
+ const params = {
30
+ levels: args.levels?.join(','),
31
+ serviceName: args.serviceName,
32
+ appVersion: args.appVersion,
33
+ };
34
+ const { data, elsRequestId } = await client.findSimilarErrors(args.traceId, params);
35
+ const meta = {
36
+ elsRequestId,
37
+ cached: false,
38
+ ttlSec: 60,
39
+ redactionApplied: false,
40
+ };
41
+ const result = (data ?? {});
42
+ const totalOccurrences = Number(result.totalOccurrences ?? 0);
43
+ return {
44
+ structuredContent: { ...result, _meta: meta },
45
+ content: [
46
+ {
47
+ type: 'text',
48
+ text: `Found ${totalOccurrences} similar errors (lastHour=${result.lastHour ?? 0}, last24h=${result.last24h ?? 0}, last7d=${result.last7d ?? 0}).`,
49
+ },
50
+ ],
51
+ };
52
+ }
53
+ catch (err) {
54
+ if (err instanceof ToolError)
55
+ return err.toToolResult();
56
+ throw err;
57
+ }
58
+ }
59
+ //# sourceMappingURL=findSimilarErrors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findSimilarErrors.js","sourceRoot":"","sources":["../../src/tools/findSimilarErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzC,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,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,wBAAwB,GAAG;IACtC,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,wCAAwC;IAC/C,WAAW,EACT,gLAAgL;IAClL,UAAU,EAAE,2BAA2B;CACxC,CAAC;AAWF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAU,EAAE,MAAiB;IACzE,IAAI,CAAC;QACH,MAAM,MAAM,GAAuC;YACjD,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEpF,MAAM,IAAI,GAAiB;YACzB,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,EAAE;YACV,gBAAgB,EAAE,KAAK;SACxB,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QACvD,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC;QAE9D,OAAO;YACL,iBAAiB,EAAE,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;YAC7C,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS,gBAAgB,6BAA6B,MAAM,CAAC,QAAQ,IAAI,CAAC,aAAa,MAAM,CAAC,OAAO,IAAI,CAAC,YAAY,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI;iBACnJ;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,30 @@
1
+ import { z } from 'zod';
2
+ import type { ElsClient } from '../elsClient.js';
3
+ import type { ToolResult } from '../types.js';
4
+ /**
5
+ * Tool: get_log_details
6
+ * Mapping: GET /errors/:traceId → analytics.routes.ts:213
7
+ *
8
+ * Default response_format = "full" (debug-обычное ожидание).
9
+ * 404 от ELS → ToolError('NOT_FOUND').
10
+ */
11
+ export declare const getLogDetailsInputShape: {
12
+ traceId: z.ZodString;
13
+ response_format: z.ZodDefault<z.ZodEnum<["compact", "full"]>>;
14
+ };
15
+ export declare const getLogDetailsToolDef: {
16
+ name: string;
17
+ title: string;
18
+ description: string;
19
+ inputShape: {
20
+ traceId: z.ZodString;
21
+ response_format: z.ZodDefault<z.ZodEnum<["compact", "full"]>>;
22
+ };
23
+ };
24
+ type Args = {
25
+ traceId: string;
26
+ response_format: 'compact' | 'full';
27
+ };
28
+ export declare function handleGetLogDetails(args: Args, client: ElsClient): Promise<ToolResult>;
29
+ export {};
30
+ //# sourceMappingURL=getLogDetails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getLogDetails.d.ts","sourceRoot":"","sources":["../../src/tools/getLogDetails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;GAMG;AAEH,eAAO,MAAM,uBAAuB;;;CAInC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;CAMhC,CAAC;AAEF,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,SAAS,GAAG,MAAM,CAAC;CACrC,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CA0B5F"}
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+ import { ToolError } from '../lib/errors.js';
3
+ import { applyResponseFormatSingle } from '../lib/responseFormat.js';
4
+ /**
5
+ * Tool: get_log_details
6
+ * Mapping: GET /errors/:traceId → analytics.routes.ts:213
7
+ *
8
+ * Default response_format = "full" (debug-обычное ожидание).
9
+ * 404 от ELS → ToolError('NOT_FOUND').
10
+ */
11
+ export const getLogDetailsInputShape = {
12
+ traceId: z.string().min(1).max(128),
13
+ // eslint-disable-next-line camelcase
14
+ response_format: z.enum(['compact', 'full']).default('full'),
15
+ };
16
+ export const getLogDetailsToolDef = {
17
+ name: 'get_log_details',
18
+ title: 'Get full error log details by traceId',
19
+ description: 'Fetch full details of one error log: stack trace, headers, context, timing. Default response_format=full (includes stack).',
20
+ inputShape: getLogDetailsInputShape,
21
+ };
22
+ export async function handleGetLogDetails(args, client) {
23
+ try {
24
+ const { data, elsRequestId } = await client.getLogDetails(args.traceId);
25
+ const { log, truncated } = applyResponseFormatSingle(data, args.response_format);
26
+ const meta = {
27
+ elsRequestId,
28
+ cached: false,
29
+ ttlSec: 3600,
30
+ redactionApplied: false,
31
+ truncated,
32
+ };
33
+ return {
34
+ structuredContent: { log, _meta: meta },
35
+ content: [
36
+ {
37
+ type: 'text',
38
+ text: `Error log ${data.traceId} (level=${data.level}, service=${data.serviceName || 'unknown'}): ${String(data.message ?? '').slice(0, 200)}`,
39
+ },
40
+ ],
41
+ };
42
+ }
43
+ catch (err) {
44
+ if (err instanceof ToolError)
45
+ return err.toToolResult();
46
+ throw err;
47
+ }
48
+ }
49
+ //# sourceMappingURL=getLogDetails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getLogDetails.js","sourceRoot":"","sources":["../../src/tools/getLogDetails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAGrE;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACnC,qCAAqC;IACrC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CAC7D,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE,uCAAuC;IAC9C,WAAW,EACT,4HAA4H;IAC9H,UAAU,EAAE,uBAAuB;CACpC,CAAC;AAOF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAU,EAAE,MAAiB;IACrE,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAEjF,MAAM,IAAI,GAAiB;YACzB,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI;YACZ,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACV,CAAC;QAEF,OAAO;YACL,iBAAiB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE;YACvC,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,aAAa,IAAI,CAAC,OAAO,WAAW,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,WAAW,IAAI,SAAS,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;iBAC/I;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,46 @@
1
+ import { z } from 'zod';
2
+ import type { ElsClient } from '../elsClient.js';
3
+ import type { ToolResult } from '../types.js';
4
+ /**
5
+ * Tool: grouped_errors
6
+ * Mapping: GET /analytics/grouped-errors → analytics.routes.ts:329
7
+ * Upstream Zod: GroupedErrorsSchema (from, to, take, +фасет-фильтры).
8
+ *
9
+ * Список уникальных fingerprint'ов, отсортированных по count (default), с
10
+ * per-group stats: count, firstSeen, lastSeen, affectedUsers, exampleTraceId.
11
+ *
12
+ * Phase 2 не пробрасывает sortBy в upstream (ELS-endpoint его не принимает),
13
+ * но возвращает выбранное значение в structured-content для подсказки LLM.
14
+ */
15
+ export declare const groupedErrorsInputShape: {
16
+ from: z.ZodOptional<z.ZodString>;
17
+ to: z.ZodOptional<z.ZodString>;
18
+ level: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
19
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
20
+ take: z.ZodDefault<z.ZodNumber>;
21
+ sortBy: z.ZodDefault<z.ZodEnum<["count", "lastSeen", "affectedUsers"]>>;
22
+ };
23
+ export declare const groupedErrorsToolDef: {
24
+ name: string;
25
+ title: string;
26
+ description: string;
27
+ inputShape: {
28
+ from: z.ZodOptional<z.ZodString>;
29
+ to: z.ZodOptional<z.ZodString>;
30
+ level: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
31
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
32
+ take: z.ZodDefault<z.ZodNumber>;
33
+ sortBy: z.ZodDefault<z.ZodEnum<["count", "lastSeen", "affectedUsers"]>>;
34
+ };
35
+ };
36
+ type Args = {
37
+ from?: string;
38
+ to?: string;
39
+ level?: string[];
40
+ serviceName?: string[];
41
+ take: number;
42
+ sortBy: 'count' | 'lastSeen' | 'affectedUsers';
43
+ };
44
+ export declare function handleGroupedErrors(args: Args, client: ElsClient): Promise<ToolResult>;
45
+ export {};
46
+ //# sourceMappingURL=groupedErrors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupedErrors.d.ts","sourceRoot":"","sources":["../../src/tools/groupedErrors.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;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,uBAAuB;;;;;;;CAOnC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;CAMhC,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,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,eAAe,CAAC;CAChD,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CA2C5F"}