@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.
- package/README.md +482 -0
- package/dist/audit/prisma.d.ts +67 -0
- package/dist/audit/prisma.d.ts.map +1 -0
- package/dist/audit/prisma.js +65 -0
- package/dist/audit/prisma.js.map +1 -0
- package/dist/audit/service.d.ts +72 -0
- package/dist/audit/service.d.ts.map +1 -0
- package/dist/audit/service.js +137 -0
- package/dist/audit/service.js.map +1 -0
- package/dist/billing/limits.d.ts +34 -0
- package/dist/billing/limits.d.ts.map +1 -0
- package/dist/billing/limits.js +51 -0
- package/dist/billing/limits.js.map +1 -0
- package/dist/billing/tracker.d.ts +39 -0
- package/dist/billing/tracker.d.ts.map +1 -0
- package/dist/billing/tracker.js +92 -0
- package/dist/billing/tracker.js.map +1 -0
- package/dist/cache/cachedElsClient.d.ts +71 -0
- package/dist/cache/cachedElsClient.d.ts.map +1 -0
- package/dist/cache/cachedElsClient.js +167 -0
- package/dist/cache/cachedElsClient.js.map +1 -0
- package/dist/cache/index.d.ts +10 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/policies.d.ts +60 -0
- package/dist/cache/policies.d.ts.map +1 -0
- package/dist/cache/policies.js +90 -0
- package/dist/cache/policies.js.map +1 -0
- package/dist/cache/redis.d.ts +52 -0
- package/dist/cache/redis.d.ts.map +1 -0
- package/dist/cache/redis.js +134 -0
- package/dist/cache/redis.js.map +1 -0
- package/dist/cache/types.d.ts +32 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +32 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cache/wrapper.d.ts +38 -0
- package/dist/cache/wrapper.d.ts.map +1 -0
- package/dist/cache/wrapper.js +109 -0
- package/dist/cache/wrapper.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +86 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +105 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +211 -0
- package/dist/config.js.map +1 -0
- package/dist/elsClient.d.ts +137 -0
- package/dist/elsClient.d.ts.map +1 -0
- package/dist/elsClient.js +285 -0
- package/dist/elsClient.js.map +1 -0
- package/dist/http/app.d.ts +40 -0
- package/dist/http/app.d.ts.map +1 -0
- package/dist/http/app.js +135 -0
- package/dist/http/app.js.map +1 -0
- package/dist/http/jwks.d.ts +8 -0
- package/dist/http/jwks.d.ts.map +1 -0
- package/dist/http/jwks.js +34 -0
- package/dist/http/jwks.js.map +1 -0
- package/dist/http/middleware/auth.d.ts +11 -0
- package/dist/http/middleware/auth.d.ts.map +1 -0
- package/dist/http/middleware/auth.js +225 -0
- package/dist/http/middleware/auth.js.map +1 -0
- package/dist/http/middleware/dcrRateLimit.d.ts +29 -0
- package/dist/http/middleware/dcrRateLimit.d.ts.map +1 -0
- package/dist/http/middleware/dcrRateLimit.js +59 -0
- package/dist/http/middleware/dcrRateLimit.js.map +1 -0
- package/dist/http/middleware/errorHandler.d.ts +12 -0
- package/dist/http/middleware/errorHandler.d.ts.map +1 -0
- package/dist/http/middleware/errorHandler.js +26 -0
- package/dist/http/middleware/errorHandler.js.map +1 -0
- package/dist/http/middleware/originGuard.d.ts +28 -0
- package/dist/http/middleware/originGuard.d.ts.map +1 -0
- package/dist/http/middleware/originGuard.js +55 -0
- package/dist/http/middleware/originGuard.js.map +1 -0
- package/dist/http/middleware/requestId.d.ts +19 -0
- package/dist/http/middleware/requestId.d.ts.map +1 -0
- package/dist/http/middleware/requestId.js +23 -0
- package/dist/http/middleware/requestId.js.map +1 -0
- package/dist/http/routes/health.d.ts +24 -0
- package/dist/http/routes/health.d.ts.map +1 -0
- package/dist/http/routes/health.js +73 -0
- package/dist/http/routes/health.js.map +1 -0
- package/dist/http/routes/metrics.d.ts +18 -0
- package/dist/http/routes/metrics.d.ts.map +1 -0
- package/dist/http/routes/metrics.js +42 -0
- package/dist/http/routes/metrics.js.map +1 -0
- package/dist/http/routes/wellKnown.d.ts +15 -0
- package/dist/http/routes/wellKnown.d.ts.map +1 -0
- package/dist/http/routes/wellKnown.js +43 -0
- package/dist/http/routes/wellKnown.js.map +1 -0
- package/dist/http/types.d.ts +40 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +9 -0
- package/dist/http/types.js.map +1 -0
- package/dist/instrumentation.d.ts +22 -0
- package/dist/instrumentation.d.ts.map +1 -0
- package/dist/instrumentation.js +38 -0
- package/dist/instrumentation.js.map +1 -0
- package/dist/lib/cursor.d.ts +22 -0
- package/dist/lib/cursor.d.ts.map +1 -0
- package/dist/lib/cursor.js +95 -0
- package/dist/lib/cursor.js.map +1 -0
- package/dist/lib/errors.d.ts +49 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +83 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/responseFormat.d.ts +14 -0
- package/dist/lib/responseFormat.d.ts.map +1 -0
- package/dist/lib/responseFormat.js +74 -0
- package/dist/lib/responseFormat.js.map +1 -0
- package/dist/middleware/withMiddleware.d.ts +53 -0
- package/dist/middleware/withMiddleware.d.ts.map +1 -0
- package/dist/middleware/withMiddleware.js +190 -0
- package/dist/middleware/withMiddleware.js.map +1 -0
- package/dist/observability/health.d.ts +51 -0
- package/dist/observability/health.d.ts.map +1 -0
- package/dist/observability/health.js +77 -0
- package/dist/observability/health.js.map +1 -0
- package/dist/observability/index.d.ts +8 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/logger.d.ts +45 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +75 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +49 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +184 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/tracing.d.ts +28 -0
- package/dist/observability/tracing.d.ts.map +1 -0
- package/dist/observability/tracing.js +56 -0
- package/dist/observability/tracing.js.map +1 -0
- package/dist/prompts/index.d.ts +20 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +202 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/redaction/argsRedactor.d.ts +22 -0
- package/dist/redaction/argsRedactor.d.ts.map +1 -0
- package/dist/redaction/argsRedactor.js +97 -0
- package/dist/redaction/argsRedactor.js.map +1 -0
- package/dist/redaction/fields.d.ts +64 -0
- package/dist/redaction/fields.d.ts.map +1 -0
- package/dist/redaction/fields.js +155 -0
- package/dist/redaction/fields.js.map +1 -0
- package/dist/redaction/index.d.ts +52 -0
- package/dist/redaction/index.d.ts.map +1 -0
- package/dist/redaction/index.js +160 -0
- package/dist/redaction/index.js.map +1 -0
- package/dist/redaction/promptInjection.d.ts +32 -0
- package/dist/redaction/promptInjection.d.ts.map +1 -0
- package/dist/redaction/promptInjection.js +68 -0
- package/dist/redaction/promptInjection.js.map +1 -0
- package/dist/redaction/url.d.ts +8 -0
- package/dist/redaction/url.d.ts.map +1 -0
- package/dist/redaction/url.js +26 -0
- package/dist/redaction/url.js.map +1 -0
- package/dist/redaction/userAgent.d.ts +9 -0
- package/dist/redaction/userAgent.d.ts.map +1 -0
- package/dist/redaction/userAgent.js +39 -0
- package/dist/redaction/userAgent.js.map +1 -0
- package/dist/resources/index.d.ts +24 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +150 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +37 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +35 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/baselineCompare.d.ts +36 -0
- package/dist/tools/baselineCompare.d.ts.map +1 -0
- package/dist/tools/baselineCompare.js +69 -0
- package/dist/tools/baselineCompare.js.map +1 -0
- package/dist/tools/errorHeatmap.d.ts +40 -0
- package/dist/tools/errorHeatmap.d.ts.map +1 -0
- package/dist/tools/errorHeatmap.js +69 -0
- package/dist/tools/errorHeatmap.js.map +1 -0
- package/dist/tools/errorHistogram.d.ts +39 -0
- package/dist/tools/errorHistogram.d.ts.map +1 -0
- package/dist/tools/errorHistogram.js +61 -0
- package/dist/tools/errorHistogram.js.map +1 -0
- package/dist/tools/errorStatsBreakdown.d.ts +43 -0
- package/dist/tools/errorStatsBreakdown.d.ts.map +1 -0
- package/dist/tools/errorStatsBreakdown.js +77 -0
- package/dist/tools/errorStatsBreakdown.js.map +1 -0
- package/dist/tools/errorsInSession.d.ts +44 -0
- package/dist/tools/errorsInSession.d.ts.map +1 -0
- package/dist/tools/errorsInSession.js +91 -0
- package/dist/tools/errorsInSession.js.map +1 -0
- package/dist/tools/explainError.d.ts +35 -0
- package/dist/tools/explainError.d.ts.map +1 -0
- package/dist/tools/explainError.js +98 -0
- package/dist/tools/explainError.js.map +1 -0
- package/dist/tools/findCorrelatedErrors.d.ts +43 -0
- package/dist/tools/findCorrelatedErrors.d.ts.map +1 -0
- package/dist/tools/findCorrelatedErrors.js +59 -0
- package/dist/tools/findCorrelatedErrors.js.map +1 -0
- package/dist/tools/findSimilarErrors.d.ts +44 -0
- package/dist/tools/findSimilarErrors.d.ts.map +1 -0
- package/dist/tools/findSimilarErrors.js +59 -0
- package/dist/tools/findSimilarErrors.js.map +1 -0
- package/dist/tools/getLogDetails.d.ts +30 -0
- package/dist/tools/getLogDetails.d.ts.map +1 -0
- package/dist/tools/getLogDetails.js +49 -0
- package/dist/tools/getLogDetails.js.map +1 -0
- package/dist/tools/groupedErrors.d.ts +46 -0
- package/dist/tools/groupedErrors.d.ts.map +1 -0
- package/dist/tools/groupedErrors.js +71 -0
- package/dist/tools/groupedErrors.js.map +1 -0
- package/dist/tools/impactAnalysis.d.ts +42 -0
- package/dist/tools/impactAnalysis.d.ts.map +1 -0
- package/dist/tools/impactAnalysis.js +61 -0
- package/dist/tools/impactAnalysis.js.map +1 -0
- package/dist/tools/index.d.ts +41 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +83 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listApps.d.ts +27 -0
- package/dist/tools/listApps.d.ts.map +1 -0
- package/dist/tools/listApps.js +78 -0
- package/dist/tools/listApps.js.map +1 -0
- package/dist/tools/queryLogsJql.d.ts +44 -0
- package/dist/tools/queryLogsJql.d.ts.map +1 -0
- package/dist/tools/queryLogsJql.js +107 -0
- package/dist/tools/queryLogsJql.js.map +1 -0
- package/dist/tools/searchLogs.d.ts +60 -0
- package/dist/tools/searchLogs.d.ts.map +1 -0
- package/dist/tools/searchLogs.js +127 -0
- package/dist/tools/searchLogs.js.map +1 -0
- package/dist/tools/topErrorMessages.d.ts +42 -0
- package/dist/tools/topErrorMessages.d.ts.map +1 -0
- package/dist/tools/topErrorMessages.js +63 -0
- package/dist/tools/topErrorMessages.js.map +1 -0
- package/dist/tools/trafficStats.d.ts +39 -0
- package/dist/tools/trafficStats.d.ts.map +1 -0
- package/dist/tools/trafficStats.js +57 -0
- package/dist/tools/trafficStats.js.map +1 -0
- package/dist/tools/triageRecentCritical.d.ts +26 -0
- package/dist/tools/triageRecentCritical.d.ts.map +1 -0
- package/dist/tools/triageRecentCritical.js +81 -0
- package/dist/tools/triageRecentCritical.js.map +1 -0
- package/dist/tools/versionRegression.d.ts +29 -0
- package/dist/tools/versionRegression.d.ts.map +1 -0
- package/dist/tools/versionRegression.js +80 -0
- package/dist/tools/versionRegression.js.map +1 -0
- package/dist/transports/http-server.d.ts +25 -0
- package/dist/transports/http-server.d.ts.map +1 -0
- package/dist/transports/http-server.js +84 -0
- package/dist/transports/http-server.js.map +1 -0
- package/dist/transports/http.d.ts +71 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +315 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/stdio.d.ts +13 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js +16 -0
- package/dist/transports/stdio.js.map +1 -0
- package/dist/types.d.ts +150 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- 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":"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"}
|
|
@@ -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":"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"}
|