@wizeworks/lens-node 0.3.0-alpha.3 → 0.3.0-alpha.5
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/dist/adapters/elasticsearch.d.ts +21 -0
- package/dist/adapters/elasticsearch.d.ts.map +1 -0
- package/dist/adapters/elasticsearch.js +93 -0
- package/dist/adapters/elasticsearch.js.map +1 -0
- package/dist/adapters/ioredis.d.ts +4 -0
- package/dist/adapters/ioredis.d.ts.map +1 -0
- package/dist/adapters/ioredis.js +60 -0
- package/dist/adapters/ioredis.js.map +1 -0
- package/dist/adapters/mongodb-shape.d.ts +16 -0
- package/dist/adapters/mongodb-shape.d.ts.map +1 -0
- package/dist/adapters/mongodb-shape.js +81 -0
- package/dist/adapters/mongodb-shape.js.map +1 -0
- package/dist/adapters/mongodb.d.ts +4 -0
- package/dist/adapters/mongodb.d.ts.map +1 -0
- package/dist/adapters/mongodb.js +95 -0
- package/dist/adapters/mongodb.js.map +1 -0
- package/dist/adapters/nosql.d.ts +14 -0
- package/dist/adapters/nosql.d.ts.map +1 -0
- package/dist/adapters/nosql.js +61 -0
- package/dist/adapters/nosql.js.map +1 -0
- package/dist/adapters/redis-shape.d.ts +31 -0
- package/dist/adapters/redis-shape.d.ts.map +1 -0
- package/dist/adapters/redis-shape.js +80 -0
- package/dist/adapters/redis-shape.js.map +1 -0
- package/dist/adapters/redis.d.ts +4 -0
- package/dist/adapters/redis.d.ts.map +1 -0
- package/dist/adapters/redis.js +93 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/adapters/registry.d.ts +2 -0
- package/dist/adapters/registry.d.ts.map +1 -1
- package/dist/adapters/registry.js +2 -0
- package/dist/adapters/registry.js.map +1 -1
- package/dist/api.d.ts +5 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +19 -7
- package/dist/api.js.map +1 -1
- package/dist/auto/config.d.ts +14 -0
- package/dist/auto/config.d.ts.map +1 -0
- package/dist/auto/config.js +51 -0
- package/dist/auto/config.js.map +1 -0
- package/dist/auto/esm-loader.d.ts +10 -0
- package/dist/auto/esm-loader.d.ts.map +1 -0
- package/dist/auto/esm-loader.js +10 -0
- package/dist/auto/esm-loader.js.map +1 -0
- package/dist/auto/esm-source.d.ts +15 -0
- package/dist/auto/esm-source.d.ts.map +1 -0
- package/dist/auto/esm-source.js +23 -0
- package/dist/auto/esm-source.js.map +1 -0
- package/dist/auto/frameworks.d.ts +3 -0
- package/dist/auto/frameworks.d.ts.map +1 -0
- package/dist/auto/frameworks.js +112 -0
- package/dist/auto/frameworks.js.map +1 -0
- package/dist/auto/handle.d.ts +7 -0
- package/dist/auto/handle.d.ts.map +1 -0
- package/dist/auto/handle.js +47 -0
- package/dist/auto/handle.js.map +1 -0
- package/dist/auto/hono.d.ts +3 -0
- package/dist/auto/hono.d.ts.map +1 -0
- package/dist/auto/hono.js +43 -0
- package/dist/auto/hono.js.map +1 -0
- package/dist/auto/http.d.ts +18 -0
- package/dist/auto/http.d.ts.map +1 -0
- package/dist/auto/http.js +77 -0
- package/dist/auto/http.js.map +1 -0
- package/dist/auto/install.d.ts +5 -0
- package/dist/auto/install.d.ts.map +1 -0
- package/dist/auto/install.js +26 -0
- package/dist/auto/install.js.map +1 -0
- package/dist/auto/libraries.d.ts +3 -0
- package/dist/auto/libraries.d.ts.map +1 -0
- package/dist/auto/libraries.js +118 -0
- package/dist/auto/libraries.js.map +1 -0
- package/dist/auto/module-hooks.d.ts +14 -0
- package/dist/auto/module-hooks.d.ts.map +1 -0
- package/dist/auto/module-hooks.js +90 -0
- package/dist/auto/module-hooks.js.map +1 -0
- package/dist/auto/nest.d.ts +7 -0
- package/dist/auto/nest.d.ts.map +1 -0
- package/dist/auto/nest.js +26 -0
- package/dist/auto/nest.js.map +1 -0
- package/dist/auto/owner.d.ts +19 -0
- package/dist/auto/owner.d.ts.map +1 -0
- package/dist/auto/owner.js +52 -0
- package/dist/auto/owner.js.map +1 -0
- package/dist/auto/prisma.d.ts +3 -0
- package/dist/auto/prisma.d.ts.map +1 -0
- package/dist/auto/prisma.js +55 -0
- package/dist/auto/prisma.js.map +1 -0
- package/dist/auto/sqlite.d.ts +3 -0
- package/dist/auto/sqlite.d.ts.map +1 -0
- package/dist/auto/sqlite.js +31 -0
- package/dist/auto/sqlite.js.map +1 -0
- package/dist/auto/state.d.ts +14 -0
- package/dist/auto/state.d.ts.map +1 -0
- package/dist/auto/state.js +16 -0
- package/dist/auto/state.js.map +1 -0
- package/dist/auto.d.ts +2 -0
- package/dist/auto.d.ts.map +1 -0
- package/dist/auto.js +4 -0
- package/dist/auto.js.map +1 -0
- package/dist/capture.d.ts +3 -1
- package/dist/capture.d.ts.map +1 -1
- package/dist/capture.js +1 -1
- package/dist/capture.js.map +1 -1
- package/dist/client-attributes.d.ts +19 -0
- package/dist/client-attributes.d.ts.map +1 -0
- package/dist/client-attributes.js +56 -0
- package/dist/client-attributes.js.map +1 -0
- package/dist/db.js +1 -1
- package/dist/db.js.map +1 -1
- package/dist/frameworks/hono.d.ts +16 -0
- package/dist/frameworks/hono.d.ts.map +1 -1
- package/dist/frameworks/hono.js +1 -1
- package/dist/frameworks/hono.js.map +1 -1
- package/dist/frameworks/koa.d.ts +2 -0
- package/dist/frameworks/koa.d.ts.map +1 -1
- package/dist/frameworks/koa.js +1 -1
- package/dist/frameworks/koa.js.map +1 -1
- package/dist/frameworks/nest-errors.d.ts +10 -0
- package/dist/frameworks/nest-errors.d.ts.map +1 -0
- package/dist/frameworks/nest-errors.js +75 -0
- package/dist/frameworks/nest-errors.js.map +1 -0
- package/dist/frameworks/nest-route.d.ts +31 -0
- package/dist/frameworks/nest-route.d.ts.map +1 -0
- package/dist/frameworks/nest-route.js +58 -0
- package/dist/frameworks/nest-route.js.map +1 -0
- package/dist/frameworks/nest.d.ts +16 -0
- package/dist/frameworks/nest.d.ts.map +1 -0
- package/dist/frameworks/nest.js +74 -0
- package/dist/frameworks/nest.js.map +1 -0
- package/dist/frameworks/node-server.d.ts +3 -0
- package/dist/frameworks/node-server.d.ts.map +1 -1
- package/dist/frameworks/node-server.js +1 -1
- package/dist/frameworks/node-server.js.map +1 -1
- package/dist/graphql/channels.d.ts +5 -0
- package/dist/graphql/channels.d.ts.map +1 -0
- package/dist/graphql/channels.js +56 -0
- package/dist/graphql/channels.js.map +1 -0
- package/dist/graphql/document.d.ts +13 -0
- package/dist/graphql/document.d.ts.map +1 -0
- package/dist/graphql/document.js +62 -0
- package/dist/graphql/document.js.map +1 -0
- package/dist/graphql/index.d.ts +13 -0
- package/dist/graphql/index.d.ts.map +1 -0
- package/dist/graphql/index.js +92 -0
- package/dist/graphql/index.js.map +1 -0
- package/dist/graphql/operation.d.ts +37 -0
- package/dist/graphql/operation.d.ts.map +1 -0
- package/dist/graphql/operation.js +58 -0
- package/dist/graphql/operation.js.map +1 -0
- package/dist/graphql/resolvers.d.ts +5 -0
- package/dist/graphql/resolvers.d.ts.map +1 -0
- package/dist/graphql/resolvers.js +79 -0
- package/dist/graphql/resolvers.js.map +1 -0
- package/dist/graphql/shared.d.ts +14 -0
- package/dist/graphql/shared.d.ts.map +1 -0
- package/dist/graphql/shared.js +21 -0
- package/dist/graphql/shared.js.map +1 -0
- package/dist/http-client.d.ts +8 -0
- package/dist/http-client.d.ts.map +1 -0
- package/dist/http-client.js +132 -0
- package/dist/http-client.js.map +1 -0
- package/dist/hub-connect.d.ts +2 -0
- package/dist/hub-connect.d.ts.map +1 -1
- package/dist/hub-connect.js +3 -1
- package/dist/hub-connect.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/info.d.ts +2 -0
- package/dist/info.d.ts.map +1 -1
- package/dist/info.js +1 -1
- package/dist/info.js.map +1 -1
- package/dist/kit.d.ts +3 -1
- package/dist/kit.d.ts.map +1 -1
- package/dist/kit.js +1 -0
- package/dist/kit.js.map +1 -1
- package/dist/logger.d.ts +4 -4
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +11 -7
- package/dist/logger.js.map +1 -1
- package/dist/logs/bunyan.d.ts +1 -1
- package/dist/logs/bunyan.d.ts.map +1 -1
- package/dist/logs/bunyan.js +2 -3
- package/dist/logs/bunyan.js.map +1 -1
- package/dist/logs/consola.d.ts +1 -1
- package/dist/logs/consola.d.ts.map +1 -1
- package/dist/logs/consola.js +1 -1
- package/dist/logs/consola.js.map +1 -1
- package/dist/logs/console.d.ts +1 -1
- package/dist/logs/console.d.ts.map +1 -1
- package/dist/logs/console.js +5 -3
- package/dist/logs/console.js.map +1 -1
- package/dist/logs/otel.d.ts.map +1 -1
- package/dist/logs/otel.js +1 -3
- package/dist/logs/otel.js.map +1 -1
- package/dist/logs/pino.d.ts +1 -1
- package/dist/logs/pino.d.ts.map +1 -1
- package/dist/logs/pino.js +2 -3
- package/dist/logs/pino.js.map +1 -1
- package/dist/logs/winston.d.ts +1 -1
- package/dist/logs/winston.d.ts.map +1 -1
- package/dist/logs/winston.js +2 -3
- package/dist/logs/winston.js.map +1 -1
- package/dist/loose-logs.d.ts +13 -0
- package/dist/loose-logs.d.ts.map +1 -0
- package/dist/loose-logs.js +21 -0
- package/dist/loose-logs.js.map +1 -0
- package/dist/mcp-find.d.ts.map +1 -1
- package/dist/mcp-find.js +40 -8
- package/dist/mcp-find.js.map +1 -1
- package/dist/mcp-memory.d.ts +7 -0
- package/dist/mcp-memory.d.ts.map +1 -0
- package/dist/mcp-memory.js +10 -0
- package/dist/mcp-memory.js.map +1 -0
- package/dist/mcp-overview.d.ts +5 -0
- package/dist/mcp-overview.d.ts.map +1 -0
- package/dist/mcp-overview.js +71 -0
- package/dist/mcp-overview.js.map +1 -0
- package/dist/mcp-page.d.ts +28 -0
- package/dist/mcp-page.d.ts.map +1 -0
- package/dist/mcp-page.js +77 -0
- package/dist/mcp-page.js.map +1 -0
- package/dist/mcp-problems.d.ts +5 -0
- package/dist/mcp-problems.d.ts.map +1 -0
- package/dist/mcp-problems.js +56 -0
- package/dist/mcp-problems.js.map +1 -0
- package/dist/mcp-projects.d.ts.map +1 -1
- package/dist/mcp-projects.js +7 -2
- package/dist/mcp-projects.js.map +1 -1
- package/dist/mcp-search.d.ts.map +1 -1
- package/dist/mcp-search.js +9 -5
- package/dist/mcp-search.js.map +1 -1
- package/dist/mcp-shared.d.ts +37 -1
- package/dist/mcp-shared.d.ts.map +1 -1
- package/dist/mcp-shared.js +3 -0
- package/dist/mcp-shared.js.map +1 -1
- package/dist/mcp-store.d.ts +2 -2
- package/dist/mcp-store.d.ts.map +1 -1
- package/dist/mcp-store.js +6 -5
- package/dist/mcp-store.js.map +1 -1
- package/dist/mcp-tags.d.ts +8 -0
- package/dist/mcp-tags.d.ts.map +1 -0
- package/dist/mcp-tags.js +22 -0
- package/dist/mcp-tags.js.map +1 -0
- package/dist/mcp-traffic.d.ts +5 -0
- package/dist/mcp-traffic.d.ts.map +1 -0
- package/dist/mcp-traffic.js +87 -0
- package/dist/mcp-traffic.js.map +1 -0
- package/dist/mcp.d.ts +4 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +14 -3
- package/dist/mcp.js.map +1 -1
- package/dist/messaging/bullmq.d.ts +4 -0
- package/dist/messaging/bullmq.d.ts.map +1 -0
- package/dist/messaging/bullmq.js +137 -0
- package/dist/messaging/bullmq.js.map +1 -0
- package/dist/messaging/shared.d.ts +10 -4
- package/dist/messaging/shared.d.ts.map +1 -1
- package/dist/messaging/shared.js +13 -4
- package/dist/messaging/shared.js.map +1 -1
- package/dist/messaging/sqs-message.d.ts +35 -0
- package/dist/messaging/sqs-message.d.ts.map +1 -0
- package/dist/messaging/sqs-message.js +66 -0
- package/dist/messaging/sqs-message.js.map +1 -0
- package/dist/messaging/sqs.d.ts +4 -0
- package/dist/messaging/sqs.d.ts.map +1 -0
- package/dist/messaging/sqs.js +104 -0
- package/dist/messaging/sqs.js.map +1 -0
- package/dist/processor.d.ts +2 -1
- package/dist/processor.d.ts.map +1 -1
- package/dist/processor.js +8 -3
- package/dist/processor.js.map +1 -1
- package/dist/real/real.d.ts +20 -0
- package/dist/real/real.d.ts.map +1 -0
- package/dist/real/real.js +42 -0
- package/dist/real/real.js.map +1 -0
- package/dist/request-capture.d.ts.map +1 -1
- package/dist/request-capture.js +2 -1
- package/dist/request-capture.js.map +1 -1
- package/dist/request-naming.d.ts +8 -0
- package/dist/request-naming.d.ts.map +1 -0
- package/dist/request-naming.js +29 -0
- package/dist/request-naming.js.map +1 -0
- package/dist/sampling.d.ts.map +1 -1
- package/dist/sampling.js +2 -2
- package/dist/sampling.js.map +1 -1
- package/dist/search-api.d.ts +4 -3
- package/dist/search-api.d.ts.map +1 -1
- package/dist/search-api.js +8 -7
- package/dist/search-api.js.map +1 -1
- package/dist/sourcemaps.d.ts +15 -0
- package/dist/sourcemaps.d.ts.map +1 -0
- package/dist/sourcemaps.js +68 -0
- package/dist/sourcemaps.js.map +1 -0
- package/dist/spans.d.ts +3 -0
- package/dist/spans.d.ts.map +1 -1
- package/dist/spans.js +9 -1
- package/dist/spans.js.map +1 -1
- package/dist/store-entries.d.ts +34 -0
- package/dist/store-entries.d.ts.map +1 -0
- package/dist/store-entries.js +70 -0
- package/dist/store-entries.js.map +1 -0
- package/dist/store.d.ts +4 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +19 -22
- package/dist/store.js.map +1 -1
- package/dist/tags-api.d.ts +9 -0
- package/dist/tags-api.d.ts.map +1 -0
- package/dist/tags-api.js +16 -0
- package/dist/tags-api.js.map +1 -0
- package/dist/test/helpers.d.ts +15 -0
- package/dist/test/helpers.d.ts.map +1 -0
- package/dist/test/helpers.js +56 -0
- package/dist/test/helpers.js.map +1 -0
- package/dist/tracing.d.ts +10 -1
- package/dist/tracing.d.ts.map +1 -1
- package/dist/tracing.js +17 -8
- package/dist/tracing.js.map +1 -1
- package/dist/types.d.ts +16 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +3 -2
- package/dist/ui.js.map +1 -1
- package/dist/wizelens.d.ts +3 -1
- package/dist/wizelens.d.ts.map +1 -1
- package/dist/wizelens.js +28 -12
- package/dist/wizelens.js.map +1 -1
- package/package.json +26 -4
package/dist/mcp-find.js
CHANGED
|
@@ -17,11 +17,35 @@ async function slowQueries(data, threshold, range, limit) {
|
|
|
17
17
|
}
|
|
18
18
|
return rows;
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
/** Requests read to find N+1 candidates with another repeat count, and traces of them loaded. */
|
|
21
|
+
const N1_SCAN = 5_000;
|
|
22
|
+
const N1_LOAD = 200;
|
|
23
|
+
const iso = (ms) => new Date(ms).toISOString();
|
|
24
|
+
/** From the stats: the N+1 insights of the whole range, at the host's threshold. */
|
|
25
|
+
async function fromStats(data, range) {
|
|
26
|
+
const m = await data.page("insights", range, { status: "all" });
|
|
27
|
+
return m.groups
|
|
28
|
+
.filter((g) => g.kind === "n+1-db" || g.kind === "n+1-http")
|
|
29
|
+
.map((g) => ({ kind: g.kind === "n+1-db" ? "db" : "http", shape: g.shape, endpoints: g.endpoints.slice(0, 5), requests: g.occurrences, repeats: g.count, totalMs: Math.round(g.totalMs), lastSeen: iso(g.lastSeenMs), exampleTraceId: g.exampleTraceId }));
|
|
30
|
+
}
|
|
31
|
+
/** With another threshold: the requests with that many database or HTTP calls, most first, read whole and grouped by shape. */
|
|
32
|
+
async function fromTraces(data, n, range) {
|
|
33
|
+
const requests = await findAll(data, "requests", null, range, N1_SCAN);
|
|
34
|
+
const busy = requests.filter((r) => r.dbCount >= n || r.fetchCount >= n).sort((a, b) => Math.max(b.dbCount, b.fetchCount) - Math.max(a.dbCount, a.fetchCount)).slice(0, N1_LOAD);
|
|
35
|
+
const groups = new Map();
|
|
36
|
+
for (const r of busy) {
|
|
37
|
+
const t = await data.get(r.traceId, false);
|
|
38
|
+
if (!t)
|
|
39
|
+
continue;
|
|
40
|
+
const found = [...findNPlusOneDb(t, n).map((f) => ({ kind: "db", f })), ...findNPlusOneHttp(t, n).map((f) => ({ kind: "http", f }))];
|
|
41
|
+
for (const { kind, f } of found) {
|
|
42
|
+
const g = groups.get(`${kind}|${f.shape}`) ?? { kind, shape: f.shape, endpoints: [], requests: 0, repeats: 0, totalMs: 0, lastSeen: iso(t.startMs), exampleTraceId: t.traceId };
|
|
43
|
+
if (!g.endpoints.includes(r.endpoint) && g.endpoints.length < 5)
|
|
44
|
+
g.endpoints.push(r.endpoint);
|
|
45
|
+
groups.set(`${kind}|${f.shape}`, { ...g, requests: g.requests + 1, repeats: g.repeats + f.count, totalMs: Math.round(g.totalMs + f.totalMs) });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return [...groups.values()];
|
|
25
49
|
}
|
|
26
50
|
function registerSlowQueries(server, src) {
|
|
27
51
|
const inputSchema = {
|
|
@@ -37,11 +61,19 @@ function registerSlowQueries(server, src) {
|
|
|
37
61
|
});
|
|
38
62
|
}
|
|
39
63
|
function registerNPlusOne(server, src) {
|
|
40
|
-
const inputSchema = {
|
|
41
|
-
|
|
64
|
+
const inputSchema = {
|
|
65
|
+
...src.arg,
|
|
66
|
+
minRepeats: z.number().int().min(2).optional().describe(`Default ${src.defaults.nPlusOneThreshold}, the project's threshold.`),
|
|
67
|
+
limit: z.number().int().min(1).max(200).optional().describe("Default 20."),
|
|
68
|
+
range: rangeArg("to look"),
|
|
69
|
+
};
|
|
70
|
+
const description = "Find N+1 patterns (the same SQL or HTTP call shape repeated in one request), grouped by shape, the most time first, from the whole store.";
|
|
42
71
|
server.registerTool("find_n_plus_one", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
43
72
|
const data = await src.open("find_n_plus_one", args);
|
|
44
|
-
|
|
73
|
+
const n = args.minRepeats ?? data.nPlusOneThreshold;
|
|
74
|
+
const range = args.range ?? "24h";
|
|
75
|
+
const groups = data.page && n === data.nPlusOneThreshold ? await fromStats(data, range) : await fromTraces(data, n, range);
|
|
76
|
+
return json(groups.sort((a, b) => b.totalMs - a.totalMs).slice(0, args.limit ?? 20));
|
|
45
77
|
});
|
|
46
78
|
}
|
|
47
79
|
/** find_slow_queries and find_n_plus_one. */
|
package/dist/mcp-find.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-find.js","sourceRoot":"","sources":["../src/mcp-find.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,EAA8B,MAAM,sBAAsB,CAAC;AAC5H,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAsB,SAAS,EAAe,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEnD,mFAAmF;AACnF,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB,wHAAwH;AACxH,KAAK,UAAU,WAAW,CAAC,IAAmB,EAAE,SAAiB,EAAE,KAAgB,EAAE,KAAa;IAChG,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,0BAA0B,SAAS,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACnH,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsC,CAAC;IAC7D,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAE,CAAC,CAAC;QAClI,MAAM,IAAI,GAAG,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5I,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"mcp-find.js","sourceRoot":"","sources":["../src/mcp-find.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ModelOf, type PageName, type TimeRange, type Trace } from "@wizeworks/lens-core";
|
|
2
|
+
/** get_page and get_overview on the app's own traces, with its thresholds. */
|
|
3
|
+
export declare function memoryPages(traces: () => readonly Trace[], o: {
|
|
4
|
+
slowQueryMs: number;
|
|
5
|
+
nPlusOneThreshold: number;
|
|
6
|
+
}, now?: () => number): <P extends PageName>(page: P, range: TimeRange, params?: Record<string, string>) => Promise<ModelOf<P>>;
|
|
7
|
+
//# sourceMappingURL=mcp-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-memory.d.ts","sourceRoot":"","sources":["../src/mcp-memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,OAAO,EAAE,KAAK,QAAQ,EAA4B,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEzI,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,SAAS,KAAK,EAAE,EAAE,CAAC,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,GAAE,MAAM,MAAiB,IAC/H,CAAC,SAAS,QAAQ,QAAQ,CAAC,SAAS,SAAS,WAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAQ,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAIvH"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Page models for the in-app MCP tools: computed from the traces this app keeps, the way the dashboard does in the browser.
|
|
2
|
+
import { memoryExecutor, pageContext, runPageSync } from "@wizeworks/lens-core";
|
|
3
|
+
/** get_page and get_overview on the app's own traces, with its thresholds. */
|
|
4
|
+
export function memoryPages(traces, o, now = Date.now) {
|
|
5
|
+
return async (page, range, params = {}) => {
|
|
6
|
+
const ex = memoryExecutor(traces(), o);
|
|
7
|
+
return runPageSync(page, pageContext(range, now(), params, { slowQueryMs: o.slowQueryMs }), ex);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=mcp-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-memory.js","sourceRoot":"","sources":["../src/mcp-memory.ts"],"names":[],"mappings":"AAAA,4HAA4H;AAC5H,OAAO,EAAE,cAAc,EAA+B,WAAW,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAEzI,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,MAA8B,EAAE,CAAqD,EAAE,GAAG,GAAiB,IAAI,CAAC,GAAG;IAC7I,OAAO,KAAK,EAAsB,IAAO,EAAE,KAAgB,EAAE,MAAM,GAA2B,EAAE,EAAuB,EAAE;QACvH,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,OAAO,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAClG,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type Source } from "./mcp-shared.js";
|
|
3
|
+
/** get_overview: the dashboard's overview for a morning report. On a host with several projects, no `project` reads them all. */
|
|
4
|
+
export declare function registerOverviewTool(server: McpServer, src: Source): void;
|
|
5
|
+
//# sourceMappingURL=mcp-overview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-overview.d.ts","sourceRoot":"","sources":["../src/mcp-overview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAwD,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAgEpG,iIAAiI;AACjI,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAYzE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { json, READ_ONLY } from "./mcp-shared.js";
|
|
3
|
+
const RANGES = ["1h", "6h", "24h", "7d"];
|
|
4
|
+
const TOP_ERRORS = 10;
|
|
5
|
+
const SEVERITY = { unhealthy: 0, degraded: 1, healthy: 2, idle: 3 };
|
|
6
|
+
const iso = (ms) => new Date(ms).toISOString();
|
|
7
|
+
const round = (v) => (v == null ? null : Math.round(v * 100) / 100);
|
|
8
|
+
const headline = (h) => ({ value: round(h.value), previous: round(h.previous), changePercent: round(h.change) });
|
|
9
|
+
const serviceOf = (r) => ({ name: r.name, kind: r.kind, status: r.status, requests: r.requests, errors: r.errors, errorRatePercent: round(r.errorRate), avgMs: round(r.avgMs), p95Ms: round(r.p95Ms) });
|
|
10
|
+
const errorOf = (g) => ({
|
|
11
|
+
type: g.type,
|
|
12
|
+
message: g.message,
|
|
13
|
+
service: g.service,
|
|
14
|
+
endpoint: g.endpoint,
|
|
15
|
+
count: g.count,
|
|
16
|
+
critical: g.critical,
|
|
17
|
+
firstSeen: iso(g.firstSeenMs),
|
|
18
|
+
lastSeen: iso(g.lastSeenMs),
|
|
19
|
+
traceId: g.traceIds[0] ?? null,
|
|
20
|
+
});
|
|
21
|
+
const insightOf = (i) => ({ title: i.title, impact: i.impact, occurrences: i.occurrences, totalMs: round(i.totalMs), endpoints: i.endpoints.slice(0, 3) });
|
|
22
|
+
/** One project's morning report: traffic against the window before, every service's health, the top errors, and the biggest insights. */
|
|
23
|
+
async function reportOf(data, range) {
|
|
24
|
+
const [ov, svc, err] = await Promise.all([data.page("overview", range), data.page("services", range), data.page("errors", range)]);
|
|
25
|
+
const services = [...svc.rows].sort((a, b) => SEVERITY[a.status] - SEVERITY[b.status] || b.requests - a.requests);
|
|
26
|
+
return {
|
|
27
|
+
window: { from: iso(ov.meta.window.from), to: iso(ov.meta.window.to), comparedWith: ov.meta.compareLabel },
|
|
28
|
+
stillSettling: ov.meta.settling ?? 0,
|
|
29
|
+
requests: headline(ov.headlines.total),
|
|
30
|
+
errorRatePercent: headline(ov.headlines.errorRate),
|
|
31
|
+
avgDurationMs: headline(ov.headlines.avgDuration),
|
|
32
|
+
needsAttention: services.filter((s) => s.status === "unhealthy" || s.status === "degraded").map((s) => `${s.name}: ${s.status}`),
|
|
33
|
+
services: services.map(serviceOf),
|
|
34
|
+
exceptions: err.exceptions,
|
|
35
|
+
topErrors: [...err.groups].sort((a, b) => b.count - a.count).slice(0, TOP_ERRORS).map(errorOf),
|
|
36
|
+
insights: ov.insights.map(insightOf),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Every project at once, the ones that need attention first, with totals across them. */
|
|
40
|
+
function summaryOf(range, reports) {
|
|
41
|
+
const sorted = [...reports].sort((a, b) => b.report.needsAttention.length - a.report.needsAttention.length || (b.report.requests.value ?? 0) - (a.report.requests.value ?? 0));
|
|
42
|
+
const services = reports.flatMap((r) => r.report.services);
|
|
43
|
+
return {
|
|
44
|
+
range,
|
|
45
|
+
totals: {
|
|
46
|
+
projects: reports.length,
|
|
47
|
+
requests: reports.reduce((t, r) => t + (r.report.requests.value ?? 0), 0),
|
|
48
|
+
exceptions: reports.reduce((t, r) => t + r.report.exceptions, 0),
|
|
49
|
+
services: services.length,
|
|
50
|
+
unhealthy: services.filter((s) => s.status === "unhealthy").length,
|
|
51
|
+
degraded: services.filter((s) => s.status === "degraded").length,
|
|
52
|
+
},
|
|
53
|
+
projects: sorted.map(({ project, report }) => ({ project: project.name, projectId: project.id, ...report })),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** get_overview: the dashboard's overview for a morning report. On a host with several projects, no `project` reads them all. */
|
|
57
|
+
export function registerOverviewTool(server, src) {
|
|
58
|
+
if (!src.defaults.overview)
|
|
59
|
+
return;
|
|
60
|
+
const inputSchema = { ...src.arg, range: z.enum(RANGES).optional().describe("Time range, compared with the one before it. Default 24h.") };
|
|
61
|
+
const description = "A health report: requests, error rate, and duration against the window before; every service's status, traffic, errors, and p95; the top errors; and the biggest performance insights. Without `project` on a multi-project host, it covers every project. Good for a daily or morning report.";
|
|
62
|
+
server.registerTool("get_overview", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
63
|
+
const range = args.range ?? "24h";
|
|
64
|
+
const named = args.project;
|
|
65
|
+
if (named || !src.each)
|
|
66
|
+
return json({ range, ...(await reportOf(await src.open("get_overview", args), range)) });
|
|
67
|
+
const all = await src.each("get_overview", args);
|
|
68
|
+
return json(summaryOf(range, await Promise.all(all.map(async ({ project, data }) => ({ project, report: await reportOf(data, range) })))));
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=mcp-overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-overview.js","sourceRoot":"","sources":["../src/mcp-overview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type Source } from "./mcp-shared.js";
|
|
3
|
+
/** The dashboard pages an agent may read, with what each holds and the parameters it takes. */
|
|
4
|
+
export declare const MCP_PAGES: {
|
|
5
|
+
readonly overview: "Headlines, charts, top errors, insights, and services. service: a service name.";
|
|
6
|
+
readonly services: "Every service with status, traffic, errors, and latency. service: the selected row.";
|
|
7
|
+
readonly service: "One service: endpoints, dependencies, versions, and errors. service (required): a name.";
|
|
8
|
+
readonly endpoint: "One endpoint: latency, errors, slowest requests, users affected. service, endpoint (\"GET /api/orders/{id}\"), both required.";
|
|
9
|
+
readonly requests: "Request list with totals. method, status (5xx, 4xx, 200), duration (slow, >1s), service, endpoint, user, q, sort, page, size.";
|
|
10
|
+
readonly traces: "Trace list. status (ok, error), duration, service, q, sort (time, duration), page, size.";
|
|
11
|
+
readonly errors: "Error groups. status (unresolved, resolved, ignored, all), service, type, endpoint, user, critical=1, new=1, q, sort (recent, count), page, size.";
|
|
12
|
+
readonly error: "One error group: occurrences over time, endpoints, users affected, stack trace. group (required): a group key from errors.";
|
|
13
|
+
readonly database: "Queries by shape, slowest and most called, N+1 and slow query counts. service, q, table, operation, database, sort, page, size.";
|
|
14
|
+
readonly query: "One query shape: calls, latency, endpoints. q (required): the shape from database.";
|
|
15
|
+
readonly insights: "Performance insights (N+1, slow queries, duplicates). area, impact, status, service, endpoint, q, key.";
|
|
16
|
+
readonly logs: "Log lines with level counts. level, exact=1, service, category, trace, user, q, page, size.";
|
|
17
|
+
readonly rendering: "Browser page views and components. q.";
|
|
18
|
+
readonly route: "One browser route. route (required).";
|
|
19
|
+
readonly "log-patterns": "Log lines grouped into patterns, with counts. level, exact=1, service, pattern, origin.";
|
|
20
|
+
readonly traffic: "Requests, errors, and latency per time bucket and per endpoint. service, endpoint, buckets (16, 24, 48), from, to (ms).";
|
|
21
|
+
readonly problems: "Problems: anomalies grouped with a suspected cause. service, sensitivity (high, medium, low), problem, at, focus.";
|
|
22
|
+
readonly uptime: "Uptime checks: status, response time, incidents. check (one check id).";
|
|
23
|
+
readonly users: "Signed-in users by requests. q, page, size.";
|
|
24
|
+
readonly user: "One user: requests, failures, errors they hit, slowest requests. user (required).";
|
|
25
|
+
};
|
|
26
|
+
/** get_page and get_alerts. */
|
|
27
|
+
export declare function registerPageTools(server: McpServer, src: Source): void;
|
|
28
|
+
//# sourceMappingURL=mcp-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-page.d.ts","sourceRoot":"","sources":["../src/mcp-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAmC,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG/E,+FAA+F;AAC/F,eAAO,MAAM,SAAS;uBACV,iFAAiF;uBACjF,qFAAqF;sBACtF,yFAAyF;uBACxF,+HAA+H;uBAC/H,+HAA+H;qBACjI,0FAA0F;qBAC1F,mJAAmJ;oBACpJ,4HAA4H;uBACzH,iIAAiI;oBACpI,oFAAoF;uBACjF,wGAAwG;mBAC5G,6FAA6F;wBACxF,uCAAuC;oBAC3C,sCAAsC;6BAC7B,yFAAyF;sBAChG,yHAAyH;uBACxH,mHAAmH;qBACrH,wEAAwE;oBACzE,6CAA6C;mBAC9C,mFAAmF;CACrC,CAAC;AAoDvD,+BAA+B;AAC/B,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAGtE"}
|
package/dist/mcp-page.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { json, READ_ONLY } from "./mcp-shared.js";
|
|
3
|
+
import { rangeArg } from "./mcp-store.js";
|
|
4
|
+
/** The dashboard pages an agent may read, with what each holds and the parameters it takes. */
|
|
5
|
+
export const MCP_PAGES = {
|
|
6
|
+
overview: "Headlines, charts, top errors, insights, and services. service: a service name.",
|
|
7
|
+
services: "Every service with status, traffic, errors, and latency. service: the selected row.",
|
|
8
|
+
service: "One service: endpoints, dependencies, versions, and errors. service (required): a name.",
|
|
9
|
+
endpoint: "One endpoint: latency, errors, slowest requests, users affected. service, endpoint (\"GET /api/orders/{id}\"), both required.",
|
|
10
|
+
requests: "Request list with totals. method, status (5xx, 4xx, 200), duration (slow, >1s), service, endpoint, user, q, sort, page, size.",
|
|
11
|
+
traces: "Trace list. status (ok, error), duration, service, q, sort (time, duration), page, size.",
|
|
12
|
+
errors: "Error groups. status (unresolved, resolved, ignored, all), service, type, endpoint, user, critical=1, new=1, q, sort (recent, count), page, size.",
|
|
13
|
+
error: "One error group: occurrences over time, endpoints, users affected, stack trace. group (required): a group key from errors.",
|
|
14
|
+
database: "Queries by shape, slowest and most called, N+1 and slow query counts. service, q, table, operation, database, sort, page, size.",
|
|
15
|
+
query: "One query shape: calls, latency, endpoints. q (required): the shape from database.",
|
|
16
|
+
insights: "Performance insights (N+1, slow queries, duplicates). area, impact, status, service, endpoint, q, key.",
|
|
17
|
+
logs: "Log lines with level counts. level, exact=1, service, category, trace, user, q, page, size.",
|
|
18
|
+
rendering: "Browser page views and components. q.",
|
|
19
|
+
route: "One browser route. route (required).",
|
|
20
|
+
"log-patterns": "Log lines grouped into patterns, with counts. level, exact=1, service, pattern, origin.",
|
|
21
|
+
traffic: "Requests, errors, and latency per time bucket and per endpoint. service, endpoint, buckets (16, 24, 48), from, to (ms).",
|
|
22
|
+
problems: "Problems: anomalies grouped with a suspected cause. service, sensitivity (high, medium, low), problem, at, focus.",
|
|
23
|
+
uptime: "Uptime checks: status, response time, incidents. check (one check id).",
|
|
24
|
+
users: "Signed-in users by requests. q, page, size.",
|
|
25
|
+
user: "One user: requests, failures, errors they hit, slowest requests. user (required).",
|
|
26
|
+
};
|
|
27
|
+
const PAGE_NAMES = Object.keys(MCP_PAGES);
|
|
28
|
+
function registerGetPage(server, src) {
|
|
29
|
+
if (!src.defaults.overview)
|
|
30
|
+
return;
|
|
31
|
+
const inputSchema = {
|
|
32
|
+
...src.arg,
|
|
33
|
+
page: z.enum(PAGE_NAMES).describe(PAGE_NAMES.map((p) => `${p}: ${MCP_PAGES[p]}`).join(" | ")),
|
|
34
|
+
params: z.record(z.string(), z.string().max(500)).optional().describe("The page's parameters, as listed with `page`. Values are text."),
|
|
35
|
+
range: rangeArg("the page covers"),
|
|
36
|
+
};
|
|
37
|
+
const description = "Read one dashboard page's numbers, the same the dashboard shows, from the whole store. Pick the page and its parameters; for a list, page through with page and size.";
|
|
38
|
+
server.registerTool("get_page", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
39
|
+
const data = await src.open("get_page", args);
|
|
40
|
+
try {
|
|
41
|
+
return json(await data.page(args.page, args.range ?? "24h", args.params ?? {}));
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
return { ...json({ error: err instanceof Error ? err.message : String(err) }), isError: true };
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** Where a rule sends, without the secret part (webhook URLs, routing keys, addresses). */
|
|
49
|
+
const channelKinds = (cs) => cs.map((c) => c.kind);
|
|
50
|
+
const ruleOf = (r) => {
|
|
51
|
+
const { channels, ...rest } = r;
|
|
52
|
+
return { ...rest, channels: channelKinds(channels) };
|
|
53
|
+
};
|
|
54
|
+
const iso = (ms) => (ms === null ? null : new Date(ms).toISOString());
|
|
55
|
+
function reportOf(a) {
|
|
56
|
+
const names = new Map(a.rules.map((r) => [r.id, r.name]));
|
|
57
|
+
return {
|
|
58
|
+
firing: a.rules.filter((r) => r.enabled && r.state === "firing").map((r) => r.name),
|
|
59
|
+
rules: a.rules.map((r) => ({ ...ruleOf(r), lastEval: iso(r.lastEvalMs), mutedUntil: iso(r.mutedUntilMs) })),
|
|
60
|
+
events: a.events.map((e) => ({ rule: names.get(e.ruleId) ?? e.ruleId, kind: e.kind, value: e.value, message: e.message, time: iso(e.timeMs) })),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function registerGetAlerts(server, src) {
|
|
64
|
+
if (!src.defaults.alerts)
|
|
65
|
+
return;
|
|
66
|
+
const description = "List alert rules (what each watches, its threshold, and whether it is firing) and the newest alert events. Channel secrets are left out.";
|
|
67
|
+
server.registerTool("get_alerts", { description, inputSchema: { ...src.arg }, annotations: READ_ONLY }, async (args) => {
|
|
68
|
+
const data = await src.open("get_alerts", args);
|
|
69
|
+
return json(reportOf(await data.alerts()));
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/** get_page and get_alerts. */
|
|
73
|
+
export function registerPageTools(server, src) {
|
|
74
|
+
registerGetPage(server, src);
|
|
75
|
+
registerGetAlerts(server, src);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=mcp-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-page.js","sourceRoot":"","sources":["../src/mcp-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type Source } from "./mcp-shared.js";
|
|
3
|
+
/** list_problems: services and endpoints above their normal, grouped into problems with a suspected cause. */
|
|
4
|
+
export declare function registerProblemTools(server: McpServer, src: Source): void;
|
|
5
|
+
//# sourceMappingURL=mcp-problems.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-problems.d.ts","sourceRoot":"","sources":["../src/mcp-problems.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAwD,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AA4CpG,8GAA8G;AAC9G,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAazE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { causeText } from "@wizeworks/lens-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { json, READ_ONLY } from "./mcp-shared.js";
|
|
4
|
+
const RANGES = ["1h", "6h", "24h", "7d"];
|
|
5
|
+
const iso = (ms) => new Date(ms).toISOString();
|
|
6
|
+
const round = (v) => Math.round(v * 100) / 100;
|
|
7
|
+
const anomalyOf = (a) => ({
|
|
8
|
+
metric: a.metric,
|
|
9
|
+
service: a.name,
|
|
10
|
+
endpoint: a.endpoint,
|
|
11
|
+
started: iso(a.startMs),
|
|
12
|
+
ongoing: a.ongoing,
|
|
13
|
+
value: round(a.peak.value),
|
|
14
|
+
normal: round(a.peak.normal),
|
|
15
|
+
alertsAbove: round(a.peak.upper),
|
|
16
|
+
});
|
|
17
|
+
const problemOf = (p) => ({
|
|
18
|
+
id: p.id,
|
|
19
|
+
title: p.title,
|
|
20
|
+
started: iso(p.startMs),
|
|
21
|
+
ended: p.ongoing ? null : iso(p.endMs),
|
|
22
|
+
ongoing: p.ongoing,
|
|
23
|
+
services: p.services.map((s) => `${s.name} (${s.kind})`),
|
|
24
|
+
suspectedCause: p.cause ? causeText(p.cause) : null,
|
|
25
|
+
otherCauses: p.causes.slice(1).map(causeText),
|
|
26
|
+
anomalies: p.anomalies.map(anomalyOf),
|
|
27
|
+
moreAnomalies: p.anomalyCount - p.anomalies.length,
|
|
28
|
+
});
|
|
29
|
+
function reportOf(m) {
|
|
30
|
+
const normal = m.baseline.mode === "week" ? "the same hour in earlier weeks" : "the same hour on earlier days";
|
|
31
|
+
return {
|
|
32
|
+
window: { from: iso(m.meta.window.from), to: iso(m.meta.window.to) },
|
|
33
|
+
baseline: m.baseline.learning ? `learning: needs two earlier ${m.baseline.mode}s with data, has ${m.baseline.samples}` : `normal is ${normal} (${m.baseline.samples} with data)`,
|
|
34
|
+
problems: m.total,
|
|
35
|
+
ongoing: m.ongoing,
|
|
36
|
+
list: m.problems.map(problemOf),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const problemsOf = async (data, range) => reportOf(await data.page("problems", range));
|
|
40
|
+
/** list_problems: services and endpoints above their normal, grouped into problems with a suspected cause. */
|
|
41
|
+
export function registerProblemTools(server, src) {
|
|
42
|
+
if (!src.defaults.overview)
|
|
43
|
+
return;
|
|
44
|
+
const inputSchema = { ...src.arg, range: z.enum(RANGES).optional().describe("Time range to look for problems in. Default 24h.") };
|
|
45
|
+
const description = "Problems: error rate, p95 duration, or traffic above normal (the same hour in earlier weeks, plain statistics) on services and endpoints that call each other, grouped by when they started. Each names a suspected cause: a new release, a new error group, a query, or a service further down the calls. Ongoing problems come first. Without `project` on a multi-project host, it covers every project.";
|
|
46
|
+
server.registerTool("list_problems", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
47
|
+
const range = args.range ?? "24h";
|
|
48
|
+
const named = args.project;
|
|
49
|
+
if (named || !src.each)
|
|
50
|
+
return json({ range, ...(await problemsOf(await src.open("list_problems", args), range)) });
|
|
51
|
+
const all = await src.each("list_problems", args);
|
|
52
|
+
const projects = await Promise.all(all.map(async ({ project, data }) => ({ project: project.name, projectId: project.id, ...(await problemsOf(data, range)) })));
|
|
53
|
+
return json({ range, projects: projects.sort((a, b) => b.ongoing - a.ongoing || b.problems - a.problems) });
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=mcp-problems.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-problems.js","sourceRoot":"","sources":["../src/mcp-problems.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-projects.d.ts","sourceRoot":"","sources":["../src/mcp-projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAQ,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAa,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAItH,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAMxD;AAID,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,EAAE,EAAE,SAAS,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAU7F;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"mcp-projects.d.ts","sourceRoot":"","sources":["../src/mcp-projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAQ,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAa,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAItH,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAMxD;AAID,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,EAAE,EAAE,SAAS,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAU7F;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAmBrD;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,GAAG,IAAI,CAM5E"}
|
package/dist/mcp-projects.js
CHANGED
|
@@ -4,7 +4,7 @@ const auditLine = (service, tool, args) => `[wizelens] mcp tool=${tool} service=
|
|
|
4
4
|
/** One data source: every call reads it. */
|
|
5
5
|
export function singleSource(data) {
|
|
6
6
|
return {
|
|
7
|
-
defaults: { slowQueryMs: data.slowQueryMs, nPlusOneThreshold: data.nPlusOneThreshold, metrics: !!data.metrics, metricRanges: data.metricRanges },
|
|
7
|
+
defaults: { slowQueryMs: data.slowQueryMs, nPlusOneThreshold: data.nPlusOneThreshold, metrics: !!data.metrics, metricRanges: data.metricRanges, overview: !!data.page, alerts: !!data.alerts },
|
|
8
8
|
arg: {},
|
|
9
9
|
open: async (tool, args) => (data.audit(auditLine(data.service, tool, args)), data),
|
|
10
10
|
};
|
|
@@ -29,13 +29,18 @@ export function pickProject(ps, wanted) {
|
|
|
29
29
|
export function projectsSource(m) {
|
|
30
30
|
const project = z.string().max(200).optional().describe("Project id or name, from list_projects. Needed when the key reads more than one project.");
|
|
31
31
|
return {
|
|
32
|
-
defaults: { slowQueryMs: m.slowQueryMs, nPlusOneThreshold: m.nPlusOneThreshold, metrics: m.metrics, metricRanges: m.metricRanges },
|
|
32
|
+
defaults: { slowQueryMs: m.slowQueryMs, nPlusOneThreshold: m.nPlusOneThreshold, metrics: m.metrics, metricRanges: m.metricRanges, overview: !!m.overview, alerts: !!m.alerts },
|
|
33
33
|
arg: { project },
|
|
34
34
|
open: async (tool, args) => {
|
|
35
35
|
const data = await m.open(pickProject(m.projects, args.project).id);
|
|
36
36
|
data.audit(auditLine(data.service, tool, args));
|
|
37
37
|
return data;
|
|
38
38
|
},
|
|
39
|
+
each: (tool, args) => Promise.all(m.projects.map(async (project) => {
|
|
40
|
+
const data = await m.open(project.id);
|
|
41
|
+
data.audit(auditLine(data.service, tool, args));
|
|
42
|
+
return { project, data };
|
|
43
|
+
})),
|
|
39
44
|
};
|
|
40
45
|
}
|
|
41
46
|
/** list_projects: the projects this key reads, for the `project` argument. */
|
package/dist/mcp-projects.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-projects.js","sourceRoot":"","sources":["../src/mcp-projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAyD,SAAS,EAAe,MAAM,iBAAiB,CAAC;AAEtH,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,IAAY,EAAE,IAAa,EAAE,EAAE,CAAC,uBAAuB,IAAI,YAAY,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;AAExJ,4CAA4C;AAC5C,MAAM,UAAU,YAAY,CAAC,IAAmB;IAC9C,OAAO;QACL,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;
|
|
1
|
+
{"version":3,"file":"mcp-projects.js","sourceRoot":"","sources":["../src/mcp-projects.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-search.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-search.d.ts","sourceRoot":"","sources":["../src/mcp-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAmB,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"mcp-search.d.ts","sourceRoot":"","sources":["../src/mcp-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAmB,KAAK,MAAM,EAAU,MAAM,iBAAiB,CAAC;AAgDvE,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAGxE"}
|
package/dist/mcp-search.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { checkSearch, decodeCursor, SEARCH_KINDS, searchMemory, suggestMemory } from "@wizeworks/lens-core";
|
|
1
|
+
import { activeTags, checkSearch, decodeCursor, expandQuery, SEARCH_KINDS, searchMemory, suggestMemory, suggestTags } from "@wizeworks/lens-core";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { json, READ_ONLY } from "./mcp-shared.js";
|
|
3
|
+
import { json, READ_ONLY, tagsOf } from "./mcp-shared.js";
|
|
4
|
+
import { pageTags } from "./mcp-tags.js";
|
|
4
5
|
import { RANGES, windowOf } from "./mcp-store.js";
|
|
5
6
|
const LANGUAGE = [
|
|
6
7
|
"Search language: words and \"phrases\" match text (path, SQL, messages, errors).",
|
|
7
8
|
"field:value with service, env, trace, span, name, method, path, route, status (500, 5xx, ok, error), duration (250ms, 1s), level, category, kind, user, error (true/false), message.",
|
|
8
9
|
"@attribute:value for any span or log attribute, such as @user.id:42 or @db.system.name:postgres.",
|
|
9
10
|
"Use >, >=, <, <= (status:>=500, duration:>1s), ranges a..b, * wildcards (path:/api/*), -term or NOT to exclude, OR, and parentheses.",
|
|
11
|
+
"tag:name matches a tag rule (list_tags) or a tag the app sets; results come with the tags on each.",
|
|
10
12
|
].join(" ");
|
|
11
13
|
function registerSearch(server, src) {
|
|
12
14
|
const inputSchema = {
|
|
@@ -23,8 +25,10 @@ function registerSearch(server, src) {
|
|
|
23
25
|
const parsed = checkSearch(args.q);
|
|
24
26
|
if (!parsed.ok)
|
|
25
27
|
return { ...json({ error: parsed.error, start: parsed.start, end: parsed.end }), isError: true };
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
+
const raw = { kind: (args.kind ?? "requests"), node: parsed.node, window: windowOf(data, args.range ?? "24h"), limit: args.limit ?? 20, cursor: decodeCursor(args.cursor), env: data.env };
|
|
29
|
+
const { query, unknownTags } = expandQuery(raw, activeTags(await tagsOf(data)));
|
|
30
|
+
const page = await (data.search ? data.search(query) : searchMemory(await data.all(), query));
|
|
31
|
+
return json({ ...page, tags: await pageTags(data, page), unknownTags });
|
|
28
32
|
});
|
|
29
33
|
}
|
|
30
34
|
function registerFields(server, src) {
|
|
@@ -38,7 +42,7 @@ function registerFields(server, src) {
|
|
|
38
42
|
server.registerTool("search_fields", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
39
43
|
const data = await src.open("search_fields", args);
|
|
40
44
|
const r = { field: args.field || null, prefix: args.prefix ?? "", window: windowOf(data, args.range ?? "24h"), limit: 50, env: data.env };
|
|
41
|
-
return json(await (data.suggest ? data.suggest(r) : suggestMemory(await data.all(), r)));
|
|
45
|
+
return json(suggestTags(r, await tagsOf(data)) ?? (await (data.suggest ? data.suggest(r) : suggestMemory(await data.all(), r))));
|
|
42
46
|
});
|
|
43
47
|
}
|
|
44
48
|
/** search and search_fields: the search language, on the host's store or on `all()` in memory. */
|
package/dist/mcp-search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-search.js","sourceRoot":"","sources":["../src/mcp-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-search.js","sourceRoot":"","sources":["../src/mcp-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAe,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,QAAQ,GAAG;IACf,kFAAkF;IAClF,sLAAsL;IACtL,kGAAkG;IAClG,sIAAsI;IACtI,oGAAoG;CACrG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,SAAS,cAAc,CAAC,MAAiB,EAAE,GAAW;IACpD,MAAM,WAAW,GAAG;QAClB,GAAG,GAAG,CAAC,GAAG;QACV,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QACpF,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,YAAqC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;QACpI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;QAC/F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC5F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;KAChG,CAAC;IACF,MAAM,WAAW,GAAG,2DAA2D,QAAQ,EAAE,CAAC;IAC1F,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACjG,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjH,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,UAAU,CAAkC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5N,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9F,OAAO,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,MAAiB,EAAE,GAAW;IACpD,MAAM,WAAW,GAAG;QAClB,GAAG,GAAG,CAAC,GAAG;QACV,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sHAAsH,CAAC;QACtK,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QAC7F,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KAC9E,CAAC;IACF,MAAM,WAAW,GAAG,4GAA4G,CAAC;IACjI,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACxG,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1I,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnI,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,GAAW;IAChE,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC"}
|