@testrelic/mcp 2.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/LICENSE +201 -0
- package/README.md +198 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/cache/blob.d.ts +22 -0
- package/dist/cache/blob.d.ts.map +1 -0
- package/dist/cache/blob.js +92 -0
- package/dist/cache/blob.js.map +1 -0
- package/dist/cache/diff-reader.d.ts +29 -0
- package/dist/cache/diff-reader.d.ts.map +1 -0
- package/dist/cache/diff-reader.js +34 -0
- package/dist/cache/diff-reader.js.map +1 -0
- package/dist/cache/index.d.ts +57 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +99 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/key.d.ts +15 -0
- package/dist/cache/key.d.ts.map +1 -0
- package/dist/cache/key.js +32 -0
- package/dist/cache/key.js.map +1 -0
- package/dist/cache/lru.d.ts +21 -0
- package/dist/cache/lru.d.ts.map +1 -0
- package/dist/cache/lru.js +32 -0
- package/dist/cache/lru.js.map +1 -0
- package/dist/cache/sqlite.d.ts +22 -0
- package/dist/cache/sqlite.d.ts.map +1 -0
- package/dist/cache/sqlite.js +102 -0
- package/dist/cache/sqlite.js.map +1 -0
- package/dist/cache/vector.d.ts +42 -0
- package/dist/cache/vector.d.ts.map +1 -0
- package/dist/cache/vector.js +187 -0
- package/dist/cache/vector.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +205 -0
- package/dist/cli.js.map +1 -0
- package/dist/clients/amplitude.d.ts +24 -0
- package/dist/clients/amplitude.d.ts.map +1 -0
- package/dist/clients/amplitude.js +15 -0
- package/dist/clients/amplitude.js.map +1 -0
- package/dist/clients/clickhouse.d.ts +10 -0
- package/dist/clients/clickhouse.d.ts.map +1 -0
- package/dist/clients/clickhouse.js +8 -0
- package/dist/clients/clickhouse.js.map +1 -0
- package/dist/clients/cloud.d.ts +347 -0
- package/dist/clients/cloud.d.ts.map +1 -0
- package/dist/clients/cloud.js +402 -0
- package/dist/clients/cloud.js.map +1 -0
- package/dist/clients/http.d.ts +40 -0
- package/dist/clients/http.d.ts.map +1 -0
- package/dist/clients/http.js +67 -0
- package/dist/clients/http.js.map +1 -0
- package/dist/clients/index.d.ts +38 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +24 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/jira.d.ts +16 -0
- package/dist/clients/jira.d.ts.map +1 -0
- package/dist/clients/jira.js +11 -0
- package/dist/clients/jira.js.map +1 -0
- package/dist/clients/loki.d.ts +7 -0
- package/dist/clients/loki.d.ts.map +1 -0
- package/dist/clients/loki.js +8 -0
- package/dist/clients/loki.js.map +1 -0
- package/dist/clients/retry.d.ts +28 -0
- package/dist/clients/retry.d.ts.map +1 -0
- package/dist/clients/retry.js +79 -0
- package/dist/clients/retry.js.map +1 -0
- package/dist/clients/testrelic.d.ts +90 -0
- package/dist/clients/testrelic.d.ts.map +1 -0
- package/dist/clients/testrelic.js +68 -0
- package/dist/clients/testrelic.js.map +1 -0
- package/dist/config.d.ts +216 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +233 -0
- package/dist/config.js.map +1 -0
- package/dist/context/code-map.d.ts +35 -0
- package/dist/context/code-map.d.ts.map +1 -0
- package/dist/context/code-map.js +187 -0
- package/dist/context/code-map.js.map +1 -0
- package/dist/context/correlator.d.ts +32 -0
- package/dist/context/correlator.d.ts.map +1 -0
- package/dist/context/correlator.js +106 -0
- package/dist/context/correlator.js.map +1 -0
- package/dist/context/coverage-map.d.ts +25 -0
- package/dist/context/coverage-map.d.ts.map +1 -0
- package/dist/context/coverage-map.js +44 -0
- package/dist/context/coverage-map.js.map +1 -0
- package/dist/context/index.d.ts +20 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +18 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/journey-graph.d.ts +22 -0
- package/dist/context/journey-graph.d.ts.map +1 -0
- package/dist/context/journey-graph.js +38 -0
- package/dist/context/journey-graph.js.map +1 -0
- package/dist/context/signal-map.d.ts +26 -0
- package/dist/context/signal-map.d.ts.map +1 -0
- package/dist/context/signal-map.js +30 -0
- package/dist/context/signal-map.js.map +1 -0
- package/dist/elicit/ask.d.ts +28 -0
- package/dist/elicit/ask.d.ts.map +1 -0
- package/dist/elicit/ask.js +31 -0
- package/dist/elicit/ask.js.map +1 -0
- package/dist/elicit/zod-to-json.d.ts +7 -0
- package/dist/elicit/zod-to-json.d.ts.map +1 -0
- package/dist/elicit/zod-to-json.js +37 -0
- package/dist/elicit/zod-to-json.js.map +1 -0
- package/dist/errors.d.ts +59 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +122 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +127 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +6 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +29 -0
- package/dist/logger.js.map +1 -0
- package/dist/prompts/index.d.ts +8 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +86 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/registry/index.d.ts +70 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +88 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/project.d.ts +20 -0
- package/dist/registry/project.d.ts.map +1 -0
- package/dist/registry/project.js +44 -0
- package/dist/registry/project.js.map +1 -0
- package/dist/resources/index.d.ts +13 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +76 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/sampling/bridge.d.ts +35 -0
- package/dist/sampling/bridge.d.ts.map +1 -0
- package/dist/sampling/bridge.js +39 -0
- package/dist/sampling/bridge.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +29 -0
- package/dist/telemetry/metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics.js +46 -0
- package/dist/telemetry/metrics.js.map +1 -0
- package/dist/telemetry/tokens.d.ts +16 -0
- package/dist/telemetry/tokens.d.ts.map +1 -0
- package/dist/telemetry/tokens.js +40 -0
- package/dist/telemetry/tokens.js.map +1 -0
- package/dist/tools/core/index.d.ts +8 -0
- package/dist/tools/core/index.d.ts.map +1 -0
- package/dist/tools/core/index.js +219 -0
- package/dist/tools/core/index.js.map +1 -0
- package/dist/tools/coverage/index.d.ts +9 -0
- package/dist/tools/coverage/index.d.ts.map +1 -0
- package/dist/tools/coverage/index.js +247 -0
- package/dist/tools/coverage/index.js.map +1 -0
- package/dist/tools/creation/index.d.ts +9 -0
- package/dist/tools/creation/index.d.ts.map +1 -0
- package/dist/tools/creation/index.js +357 -0
- package/dist/tools/creation/index.js.map +1 -0
- package/dist/tools/creation/templates.d.ts +17 -0
- package/dist/tools/creation/templates.d.ts.map +1 -0
- package/dist/tools/creation/templates.js +63 -0
- package/dist/tools/creation/templates.js.map +1 -0
- package/dist/tools/devtools/index.d.ts +9 -0
- package/dist/tools/devtools/index.d.ts.map +1 -0
- package/dist/tools/devtools/index.js +106 -0
- package/dist/tools/devtools/index.js.map +1 -0
- package/dist/tools/healing/index.d.ts +10 -0
- package/dist/tools/healing/index.d.ts.map +1 -0
- package/dist/tools/healing/index.js +190 -0
- package/dist/tools/healing/index.js.map +1 -0
- package/dist/tools/impact/index.d.ts +8 -0
- package/dist/tools/impact/index.d.ts.map +1 -0
- package/dist/tools/impact/index.js +215 -0
- package/dist/tools/impact/index.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +29 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/signals/index.d.ts +9 -0
- package/dist/tools/signals/index.d.ts.map +1 -0
- package/dist/tools/signals/index.js +100 -0
- package/dist/tools/signals/index.js.map +1 -0
- package/dist/tools/triage/index.d.ts +9 -0
- package/dist/tools/triage/index.d.ts.map +1 -0
- package/dist/tools/triage/index.js +366 -0
- package/dist/tools/triage/index.js.map +1 -0
- package/dist/transport/http.d.ts +16 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +110 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/stdio.d.ts +6 -0
- package/dist/transport/stdio.d.ts.map +1 -0
- package/dist/transport/stdio.js +19 -0
- package/dist/transport/stdio.js.map +1 -0
- package/dist/types/index.d.ts +268 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-map.d.ts","sourceRoot":"","sources":["../../src/context/coverage-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;;;;;;GASG;AAEH,qBAAa,WAAW;IAIpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAkB;gBAGlB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,YAAY;IAGzB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAStD,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAKrF,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAK1F,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKnG,UAAU,IAAI,IAAI;CAG1B"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage map — `test_id -> { journey_ids[], code_node_ids[] }`.
|
|
3
|
+
*
|
|
4
|
+
* Built from three sources server-side:
|
|
5
|
+
* 1. Run artefacts (inferred network calls, selectors touched).
|
|
6
|
+
* 2. Static tags on tests (e.g. `@journey:checkout-guest`).
|
|
7
|
+
* 3. AST-extracted API calls (best-effort).
|
|
8
|
+
*
|
|
9
|
+
* This module just caches the platform's `/test-map` response.
|
|
10
|
+
*/
|
|
11
|
+
export class CoverageMap {
|
|
12
|
+
clients;
|
|
13
|
+
cache;
|
|
14
|
+
ns = "coverage-map";
|
|
15
|
+
constructor(clients, cache) {
|
|
16
|
+
this.clients = clients;
|
|
17
|
+
this.cache = cache;
|
|
18
|
+
}
|
|
19
|
+
async load(project_id) {
|
|
20
|
+
const key = this.cache.key("coverage-map:load", { project_id });
|
|
21
|
+
const hit = this.cache.get(key);
|
|
22
|
+
if (hit)
|
|
23
|
+
return hit.value;
|
|
24
|
+
const { data } = await this.clients.testrelic.getTestMap(project_id);
|
|
25
|
+
this.cache.set(key, data, { ttlSeconds: 1_800, namespace: this.ns });
|
|
26
|
+
return data;
|
|
27
|
+
}
|
|
28
|
+
async byTestId(project_id, test_id) {
|
|
29
|
+
const all = await this.load(project_id);
|
|
30
|
+
return all.find((e) => e.test_id === test_id);
|
|
31
|
+
}
|
|
32
|
+
async testsCoveringJourney(project_id, journey_id) {
|
|
33
|
+
const all = await this.load(project_id);
|
|
34
|
+
return all.filter((e) => e.journey_ids.includes(journey_id));
|
|
35
|
+
}
|
|
36
|
+
async testsTouchingCodeNode(project_id, code_node_id) {
|
|
37
|
+
const all = await this.load(project_id);
|
|
38
|
+
return all.filter((e) => e.code_node_ids.includes(code_node_id));
|
|
39
|
+
}
|
|
40
|
+
invalidate() {
|
|
41
|
+
this.cache.invalidateNamespace(this.ns);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=coverage-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-map.js","sourceRoot":"","sources":["../../src/context/coverage-map.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,MAAM,OAAO,WAAW;IAIH;IACA;IAJF,EAAE,GAAG,cAAc,CAAC;IAErC,YACmB,OAAqB,EACrB,KAAmB;QADnB,YAAO,GAAP,OAAO,CAAc;QACrB,UAAK,GAAL,KAAK,CAAc;IACnC,CAAC;IAEG,KAAK,CAAC,IAAI,CAAC,UAAkB;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,GAAG,CAAC,CAAC;QACrD,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,UAAkB,EAAE,OAAe;QACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAChD,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAAC,UAAkB,EAAE,UAAkB;QACtE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAAC,UAAkB,EAAE,YAAoB;QACzE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACnE,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CacheManager } from "../cache/index.js";
|
|
2
|
+
import type { ClientBundle } from "../clients/index.js";
|
|
3
|
+
import { CodeMap } from "./code-map.js";
|
|
4
|
+
import { CoverageMap } from "./coverage-map.js";
|
|
5
|
+
import { Correlator } from "./correlator.js";
|
|
6
|
+
import { JourneyGraph } from "./journey-graph.js";
|
|
7
|
+
import { SignalMap } from "./signal-map.js";
|
|
8
|
+
/**
|
|
9
|
+
* Bundles all context-engine modules. Instantiated once per server.
|
|
10
|
+
*/
|
|
11
|
+
export interface ContextEngine {
|
|
12
|
+
journeys: JourneyGraph;
|
|
13
|
+
coverage: CoverageMap;
|
|
14
|
+
code: CodeMap;
|
|
15
|
+
signals: SignalMap;
|
|
16
|
+
correlator: Correlator;
|
|
17
|
+
}
|
|
18
|
+
export declare function buildContextEngine(clients: ClientBundle, cache: CacheManager): ContextEngine;
|
|
19
|
+
export { JourneyGraph, CoverageMap, CodeMap, SignalMap, Correlator };
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,WAAW,CAAC;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,SAAS,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,aAAa,CAU5F;AAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CodeMap } from "./code-map.js";
|
|
2
|
+
import { CoverageMap } from "./coverage-map.js";
|
|
3
|
+
import { Correlator } from "./correlator.js";
|
|
4
|
+
import { JourneyGraph } from "./journey-graph.js";
|
|
5
|
+
import { SignalMap } from "./signal-map.js";
|
|
6
|
+
export function buildContextEngine(clients, cache) {
|
|
7
|
+
const journeys = new JourneyGraph(clients, cache);
|
|
8
|
+
const coverage = new CoverageMap(clients, cache);
|
|
9
|
+
return {
|
|
10
|
+
journeys,
|
|
11
|
+
coverage,
|
|
12
|
+
code: new CodeMap(clients, cache),
|
|
13
|
+
signals: new SignalMap(clients, cache),
|
|
14
|
+
correlator: new Correlator(journeys, coverage),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export { JourneyGraph, CoverageMap, CodeMap, SignalMap, Correlator };
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAa5C,MAAM,UAAU,kBAAkB,CAAC,OAAqB,EAAE,KAAmB;IAC3E,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjD,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,IAAI,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;QACjC,OAAO,EAAE,IAAI,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;QACtC,UAAU,EAAE,IAAI,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CacheManager } from "../cache/index.js";
|
|
2
|
+
import type { ClientBundle } from "../clients/index.js";
|
|
3
|
+
import type { UserJourney } from "../types/index.js";
|
|
4
|
+
/**
|
|
5
|
+
* Journey graph — condensed DAG of user flows observed in production.
|
|
6
|
+
*
|
|
7
|
+
* v2: fetched from cloud-platform-app's per-repo navigation endpoint
|
|
8
|
+
* (`GET /api/v1/repos/:repoId/navigation`) which is derived server-side from
|
|
9
|
+
* session analytics + the org's Amplitude integration. The MCP never calls
|
|
10
|
+
* Amplitude directly.
|
|
11
|
+
*/
|
|
12
|
+
export declare class JourneyGraph {
|
|
13
|
+
private readonly clients;
|
|
14
|
+
private readonly cache;
|
|
15
|
+
private readonly ns;
|
|
16
|
+
constructor(clients: ClientBundle, cache: CacheManager);
|
|
17
|
+
top(project_id: string, limit?: number): Promise<UserJourney[]>;
|
|
18
|
+
byId(project_id: string, journey_id: string): Promise<UserJourney | undefined>;
|
|
19
|
+
totalUsers(project_id: string): Promise<number>;
|
|
20
|
+
invalidate(): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=journey-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journey-graph.d.ts","sourceRoot":"","sources":["../../src/context/journey-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;;GAOG;AAEH,qBAAa,YAAY;IAIrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmB;gBAGnB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,YAAY;IAGzB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAS3D,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAK9E,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKrD,UAAU,IAAI,IAAI;CAG1B"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Journey graph — condensed DAG of user flows observed in production.
|
|
3
|
+
*
|
|
4
|
+
* v2: fetched from cloud-platform-app's per-repo navigation endpoint
|
|
5
|
+
* (`GET /api/v1/repos/:repoId/navigation`) which is derived server-side from
|
|
6
|
+
* session analytics + the org's Amplitude integration. The MCP never calls
|
|
7
|
+
* Amplitude directly.
|
|
8
|
+
*/
|
|
9
|
+
export class JourneyGraph {
|
|
10
|
+
clients;
|
|
11
|
+
cache;
|
|
12
|
+
ns = "journey-graph";
|
|
13
|
+
constructor(clients, cache) {
|
|
14
|
+
this.clients = clients;
|
|
15
|
+
this.cache = cache;
|
|
16
|
+
}
|
|
17
|
+
async top(project_id, limit = 50) {
|
|
18
|
+
const key = this.cache.key("journey-graph:top", { project_id, limit });
|
|
19
|
+
const hit = this.cache.get(key);
|
|
20
|
+
if (hit)
|
|
21
|
+
return hit.value;
|
|
22
|
+
const { data } = await this.clients.testrelic.listJourneys(project_id, limit);
|
|
23
|
+
this.cache.set(key, data, { ttlSeconds: 3_600, namespace: this.ns });
|
|
24
|
+
return data;
|
|
25
|
+
}
|
|
26
|
+
async byId(project_id, journey_id) {
|
|
27
|
+
const all = await this.top(project_id, 500);
|
|
28
|
+
return all.find((j) => j.id === journey_id);
|
|
29
|
+
}
|
|
30
|
+
async totalUsers(project_id) {
|
|
31
|
+
const all = await this.top(project_id, 500);
|
|
32
|
+
return all.reduce((sum, j) => sum + (j.user_count ?? 0), 0);
|
|
33
|
+
}
|
|
34
|
+
invalidate() {
|
|
35
|
+
this.cache.invalidateNamespace(this.ns);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=journey-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journey-graph.js","sourceRoot":"","sources":["../../src/context/journey-graph.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,MAAM,OAAO,YAAY;IAIJ;IACA;IAJF,EAAE,GAAG,eAAe,CAAC;IAEtC,YACmB,OAAqB,EACrB,KAAmB;QADnB,YAAO,GAAP,OAAO,CAAc;QACrB,UAAK,GAAL,KAAK,CAAc;IACnC,CAAC;IAEG,KAAK,CAAC,GAAG,CAAC,UAAkB,EAAE,KAAK,GAAG,EAAE;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,GAAG,CAAC,CAAC;QAC/C,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,UAAkB,EAAE,UAAkB;QACtD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,UAAkB;QACxC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CacheManager } from "../cache/index.js";
|
|
2
|
+
import type { ClientBundle } from "../clients/index.js";
|
|
3
|
+
import type { LokiLogLine } from "../types/index.js";
|
|
4
|
+
/**
|
|
5
|
+
* Signal map — last-24h error buckets by route/service, proxied through the
|
|
6
|
+
* cloud platform's Loki integration (`GET /api/v1/integrations/loki/logs`).
|
|
7
|
+
* The MCP never contacts Loki directly; the platform uses the org's stored
|
|
8
|
+
* Loki credentials to run the query and strips them from the response.
|
|
9
|
+
*/
|
|
10
|
+
export interface SignalBucket {
|
|
11
|
+
service: string;
|
|
12
|
+
error_rate_peak: number;
|
|
13
|
+
peak_time: string;
|
|
14
|
+
total_errors: number;
|
|
15
|
+
log_lines: LokiLogLine[];
|
|
16
|
+
time_range: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class SignalMap {
|
|
19
|
+
private readonly clients;
|
|
20
|
+
private readonly cache;
|
|
21
|
+
private readonly ns;
|
|
22
|
+
constructor(clients: ClientBundle, cache: CacheManager);
|
|
23
|
+
forPattern(error_pattern: string, time_range?: string): Promise<SignalBucket>;
|
|
24
|
+
invalidate(): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=signal-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-map.d.ts","sourceRoot":"","sources":["../../src/context/signal-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,SAAS;IAIlB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAgB;gBAGhB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,YAAY;IAGzB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAiBnF,UAAU,IAAI,IAAI;CAG1B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export class SignalMap {
|
|
2
|
+
clients;
|
|
3
|
+
cache;
|
|
4
|
+
ns = "signal-map";
|
|
5
|
+
constructor(clients, cache) {
|
|
6
|
+
this.clients = clients;
|
|
7
|
+
this.cache = cache;
|
|
8
|
+
}
|
|
9
|
+
async forPattern(error_pattern, time_range) {
|
|
10
|
+
const key = this.cache.key("signal-map:pattern", { error_pattern, time_range: time_range ?? "default" });
|
|
11
|
+
const hit = this.cache.get(key);
|
|
12
|
+
if (hit)
|
|
13
|
+
return hit.value;
|
|
14
|
+
const data = await this.clients.loki.queryRange(error_pattern, time_range);
|
|
15
|
+
const bucket = {
|
|
16
|
+
service: data.log_lines[0]?.service ?? "unknown",
|
|
17
|
+
error_rate_peak: data.error_rate_peak,
|
|
18
|
+
peak_time: data.peak_time,
|
|
19
|
+
total_errors: data.total_errors,
|
|
20
|
+
log_lines: data.log_lines,
|
|
21
|
+
time_range: data.time_range,
|
|
22
|
+
};
|
|
23
|
+
this.cache.set(key, bucket, { ttlSeconds: 300, namespace: this.ns });
|
|
24
|
+
return bucket;
|
|
25
|
+
}
|
|
26
|
+
invalidate() {
|
|
27
|
+
this.cache.invalidateNamespace(this.ns);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=signal-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-map.js","sourceRoot":"","sources":["../../src/context/signal-map.ts"],"names":[],"mappings":"AAoBA,MAAM,OAAO,SAAS;IAID;IACA;IAJF,EAAE,GAAG,YAAY,CAAC;IAEnC,YACmB,OAAqB,EACrB,KAAmB;QADnB,YAAO,GAAP,OAAO,CAAc;QACrB,UAAK,GAAL,KAAK,CAAc;IACnC,CAAC;IAEG,KAAK,CAAC,UAAU,CAAC,aAAqB,EAAE,UAAmB;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,IAAI,SAAS,EAAE,CAAC,CAAC;QACzG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,GAAG,CAAC,CAAC;QAC9C,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAiB;YAC3B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,SAAS;YAChD,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
/**
|
|
4
|
+
* Elicitation helper: prompts the client's user for schema-driven input.
|
|
5
|
+
* Gracefully degrades when a client doesn't implement elicitation — tools
|
|
6
|
+
* should fall back to using whatever defaults they already have.
|
|
7
|
+
*/
|
|
8
|
+
export interface ElicitOptions {
|
|
9
|
+
message: string;
|
|
10
|
+
/** Zod schema describing the fields we want. */
|
|
11
|
+
schema: z.ZodType;
|
|
12
|
+
}
|
|
13
|
+
export type ElicitResult = {
|
|
14
|
+
kind: "accepted";
|
|
15
|
+
content: Record<string, unknown>;
|
|
16
|
+
} | {
|
|
17
|
+
kind: "declined";
|
|
18
|
+
} | {
|
|
19
|
+
kind: "cancelled";
|
|
20
|
+
} | {
|
|
21
|
+
kind: "unsupported";
|
|
22
|
+
};
|
|
23
|
+
export declare class Elicitor {
|
|
24
|
+
private readonly server;
|
|
25
|
+
constructor(server: McpServer);
|
|
26
|
+
ask(opts: ElicitOptions): Promise<ElicitResult>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/elicit/ask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAI7B;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAE5B,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,SAAS;IAEjC,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAmB7D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { zodToJsonSchema } from "./zod-to-json.js";
|
|
2
|
+
import { getLogger } from "../logger.js";
|
|
3
|
+
export class Elicitor {
|
|
4
|
+
server;
|
|
5
|
+
constructor(server) {
|
|
6
|
+
this.server = server;
|
|
7
|
+
}
|
|
8
|
+
async ask(opts) {
|
|
9
|
+
try {
|
|
10
|
+
const sdkServer = this.server.server;
|
|
11
|
+
if (!sdkServer?.elicitInput)
|
|
12
|
+
return { kind: "unsupported" };
|
|
13
|
+
const result = await sdkServer.elicitInput({
|
|
14
|
+
message: opts.message,
|
|
15
|
+
requestedSchema: zodToJsonSchema(opts.schema),
|
|
16
|
+
});
|
|
17
|
+
if (result.action === "accept" && result.content)
|
|
18
|
+
return { kind: "accepted", content: result.content };
|
|
19
|
+
if (result.action === "decline")
|
|
20
|
+
return { kind: "declined" };
|
|
21
|
+
if (result.action === "cancel")
|
|
22
|
+
return { kind: "cancelled" };
|
|
23
|
+
return { kind: "unsupported" };
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
getLogger().debug({ err }, "elicitation unavailable");
|
|
27
|
+
return { kind: "unsupported" };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=ask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/elicit/ask.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAoBzC,MAAM,OAAO,QAAQ;IACU;IAA7B,YAA6B,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;IAAG,CAAC;IAE3C,KAAK,CAAC,GAAG,CAAC,IAAmB;QAClC,IAAI,CAAC;YACH,MAAM,SAAS,GAAI,IAAI,CAAC,MAEtB,CAAC,MAAM,CAAC;YACV,IAAI,CAAC,SAAS,EAAE,WAAW;gBAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC;gBACzC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,eAAe,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;aAC9C,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YACvG,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YAC7D,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,yBAAyB,CAAC,CAAC;YACtD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Minimal zod → JSON-Schema converter covering the primitive shapes we use
|
|
4
|
+
* in elicitation. Falls back to `{type:"object"}` for anything exotic.
|
|
5
|
+
*/
|
|
6
|
+
export declare function zodToJsonSchema(schema: z.ZodType): Record<string, unknown>;
|
|
7
|
+
//# sourceMappingURL=zod-to-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-to-json.d.ts","sourceRoot":"","sources":["../../src/elicit/zod-to-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8B1E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal zod → JSON-Schema converter covering the primitive shapes we use
|
|
3
|
+
* in elicitation. Falls back to `{type:"object"}` for anything exotic.
|
|
4
|
+
*/
|
|
5
|
+
export function zodToJsonSchema(schema) {
|
|
6
|
+
const def = schema._def;
|
|
7
|
+
switch (def.typeName) {
|
|
8
|
+
case "ZodString":
|
|
9
|
+
return { type: "string" };
|
|
10
|
+
case "ZodNumber":
|
|
11
|
+
return { type: "number" };
|
|
12
|
+
case "ZodBoolean":
|
|
13
|
+
return { type: "boolean" };
|
|
14
|
+
case "ZodEnum":
|
|
15
|
+
return { type: "string", enum: def.values };
|
|
16
|
+
case "ZodOptional":
|
|
17
|
+
return zodToJsonSchema(def.innerType);
|
|
18
|
+
case "ZodDefault":
|
|
19
|
+
return zodToJsonSchema(def.innerType);
|
|
20
|
+
case "ZodArray":
|
|
21
|
+
return { type: "array", items: zodToJsonSchema(def.type) };
|
|
22
|
+
case "ZodObject": {
|
|
23
|
+
const shape = def.shape();
|
|
24
|
+
const properties = {};
|
|
25
|
+
const required = [];
|
|
26
|
+
for (const [k, v] of Object.entries(shape)) {
|
|
27
|
+
properties[k] = zodToJsonSchema(v);
|
|
28
|
+
if (!v.isOptional?.())
|
|
29
|
+
required.push(k);
|
|
30
|
+
}
|
|
31
|
+
return { type: "object", properties, required: required.length ? required : undefined };
|
|
32
|
+
}
|
|
33
|
+
default:
|
|
34
|
+
return { type: "object" };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=zod-to-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-to-json.js","sourceRoot":"","sources":["../../src/elicit/zod-to-json.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,GAAG,GAAI,MAA0E,CAAC,IAAI,CAAC;IAC7F,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5B,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5B,KAAK,YAAY;YACf,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7B,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAG,GAAuC,CAAC,MAAM,EAAE,CAAC;QACnF,KAAK,aAAa;YAChB,OAAO,eAAe,CAAE,GAA2C,CAAC,SAAS,CAAC,CAAC;QACjF,KAAK,YAAY;YACf,OAAO,eAAe,CAAE,GAA2C,CAAC,SAAS,CAAC,CAAC;QACjF,KAAK,UAAU;YACb,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAE,GAAsC,CAAC,IAAI,CAAC,EAAE,CAAC;QACjG,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAI,GAA6D,CAAC,KAAK,EAAE,CAAC;YACrF,MAAM,UAAU,GAA4B,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,UAAU,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;gBACnC,IAAI,CAAE,CAA+C,CAAC,UAAU,EAAE,EAAE;oBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzF,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAC1F,CAAC;QACD;YACE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error taxonomy. Every error the server throws downstream of a tool handler
|
|
3
|
+
* should be one of these, so clients get machine-readable `code`.
|
|
4
|
+
*/
|
|
5
|
+
export type ErrorCode = "AUTH_ERROR" | "UPSTREAM_ERROR" | "NOT_FOUND" | "RATE_LIMITED" | "INVALID_INPUT" | "CACHE_MISS" | "CAPABILITY_DISABLED" | "TIMEOUT" | "INTERNAL" | "CIRCUIT_OPEN";
|
|
6
|
+
export declare class TestRelicMcpError extends Error {
|
|
7
|
+
readonly code: ErrorCode;
|
|
8
|
+
readonly service?: string;
|
|
9
|
+
readonly retriable: boolean;
|
|
10
|
+
readonly cause?: unknown;
|
|
11
|
+
constructor(opts: {
|
|
12
|
+
code: ErrorCode;
|
|
13
|
+
message: string;
|
|
14
|
+
service?: string;
|
|
15
|
+
retriable?: boolean;
|
|
16
|
+
cause?: unknown;
|
|
17
|
+
});
|
|
18
|
+
toToolError(): {
|
|
19
|
+
content: Array<{
|
|
20
|
+
type: "text";
|
|
21
|
+
text: string;
|
|
22
|
+
}>;
|
|
23
|
+
isError: true;
|
|
24
|
+
structuredContent: Record<string, unknown>;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare class AuthError extends TestRelicMcpError {
|
|
28
|
+
constructor(message: string, service?: string);
|
|
29
|
+
}
|
|
30
|
+
export declare class UpstreamError extends TestRelicMcpError {
|
|
31
|
+
constructor(message: string, service?: string, retriable?: boolean);
|
|
32
|
+
}
|
|
33
|
+
export declare class NotFoundError extends TestRelicMcpError {
|
|
34
|
+
constructor(message: string, service?: string);
|
|
35
|
+
}
|
|
36
|
+
export declare class RateLimitedError extends TestRelicMcpError {
|
|
37
|
+
constructor(message: string, service?: string);
|
|
38
|
+
}
|
|
39
|
+
export declare class InvalidInputError extends TestRelicMcpError {
|
|
40
|
+
readonly subcode?: string;
|
|
41
|
+
constructor(message: string, subcode?: string);
|
|
42
|
+
}
|
|
43
|
+
export declare class CacheMissError extends TestRelicMcpError {
|
|
44
|
+
constructor(message: string);
|
|
45
|
+
}
|
|
46
|
+
export declare class CapabilityDisabledError extends TestRelicMcpError {
|
|
47
|
+
constructor(capability: string);
|
|
48
|
+
}
|
|
49
|
+
export declare class TimeoutError extends TestRelicMcpError {
|
|
50
|
+
constructor(message: string, service?: string);
|
|
51
|
+
}
|
|
52
|
+
export declare class CircuitOpenError extends TestRelicMcpError {
|
|
53
|
+
constructor(service: string);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Maps an axios/Error into a TestRelicMcpError. Preserves messages written for AI agents.
|
|
57
|
+
*/
|
|
58
|
+
export declare function wrapUpstreamError(err: unknown, service: string): TestRelicMcpError;
|
|
59
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,gBAAgB,GAChB,WAAW,GACX,cAAc,GACd,eAAe,GACf,YAAY,GACZ,qBAAqB,GACrB,SAAS,GACT,UAAU,GACV,cAAc,CAAC;AAEnB,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjC,SAAgB,SAAS,EAAE,OAAO,CAAC;IACnC,SAAyB,KAAK,CAAC,EAAE,OAAO,CAAC;gBAE7B,IAAI,EAAE;QAChB,IAAI,EAAE,SAAS,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB;IASM,WAAW,IAAI;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,OAAO,EAAE,IAAI,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE;CAcpI;AAED,qBAAa,SAAU,SAAQ,iBAAiB;gBAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAG9C;AAED,qBAAa,aAAc,SAAQ,iBAAiB;gBACtC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,UAAO;CAGhE;AAED,qBAAa,aAAc,SAAQ,iBAAiB;gBACtC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAG9C;AAED,qBAAa,gBAAiB,SAAQ,iBAAiB;gBACzC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAG9C;AAED,qBAAa,iBAAkB,SAAQ,iBAAiB;IACtD,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACrB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAI9C;AAED,qBAAa,cAAe,SAAQ,iBAAiB;gBACvC,OAAO,EAAE,MAAM;CAG5B;AAED,qBAAa,uBAAwB,SAAQ,iBAAiB;gBAChD,UAAU,EAAE,MAAM;CAO/B;AAED,qBAAa,YAAa,SAAQ,iBAAiB;gBACrC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAG9C;AAED,qBAAa,gBAAiB,SAAQ,iBAAiB;gBACzC,OAAO,EAAE,MAAM;CAQ5B;AAcD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAoClF"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error taxonomy. Every error the server throws downstream of a tool handler
|
|
3
|
+
* should be one of these, so clients get machine-readable `code`.
|
|
4
|
+
*/
|
|
5
|
+
export class TestRelicMcpError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
service;
|
|
8
|
+
retriable;
|
|
9
|
+
cause;
|
|
10
|
+
constructor(opts) {
|
|
11
|
+
super(opts.message);
|
|
12
|
+
this.name = "TestRelicMcpError";
|
|
13
|
+
this.code = opts.code;
|
|
14
|
+
this.service = opts.service;
|
|
15
|
+
this.retriable = opts.retriable ?? false;
|
|
16
|
+
this.cause = opts.cause;
|
|
17
|
+
}
|
|
18
|
+
toToolError() {
|
|
19
|
+
return {
|
|
20
|
+
isError: true,
|
|
21
|
+
content: [{ type: "text", text: this.message }],
|
|
22
|
+
structuredContent: {
|
|
23
|
+
error: {
|
|
24
|
+
code: this.code,
|
|
25
|
+
message: this.message,
|
|
26
|
+
service: this.service,
|
|
27
|
+
retriable: this.retriable,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class AuthError extends TestRelicMcpError {
|
|
34
|
+
constructor(message, service) {
|
|
35
|
+
super({ code: "AUTH_ERROR", message, service, retriable: false });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class UpstreamError extends TestRelicMcpError {
|
|
39
|
+
constructor(message, service, retriable = true) {
|
|
40
|
+
super({ code: "UPSTREAM_ERROR", message, service, retriable });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class NotFoundError extends TestRelicMcpError {
|
|
44
|
+
constructor(message, service) {
|
|
45
|
+
super({ code: "NOT_FOUND", message, service, retriable: false });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export class RateLimitedError extends TestRelicMcpError {
|
|
49
|
+
constructor(message, service) {
|
|
50
|
+
super({ code: "RATE_LIMITED", message, service, retriable: true });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export class InvalidInputError extends TestRelicMcpError {
|
|
54
|
+
subcode;
|
|
55
|
+
constructor(message, subcode) {
|
|
56
|
+
super({ code: "INVALID_INPUT", message, retriable: false });
|
|
57
|
+
this.subcode = subcode;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export class CacheMissError extends TestRelicMcpError {
|
|
61
|
+
constructor(message) {
|
|
62
|
+
super({ code: "CACHE_MISS", message, retriable: false });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export class CapabilityDisabledError extends TestRelicMcpError {
|
|
66
|
+
constructor(capability) {
|
|
67
|
+
super({
|
|
68
|
+
code: "CAPABILITY_DISABLED",
|
|
69
|
+
message: `Capability "${capability}" is disabled. Enable it with --caps=${capability} or add to the "capabilities" array in your config.`,
|
|
70
|
+
retriable: false,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export class TimeoutError extends TestRelicMcpError {
|
|
75
|
+
constructor(message, service) {
|
|
76
|
+
super({ code: "TIMEOUT", message, service, retriable: true });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export class CircuitOpenError extends TestRelicMcpError {
|
|
80
|
+
constructor(service) {
|
|
81
|
+
super({
|
|
82
|
+
code: "CIRCUIT_OPEN",
|
|
83
|
+
message: `Circuit breaker is open for ${service}. Retries suppressed until the service recovers.`,
|
|
84
|
+
service,
|
|
85
|
+
retriable: true,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function isAxiosError(err) {
|
|
90
|
+
return typeof err === "object" && err !== null && err.isAxiosError === true;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Maps an axios/Error into a TestRelicMcpError. Preserves messages written for AI agents.
|
|
94
|
+
*/
|
|
95
|
+
export function wrapUpstreamError(err, service) {
|
|
96
|
+
if (err instanceof TestRelicMcpError)
|
|
97
|
+
return err;
|
|
98
|
+
if (isAxiosError(err)) {
|
|
99
|
+
const status = err.response?.status;
|
|
100
|
+
if (status === 401 || status === 403) {
|
|
101
|
+
return new AuthError(`${service} returned ${status} Unauthorized. Check credentials in your config or .env. If using mock mode, ensure MOCK_SERVER_URL is set and the mock server is running (npm run mock).`, service);
|
|
102
|
+
}
|
|
103
|
+
if (status === 404) {
|
|
104
|
+
return new NotFoundError(`${service} returned 404 Not Found. The requested resource does not exist.`, service);
|
|
105
|
+
}
|
|
106
|
+
if (status === 429) {
|
|
107
|
+
return new RateLimitedError(`${service} returned 429 Too Many Requests. Wait before retrying.`, service);
|
|
108
|
+
}
|
|
109
|
+
if (status && status >= 500) {
|
|
110
|
+
return new UpstreamError(`${service} returned ${status} Server Error. The service may be temporarily unavailable.`, service, true);
|
|
111
|
+
}
|
|
112
|
+
if (err.code === "ECONNREFUSED") {
|
|
113
|
+
return new UpstreamError(`Cannot connect to ${service} at ${err.config?.url}. If using mock mode, start the mock server first: npm run mock`, service, true);
|
|
114
|
+
}
|
|
115
|
+
if (err.code === "ECONNABORTED" || err.code === "ETIMEDOUT") {
|
|
116
|
+
return new TimeoutError(`${service} request timed out.`, service);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
120
|
+
return new UpstreamError(`${service} error: ${message}`, service, true);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { Config } from "./config.js";
|
|
3
|
+
import { type ResolvedConfig } from "./config.js";
|
|
4
|
+
import { type ToolContext } from "./registry/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Programmatic API — this is the entry point that the CLI uses and also
|
|
7
|
+
* what library consumers import via `import { createServer } from "@testrelic/mcp"`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import { createServer } from "@testrelic/mcp";
|
|
11
|
+
* const { server, start, stop } = await createServer({ capabilities: ["coverage"] });
|
|
12
|
+
* await start();
|
|
13
|
+
* // ... later
|
|
14
|
+
* await stop();
|
|
15
|
+
*/
|
|
16
|
+
export interface TestRelicServer {
|
|
17
|
+
/** The underlying MCP server instance — do not mutate. */
|
|
18
|
+
server: McpServer;
|
|
19
|
+
/** Resolved config (defaults, env, and caller-provided merged). */
|
|
20
|
+
config: ResolvedConfig;
|
|
21
|
+
/** Registered tool list for logging/documentation. */
|
|
22
|
+
registeredTools: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
capability: string;
|
|
25
|
+
deprecated: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
/** Start the transport (stdio or http based on config). */
|
|
28
|
+
start(): Promise<void>;
|
|
29
|
+
/** Gracefully shut down the transport and flush telemetry. */
|
|
30
|
+
stop(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* INTERNAL — tool context exposed for tests. Not part of the public API.
|
|
33
|
+
* Do not use in production code; reach for the MCP protocol instead.
|
|
34
|
+
*/
|
|
35
|
+
__ctx: ToolContext;
|
|
36
|
+
}
|
|
37
|
+
export declare function createServer(inputConfig?: Config): Promise<TestRelicServer>;
|
|
38
|
+
export type { Config, ResolvedConfig } from "./config.js";
|
|
39
|
+
export type { Capability, Transport, LogLevel, ServerConfig, TimeoutConfig, CloudConfig } from "./config.js";
|
|
40
|
+
export type { ToolContext, ToolDefinition, ToolResponse, RegisteredTool } from "./registry/index.js";
|
|
41
|
+
export { TestRelicMcpError, AuthError, UpstreamError, NotFoundError, RateLimitedError, InvalidInputError, TimeoutError, CircuitOpenError } from "./errors.js";
|
|
42
|
+
export { version, name } from "./version.js";
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAA6C,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7F,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQrE;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,MAAM,EAAE,SAAS,CAAC;IAClB,mEAAmE;IACnE,MAAM,EAAE,cAAc,CAAC;IACvB,sDAAsD;IACtD,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClF,2DAA2D;IAC3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,8DAA8D;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB;;;OAGG;IACH,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,wBAAsB,YAAY,CAAC,WAAW,GAAE,MAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CA+HrF;AAGD,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7G,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC9J,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC"}
|