@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,71 @@
1
+ import { z } from 'zod';
2
+ import { ToolError } from '../lib/errors.js';
3
+ /**
4
+ * Tool: grouped_errors
5
+ * Mapping: GET /analytics/grouped-errors → analytics.routes.ts:329
6
+ * Upstream Zod: GroupedErrorsSchema (from, to, take, +фасет-фильтры).
7
+ *
8
+ * Список уникальных fingerprint'ов, отсортированных по count (default), с
9
+ * per-group stats: count, firstSeen, lastSeen, affectedUsers, exampleTraceId.
10
+ *
11
+ * Phase 2 не пробрасывает sortBy в upstream (ELS-endpoint его не принимает),
12
+ * но возвращает выбранное значение в structured-content для подсказки LLM.
13
+ */
14
+ export const groupedErrorsInputShape = {
15
+ from: z.string().optional(),
16
+ to: z.string().optional(),
17
+ level: z.array(z.string().max(16)).optional(),
18
+ serviceName: z.array(z.string().max(255)).optional(),
19
+ take: z.number().int().min(1).max(100).default(20),
20
+ sortBy: z.enum(['count', 'lastSeen', 'affectedUsers']).default('count'),
21
+ };
22
+ export const groupedErrorsToolDef = {
23
+ name: 'grouped_errors',
24
+ title: 'Deduplicated error groups',
25
+ description: 'List of unique fingerprints sorted by occurrence, with per-group stats (count, firstSeen, lastSeen, affectedUsers, exampleTraceId). The "ranked list of all problems" view.',
26
+ inputShape: groupedErrorsInputShape,
27
+ };
28
+ export async function handleGroupedErrors(args, client) {
29
+ try {
30
+ const params = {
31
+ from: args.from,
32
+ to: args.to,
33
+ take: args.take,
34
+ levels: args.level?.join(','),
35
+ serviceName: args.serviceName?.join(','),
36
+ };
37
+ const { data, elsRequestId } = await client.groupedErrors(params);
38
+ const body = (data ?? {});
39
+ const items = Array.isArray(body.data)
40
+ ? body.data
41
+ : Array.isArray(body.items)
42
+ ? body.items
43
+ : [];
44
+ const meta = {
45
+ elsRequestId,
46
+ cached: false,
47
+ ttlSec: 60,
48
+ redactionApplied: false,
49
+ };
50
+ return {
51
+ structuredContent: {
52
+ items,
53
+ sortBy: args.sortBy,
54
+ nextCursor: null,
55
+ _meta: meta,
56
+ },
57
+ content: [
58
+ {
59
+ type: 'text',
60
+ text: `${items.length} grouped errors (take=${args.take}, sortBy=${args.sortBy}).`,
61
+ },
62
+ ],
63
+ };
64
+ }
65
+ catch (err) {
66
+ if (err instanceof ToolError)
67
+ return err.toToolResult();
68
+ throw err;
69
+ }
70
+ }
71
+ //# sourceMappingURL=groupedErrors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupedErrors.js","sourceRoot":"","sources":["../../src/tools/groupedErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,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,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;CACxE,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,gBAAgB;IACtB,KAAK,EAAE,2BAA2B;IAClC,WAAW,EACT,6KAA6K;IAC/K,UAAU,EAAE,uBAAuB;CACpC,CAAC;AAWF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAU,EAAE,MAAiB;IACrE,IAAI,CAAC;QACH,MAAM,MAAM,GAAgD;YAC1D,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,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,aAAa,CAAC,MAAM,CAAC,CAAC;QAElE,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACpC,CAAC,CAAC,IAAI,CAAC,IAAI;YACX,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;gBACzB,CAAC,CAAC,IAAI,CAAC,KAAK;gBACZ,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,IAAI,GAAiB;YACzB,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,EAAE;YACV,gBAAgB,EAAE,KAAK;SACxB,CAAC;QAEF,OAAO;YACL,iBAAiB,EAAE;gBACjB,KAAK;gBACL,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,IAAI;aACZ;YACD,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,yBAAyB,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,MAAM,IAAI;iBACnF;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: impact_analysis
6
+ * Mapping: GET /analytics/impact → analytics.routes.ts:344
7
+ * Upstream Zod: ImpactSchema (from, to, +фасет-фильтры).
8
+ *
9
+ * Ранжирует ошибки по impact-score (комбинация frequency / affectedUsers /
10
+ * severity / recency). Upstream сам считает score; tool пробрасывает.
11
+ *
12
+ * Поле `weights` в input — на будущее (Phase 4), upstream его не принимает.
13
+ */
14
+ export declare const impactAnalysisInputShape: {
15
+ from: z.ZodOptional<z.ZodString>;
16
+ to: z.ZodOptional<z.ZodString>;
17
+ level: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
18
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
19
+ take: z.ZodDefault<z.ZodNumber>;
20
+ };
21
+ export declare const impactAnalysisToolDef: {
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.ZodString, "many">>;
29
+ serviceName: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
30
+ take: z.ZodDefault<z.ZodNumber>;
31
+ };
32
+ };
33
+ type Args = {
34
+ from?: string;
35
+ to?: string;
36
+ level?: string[];
37
+ serviceName?: string[];
38
+ take: number;
39
+ };
40
+ export declare function handleImpactAnalysis(args: Args, client: ElsClient): Promise<ToolResult>;
41
+ export {};
42
+ //# sourceMappingURL=impactAnalysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impactAnalysis.d.ts","sourceRoot":"","sources":["../../src/tools/impactAnalysis.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;;;;;;;;;GASG;AAEH,eAAO,MAAM,wBAAwB;;;;;;CAMpC,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;;;;;;;;CAMjC,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;CACd,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAmC7F"}
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ import { ToolError } from '../lib/errors.js';
3
+ /**
4
+ * Tool: impact_analysis
5
+ * Mapping: GET /analytics/impact → analytics.routes.ts:344
6
+ * Upstream Zod: ImpactSchema (from, to, +фасет-фильтры).
7
+ *
8
+ * Ранжирует ошибки по impact-score (комбинация frequency / affectedUsers /
9
+ * severity / recency). Upstream сам считает score; tool пробрасывает.
10
+ *
11
+ * Поле `weights` в input — на будущее (Phase 4), upstream его не принимает.
12
+ */
13
+ export const impactAnalysisInputShape = {
14
+ from: z.string().optional(),
15
+ to: z.string().optional(),
16
+ level: z.array(z.string().max(16)).optional(),
17
+ serviceName: z.array(z.string().max(255)).optional(),
18
+ take: z.number().int().min(1).max(100).default(20),
19
+ };
20
+ export const impactAnalysisToolDef = {
21
+ name: 'impact_analysis',
22
+ title: 'Business-impact score for top errors',
23
+ description: 'Rank errors by impact score (frequency + affected users + severity + recency). Use for "what should we fix first?".',
24
+ inputShape: impactAnalysisInputShape,
25
+ };
26
+ export async function handleImpactAnalysis(args, client) {
27
+ try {
28
+ const params = {
29
+ from: args.from,
30
+ to: args.to,
31
+ levels: args.level?.join(','),
32
+ serviceName: args.serviceName?.join(','),
33
+ };
34
+ const { data, elsRequestId } = await client.impact(params);
35
+ const body = (data ?? {});
36
+ const rawItems = Array.isArray(body.data)
37
+ ? body.data
38
+ : Array.isArray(body.items)
39
+ ? body.items
40
+ : [];
41
+ const items = rawItems.slice(0, args.take);
42
+ const meta = {
43
+ elsRequestId,
44
+ cached: false,
45
+ ttlSec: 300,
46
+ redactionApplied: false,
47
+ };
48
+ return {
49
+ structuredContent: { items, _meta: meta },
50
+ content: [
51
+ { type: 'text', text: `${items.length} errors ranked by impact score.` },
52
+ ],
53
+ };
54
+ }
55
+ catch (err) {
56
+ if (err instanceof ToolError)
57
+ return err.toToolResult();
58
+ throw err;
59
+ }
60
+ }
61
+ //# sourceMappingURL=impactAnalysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impactAnalysis.js","sourceRoot":"","sources":["../../src/tools/impactAnalysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,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;CACnD,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE,sCAAsC;IAC7C,WAAW,EACT,qHAAqH;IACvH,UAAU,EAAE,wBAAwB;CACrC,CAAC;AAUF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAU,EAAE,MAAiB;IACtE,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;SACzC,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3D,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACvC,CAAC,CAAE,IAAI,CAAC,IAAuC;YAC/C,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;gBACzB,CAAC,CAAE,IAAI,CAAC,KAAwC;gBAChD,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3C,MAAM,IAAI,GAAiB;YACzB,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,GAAG;YACX,gBAAgB,EAAE,KAAK;SACxB,CAAC;QAEF,OAAO;YACL,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;YACzC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,iCAAiC,EAAE;aACzE;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,41 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Logger } from 'pino';
3
+ import type { ElsClient } from '../elsClient.js';
4
+ import { type ToolContext, type MiddlewareDeps } from '../middleware/withMiddleware.js';
5
+ import type { Tier } from '../billing/limits.js';
6
+ /**
7
+ * Регистрирует все Phase 1 read-only tools на MCP-сервере.
8
+ *
9
+ * Каждый tool регистрируется через `server.registerTool(name, config, cb)`.
10
+ * SDK 1.x принимает Zod raw shape (Record<string, ZodType>) в `inputSchema` и
11
+ * автоматически валидирует args перед вызовом handler'а. На выходе handler
12
+ * возвращает `{ structuredContent, content, isError? }`.
13
+ *
14
+ * Опционально tool можно отключить через ENV `MCP_DISABLE_TOOLS=name1,name2`.
15
+ */
16
+ export interface RegisterToolsOptions {
17
+ client: ElsClient;
18
+ disabled?: readonly string[];
19
+ log?: Logger;
20
+ /**
21
+ * Phase 5: дополнительный contextProvider для извлечения appId/keyId/tier
22
+ * из текущего request-контекста (в stdio-режиме обычно константа из config,
23
+ * в HTTP-режиме — из OIDC claim / API-key). Если не задан, middleware
24
+ * пропускается и handler вызывается напрямую (legacy-режим).
25
+ */
26
+ contextProvider?: () => ToolContext;
27
+ /** Phase 5: deps для middleware (audit/usage/redaction). */
28
+ middleware?: MiddlewareDeps;
29
+ }
30
+ export declare function registerTools(server: McpServer, opts: RegisterToolsOptions): string[];
31
+ /**
32
+ * Phase 5 helper: создаёт ToolContext из переменных окружения для stdio-режима.
33
+ */
34
+ export declare function makeStdioContext(args: {
35
+ appId: string;
36
+ apiKey: string;
37
+ tier: Tier;
38
+ log?: Logger;
39
+ }): ToolContext;
40
+ export declare const ALL_TOOL_NAMES: string[];
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAuBjD;;;;;;;;;GASG;AAEH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,WAAW,CAAC;IACpC,4DAA4D;IAC5D,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAiCD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAoDrF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,WAAW,CAOd;AAED,eAAO,MAAM,cAAc,UAAmC,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { withMiddleware, } from '../middleware/withMiddleware.js';
2
+ import { searchLogsToolDef, handleSearchLogs } from './searchLogs.js';
3
+ import { getLogDetailsToolDef, handleGetLogDetails } from './getLogDetails.js';
4
+ import { findSimilarErrorsToolDef, handleFindSimilarErrors } from './findSimilarErrors.js';
5
+ import { findCorrelatedErrorsToolDef, handleFindCorrelatedErrors, } from './findCorrelatedErrors.js';
6
+ import { topErrorMessagesToolDef, handleTopErrorMessages } from './topErrorMessages.js';
7
+ import { errorHistogramToolDef, handleErrorHistogram } from './errorHistogram.js';
8
+ import { trafficStatsToolDef, handleTrafficStats } from './trafficStats.js';
9
+ import { listAppsToolDef, handleListApps } from './listApps.js';
10
+ import { queryLogsJqlToolDef, handleQueryLogsJql } from './queryLogsJql.js';
11
+ import { errorStatsBreakdownToolDef, handleErrorStatsBreakdown } from './errorStatsBreakdown.js';
12
+ import { groupedErrorsToolDef, handleGroupedErrors } from './groupedErrors.js';
13
+ import { impactAnalysisToolDef, handleImpactAnalysis } from './impactAnalysis.js';
14
+ import { baselineCompareToolDef, handleBaselineCompare } from './baselineCompare.js';
15
+ import { versionRegressionToolDef, handleVersionRegression } from './versionRegression.js';
16
+ import { errorHeatmapToolDef, handleErrorHeatmap } from './errorHeatmap.js';
17
+ import { triageRecentCriticalToolDef, handleTriageRecentCritical } from './triageRecentCritical.js';
18
+ import { errorsInSessionToolDef, handleErrorsInSession } from './errorsInSession.js';
19
+ import { explainErrorToolDef, handleExplainError } from './explainError.js';
20
+ const ALL_TOOLS = [
21
+ // Phase 1
22
+ { def: searchLogsToolDef, handler: handleSearchLogs },
23
+ { def: getLogDetailsToolDef, handler: handleGetLogDetails },
24
+ { def: findSimilarErrorsToolDef, handler: handleFindSimilarErrors },
25
+ { def: findCorrelatedErrorsToolDef, handler: handleFindCorrelatedErrors },
26
+ { def: topErrorMessagesToolDef, handler: handleTopErrorMessages },
27
+ { def: errorHistogramToolDef, handler: handleErrorHistogram },
28
+ { def: trafficStatsToolDef, handler: handleTrafficStats },
29
+ { def: listAppsToolDef, handler: handleListApps },
30
+ // Phase 2
31
+ { def: queryLogsJqlToolDef, handler: handleQueryLogsJql },
32
+ { def: errorStatsBreakdownToolDef, handler: handleErrorStatsBreakdown },
33
+ { def: groupedErrorsToolDef, handler: handleGroupedErrors },
34
+ { def: impactAnalysisToolDef, handler: handleImpactAnalysis },
35
+ { def: baselineCompareToolDef, handler: handleBaselineCompare },
36
+ { def: versionRegressionToolDef, handler: handleVersionRegression },
37
+ { def: errorHeatmapToolDef, handler: handleErrorHeatmap },
38
+ { def: triageRecentCriticalToolDef, handler: handleTriageRecentCritical },
39
+ { def: errorsInSessionToolDef, handler: handleErrorsInSession },
40
+ { def: explainErrorToolDef, handler: handleExplainError },
41
+ ];
42
+ export function registerTools(server, opts) {
43
+ const disabled = new Set(opts.disabled ?? []);
44
+ const registered = [];
45
+ for (const { def, handler } of ALL_TOOLS) {
46
+ if (disabled.has(def.name)) {
47
+ opts.log?.info?.({ tool: def.name }, 'Tool disabled via MCP_DISABLE_TOOLS');
48
+ continue;
49
+ }
50
+ // SDK 1.x: registerTool typed via Zod raw shape; обходим строгий generic
51
+ // через локальный `any`-каст — handler внутри сам валидирован zod-парсером,
52
+ // который SDK прогоняет до вызова callback.
53
+ const register = server.registerTool.bind(server);
54
+ // Phase 5: если в opts задан contextProvider — оборачиваем handler в
55
+ // withMiddleware (quota + audit + usage + redaction). Иначе — legacy путь.
56
+ const effectiveHandler = opts.contextProvider
57
+ ? withMiddleware(def.name, handler, () => opts.contextProvider(), opts.middleware ?? {})
58
+ : handler;
59
+ register(def.name, {
60
+ title: def.title,
61
+ description: def.description,
62
+ inputSchema: def.inputShape,
63
+ }, async (args) => {
64
+ const result = (await effectiveHandler(args, opts.client));
65
+ return result;
66
+ });
67
+ registered.push(def.name);
68
+ }
69
+ return registered;
70
+ }
71
+ /**
72
+ * Phase 5 helper: создаёт ToolContext из переменных окружения для stdio-режима.
73
+ */
74
+ export function makeStdioContext(args) {
75
+ return {
76
+ appId: args.appId,
77
+ keyId: args.apiKey.slice(0, 8),
78
+ tier: args.tier,
79
+ ...(args.log ? { log: args.log } : {}),
80
+ };
81
+ }
82
+ export const ALL_TOOL_NAMES = ALL_TOOLS.map((t) => t.def.name);
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,cAAc,GAGf,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACpG,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAoC5E,MAAM,SAAS,GAAoD;IACjE,UAAU;IACV,EAAE,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAA8B,EAAE;IACnE,EAAE,GAAG,EAAE,oBAAoB,EAAE,OAAO,EAAE,mBAAiC,EAAE;IACzE,EAAE,GAAG,EAAE,wBAAwB,EAAE,OAAO,EAAE,uBAAqC,EAAE;IACjF,EAAE,GAAG,EAAE,2BAA2B,EAAE,OAAO,EAAE,0BAAwC,EAAE;IACvF,EAAE,GAAG,EAAE,uBAAuB,EAAE,OAAO,EAAE,sBAAoC,EAAE;IAC/E,EAAE,GAAG,EAAE,qBAAqB,EAAE,OAAO,EAAE,oBAAkC,EAAE;IAC3E,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,kBAAgC,EAAE;IACvE,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,cAA4B,EAAE;IAC/D,UAAU;IACV,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,kBAAgC,EAAE;IACvE,EAAE,GAAG,EAAE,0BAA0B,EAAE,OAAO,EAAE,yBAAuC,EAAE;IACrF,EAAE,GAAG,EAAE,oBAAoB,EAAE,OAAO,EAAE,mBAAiC,EAAE;IACzE,EAAE,GAAG,EAAE,qBAAqB,EAAE,OAAO,EAAE,oBAAkC,EAAE;IAC3E,EAAE,GAAG,EAAE,sBAAsB,EAAE,OAAO,EAAE,qBAAmC,EAAE;IAC7E,EAAE,GAAG,EAAE,wBAAwB,EAAE,OAAO,EAAE,uBAAqC,EAAE;IACjF,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,kBAAgC,EAAE;IACvE,EAAE,GAAG,EAAE,2BAA2B,EAAE,OAAO,EAAE,0BAAwC,EAAE;IACvF,EAAE,GAAG,EAAE,sBAAsB,EAAE,OAAO,EAAE,qBAAmC,EAAE;IAC7E,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,kBAAgC,EAAE;CACxE,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,IAA0B;IACzE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,SAAS,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,qCAAqC,CAAC,CAAC;YAC5E,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,4EAA4E;QAC5E,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAIpC,CAAC;QACb,qEAAqE;QACrE,2EAA2E;QAC3E,MAAM,gBAAgB,GACpB,IAAI,CAAC,eAAe;YAClB,CAAC,CAAC,cAAc,CACZ,GAAG,CAAC,IAAI,EACR,OAAoF,EACpF,GAAG,EAAE,CAAC,IAAI,CAAC,eAAgB,EAAE,EAC7B,IAAI,CAAC,UAAU,IAAI,EAAE,CACuC;YAChE,CAAC,CAAE,OAAqE,CAAC;QAE7E,QAAQ,CACN,GAAG,CAAC,IAAI,EACR;YACE,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,WAAW,EAAE,GAAG,CAAC,UAAU;SAC5B,EACD,KAAK,EAAE,IAAa,EAAE,EAAE;YACtB,MAAM,MAAM,GAAG,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAKxD,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC,CACF,CAAC;QAEF,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAKhC;IACC,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { ElsClient } from '../elsClient.js';
2
+ import type { ToolResult } from '../types.js';
3
+ /**
4
+ * Tool: list_apps
5
+ *
6
+ * Mapping: GET /apps → apps.routes.ts:23 (требует master key, `requireMaster`).
7
+ *
8
+ * Поведение Phase 1:
9
+ * - Если master-key → возвращает все apps как есть.
10
+ * - Если обычный ELS-key → 403 INSUFFICIENT_SCOPE от ELS → graceful fallback:
11
+ * отдаём `{ apps: [{ slug: '(current-app)', restricted: true }] }` с
12
+ * `_meta.warnings` и `_meta.degraded=true`. Это согласуется с планом
13
+ * «derived from API-key context» — для обычного key пользователь и так
14
+ * работает в рамках одного app.
15
+ *
16
+ * Phase 3: после OAuth-токенов сможем извлечь app-slug из `token.app` claim
17
+ * и выдавать его без 403-fallback.
18
+ */
19
+ export declare const listAppsInputShape: {};
20
+ export declare const listAppsToolDef: {
21
+ name: string;
22
+ title: string;
23
+ description: string;
24
+ inputShape: {};
25
+ };
26
+ export declare function handleListApps(_args: Record<string, never>, client: ElsClient): Promise<ToolResult>;
27
+ //# sourceMappingURL=listApps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listApps.d.ts","sourceRoot":"","sources":["../../src/tools/listApps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;;;;;;;;;;GAeG;AAEH,eAAO,MAAM,kBAAkB,IAAK,CAAC;AAErC,eAAO,MAAM,eAAe;;;;;CAM3B,CAAC;AAEF,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAoDzG"}
@@ -0,0 +1,78 @@
1
+ import { ToolError } from '../lib/errors.js';
2
+ /**
3
+ * Tool: list_apps
4
+ *
5
+ * Mapping: GET /apps → apps.routes.ts:23 (требует master key, `requireMaster`).
6
+ *
7
+ * Поведение Phase 1:
8
+ * - Если master-key → возвращает все apps как есть.
9
+ * - Если обычный ELS-key → 403 INSUFFICIENT_SCOPE от ELS → graceful fallback:
10
+ * отдаём `{ apps: [{ slug: '(current-app)', restricted: true }] }` с
11
+ * `_meta.warnings` и `_meta.degraded=true`. Это согласуется с планом
12
+ * «derived from API-key context» — для обычного key пользователь и так
13
+ * работает в рамках одного app.
14
+ *
15
+ * Phase 3: после OAuth-токенов сможем извлечь app-slug из `token.app` claim
16
+ * и выдавать его без 403-fallback.
17
+ */
18
+ export const listAppsInputShape = {};
19
+ export const listAppsToolDef = {
20
+ name: 'list_apps',
21
+ title: 'List apps available to current API-key',
22
+ description: 'List apps (tenants) accessible to the current API key. For a regular key — one app; for a master key — all active apps.',
23
+ inputShape: listAppsInputShape,
24
+ };
25
+ export async function handleListApps(_args, client) {
26
+ try {
27
+ const { data, elsRequestId } = await client.listApps();
28
+ const apps = (data?.apps ?? []).map((a) => ({
29
+ slug: a.slug,
30
+ name: a.name,
31
+ tier: a.rateLimitTier,
32
+ isActive: a.isActive,
33
+ createdAt: a.createdAt,
34
+ }));
35
+ const meta = {
36
+ elsRequestId,
37
+ cached: false,
38
+ ttlSec: 300,
39
+ redactionApplied: false,
40
+ };
41
+ return {
42
+ structuredContent: { apps, _meta: meta },
43
+ content: [{ type: 'text', text: `${apps.length} app(s) accessible.` }],
44
+ };
45
+ }
46
+ catch (err) {
47
+ if (err instanceof ToolError && err.code === 'INSUFFICIENT_SCOPE') {
48
+ // Graceful fallback: обычный ELS-key не имеет доступа к /apps,
49
+ // но всегда привязан к одному app (см. apiContext.app.slug в middleware).
50
+ const meta = {
51
+ elsRequestId: null,
52
+ cached: false,
53
+ ttlSec: 300,
54
+ redactionApplied: false,
55
+ degraded: true,
56
+ warnings: [
57
+ 'API key lacks master scope; cannot enumerate apps. Returning current-app placeholder.',
58
+ ],
59
+ };
60
+ return {
61
+ structuredContent: {
62
+ apps: [{ slug: '(current-app)', name: 'Current app', isActive: true, restricted: true }],
63
+ _meta: meta,
64
+ },
65
+ content: [
66
+ {
67
+ type: 'text',
68
+ text: 'Current API key is scoped to a single app. Use a master key to enumerate all apps.',
69
+ },
70
+ ],
71
+ };
72
+ }
73
+ if (err instanceof ToolError)
74
+ return err.toToolResult();
75
+ throw err;
76
+ }
77
+ }
78
+ //# sourceMappingURL=listApps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listApps.js","sourceRoot":"","sources":["../../src/tools/listApps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,wCAAwC;IAC/C,WAAW,EACT,yHAAyH;IAC3H,UAAU,EAAE,kBAAkB;CAC/B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAA4B,EAAE,MAAiB;IAClF,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,aAAa;YACrB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,GAAiB;YACzB,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,GAAG;YACX,gBAAgB,EAAE,KAAK;SACxB,CAAC;QAEF,OAAO;YACL,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YACxC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,qBAAqB,EAAE,CAAC;SACvE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YAClE,+DAA+D;YAC/D,0EAA0E;YAC1E,MAAM,IAAI,GAAiB;gBACzB,YAAY,EAAE,IAAI;gBAClB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,GAAG;gBACX,gBAAgB,EAAE,KAAK;gBACvB,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE;oBACR,uFAAuF;iBACxF;aACF,CAAC;YACF,OAAO;gBACL,iBAAiB,EAAE;oBACjB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;oBACxF,KAAK,EAAE,IAAI;iBACZ;gBACD,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,oFAAoF;qBAC3F;iBACF;aACF,CAAC;QACJ,CAAC;QACD,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 { ResponseFormat, ToolResult } from '../types.js';
4
+ export declare const queryLogsJqlInputShape: {
5
+ filter: z.ZodOptional<z.ZodType<unknown, z.ZodTypeDef, unknown>>;
6
+ search: z.ZodOptional<z.ZodString>;
7
+ from: z.ZodOptional<z.ZodString>;
8
+ to: z.ZodOptional<z.ZodString>;
9
+ limit: z.ZodDefault<z.ZodNumber>;
10
+ offset: z.ZodDefault<z.ZodNumber>;
11
+ sort: z.ZodDefault<z.ZodEnum<["receivedAt", "level", "message"]>>;
12
+ order: z.ZodDefault<z.ZodEnum<["asc", "desc"]>>;
13
+ response_format: z.ZodDefault<z.ZodEnum<["compact", "full", "summary"]>>;
14
+ };
15
+ export declare const queryLogsJqlToolDef: {
16
+ name: string;
17
+ title: string;
18
+ description: string;
19
+ inputShape: {
20
+ filter: z.ZodOptional<z.ZodType<unknown, z.ZodTypeDef, unknown>>;
21
+ search: z.ZodOptional<z.ZodString>;
22
+ from: z.ZodOptional<z.ZodString>;
23
+ to: z.ZodOptional<z.ZodString>;
24
+ limit: z.ZodDefault<z.ZodNumber>;
25
+ offset: z.ZodDefault<z.ZodNumber>;
26
+ sort: z.ZodDefault<z.ZodEnum<["receivedAt", "level", "message"]>>;
27
+ order: z.ZodDefault<z.ZodEnum<["asc", "desc"]>>;
28
+ response_format: z.ZodDefault<z.ZodEnum<["compact", "full", "summary"]>>;
29
+ };
30
+ };
31
+ type Args = {
32
+ filter?: unknown;
33
+ search?: string;
34
+ from?: string;
35
+ to?: string;
36
+ limit: number;
37
+ offset: number;
38
+ sort: 'receivedAt' | 'level' | 'message';
39
+ order: 'asc' | 'desc';
40
+ response_format: ResponseFormat;
41
+ };
42
+ export declare function handleQueryLogsJql(args: Args, client: ElsClient): Promise<ToolResult>;
43
+ export {};
44
+ //# sourceMappingURL=queryLogsJql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryLogsJql.d.ts","sourceRoot":"","sources":["../../src/tools/queryLogsJql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,KAAK,EAAE,cAAc,EAAuC,UAAU,EAAE,MAAM,aAAa,CAAC;AAoCnG,eAAO,MAAM,sBAAsB;;;;;;;;;;CAalC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;CAM/B,CAAC;AAEF,KAAK,IAAI,GAAG;IACV,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;IACzC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;IACtB,eAAe,EAAE,cAAc,CAAC;CACjC,CAAC;AAMF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAwD3F"}
@@ -0,0 +1,107 @@
1
+ import { z } from 'zod';
2
+ import { ToolError } from '../lib/errors.js';
3
+ import { applyResponseFormat } from '../lib/responseFormat.js';
4
+ /**
5
+ * Tool: query_logs_jql
6
+ * Mapping: POST /errors/query → analytics.routes.ts:60
7
+ * Upstream Zod: JqlQueryRequestSchema (filter AST, pagination, search).
8
+ *
9
+ * Поддерживает структурные boolean-условия (AND/OR/NOT/IN/comparison) поверх
10
+ * whitelisted полей ErrorLog. AST формат полностью совпадает с upstream
11
+ * ExprAst (см. schemas/jql.schema.ts) — мы пробрасываем body как есть.
12
+ *
13
+ * Limits (upstream): depth ≤ 8, nodes ≤ 100, IN-list ≤ 50, value ≤ 500 chars.
14
+ * При превышении ELS вернёт 400 → INVALID_ARGS.
15
+ *
16
+ * Defaults: limit=20, response_format=compact, sort=receivedAt desc.
17
+ */
18
+ const JQL_OP_VALUES = ['=', '!=', '~', '!~', 'in', 'not_in', '>', '<', '>=', '<='];
19
+ // Recursive AST schema — зеркало FilterAstSchema из upstream.
20
+ // Используем z.ZodType<unknown> чтобы избежать чрезмерной типизации в SDK.
21
+ const PrimitiveValueSchema = z.union([z.string().max(500), z.number(), z.boolean()]);
22
+ const ExprSchema = z.lazy(() => z.union([
23
+ z.object({
24
+ type: z.literal('comparison'),
25
+ field: z.string().min(1).max(64),
26
+ op: z.enum(JQL_OP_VALUES),
27
+ value: z.union([PrimitiveValueSchema, z.array(PrimitiveValueSchema).max(50)]),
28
+ }),
29
+ z.object({ type: z.literal('and'), children: z.array(ExprSchema).min(1).max(50) }),
30
+ z.object({ type: z.literal('or'), children: z.array(ExprSchema).min(1).max(50) }),
31
+ z.object({ type: z.literal('not'), child: ExprSchema }),
32
+ ]));
33
+ export const queryLogsJqlInputShape = {
34
+ filter: ExprSchema.optional().describe('Filter AST (comparison / and / or / not). Fields whitelisted upstream; ops per field-type.'),
35
+ search: z.string().max(500).optional(),
36
+ from: z.string().optional().describe('ISO timestamp. Default: 1h ago.'),
37
+ to: z.string().optional(),
38
+ limit: z.number().int().min(1).max(200).default(20),
39
+ offset: z.number().int().min(0).default(0),
40
+ sort: z.enum(['receivedAt', 'level', 'message']).default('receivedAt'),
41
+ order: z.enum(['asc', 'desc']).default('desc'),
42
+ // eslint-disable-next-line camelcase
43
+ response_format: z.enum(['compact', 'full', 'summary']).default('compact'),
44
+ };
45
+ export const queryLogsJqlToolDef = {
46
+ name: 'query_logs_jql',
47
+ title: 'Query logs with JQL filter AST',
48
+ description: 'Run a JQL-like structured query with nested AND/OR/NOT groups and IN/NOT_IN operators on whitelisted fields. Use when search_logs cannot express boolean logic.',
49
+ inputShape: queryLogsJqlInputShape,
50
+ };
51
+ function defaultFrom() {
52
+ return new Date(Date.now() - 60 * 60 * 1000).toISOString();
53
+ }
54
+ export async function handleQueryLogsJql(args, client) {
55
+ try {
56
+ const body = {
57
+ pagination: {
58
+ from: args.from ?? defaultFrom(),
59
+ to: args.to,
60
+ limit: args.limit,
61
+ offset: args.offset,
62
+ sort: args.sort,
63
+ order: args.order,
64
+ },
65
+ };
66
+ if (args.filter !== undefined)
67
+ body.filter = args.filter;
68
+ if (args.search !== undefined)
69
+ body.search = args.search;
70
+ const { data, elsRequestId } = await client.queryLogsJql(body);
71
+ const raw = data;
72
+ const { items: formattedItems, truncated } = applyResponseFormat(raw.items ?? [], args.response_format);
73
+ const total = Number(raw.total ?? 0);
74
+ const hasMore = args.offset + args.limit < total;
75
+ const meta = {
76
+ elsRequestId,
77
+ cached: false,
78
+ ttlSec: 15,
79
+ redactionApplied: false,
80
+ truncated,
81
+ };
82
+ return {
83
+ structuredContent: {
84
+ items: formattedItems,
85
+ total,
86
+ facets: raw.facets ?? {},
87
+ histogram: raw.histogram ?? [],
88
+ nextCursor: null,
89
+ offset: args.offset,
90
+ hasMore,
91
+ _meta: meta,
92
+ },
93
+ content: [
94
+ {
95
+ type: 'text',
96
+ text: `Matched ${total} logs via JQL (showing ${formattedItems.length}, offset ${args.offset}).`,
97
+ },
98
+ ],
99
+ };
100
+ }
101
+ catch (err) {
102
+ if (err instanceof ToolError)
103
+ return err.toToolResult();
104
+ throw err;
105
+ }
106
+ }
107
+ //# sourceMappingURL=queryLogsJql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryLogsJql.js","sourceRoot":"","sources":["../../src/tools/queryLogsJql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D;;;;;;;;;;;;;GAaG;AAEH,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAE5F,8DAA8D;AAC9D,2EAA2E;AAC3E,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACrF,MAAM,UAAU,GAAuB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CACjD,CAAC,CAAC,KAAK,CAAC;IACN,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;QAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;QACzB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;KAC9E,CAAC;IACF,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;IAClF,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;IACjF,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;CACxD,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,4FAA4F,CAC7F;IACD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACvE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzB,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,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IACtE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC9C,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,mBAAmB,GAAG;IACjC,IAAI,EAAE,gBAAgB;IACtB,KAAK,EAAE,gCAAgC;IACvC,WAAW,EACT,iKAAiK;IACnK,UAAU,EAAE,sBAAsB;CACnC,CAAC;AAcF,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,kBAAkB,CAAC,IAAU,EAAE,MAAiB;IACpE,IAAI,CAAC;QACH,MAAM,IAAI,GAA4B;YACpC,UAAU,EAAE;gBACV,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE;gBAChC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB;SACF,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAEzD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,GAAG,GAA0B,IAAI,CAAC;QAExC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAC9D,GAAG,CAAC,KAAK,IAAI,EAAE,EACf,IAAI,CAAC,eAAe,CACrB,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEjD,MAAM,IAAI,GAAiB;YACzB,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,EAAE;YACV,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACV,CAAC;QAEF,OAAO;YACL,iBAAiB,EAAE;gBACjB,KAAK,EAAE,cAAc;gBACrB,KAAK;gBACL,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;gBACxB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;gBAC9B,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO;gBACP,KAAK,EAAE,IAAI;aACZ;YACD,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,WAAW,KAAK,0BAA0B,cAAc,CAAC,MAAM,YAAY,IAAI,CAAC,MAAM,IAAI;iBACjG;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"}