@inso_web/els-mcp 0.1.0 → 0.2.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 +42 -37
- package/dist/audit/prisma.d.ts +9 -2
- package/dist/audit/prisma.d.ts.map +1 -1
- package/dist/audit/prisma.js +2 -2
- package/dist/audit/prisma.js.map +1 -1
- package/dist/audit/service.d.ts.map +1 -1
- package/dist/audit/service.js +4 -3
- package/dist/audit/service.js.map +1 -1
- package/dist/audit/verify.d.ts +55 -0
- package/dist/audit/verify.d.ts.map +1 -0
- package/dist/audit/verify.js +131 -0
- package/dist/audit/verify.js.map +1 -0
- package/dist/billing/limits.d.ts +14 -3
- package/dist/billing/limits.d.ts.map +1 -1
- package/dist/billing/limits.js +30 -3
- package/dist/billing/limits.js.map +1 -1
- package/dist/billing/tracker.d.ts +11 -3
- package/dist/billing/tracker.d.ts.map +1 -1
- package/dist/billing/tracker.js +38 -4
- package/dist/billing/tracker.js.map +1 -1
- package/dist/cache/types.d.ts +8 -8
- package/dist/cache/types.d.ts.map +1 -1
- package/dist/cache/types.js +7 -7
- package/dist/cache/wrapper.js +1 -1
- package/dist/cli.js +52 -7
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +19 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +26 -12
- package/dist/config.js.map +1 -1
- package/dist/elsClient.js +6 -6
- package/dist/elsClient.js.map +1 -1
- package/dist/http/app.d.ts +5 -2
- package/dist/http/app.d.ts.map +1 -1
- package/dist/http/app.js +12 -7
- package/dist/http/app.js.map +1 -1
- package/dist/http/lkResolver.d.ts +60 -0
- package/dist/http/lkResolver.d.ts.map +1 -0
- package/dist/http/lkResolver.js +194 -0
- package/dist/http/lkResolver.js.map +1 -0
- package/dist/http/middleware/auth.d.ts +3 -0
- package/dist/http/middleware/auth.d.ts.map +1 -1
- package/dist/http/middleware/auth.js +28 -12
- package/dist/http/middleware/auth.js.map +1 -1
- package/dist/http/middleware/dcrRateLimit.d.ts +2 -2
- package/dist/http/middleware/errorHandler.d.ts +1 -1
- package/dist/http/middleware/errorHandler.js +1 -1
- package/dist/http/middleware/originGuard.d.ts +1 -1
- package/dist/http/middleware/requestId.d.ts +1 -1
- package/dist/http/routes/health.js +1 -1
- package/dist/http/routes/health.js.map +1 -1
- package/dist/http/routes/metrics.d.ts +2 -4
- package/dist/http/routes/metrics.d.ts.map +1 -1
- package/dist/http/routes/metrics.js +2 -4
- package/dist/http/routes/metrics.js.map +1 -1
- package/dist/http/types.d.ts +9 -3
- package/dist/http/types.d.ts.map +1 -1
- package/dist/instrumentation.d.ts +3 -3
- package/dist/instrumentation.js +3 -3
- package/dist/lib/cursor.d.ts +1 -1
- package/dist/lib/cursor.js +3 -3
- package/dist/lib/errors.d.ts +5 -3
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js.map +1 -1
- package/dist/middleware/withMiddleware.d.ts +11 -9
- package/dist/middleware/withMiddleware.d.ts.map +1 -1
- package/dist/middleware/withMiddleware.js +64 -11
- package/dist/middleware/withMiddleware.js.map +1 -1
- package/dist/observability/health.d.ts +2 -2
- package/dist/observability/logger.d.ts +1 -1
- package/dist/observability/tracing.d.ts +2 -2
- package/dist/prompts/index.d.ts +2 -2
- package/dist/prompts/index.js +1 -1
- package/dist/redaction/promptInjection.d.ts +2 -5
- package/dist/redaction/promptInjection.d.ts.map +1 -1
- package/dist/redaction/promptInjection.js +3 -6
- package/dist/redaction/promptInjection.js.map +1 -1
- package/dist/redaction/userAgent.d.ts +1 -1
- package/dist/redaction/userAgent.js +1 -1
- package/dist/resources/index.d.ts +3 -3
- package/dist/resources/index.js +4 -4
- package/dist/resources/index.js.map +1 -1
- package/dist/server.d.ts +5 -5
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/errorHeatmap.js +1 -1
- package/dist/tools/errorHeatmap.js.map +1 -1
- package/dist/tools/errorStatsBreakdown.d.ts +5 -4
- package/dist/tools/errorStatsBreakdown.d.ts.map +1 -1
- package/dist/tools/errorStatsBreakdown.js +7 -6
- package/dist/tools/errorStatsBreakdown.js.map +1 -1
- package/dist/tools/errorsInSession.d.ts +1 -1
- package/dist/tools/errorsInSession.js +1 -1
- package/dist/tools/explainError.d.ts +5 -5
- package/dist/tools/explainError.js +9 -9
- package/dist/tools/explainError.js.map +1 -1
- package/dist/tools/groupedErrors.d.ts +2 -2
- package/dist/tools/groupedErrors.js +2 -2
- package/dist/tools/impactAnalysis.d.ts +1 -1
- package/dist/tools/impactAnalysis.js +1 -1
- package/dist/tools/index.d.ts +5 -5
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/listApps.d.ts +4 -4
- package/dist/tools/listApps.js +4 -4
- package/dist/tools/searchLogs.js +2 -2
- package/dist/transports/http-server.d.ts +2 -1
- package/dist/transports/http-server.d.ts.map +1 -1
- package/dist/transports/http-server.js +42 -2
- package/dist/transports/http-server.js.map +1 -1
- package/dist/transports/http.d.ts +8 -4
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +13 -9
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/stdio.d.ts +1 -1
- package/dist/transports/stdio.js +1 -1
- package/dist/types.d.ts +8 -9
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
package/dist/http/app.js
CHANGED
|
@@ -23,15 +23,14 @@ export function createHttpApp(opts) {
|
|
|
23
23
|
}));
|
|
24
24
|
// CORS: allow известные origins + dev-friendly localhost-*.
|
|
25
25
|
app.use(cors(buildCorsOptions(config.corsOrigins)));
|
|
26
|
-
//
|
|
26
|
+
// request-id middleware с child logger.
|
|
27
27
|
app.use(requestId({ logger: log }));
|
|
28
28
|
// JSON body parser. MCP messages могут быть batch'ами; лимит 4 MB
|
|
29
29
|
// (типичные tool responses ELS ≤ 1 MB).
|
|
30
30
|
app.use(express.json({ limit: '4mb' }));
|
|
31
31
|
// ─── /els router ──────────────────────────────────────────────────────
|
|
32
32
|
const router = Router();
|
|
33
|
-
// Public — health
|
|
34
|
-
// Phase 6: используем Phase 4 health-handlers с реальными probes (redis + ELS).
|
|
33
|
+
// Public — health (health-handlers с реальными probes: redis + ELS).
|
|
35
34
|
router.use('/', createHealthRouter({
|
|
36
35
|
...(opts.probeElsClient ? { elsClient: opts.probeElsClient } : {}),
|
|
37
36
|
...(opts.redis ? { redis: opts.redis } : {}),
|
|
@@ -70,20 +69,26 @@ export function createHttpApp(opts) {
|
|
|
70
69
|
...(opts.redis ? { redis: opts.redis } : {}),
|
|
71
70
|
...(opts.middlewareDeps ? { middlewareDeps: opts.middlewareDeps } : {}),
|
|
72
71
|
});
|
|
73
|
-
//
|
|
72
|
+
// originGuard — защита от browser-clients с unknown origin.
|
|
74
73
|
const originGuard = createOriginGuard({
|
|
75
74
|
allowed: config.corsOrigins,
|
|
76
75
|
log,
|
|
77
76
|
});
|
|
78
|
-
|
|
77
|
+
const authMiddleware = createAuthMiddleware({
|
|
78
|
+
config,
|
|
79
|
+
jwks,
|
|
80
|
+
log,
|
|
81
|
+
...(opts.lkResolver !== undefined ? { lkResolver: opts.lkResolver } : {}),
|
|
82
|
+
});
|
|
83
|
+
router.post('/mcp', originGuard, authMiddleware, async (req, res) => {
|
|
79
84
|
await manager.handleRequest(req, res);
|
|
80
85
|
});
|
|
81
86
|
// GET /mcp — long-lived SSE (server → client notifications). Hand off to SDK.
|
|
82
|
-
router.get('/mcp', originGuard,
|
|
87
|
+
router.get('/mcp', originGuard, authMiddleware, async (req, res) => {
|
|
83
88
|
await manager.handleRequest(req, res);
|
|
84
89
|
});
|
|
85
90
|
// DELETE /mcp — explicit session termination.
|
|
86
|
-
router.delete('/mcp', originGuard,
|
|
91
|
+
router.delete('/mcp', originGuard, authMiddleware, async (req, res) => {
|
|
87
92
|
await manager.handleRequest(req, res);
|
|
88
93
|
});
|
|
89
94
|
app.use('/els', router);
|
package/dist/http/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/http/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAgB,MAAM,EAAkD,MAAM,SAAS,CAAC;AACxG,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAA0B,MAAM,MAAM,CAAC;AAI9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/http/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LK API resolvers.
|
|
3
|
+
*
|
|
4
|
+
* Два резолвера дёргают LK backend и кэшируются в Redis (если доступен):
|
|
5
|
+
*
|
|
6
|
+
* 1. `resolveOidcSubApps(sub)` — `GET /api/internal/users/{sub}/apps`
|
|
7
|
+
* возвращает список доступных пользователю appSlugs.
|
|
8
|
+
* Кэш: `mcp:oidc:apps:{sub}` TTL 5 min.
|
|
9
|
+
*
|
|
10
|
+
* 2. `resolveAppTier(appSlug)` — `GET /api/internal/apps/{slug}/billing/tier`
|
|
11
|
+
* возвращает один из `FREE`/`STANDARD`/`PREMIUM`/`UNLIMITED`.
|
|
12
|
+
* Кэш: `mcp:tier:{appSlug}` TTL 30 sec.
|
|
13
|
+
*
|
|
14
|
+
* TODO (LK backend): оба эндпоинта **пока не реализованы** — резолверы
|
|
15
|
+
* корректно отрабатывают 404/500/timeout, возвращая fallback значения.
|
|
16
|
+
* Когда эндпоинты появятся, никакого изменения кода не потребуется.
|
|
17
|
+
*
|
|
18
|
+
* Все вызовы — best-effort: при недоступности LK сервис **не** падает,
|
|
19
|
+
* а использует safety-net fallback (`MCP_OIDC_DEMO_APP_SLUG`,
|
|
20
|
+
* `config.defaultTier`).
|
|
21
|
+
*/
|
|
22
|
+
import type { Logger } from 'pino';
|
|
23
|
+
import type { Tier } from '../billing/limits.js';
|
|
24
|
+
/** Минимальный интерфейс Redis-клиента, который нам нужен. */
|
|
25
|
+
export interface RedisLike {
|
|
26
|
+
get(key: string): Promise<string | null>;
|
|
27
|
+
set(key: string, value: string, mode: string, duration: number): Promise<unknown>;
|
|
28
|
+
}
|
|
29
|
+
export interface LkResolverOptions {
|
|
30
|
+
/** LK API base URL (без trailing slash). Если null — резолвер сразу fallback'ит. */
|
|
31
|
+
lkApiBaseUrl?: string | null;
|
|
32
|
+
/** Internal-API service-token (Bearer) для авторизации в LK. */
|
|
33
|
+
lkApiToken?: string | null;
|
|
34
|
+
/** Redis-клиент для кэша. Если null — резолвер не кэширует. */
|
|
35
|
+
redis?: RedisLike | null;
|
|
36
|
+
/** Fallback appSlug при недоступности LK. */
|
|
37
|
+
fallbackAppSlug?: string;
|
|
38
|
+
/** Fallback tier при недоступности LK. */
|
|
39
|
+
fallbackTier: Tier;
|
|
40
|
+
log?: Logger;
|
|
41
|
+
/** Override fetch для тестов. */
|
|
42
|
+
fetchImpl?: typeof fetch;
|
|
43
|
+
}
|
|
44
|
+
export interface SubAppsResult {
|
|
45
|
+
/** Доступные appSlugs (минимум один — fallback'ом). */
|
|
46
|
+
apps: string[];
|
|
47
|
+
/** True → ответ из LK, false → fallback. */
|
|
48
|
+
fromLk: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface TierResult {
|
|
51
|
+
tier: Tier;
|
|
52
|
+
/** True → ответ из LK, false → fallback. */
|
|
53
|
+
fromLk: boolean;
|
|
54
|
+
}
|
|
55
|
+
export interface LkResolver {
|
|
56
|
+
resolveOidcSubApps(sub: string): Promise<SubAppsResult>;
|
|
57
|
+
resolveAppTier(appSlug: string): Promise<TierResult>;
|
|
58
|
+
}
|
|
59
|
+
export declare function createLkResolver(opts: LkResolverOptions): LkResolver;
|
|
60
|
+
//# sourceMappingURL=lkResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lkResolver.d.ts","sourceRoot":"","sources":["../../src/http/lkResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAQjD,8DAA8D;AAC9D,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,iBAAiB;IAChC,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0CAA0C;IAC1C,YAAY,EAAE,IAAI,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACxD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACtD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,CAkJpE"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LK API resolvers.
|
|
3
|
+
*
|
|
4
|
+
* Два резолвера дёргают LK backend и кэшируются в Redis (если доступен):
|
|
5
|
+
*
|
|
6
|
+
* 1. `resolveOidcSubApps(sub)` — `GET /api/internal/users/{sub}/apps`
|
|
7
|
+
* возвращает список доступных пользователю appSlugs.
|
|
8
|
+
* Кэш: `mcp:oidc:apps:{sub}` TTL 5 min.
|
|
9
|
+
*
|
|
10
|
+
* 2. `resolveAppTier(appSlug)` — `GET /api/internal/apps/{slug}/billing/tier`
|
|
11
|
+
* возвращает один из `FREE`/`STANDARD`/`PREMIUM`/`UNLIMITED`.
|
|
12
|
+
* Кэш: `mcp:tier:{appSlug}` TTL 30 sec.
|
|
13
|
+
*
|
|
14
|
+
* TODO (LK backend): оба эндпоинта **пока не реализованы** — резолверы
|
|
15
|
+
* корректно отрабатывают 404/500/timeout, возвращая fallback значения.
|
|
16
|
+
* Когда эндпоинты появятся, никакого изменения кода не потребуется.
|
|
17
|
+
*
|
|
18
|
+
* Все вызовы — best-effort: при недоступности LK сервис **не** падает,
|
|
19
|
+
* а использует safety-net fallback (`MCP_OIDC_DEMO_APP_SLUG`,
|
|
20
|
+
* `config.defaultTier`).
|
|
21
|
+
*/
|
|
22
|
+
const TIERS = new Set(['FREE', 'STANDARD', 'PREMIUM', 'UNLIMITED']);
|
|
23
|
+
const APPS_CACHE_TTL_SEC = 300; // 5 min
|
|
24
|
+
const TIER_CACHE_TTL_SEC = 30;
|
|
25
|
+
const LK_REQUEST_TIMEOUT_MS = 2_000;
|
|
26
|
+
export function createLkResolver(opts) {
|
|
27
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
28
|
+
const log = opts.log;
|
|
29
|
+
const baseUrl = opts.lkApiBaseUrl?.replace(/\/$/, '') ?? null;
|
|
30
|
+
async function getCached(key) {
|
|
31
|
+
if (!opts.redis)
|
|
32
|
+
return null;
|
|
33
|
+
try {
|
|
34
|
+
return await opts.redis.get(key);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
log?.debug?.({ err, key }, 'lkResolver: redis get failed (degraded)');
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function setCached(key, value, ttlSec) {
|
|
42
|
+
if (!opts.redis)
|
|
43
|
+
return;
|
|
44
|
+
try {
|
|
45
|
+
await opts.redis.set(key, value, 'EX', ttlSec);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
log?.debug?.({ err, key }, 'lkResolver: redis set failed (degraded)');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function authHeaders() {
|
|
52
|
+
const headers = { Accept: 'application/json' };
|
|
53
|
+
if (opts.lkApiToken)
|
|
54
|
+
headers.Authorization = `Bearer ${opts.lkApiToken}`;
|
|
55
|
+
return headers;
|
|
56
|
+
}
|
|
57
|
+
async function doFetch(url) {
|
|
58
|
+
const ctrl = new AbortController();
|
|
59
|
+
const timer = setTimeout(() => ctrl.abort(), LK_REQUEST_TIMEOUT_MS);
|
|
60
|
+
try {
|
|
61
|
+
const res = await fetchImpl(url, { headers: authHeaders(), signal: ctrl.signal });
|
|
62
|
+
return res;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
log?.debug?.({ err, url }, 'lkResolver: LK fetch failed (degraded)');
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
clearTimeout(timer);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
async resolveOidcSubApps(sub) {
|
|
74
|
+
const cacheKey = `mcp:oidc:apps:${sub}`;
|
|
75
|
+
const cached = await getCached(cacheKey);
|
|
76
|
+
if (cached) {
|
|
77
|
+
try {
|
|
78
|
+
const parsed = JSON.parse(cached);
|
|
79
|
+
if (Array.isArray(parsed.apps) && parsed.apps.length > 0) {
|
|
80
|
+
return { apps: parsed.apps, fromLk: parsed.fromLk === true };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Ignore — fall through to LK fetch.
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const fallback = {
|
|
88
|
+
apps: opts.fallbackAppSlug ? [opts.fallbackAppSlug] : [],
|
|
89
|
+
fromLk: false,
|
|
90
|
+
};
|
|
91
|
+
if (!baseUrl)
|
|
92
|
+
return fallback;
|
|
93
|
+
const url = `${baseUrl}/api/internal/users/${encodeURIComponent(sub)}/apps`;
|
|
94
|
+
const res = await doFetch(url);
|
|
95
|
+
if (!res)
|
|
96
|
+
return fallback;
|
|
97
|
+
if (res.status === 404 || res.status >= 500) {
|
|
98
|
+
log?.debug?.({ sub, status: res.status, url }, 'lkResolver: LK returned error status; using fallback');
|
|
99
|
+
return fallback;
|
|
100
|
+
}
|
|
101
|
+
if (res.status !== 200) {
|
|
102
|
+
log?.debug?.({ sub, status: res.status }, 'lkResolver: unexpected LK status; using fallback');
|
|
103
|
+
return fallback;
|
|
104
|
+
}
|
|
105
|
+
let body = null;
|
|
106
|
+
try {
|
|
107
|
+
body = await res.json();
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
log?.debug?.({ err, sub }, 'lkResolver: failed to parse LK response');
|
|
111
|
+
return fallback;
|
|
112
|
+
}
|
|
113
|
+
const apps = extractApps(body);
|
|
114
|
+
if (apps.length === 0) {
|
|
115
|
+
log?.debug?.({ sub }, 'lkResolver: LK returned empty app list; using fallback');
|
|
116
|
+
return fallback;
|
|
117
|
+
}
|
|
118
|
+
const result = { apps, fromLk: true };
|
|
119
|
+
await setCached(cacheKey, JSON.stringify(result), APPS_CACHE_TTL_SEC);
|
|
120
|
+
return result;
|
|
121
|
+
},
|
|
122
|
+
async resolveAppTier(appSlug) {
|
|
123
|
+
const cacheKey = `mcp:tier:${appSlug}`;
|
|
124
|
+
const cached = await getCached(cacheKey);
|
|
125
|
+
if (cached) {
|
|
126
|
+
try {
|
|
127
|
+
const parsed = JSON.parse(cached);
|
|
128
|
+
if (typeof parsed.tier === 'string' && TIERS.has(parsed.tier)) {
|
|
129
|
+
return { tier: parsed.tier, fromLk: parsed.fromLk === true };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Ignore — fall through to LK fetch.
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const fallback = { tier: opts.fallbackTier, fromLk: false };
|
|
137
|
+
if (!baseUrl)
|
|
138
|
+
return fallback;
|
|
139
|
+
const url = `${baseUrl}/api/internal/apps/${encodeURIComponent(appSlug)}/billing/tier`;
|
|
140
|
+
const res = await doFetch(url);
|
|
141
|
+
if (!res)
|
|
142
|
+
return fallback;
|
|
143
|
+
if (res.status === 404 || res.status >= 500) {
|
|
144
|
+
log?.debug?.({ appSlug, status: res.status, url }, 'lkResolver: LK tier endpoint returned error; using fallback');
|
|
145
|
+
return fallback;
|
|
146
|
+
}
|
|
147
|
+
if (res.status !== 200)
|
|
148
|
+
return fallback;
|
|
149
|
+
let body = null;
|
|
150
|
+
try {
|
|
151
|
+
body = await res.json();
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return fallback;
|
|
155
|
+
}
|
|
156
|
+
const tier = extractTier(body);
|
|
157
|
+
if (!tier)
|
|
158
|
+
return fallback;
|
|
159
|
+
const result = { tier, fromLk: true };
|
|
160
|
+
await setCached(cacheKey, JSON.stringify(result), TIER_CACHE_TTL_SEC);
|
|
161
|
+
return result;
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function extractApps(body) {
|
|
166
|
+
if (!body || typeof body !== 'object')
|
|
167
|
+
return [];
|
|
168
|
+
const b = body;
|
|
169
|
+
const raw = b.apps ?? b.appSlugs ?? b.data;
|
|
170
|
+
if (!Array.isArray(raw))
|
|
171
|
+
return [];
|
|
172
|
+
const apps = [];
|
|
173
|
+
for (const item of raw) {
|
|
174
|
+
if (typeof item === 'string' && item.length > 0)
|
|
175
|
+
apps.push(item);
|
|
176
|
+
else if (item && typeof item === 'object') {
|
|
177
|
+
const slug = item.slug ?? item.appSlug;
|
|
178
|
+
if (typeof slug === 'string' && slug.length > 0)
|
|
179
|
+
apps.push(slug);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return Array.from(new Set(apps));
|
|
183
|
+
}
|
|
184
|
+
function extractTier(body) {
|
|
185
|
+
if (!body || typeof body !== 'object')
|
|
186
|
+
return null;
|
|
187
|
+
const b = body;
|
|
188
|
+
const raw = b.tier ?? b.name ?? b.plan;
|
|
189
|
+
if (typeof raw !== 'string')
|
|
190
|
+
return null;
|
|
191
|
+
const upper = raw.toUpperCase();
|
|
192
|
+
return TIERS.has(upper) ? upper : null;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=lkResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lkResolver.js","sourceRoot":"","sources":["../../src/http/lkResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,13 @@ import type { RequestHandler } from 'express';
|
|
|
2
2
|
import type { Logger } from 'pino';
|
|
3
3
|
import type { Config } from '../../config.js';
|
|
4
4
|
import type { JwksResolver } from '../jwks.js';
|
|
5
|
+
import type { LkResolver } from '../lkResolver.js';
|
|
5
6
|
export interface CreateAuthOptions {
|
|
6
7
|
config: Config;
|
|
7
8
|
jwks: JwksResolver;
|
|
8
9
|
log?: Logger;
|
|
10
|
+
/** Опциональный LK resolver — если null, используется fallback на oidcDemoAppSlug. */
|
|
11
|
+
lkResolver?: LkResolver | null;
|
|
9
12
|
}
|
|
10
13
|
export declare function createAuthMiddleware(opts: CreateAuthOptions): RequestHandler;
|
|
11
14
|
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/http/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,cAAc,EAAY,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/http/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,cAAc,EAAY,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAmBnD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CAChC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,cAAc,CAiJ5E"}
|
|
@@ -4,7 +4,8 @@ import { recordAuthRejection } from '../../observability/metrics.js';
|
|
|
4
4
|
*
|
|
5
5
|
* Поддерживает два path:
|
|
6
6
|
* A. ELS-key Bearer (`Bearer els_(live|test)_...`) — passthrough в ELS как есть.
|
|
7
|
-
* B. OIDC JWT Bearer — локально валидируем через JWKS (INSO Auth)
|
|
7
|
+
* B. OIDC JWT Bearer — локально валидируем через JWKS (INSO Auth),
|
|
8
|
+
* резолвим sub → доступные apps через LK API (с кэшем + fallback).
|
|
8
9
|
*
|
|
9
10
|
* Если оба заголовка не подходят (или их нет) — 401 с `WWW-Authenticate`,
|
|
10
11
|
* указывающим на RFC 9728 resource metadata.
|
|
@@ -15,6 +16,7 @@ import { recordAuthRejection } from '../../observability/metrics.js';
|
|
|
15
16
|
const ELS_KEY_REGEX = /^els_(live|test)_[\w-]{30,}$/;
|
|
16
17
|
export function createAuthMiddleware(opts) {
|
|
17
18
|
const { config, jwks, log } = opts;
|
|
19
|
+
const lkResolver = opts.lkResolver ?? null;
|
|
18
20
|
const wwwAuthHeader = buildWwwAuthenticate(config.publicUrl);
|
|
19
21
|
return async function authMiddleware(req, res, next) {
|
|
20
22
|
const authHeader = readAuthorization(req);
|
|
@@ -34,7 +36,7 @@ export function createAuthMiddleware(opts) {
|
|
|
34
36
|
});
|
|
35
37
|
return;
|
|
36
38
|
}
|
|
37
|
-
// Path A: ELS-key (priority
|
|
39
|
+
// Path A: ELS-key (priority).
|
|
38
40
|
if (ELS_KEY_REGEX.test(token)) {
|
|
39
41
|
const ctx = buildElsKeyContext(req, token, config);
|
|
40
42
|
req.context = ctx;
|
|
@@ -56,7 +58,7 @@ export function createAuthMiddleware(opts) {
|
|
|
56
58
|
});
|
|
57
59
|
return;
|
|
58
60
|
}
|
|
59
|
-
//
|
|
61
|
+
// Scope-claim обязателен (не просто пустой).
|
|
60
62
|
if (!hasScopeClaim(payload)) {
|
|
61
63
|
recordAuthRejection('oidc_missing_scope_claim');
|
|
62
64
|
log?.warn?.({ sub, requestId: pickRequestId(req) }, 'OIDC reject: scope claim absent');
|
|
@@ -78,7 +80,7 @@ export function createAuthMiddleware(opts) {
|
|
|
78
80
|
});
|
|
79
81
|
return;
|
|
80
82
|
}
|
|
81
|
-
//
|
|
83
|
+
// Проверка audience — JWT должен содержать ожидаемую audience.
|
|
82
84
|
if (!hasAudience(payload, config.oidcAudience)) {
|
|
83
85
|
recordAuthRejection('oidc_invalid_audience');
|
|
84
86
|
log?.warn?.({ sub, aud: payload.aud, expected: config.oidcAudience, requestId: pickRequestId(req) }, 'OIDC reject: invalid audience');
|
|
@@ -88,20 +90,33 @@ export function createAuthMiddleware(opts) {
|
|
|
88
90
|
});
|
|
89
91
|
return;
|
|
90
92
|
}
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
|
|
94
|
-
if (
|
|
93
|
+
// Резолвим OIDC sub → доступные пользователю apps через LK API (с
|
|
94
|
+
// кэшем 5 мин в Redis); fallback на MCP_OIDC_DEMO_APP_SLUG.
|
|
95
|
+
let apps = [];
|
|
96
|
+
if (lkResolver) {
|
|
97
|
+
try {
|
|
98
|
+
const r = await lkResolver.resolveOidcSubApps(sub);
|
|
99
|
+
apps = r.apps;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
log?.debug?.({ err, sub }, 'lkResolver: resolveOidcSubApps threw; using fallback');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (apps.length === 0 && config.oidcDemoAppSlug) {
|
|
106
|
+
apps = [config.oidcDemoAppSlug];
|
|
107
|
+
}
|
|
108
|
+
if (apps.length === 0) {
|
|
95
109
|
recordAuthRejection('oidc_no_app_resolver');
|
|
96
110
|
res.status(503).json({
|
|
97
111
|
error: 'oidc_app_resolver_unavailable',
|
|
98
|
-
error_description: 'OIDC sub → appSlug resolver
|
|
112
|
+
error_description: 'OIDC sub → appSlug resolver returned no apps and no fallback (MCP_OIDC_DEMO_APP_SLUG) is set.',
|
|
99
113
|
});
|
|
100
114
|
return;
|
|
101
115
|
}
|
|
102
|
-
const
|
|
116
|
+
const appSlug = apps[0];
|
|
117
|
+
const ctx = buildOidcContext(req, sub, scopes, appSlug, apps);
|
|
103
118
|
req.context = ctx;
|
|
104
|
-
log?.debug?.({ sub, requestId: ctx.requestId, appSlug }, 'auth: oidc');
|
|
119
|
+
log?.debug?.({ sub, requestId: ctx.requestId, appSlug, appsCount: apps.length }, 'auth: oidc');
|
|
105
120
|
next();
|
|
106
121
|
return;
|
|
107
122
|
}
|
|
@@ -177,12 +192,13 @@ function buildElsKeyContext(req, token, _config) {
|
|
|
177
192
|
requestId: pickRequestId(req),
|
|
178
193
|
};
|
|
179
194
|
}
|
|
180
|
-
function buildOidcContext(req, sub, scopes, appSlug) {
|
|
195
|
+
function buildOidcContext(req, sub, scopes, appSlug, availableApps) {
|
|
181
196
|
return {
|
|
182
197
|
authMethod: 'oidc',
|
|
183
198
|
oidcSub: sub,
|
|
184
199
|
scopes,
|
|
185
200
|
appSlug,
|
|
201
|
+
availableApps,
|
|
186
202
|
keyId: `oidc:${sub.slice(0, 8)}`,
|
|
187
203
|
ip: pickIp(req),
|
|
188
204
|
userAgent: pickUserAgent(req),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/http/middleware/auth.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/http/middleware/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@ import type { RequestHandler } from 'express';
|
|
|
2
2
|
import type { Logger } from 'pino';
|
|
3
3
|
import type { RedisService } from '../../cache/redis.js';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Rate-limit middleware для **будущего** Dynamic Client Registration
|
|
6
6
|
* endpoint (`POST /oauth/register`). DCR ещё не реализован в auth-сервисе —
|
|
7
|
-
* этот файл — stub
|
|
7
|
+
* этот файл — ready-for-future stub.
|
|
8
8
|
*
|
|
9
9
|
* Алгоритм:
|
|
10
10
|
* - Redis-based sliding window: один счётчик per IP, ключ `mcp:dcr:rl:{ip}`.
|
|
@@ -5,7 +5,7 @@ import type { Logger } from 'pino';
|
|
|
5
5
|
*
|
|
6
6
|
* Должен быть зарегистрирован последним (`app.use(errorHandler(log))`).
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* Предпочитает per-request `req.log` (если установлен в requestId
|
|
9
9
|
* middleware) — иначе fallback на global logger.
|
|
10
10
|
*/
|
|
11
11
|
export declare function errorHandler(log?: Logger): ErrorRequestHandler;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Должен быть зарегистрирован последним (`app.use(errorHandler(log))`).
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* Предпочитает per-request `req.log` (если установлен в requestId
|
|
7
7
|
* middleware) — иначе fallback на global logger.
|
|
8
8
|
*/
|
|
9
9
|
export function errorHandler(log) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { RequestHandler } from 'express';
|
|
2
2
|
import type { Logger } from 'pino';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Origin-validation middleware для /els/mcp.
|
|
5
5
|
*
|
|
6
6
|
* Семантика:
|
|
7
7
|
* - Если запрос пришёл с `Origin` header (browser-based MCP клиент или
|
|
@@ -7,7 +7,7 @@ import type { Logger } from 'pino';
|
|
|
7
7
|
*
|
|
8
8
|
* Также ставит response header `X-Request-Id` для клиента (полезно при триаже).
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* Если передан base logger — добавляем `req.log = base.child({...})`
|
|
11
11
|
* с per-request полями (`requestId`, `sessionId`). Downstream middleware
|
|
12
12
|
* (auth, errorHandler) могут использовать `req.log` для лучшей корреляции.
|
|
13
13
|
*/
|
|
@@ -34,7 +34,7 @@ function insoHealthHandler() {
|
|
|
34
34
|
function readinessHandler(opts) {
|
|
35
35
|
return async function handler(_req, res) {
|
|
36
36
|
// checks: { els: 'ok' | 'fail' | 'skip', redis: ... }
|
|
37
|
-
// Используем
|
|
37
|
+
// Используем общий checkReadiness с тем же контрактом.
|
|
38
38
|
const checks = {};
|
|
39
39
|
let allOk = true;
|
|
40
40
|
if (opts.elsClient || opts.redis) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/http/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAuB,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,MAAM,SAAS,CAAC;AAIzB,OAAO,EACL,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AAmBvC,MAAM,UAAU,kBAAkB,CAAC,OAA4B,EAAE;IAC/D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAU,uBAAuB;IAC5E,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,CAAC,CAAC,CAAW,SAAS;IAC9D,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAQ,uBAAuB;IAC5E,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAO,SAAS;IAC9D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,SAAS,OAAO,CAAC,IAAI,EAAE,GAAG;QAC/B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/F,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB;IACxB,OAAO,SAAS,OAAO,CAAC,IAAI,EAAE,GAAG;QAC/B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,SAAS;YACrB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,OAAO;SAClD,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAyB;IACjD,OAAO,KAAK,UAAU,OAAO,CAAC,IAAI,EAAE,GAAG;QACrC,sDAAsD;QACtD,
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/http/routes/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
2
|
import { type ReadinessDeps } from '../../observability/health.js';
|
|
3
3
|
/**
|
|
4
|
-
* Lightweight HTTP handlers для Express-like
|
|
4
|
+
* Lightweight HTTP handlers для Express-like транспорта.
|
|
5
5
|
*
|
|
6
6
|
* Каждый handler — `(req, res) => Promise<void>` (совместимо с Node http
|
|
7
|
-
* и Express `(req, res, next?)`).
|
|
7
|
+
* и Express `(req, res, next?)`). Используются так:
|
|
8
8
|
*
|
|
9
9
|
* app.get('/els/metrics', metricsHandler);
|
|
10
10
|
* app.get('/els/healthz', healthzHandler);
|
|
11
11
|
* app.get('/els/readyz', readyzHandler(deps));
|
|
12
|
-
*
|
|
13
|
-
* Phase 4 предоставляет реализацию; Phase 3 — wiring.
|
|
14
12
|
*/
|
|
15
13
|
export declare function metricsHandler(_req: IncomingMessage, res: ServerResponse): Promise<void>;
|
|
16
14
|
export declare function healthzHandler(_req: IncomingMessage, res: ServerResponse): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/http/routes/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAElG
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/http/routes/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAElG;;;;;;;;;GASG;AAEH,wBAAsB,cAAc,CAClC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAK/E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,IACjC,MAAM,eAAe,EAAE,KAAK,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC,CAMzE"}
|