@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,75 @@
|
|
|
1
|
+
import pino from 'pino';
|
|
2
|
+
const REDACT_PATHS = [
|
|
3
|
+
'req.headers.authorization',
|
|
4
|
+
'req.headers.cookie',
|
|
5
|
+
'req.headers["x-api-key"]',
|
|
6
|
+
'res.headers["set-cookie"]',
|
|
7
|
+
'*.password',
|
|
8
|
+
'*.token',
|
|
9
|
+
'*.apiKey',
|
|
10
|
+
'*.secret',
|
|
11
|
+
'ctx.elsApiKey',
|
|
12
|
+
'elsApiKey',
|
|
13
|
+
];
|
|
14
|
+
let _logger = null;
|
|
15
|
+
export function createLogger(cfg = {}) {
|
|
16
|
+
const level = cfg.level ?? process.env.MCP_LOG_LEVEL ?? 'info';
|
|
17
|
+
const pretty = cfg.pretty ??
|
|
18
|
+
(process.env.NODE_ENV !== 'production' && process.env.MCP_LOG_PRETTY !== 'false');
|
|
19
|
+
const baseOpts = {
|
|
20
|
+
level,
|
|
21
|
+
base: {
|
|
22
|
+
service: cfg.service ?? 'els-mcp',
|
|
23
|
+
version: cfg.version ?? process.env.GIT_SHA ?? process.env.npm_package_version ?? null,
|
|
24
|
+
pod: cfg.pod ?? process.env.HOSTNAME ?? null,
|
|
25
|
+
},
|
|
26
|
+
redact: {
|
|
27
|
+
paths: REDACT_PATHS,
|
|
28
|
+
censor: '<REDACTED>',
|
|
29
|
+
},
|
|
30
|
+
timestamp: pino.stdTimeFunctions.isoTime,
|
|
31
|
+
formatters: {
|
|
32
|
+
level(label) {
|
|
33
|
+
return { level: label };
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
let dest;
|
|
38
|
+
if (pretty) {
|
|
39
|
+
try {
|
|
40
|
+
// pino-pretty подключаем через transport, чтобы не блокировать event-loop
|
|
41
|
+
return pino({
|
|
42
|
+
...baseOpts,
|
|
43
|
+
transport: {
|
|
44
|
+
target: 'pino-pretty',
|
|
45
|
+
options: {
|
|
46
|
+
destination: 2,
|
|
47
|
+
colorize: true,
|
|
48
|
+
translateTime: 'SYS:HH:MM:ss.l',
|
|
49
|
+
ignore: 'pid,hostname',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// pino-pretty не установлен — fallback на JSON в stderr
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Production / fallback: JSON в stderr
|
|
59
|
+
dest = pino.destination({ dest: 2, sync: false });
|
|
60
|
+
return pino(baseOpts, dest);
|
|
61
|
+
}
|
|
62
|
+
/** Singleton accessor. */
|
|
63
|
+
export function getLogger() {
|
|
64
|
+
if (!_logger) {
|
|
65
|
+
_logger = createLogger();
|
|
66
|
+
}
|
|
67
|
+
return _logger;
|
|
68
|
+
}
|
|
69
|
+
export function setLogger(logger) {
|
|
70
|
+
_logger = logger;
|
|
71
|
+
}
|
|
72
|
+
export function withRequestContext(logger, fields) {
|
|
73
|
+
return logger.child(fields);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/observability/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAiE,MAAM,MAAM,CAAC;AA6BrF,MAAM,YAAY,GAAG;IACnB,2BAA2B;IAC3B,oBAAoB;IACpB,0BAA0B;IAC1B,2BAA2B;IAC3B,YAAY;IACZ,SAAS;IACT,UAAU;IACV,UAAU;IACV,eAAe;IACf,WAAW;CACZ,CAAC;AAEF,IAAI,OAAO,GAAkB,IAAI,CAAC;AAElC,MAAM,UAAU,YAAY,CAAC,MAAoB,EAAE;IACjD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,CAAC;IAC/D,MAAM,MAAM,GACV,GAAG,CAAC,MAAM;QACV,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,OAAO,CAAC,CAAC;IAEpF,MAAM,QAAQ,GAAkB;QAC9B,KAAK;QACL,IAAI,EAAE;YACJ,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;YACjC,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI;YACtF,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI;SAC7C;QACD,MAAM,EAAE;YACN,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,YAAY;SACrB;QACD,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO;QACxC,UAAU,EAAE;YACV,KAAK,CAAC,KAAK;gBACT,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YAC1B,CAAC;SACF;KACF,CAAC;IAEF,IAAI,IAAmC,CAAC;IAExC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,0EAA0E;YAC1E,OAAO,IAAI,CAAC;gBACV,GAAG,QAAQ;gBACX,SAAS,EAAE;oBACT,MAAM,EAAE,aAAa;oBACrB,OAAO,EAAE;wBACP,WAAW,EAAE,CAAC;wBACd,QAAQ,EAAE,IAAI;wBACd,aAAa,EAAE,gBAAgB;wBAC/B,MAAM,EAAE,cAAc;qBACvB;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,YAAY,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,OAAO,GAAG,MAAM,CAAC;AACnB,CAAC;AAgBD,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAwB;IACzE,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Registry, Counter, Histogram, Gauge } from 'prom-client';
|
|
2
|
+
/**
|
|
3
|
+
* Prometheus metrics для MCP-сервера.
|
|
4
|
+
*
|
|
5
|
+
* Источник истины по именам — `todo/error-logs-service/mcp/07-observability.md`
|
|
6
|
+
* § 1. Категории:
|
|
7
|
+
* - RED (rate / errors / duration) — `mcp_requests_total`, `mcp_request_duration_seconds`, `mcp_errors_total`
|
|
8
|
+
* - Cache — `mcp_cache_hits_total`, `mcp_cache_misses_total`, `mcp_cache_hit_ratio`
|
|
9
|
+
* - Upstream (ELS) — `mcp_els_upstream_errors_total`
|
|
10
|
+
* - SSE / sessions — `mcp_sse_connections_active`
|
|
11
|
+
* - Security — `mcp_redaction_applied_total`
|
|
12
|
+
* - Billing — `mcp_billing_events_total`
|
|
13
|
+
*
|
|
14
|
+
* Регистр — singleton (один на процесс). Endpoint `/els/metrics` сериализует
|
|
15
|
+
* текущее состояние в Prometheus text format.
|
|
16
|
+
*/
|
|
17
|
+
export declare const registry: Registry<"text/plain; version=0.0.4; charset=utf-8">;
|
|
18
|
+
export declare const mcpRequestsTotal: Counter<"status" | "tool" | "cached">;
|
|
19
|
+
export declare const mcpRequestDuration: Histogram<"tool">;
|
|
20
|
+
export declare const mcpErrorsTotal: Counter<"code" | "tool">;
|
|
21
|
+
export declare const mcpCacheHitsTotal: Counter<"tool_class">;
|
|
22
|
+
export declare const mcpCacheMissesTotal: Counter<"tool_class">;
|
|
23
|
+
export declare const mcpCacheHitRatio: Gauge<"tool_class">;
|
|
24
|
+
export declare const mcpElsUpstreamErrorsTotal: Counter<"endpoint" | "status">;
|
|
25
|
+
export declare const mcpSseConnectionsActive: Gauge<string>;
|
|
26
|
+
export declare const mcpRedactionAppliedTotal: Counter<"field">;
|
|
27
|
+
export declare const mcpAuthRejectionsTotal: Counter<"reason">;
|
|
28
|
+
export declare const mcpPromptInjectionBlockedTotal: Counter<"rule">;
|
|
29
|
+
export declare const mcpSseConnectionsActiveByApp: Gauge<"appSlug">;
|
|
30
|
+
export declare const mcpSseRejectionsTotal: Counter<"reason" | "appSlug">;
|
|
31
|
+
export declare const mcpBillingEventsTotal: Counter<"appSlug" | "tier">;
|
|
32
|
+
export declare function recordCacheHit(toolClass: string): void;
|
|
33
|
+
export declare function recordCacheMiss(toolClass: string): void;
|
|
34
|
+
export declare function recordToolRequest(tool: string, status: 'ok' | 'error' | 'timeout', cached: boolean, durationSec: number): void;
|
|
35
|
+
export declare function recordToolError(tool: string, code: string): void;
|
|
36
|
+
export declare function recordUpstreamError(endpoint: string, status: number | string): void;
|
|
37
|
+
export declare function recordRedaction(field: string): void;
|
|
38
|
+
export declare function recordBillingEvent(appSlug: string, tier: string): void;
|
|
39
|
+
export declare function recordAuthRejection(reason: string): void;
|
|
40
|
+
export declare function recordPromptInjectionBlocked(rule: string): void;
|
|
41
|
+
export declare function incSseActive(appSlug: string): void;
|
|
42
|
+
export declare function decSseActive(appSlug: string): void;
|
|
43
|
+
export declare function recordSseRejection(reason: string, appSlug: string): void;
|
|
44
|
+
/** Сброс per-process состояния (для тестов). */
|
|
45
|
+
export declare function resetMetricsForTests(): void;
|
|
46
|
+
/** Сериализация в Prometheus text format. */
|
|
47
|
+
export declare function getMetricsText(): Promise<string>;
|
|
48
|
+
export declare function getMetricsContentType(): string;
|
|
49
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,OAAO,EACP,SAAS,EACT,KAAK,EAEN,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,QAAQ,sDAAiB,CAAC;AAOvC,eAAO,MAAM,gBAAgB,uCAK3B,CAAC;AAEH,eAAO,MAAM,kBAAkB,mBAO7B,CAAC;AAEH,eAAO,MAAM,cAAc,0BAKzB,CAAC;AAIH,eAAO,MAAM,iBAAiB,uBAK5B,CAAC;AAEH,eAAO,MAAM,mBAAmB,uBAK9B,CAAC;AAEH,eAAO,MAAM,gBAAgB,qBAK3B,CAAC;AAIH,eAAO,MAAM,yBAAyB,gCAKpC,CAAC;AAIH,eAAO,MAAM,uBAAuB,eAIlC,CAAC;AAIH,eAAO,MAAM,wBAAwB,kBAKnC,CAAC;AAEH,eAAO,MAAM,sBAAsB,mBAKjC,CAAC;AAEH,eAAO,MAAM,8BAA8B,iBAKzC,CAAC;AAEH,eAAO,MAAM,4BAA4B,kBAKvC,CAAC;AAEH,eAAO,MAAM,qBAAqB,+BAKhC,CAAC;AAIH,eAAO,MAAM,qBAAqB,6BAKhC,CAAC;AAUH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAMtD;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAMvD;AAQD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,EAClC,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,MAAM,GAClB,IAAI,CAGN;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEhE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEnF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAExD;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAExE;AAED,gDAAgD;AAChD,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C;AAED,6CAA6C;AAC7C,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAEtD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { Registry, Counter, Histogram, Gauge, collectDefaultMetrics, } from 'prom-client';
|
|
2
|
+
/**
|
|
3
|
+
* Prometheus metrics для MCP-сервера.
|
|
4
|
+
*
|
|
5
|
+
* Источник истины по именам — `todo/error-logs-service/mcp/07-observability.md`
|
|
6
|
+
* § 1. Категории:
|
|
7
|
+
* - RED (rate / errors / duration) — `mcp_requests_total`, `mcp_request_duration_seconds`, `mcp_errors_total`
|
|
8
|
+
* - Cache — `mcp_cache_hits_total`, `mcp_cache_misses_total`, `mcp_cache_hit_ratio`
|
|
9
|
+
* - Upstream (ELS) — `mcp_els_upstream_errors_total`
|
|
10
|
+
* - SSE / sessions — `mcp_sse_connections_active`
|
|
11
|
+
* - Security — `mcp_redaction_applied_total`
|
|
12
|
+
* - Billing — `mcp_billing_events_total`
|
|
13
|
+
*
|
|
14
|
+
* Регистр — singleton (один на процесс). Endpoint `/els/metrics` сериализует
|
|
15
|
+
* текущее состояние в Prometheus text format.
|
|
16
|
+
*/
|
|
17
|
+
export const registry = new Registry();
|
|
18
|
+
// Default метрики (process_cpu, nodejs_eventloop_lag, etc) — собираются автоматически.
|
|
19
|
+
collectDefaultMetrics({ register: registry, prefix: 'mcp_' });
|
|
20
|
+
// ─── RED (rate / errors / duration) ───────────────────────────────────────
|
|
21
|
+
export const mcpRequestsTotal = new Counter({
|
|
22
|
+
name: 'mcp_requests_total',
|
|
23
|
+
help: 'Total tool-call requests',
|
|
24
|
+
labelNames: ['tool', 'status', 'cached'],
|
|
25
|
+
registers: [registry],
|
|
26
|
+
});
|
|
27
|
+
export const mcpRequestDuration = new Histogram({
|
|
28
|
+
name: 'mcp_request_duration_seconds',
|
|
29
|
+
help: 'Tool-call duration histogram',
|
|
30
|
+
labelNames: ['tool'],
|
|
31
|
+
// 12 buckets per spec § 1.1 (07-observability.md)
|
|
32
|
+
buckets: [0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 20, 30],
|
|
33
|
+
registers: [registry],
|
|
34
|
+
});
|
|
35
|
+
export const mcpErrorsTotal = new Counter({
|
|
36
|
+
name: 'mcp_errors_total',
|
|
37
|
+
help: 'Total tool-call errors by code',
|
|
38
|
+
labelNames: ['tool', 'code'],
|
|
39
|
+
registers: [registry],
|
|
40
|
+
});
|
|
41
|
+
// ─── Cache ───────────────────────────────────────────────────────────────
|
|
42
|
+
export const mcpCacheHitsTotal = new Counter({
|
|
43
|
+
name: 'mcp_cache_hits_total',
|
|
44
|
+
help: 'Cache hits per tool-class',
|
|
45
|
+
labelNames: ['tool_class'],
|
|
46
|
+
registers: [registry],
|
|
47
|
+
});
|
|
48
|
+
export const mcpCacheMissesTotal = new Counter({
|
|
49
|
+
name: 'mcp_cache_misses_total',
|
|
50
|
+
help: 'Cache misses per tool-class',
|
|
51
|
+
labelNames: ['tool_class'],
|
|
52
|
+
registers: [registry],
|
|
53
|
+
});
|
|
54
|
+
export const mcpCacheHitRatio = new Gauge({
|
|
55
|
+
name: 'mcp_cache_hit_ratio',
|
|
56
|
+
help: 'Cache hit ratio per tool-class (manually updated every 10s)',
|
|
57
|
+
labelNames: ['tool_class'],
|
|
58
|
+
registers: [registry],
|
|
59
|
+
});
|
|
60
|
+
// ─── Upstream (ELS) ──────────────────────────────────────────────────────
|
|
61
|
+
export const mcpElsUpstreamErrorsTotal = new Counter({
|
|
62
|
+
name: 'mcp_els_upstream_errors_total',
|
|
63
|
+
help: 'Total upstream ELS errors (HTTP status >= 400)',
|
|
64
|
+
labelNames: ['endpoint', 'status'],
|
|
65
|
+
registers: [registry],
|
|
66
|
+
});
|
|
67
|
+
// ─── SSE / sessions ──────────────────────────────────────────────────────
|
|
68
|
+
export const mcpSseConnectionsActive = new Gauge({
|
|
69
|
+
name: 'mcp_sse_connections_active',
|
|
70
|
+
help: 'Active SSE connections (for HPA)',
|
|
71
|
+
registers: [registry],
|
|
72
|
+
});
|
|
73
|
+
// ─── Security ────────────────────────────────────────────────────────────
|
|
74
|
+
export const mcpRedactionAppliedTotal = new Counter({
|
|
75
|
+
name: 'mcp_redaction_applied_total',
|
|
76
|
+
help: 'Number of times redaction was applied per field',
|
|
77
|
+
labelNames: ['field'],
|
|
78
|
+
registers: [registry],
|
|
79
|
+
});
|
|
80
|
+
export const mcpAuthRejectionsTotal = new Counter({
|
|
81
|
+
name: 'mcp_auth_rejections_total',
|
|
82
|
+
help: 'Total auth rejections by reason',
|
|
83
|
+
labelNames: ['reason'],
|
|
84
|
+
registers: [registry],
|
|
85
|
+
});
|
|
86
|
+
export const mcpPromptInjectionBlockedTotal = new Counter({
|
|
87
|
+
name: 'mcp_prompt_injection_blocked_total',
|
|
88
|
+
help: 'Times suspicious content was detected and (potentially) blocked, by rule',
|
|
89
|
+
labelNames: ['rule'],
|
|
90
|
+
registers: [registry],
|
|
91
|
+
});
|
|
92
|
+
export const mcpSseConnectionsActiveByApp = new Gauge({
|
|
93
|
+
name: 'mcp_sse_connections_active_by_app',
|
|
94
|
+
help: 'Active SSE/MCP sessions per appSlug (per-tenant cap enforcement)',
|
|
95
|
+
labelNames: ['appSlug'],
|
|
96
|
+
registers: [registry],
|
|
97
|
+
});
|
|
98
|
+
export const mcpSseRejectionsTotal = new Counter({
|
|
99
|
+
name: 'mcp_sse_rejections_total',
|
|
100
|
+
help: 'SSE/MCP session-create rejections by reason (concurrency, tier...)',
|
|
101
|
+
labelNames: ['reason', 'appSlug'],
|
|
102
|
+
registers: [registry],
|
|
103
|
+
});
|
|
104
|
+
// ─── Billing ─────────────────────────────────────────────────────────────
|
|
105
|
+
export const mcpBillingEventsTotal = new Counter({
|
|
106
|
+
name: 'mcp_billing_events_total',
|
|
107
|
+
help: 'Per-tool counter for billing (appSlug, tier)',
|
|
108
|
+
labelNames: ['appSlug', 'tier'],
|
|
109
|
+
registers: [registry],
|
|
110
|
+
});
|
|
111
|
+
// ─── Helpers (используются из cache wrapper и tools) ─────────────────────
|
|
112
|
+
/**
|
|
113
|
+
* Внутренние счётчики per tool-class — для расчёта `mcp_cache_hit_ratio`
|
|
114
|
+
* без блокировки на recording rules Prometheus.
|
|
115
|
+
*/
|
|
116
|
+
const cacheStats = {};
|
|
117
|
+
export function recordCacheHit(toolClass) {
|
|
118
|
+
mcpCacheHitsTotal.inc({ tool_class: toolClass });
|
|
119
|
+
const s = cacheStats[toolClass] ?? { hits: 0, misses: 0 };
|
|
120
|
+
s.hits += 1;
|
|
121
|
+
cacheStats[toolClass] = s;
|
|
122
|
+
updateHitRatio(toolClass, s);
|
|
123
|
+
}
|
|
124
|
+
export function recordCacheMiss(toolClass) {
|
|
125
|
+
mcpCacheMissesTotal.inc({ tool_class: toolClass });
|
|
126
|
+
const s = cacheStats[toolClass] ?? { hits: 0, misses: 0 };
|
|
127
|
+
s.misses += 1;
|
|
128
|
+
cacheStats[toolClass] = s;
|
|
129
|
+
updateHitRatio(toolClass, s);
|
|
130
|
+
}
|
|
131
|
+
function updateHitRatio(toolClass, s) {
|
|
132
|
+
const total = s.hits + s.misses;
|
|
133
|
+
if (total === 0)
|
|
134
|
+
return;
|
|
135
|
+
mcpCacheHitRatio.set({ tool_class: toolClass }, s.hits / total);
|
|
136
|
+
}
|
|
137
|
+
export function recordToolRequest(tool, status, cached, durationSec) {
|
|
138
|
+
mcpRequestsTotal.inc({ tool, status, cached: String(cached) });
|
|
139
|
+
mcpRequestDuration.observe({ tool }, durationSec);
|
|
140
|
+
}
|
|
141
|
+
export function recordToolError(tool, code) {
|
|
142
|
+
mcpErrorsTotal.inc({ tool, code });
|
|
143
|
+
}
|
|
144
|
+
export function recordUpstreamError(endpoint, status) {
|
|
145
|
+
mcpElsUpstreamErrorsTotal.inc({ endpoint, status: String(status) });
|
|
146
|
+
}
|
|
147
|
+
export function recordRedaction(field) {
|
|
148
|
+
mcpRedactionAppliedTotal.inc({ field });
|
|
149
|
+
}
|
|
150
|
+
export function recordBillingEvent(appSlug, tier) {
|
|
151
|
+
mcpBillingEventsTotal.inc({ appSlug, tier });
|
|
152
|
+
}
|
|
153
|
+
export function recordAuthRejection(reason) {
|
|
154
|
+
mcpAuthRejectionsTotal.inc({ reason });
|
|
155
|
+
}
|
|
156
|
+
export function recordPromptInjectionBlocked(rule) {
|
|
157
|
+
mcpPromptInjectionBlockedTotal.inc({ rule });
|
|
158
|
+
}
|
|
159
|
+
export function incSseActive(appSlug) {
|
|
160
|
+
mcpSseConnectionsActiveByApp.inc({ appSlug });
|
|
161
|
+
mcpSseConnectionsActive.inc();
|
|
162
|
+
}
|
|
163
|
+
export function decSseActive(appSlug) {
|
|
164
|
+
mcpSseConnectionsActiveByApp.dec({ appSlug });
|
|
165
|
+
mcpSseConnectionsActive.dec();
|
|
166
|
+
}
|
|
167
|
+
export function recordSseRejection(reason, appSlug) {
|
|
168
|
+
mcpSseRejectionsTotal.inc({ reason, appSlug });
|
|
169
|
+
}
|
|
170
|
+
/** Сброс per-process состояния (для тестов). */
|
|
171
|
+
export function resetMetricsForTests() {
|
|
172
|
+
registry.resetMetrics();
|
|
173
|
+
for (const k of Object.keys(cacheStats)) {
|
|
174
|
+
delete cacheStats[k];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** Сериализация в Prometheus text format. */
|
|
178
|
+
export async function getMetricsText() {
|
|
179
|
+
return registry.metrics();
|
|
180
|
+
}
|
|
181
|
+
export function getMetricsContentType() {
|
|
182
|
+
return registry.contentType;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Logger } from 'pino';
|
|
2
|
+
/**
|
|
3
|
+
* OpenTelemetry SDK setup (опциональный).
|
|
4
|
+
*
|
|
5
|
+
* Включается через `OTEL_EXPORTER_OTLP_ENDPOINT`. Если переменная не задана —
|
|
6
|
+
* tracing полностью disabled, no-op, нет оверхеда.
|
|
7
|
+
*
|
|
8
|
+
* Auto-instrumentation:
|
|
9
|
+
* - HTTP / undici (upstream ELS calls)
|
|
10
|
+
* - Express (Phase 3)
|
|
11
|
+
* - ioredis (cache GET / SETEX)
|
|
12
|
+
*
|
|
13
|
+
* Custom spans:
|
|
14
|
+
* - `mcp.tool.{name}` — оборачивает каждый tool handler (вручную в Phase 3).
|
|
15
|
+
*
|
|
16
|
+
* Lazy import: `@opentelemetry/sdk-node` — тяжёлая зависимость (~30MB), грузим
|
|
17
|
+
* только если endpoint задан. Это снижает cold-start время stdio-режима.
|
|
18
|
+
*/
|
|
19
|
+
export interface TracingHandle {
|
|
20
|
+
/** Завершить SDK (call before process exit). */
|
|
21
|
+
shutdown: () => Promise<void>;
|
|
22
|
+
/** Запущен ли SDK. */
|
|
23
|
+
enabled: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function setupTracing(opts?: {
|
|
26
|
+
log?: Logger;
|
|
27
|
+
}): Promise<TracingHandle>;
|
|
28
|
+
//# sourceMappingURL=tracing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/observability/tracing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sBAAsB;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAOD,wBAAsB,YAAY,CAAC,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CA+DtF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const NOOP = {
|
|
2
|
+
shutdown: async () => { },
|
|
3
|
+
enabled: false,
|
|
4
|
+
};
|
|
5
|
+
export async function setupTracing(opts = {}) {
|
|
6
|
+
const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
|
|
7
|
+
if (!endpoint) {
|
|
8
|
+
opts.log?.debug?.('OTel disabled (OTEL_EXPORTER_OTLP_ENDPOINT not set)');
|
|
9
|
+
return NOOP;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
const [{ NodeSDK }, autoInst, otlp, resourceModule] = await Promise.all([
|
|
13
|
+
import('@opentelemetry/sdk-node'),
|
|
14
|
+
import('@opentelemetry/auto-instrumentations-node'),
|
|
15
|
+
import('@opentelemetry/exporter-trace-otlp-proto'),
|
|
16
|
+
import('@opentelemetry/resources'),
|
|
17
|
+
]);
|
|
18
|
+
const sdkAny = NodeSDK;
|
|
19
|
+
// Resource API в @opentelemetry/resources может экспортироваться по-разному
|
|
20
|
+
// (Resource как класс или resourceFromAttributes-функция в новых версиях).
|
|
21
|
+
const resAny = resourceModule;
|
|
22
|
+
const attrs = {
|
|
23
|
+
'service.name': 'els-mcp',
|
|
24
|
+
'service.version': process.env.GIT_SHA ?? '0.1.0-alpha.0',
|
|
25
|
+
'deployment.environment': process.env.NODE_ENV ?? 'development',
|
|
26
|
+
};
|
|
27
|
+
const resource = resAny.resourceFromAttributes
|
|
28
|
+
? resAny.resourceFromAttributes(attrs)
|
|
29
|
+
: resAny.Resource
|
|
30
|
+
? new resAny.Resource(attrs)
|
|
31
|
+
: undefined;
|
|
32
|
+
const sdk = new sdkAny({
|
|
33
|
+
...(resource ? { resource } : {}),
|
|
34
|
+
traceExporter: new otlp.OTLPTraceExporter({ url: endpoint }),
|
|
35
|
+
instrumentations: [autoInst.getNodeAutoInstrumentations()],
|
|
36
|
+
});
|
|
37
|
+
sdk.start();
|
|
38
|
+
opts.log?.info?.({ endpoint }, 'OpenTelemetry tracing started');
|
|
39
|
+
return {
|
|
40
|
+
enabled: true,
|
|
41
|
+
shutdown: async () => {
|
|
42
|
+
try {
|
|
43
|
+
await sdk.shutdown();
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
opts.log?.warn?.({ err: err.message }, 'OTel shutdown failed');
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
opts.log?.warn?.({ err: err.message }, 'OTel setup failed; continuing without tracing');
|
|
53
|
+
return NOOP;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=tracing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/observability/tracing.ts"],"names":[],"mappings":"AA2BA,MAAM,IAAI,GAAkB;IAC1B,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;IACxB,OAAO,EAAE,KAAK;CACf,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAyB,EAAE;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,qDAAqD,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACtE,MAAM,CAAC,yBAAyB,CAAC;YACjC,MAAM,CAAC,2CAA2C,CAAC;YACnD,MAAM,CAAC,0CAA0C,CAAC;YAClD,MAAM,CAAC,0BAA0B,CAAC;SACnC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,OAGd,CAAC;QAEF,4EAA4E;QAC5E,2EAA2E;QAC3E,MAAM,MAAM,GAAG,cAGd,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,cAAc,EAAE,SAAS;YACzB,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,eAAe;YACzD,wBAAwB,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;SAChE,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,sBAAsB;YAC5C,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,KAAK,CAAC;YACtC,CAAC,CAAC,MAAM,CAAC,QAAQ;gBACf,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC5B,CAAC,CAAC,SAAS,CAAC;QAEhB,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC;YACrB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,aAAa,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;YAC5D,gBAAgB,EAAE,CAAC,QAAQ,CAAC,2BAA2B,EAAE,CAAC;SAC3D,CAAC,CAAC;QAEH,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,+BAA+B,CAAC,CAAC;QAEhE,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACnB,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACvB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,sBAAsB,CAAC,CAAC;gBAC5E,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CACd,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,EAC/B,+CAA+C,CAChD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Logger } from 'pino';
|
|
3
|
+
/**
|
|
4
|
+
* Phase 2 MCP-prompts: предопределённые шаблоны разговоров для типовых
|
|
5
|
+
* сценариев SRE / release engineer.
|
|
6
|
+
*
|
|
7
|
+
* Каждый prompt:
|
|
8
|
+
* - имеет argsSchema (Zod raw shape — SDK генерит JSON Schema автоматически);
|
|
9
|
+
* - возвращает один user-message с rendered template;
|
|
10
|
+
* - инструктирует LLM, какие именно tools вызвать (tool-chain).
|
|
11
|
+
*
|
|
12
|
+
* Темплейты — multi-line строки на русском, рендеринг через простую
|
|
13
|
+
* `${value}`-подстановку (без mustache — не хотим тащить зависимость).
|
|
14
|
+
*/
|
|
15
|
+
export interface RegisterPromptsOptions {
|
|
16
|
+
log?: Logger;
|
|
17
|
+
}
|
|
18
|
+
export declare const ALL_PROMPT_NAMES: readonly ["triage-recent-errors", "find-regression-since-deploy", "explain-error-cluster", "weekly-error-report"];
|
|
19
|
+
export declare function registerPrompts(server: McpServer, opts?: RegisterPromptsOptions): string[];
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,gBAAgB,mHAKnB,CAAC;AAaX,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,GAAE,sBAA2B,GAAG,MAAM,EAAE,CA4N9F"}
|