@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.
Files changed (204) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +198 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/cache/blob.d.ts +22 -0
  5. package/dist/cache/blob.d.ts.map +1 -0
  6. package/dist/cache/blob.js +92 -0
  7. package/dist/cache/blob.js.map +1 -0
  8. package/dist/cache/diff-reader.d.ts +29 -0
  9. package/dist/cache/diff-reader.d.ts.map +1 -0
  10. package/dist/cache/diff-reader.js +34 -0
  11. package/dist/cache/diff-reader.js.map +1 -0
  12. package/dist/cache/index.d.ts +57 -0
  13. package/dist/cache/index.d.ts.map +1 -0
  14. package/dist/cache/index.js +99 -0
  15. package/dist/cache/index.js.map +1 -0
  16. package/dist/cache/key.d.ts +15 -0
  17. package/dist/cache/key.d.ts.map +1 -0
  18. package/dist/cache/key.js +32 -0
  19. package/dist/cache/key.js.map +1 -0
  20. package/dist/cache/lru.d.ts +21 -0
  21. package/dist/cache/lru.d.ts.map +1 -0
  22. package/dist/cache/lru.js +32 -0
  23. package/dist/cache/lru.js.map +1 -0
  24. package/dist/cache/sqlite.d.ts +22 -0
  25. package/dist/cache/sqlite.d.ts.map +1 -0
  26. package/dist/cache/sqlite.js +102 -0
  27. package/dist/cache/sqlite.js.map +1 -0
  28. package/dist/cache/vector.d.ts +42 -0
  29. package/dist/cache/vector.d.ts.map +1 -0
  30. package/dist/cache/vector.js +187 -0
  31. package/dist/cache/vector.js.map +1 -0
  32. package/dist/cli.d.ts +3 -0
  33. package/dist/cli.d.ts.map +1 -0
  34. package/dist/cli.js +205 -0
  35. package/dist/cli.js.map +1 -0
  36. package/dist/clients/amplitude.d.ts +24 -0
  37. package/dist/clients/amplitude.d.ts.map +1 -0
  38. package/dist/clients/amplitude.js +15 -0
  39. package/dist/clients/amplitude.js.map +1 -0
  40. package/dist/clients/clickhouse.d.ts +10 -0
  41. package/dist/clients/clickhouse.d.ts.map +1 -0
  42. package/dist/clients/clickhouse.js +8 -0
  43. package/dist/clients/clickhouse.js.map +1 -0
  44. package/dist/clients/cloud.d.ts +347 -0
  45. package/dist/clients/cloud.d.ts.map +1 -0
  46. package/dist/clients/cloud.js +402 -0
  47. package/dist/clients/cloud.js.map +1 -0
  48. package/dist/clients/http.d.ts +40 -0
  49. package/dist/clients/http.d.ts.map +1 -0
  50. package/dist/clients/http.js +67 -0
  51. package/dist/clients/http.js.map +1 -0
  52. package/dist/clients/index.d.ts +38 -0
  53. package/dist/clients/index.d.ts.map +1 -0
  54. package/dist/clients/index.js +24 -0
  55. package/dist/clients/index.js.map +1 -0
  56. package/dist/clients/jira.d.ts +16 -0
  57. package/dist/clients/jira.d.ts.map +1 -0
  58. package/dist/clients/jira.js +11 -0
  59. package/dist/clients/jira.js.map +1 -0
  60. package/dist/clients/loki.d.ts +7 -0
  61. package/dist/clients/loki.d.ts.map +1 -0
  62. package/dist/clients/loki.js +8 -0
  63. package/dist/clients/loki.js.map +1 -0
  64. package/dist/clients/retry.d.ts +28 -0
  65. package/dist/clients/retry.d.ts.map +1 -0
  66. package/dist/clients/retry.js +79 -0
  67. package/dist/clients/retry.js.map +1 -0
  68. package/dist/clients/testrelic.d.ts +90 -0
  69. package/dist/clients/testrelic.d.ts.map +1 -0
  70. package/dist/clients/testrelic.js +68 -0
  71. package/dist/clients/testrelic.js.map +1 -0
  72. package/dist/config.d.ts +216 -0
  73. package/dist/config.d.ts.map +1 -0
  74. package/dist/config.js +233 -0
  75. package/dist/config.js.map +1 -0
  76. package/dist/context/code-map.d.ts +35 -0
  77. package/dist/context/code-map.d.ts.map +1 -0
  78. package/dist/context/code-map.js +187 -0
  79. package/dist/context/code-map.js.map +1 -0
  80. package/dist/context/correlator.d.ts +32 -0
  81. package/dist/context/correlator.d.ts.map +1 -0
  82. package/dist/context/correlator.js +106 -0
  83. package/dist/context/correlator.js.map +1 -0
  84. package/dist/context/coverage-map.d.ts +25 -0
  85. package/dist/context/coverage-map.d.ts.map +1 -0
  86. package/dist/context/coverage-map.js +44 -0
  87. package/dist/context/coverage-map.js.map +1 -0
  88. package/dist/context/index.d.ts +20 -0
  89. package/dist/context/index.d.ts.map +1 -0
  90. package/dist/context/index.js +18 -0
  91. package/dist/context/index.js.map +1 -0
  92. package/dist/context/journey-graph.d.ts +22 -0
  93. package/dist/context/journey-graph.d.ts.map +1 -0
  94. package/dist/context/journey-graph.js +38 -0
  95. package/dist/context/journey-graph.js.map +1 -0
  96. package/dist/context/signal-map.d.ts +26 -0
  97. package/dist/context/signal-map.d.ts.map +1 -0
  98. package/dist/context/signal-map.js +30 -0
  99. package/dist/context/signal-map.js.map +1 -0
  100. package/dist/elicit/ask.d.ts +28 -0
  101. package/dist/elicit/ask.d.ts.map +1 -0
  102. package/dist/elicit/ask.js +31 -0
  103. package/dist/elicit/ask.js.map +1 -0
  104. package/dist/elicit/zod-to-json.d.ts +7 -0
  105. package/dist/elicit/zod-to-json.d.ts.map +1 -0
  106. package/dist/elicit/zod-to-json.js +37 -0
  107. package/dist/elicit/zod-to-json.js.map +1 -0
  108. package/dist/errors.d.ts +59 -0
  109. package/dist/errors.d.ts.map +1 -0
  110. package/dist/errors.js +122 -0
  111. package/dist/errors.js.map +1 -0
  112. package/dist/index.d.ts +43 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.js +127 -0
  115. package/dist/index.js.map +1 -0
  116. package/dist/logger.d.ts +6 -0
  117. package/dist/logger.d.ts.map +1 -0
  118. package/dist/logger.js +29 -0
  119. package/dist/logger.js.map +1 -0
  120. package/dist/prompts/index.d.ts +8 -0
  121. package/dist/prompts/index.d.ts.map +1 -0
  122. package/dist/prompts/index.js +86 -0
  123. package/dist/prompts/index.js.map +1 -0
  124. package/dist/registry/index.d.ts +70 -0
  125. package/dist/registry/index.d.ts.map +1 -0
  126. package/dist/registry/index.js +88 -0
  127. package/dist/registry/index.js.map +1 -0
  128. package/dist/registry/project.d.ts +20 -0
  129. package/dist/registry/project.d.ts.map +1 -0
  130. package/dist/registry/project.js +44 -0
  131. package/dist/registry/project.js.map +1 -0
  132. package/dist/resources/index.d.ts +13 -0
  133. package/dist/resources/index.d.ts.map +1 -0
  134. package/dist/resources/index.js +76 -0
  135. package/dist/resources/index.js.map +1 -0
  136. package/dist/sampling/bridge.d.ts +35 -0
  137. package/dist/sampling/bridge.d.ts.map +1 -0
  138. package/dist/sampling/bridge.js +39 -0
  139. package/dist/sampling/bridge.js.map +1 -0
  140. package/dist/telemetry/metrics.d.ts +29 -0
  141. package/dist/telemetry/metrics.d.ts.map +1 -0
  142. package/dist/telemetry/metrics.js +46 -0
  143. package/dist/telemetry/metrics.js.map +1 -0
  144. package/dist/telemetry/tokens.d.ts +16 -0
  145. package/dist/telemetry/tokens.d.ts.map +1 -0
  146. package/dist/telemetry/tokens.js +40 -0
  147. package/dist/telemetry/tokens.js.map +1 -0
  148. package/dist/tools/core/index.d.ts +8 -0
  149. package/dist/tools/core/index.d.ts.map +1 -0
  150. package/dist/tools/core/index.js +219 -0
  151. package/dist/tools/core/index.js.map +1 -0
  152. package/dist/tools/coverage/index.d.ts +9 -0
  153. package/dist/tools/coverage/index.d.ts.map +1 -0
  154. package/dist/tools/coverage/index.js +247 -0
  155. package/dist/tools/coverage/index.js.map +1 -0
  156. package/dist/tools/creation/index.d.ts +9 -0
  157. package/dist/tools/creation/index.d.ts.map +1 -0
  158. package/dist/tools/creation/index.js +357 -0
  159. package/dist/tools/creation/index.js.map +1 -0
  160. package/dist/tools/creation/templates.d.ts +17 -0
  161. package/dist/tools/creation/templates.d.ts.map +1 -0
  162. package/dist/tools/creation/templates.js +63 -0
  163. package/dist/tools/creation/templates.js.map +1 -0
  164. package/dist/tools/devtools/index.d.ts +9 -0
  165. package/dist/tools/devtools/index.d.ts.map +1 -0
  166. package/dist/tools/devtools/index.js +106 -0
  167. package/dist/tools/devtools/index.js.map +1 -0
  168. package/dist/tools/healing/index.d.ts +10 -0
  169. package/dist/tools/healing/index.d.ts.map +1 -0
  170. package/dist/tools/healing/index.js +190 -0
  171. package/dist/tools/healing/index.js.map +1 -0
  172. package/dist/tools/impact/index.d.ts +8 -0
  173. package/dist/tools/impact/index.d.ts.map +1 -0
  174. package/dist/tools/impact/index.js +215 -0
  175. package/dist/tools/impact/index.js.map +1 -0
  176. package/dist/tools/index.d.ts +9 -0
  177. package/dist/tools/index.d.ts.map +1 -0
  178. package/dist/tools/index.js +29 -0
  179. package/dist/tools/index.js.map +1 -0
  180. package/dist/tools/signals/index.d.ts +9 -0
  181. package/dist/tools/signals/index.d.ts.map +1 -0
  182. package/dist/tools/signals/index.js +100 -0
  183. package/dist/tools/signals/index.js.map +1 -0
  184. package/dist/tools/triage/index.d.ts +9 -0
  185. package/dist/tools/triage/index.d.ts.map +1 -0
  186. package/dist/tools/triage/index.js +366 -0
  187. package/dist/tools/triage/index.js.map +1 -0
  188. package/dist/transport/http.d.ts +16 -0
  189. package/dist/transport/http.d.ts.map +1 -0
  190. package/dist/transport/http.js +110 -0
  191. package/dist/transport/http.js.map +1 -0
  192. package/dist/transport/stdio.d.ts +6 -0
  193. package/dist/transport/stdio.d.ts.map +1 -0
  194. package/dist/transport/stdio.js +19 -0
  195. package/dist/transport/stdio.js.map +1 -0
  196. package/dist/types/index.d.ts +268 -0
  197. package/dist/types/index.d.ts.map +1 -0
  198. package/dist/types/index.js +6 -0
  199. package/dist/types/index.js.map +1 -0
  200. package/dist/version.d.ts +7 -0
  201. package/dist/version.d.ts.map +1 -0
  202. package/dist/version.js +7 -0
  203. package/dist/version.js.map +1 -0
  204. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.js","sourceRoot":"","sources":["../../src/clients/jira.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,OAAO,CAAC,MAAqB;IAC3C,OAAO;QACL,iBAAiB,CAAC,KAAa;YAC7B,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,WAAW,CAAC,IAKX;YACC,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { LokiQueryResponse } from "../types/index.js";
2
+ import type { ServiceClient } from "./http.js";
3
+ export declare function lokiOps(client: ServiceClient): {
4
+ queryRange(query: string, time_range?: string): Promise<LokiQueryResponse>;
5
+ };
6
+ export type LokiOps = ReturnType<typeof lokiOps>;
7
+ //# sourceMappingURL=loki.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loki.d.ts","sourceRoot":"","sources":["../../src/clients/loki.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa;sBAEvB,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;EAI7E;AAED,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export function lokiOps(client) {
2
+ return {
3
+ queryRange(query, time_range) {
4
+ return client.get("/query_range", { query, time_range });
5
+ },
6
+ };
7
+ }
8
+ //# sourceMappingURL=loki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loki.js","sourceRoot":"","sources":["../../src/clients/loki.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,OAAO,CAAC,MAAqB;IAC3C,OAAO;QACL,UAAU,CAAC,KAAa,EAAE,UAAmB;YAC3C,OAAO,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Hand-rolled circuit breaker + exponential-backoff retry with full jitter.
3
+ * No external deps. Designed to be safe for stdio transport: no process.exit
4
+ * on open, just fails fast.
5
+ */
6
+ export interface RetryOptions {
7
+ maxRetries?: number;
8
+ baseDelayMs?: number;
9
+ maxDelayMs?: number;
10
+ }
11
+ export interface CircuitOptions {
12
+ /** Fail count before opening the circuit. */
13
+ threshold?: number;
14
+ /** How long to hold the circuit open after it trips. */
15
+ cooldownMs?: number;
16
+ }
17
+ export declare class CircuitBreaker {
18
+ private readonly state;
19
+ private readonly threshold;
20
+ private readonly cooldownMs;
21
+ constructor(opts?: CircuitOptions);
22
+ assertClosed(service: string): void;
23
+ recordSuccess(service: string): void;
24
+ recordFailure(service: string): void;
25
+ isOpen(service: string): boolean;
26
+ }
27
+ export declare function withRetry<T>(service: string, fn: () => Promise<T>, opts?: RetryOptions, breaker?: CircuitBreaker): Promise<T>;
28
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/clients/retry.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,IAAI,GAAE,cAAmB;IAK9B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAUnC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIpC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAUpC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAKxC;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,GAAE,YAAiB,EACvB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,CAAC,CAAC,CAgCZ"}
@@ -0,0 +1,79 @@
1
+ import { getLogger } from "../logger.js";
2
+ import { CircuitOpenError, RateLimitedError, TestRelicMcpError } from "../errors.js";
3
+ export class CircuitBreaker {
4
+ state = {};
5
+ threshold;
6
+ cooldownMs;
7
+ constructor(opts = {}) {
8
+ this.threshold = opts.threshold ?? 5;
9
+ this.cooldownMs = opts.cooldownMs ?? 30_000;
10
+ }
11
+ assertClosed(service) {
12
+ const s = this.state[service];
13
+ if (!s || s.openedAt === null)
14
+ return;
15
+ if (Date.now() - s.openedAt > this.cooldownMs) {
16
+ this.state[service] = { failures: 0, openedAt: null };
17
+ return;
18
+ }
19
+ throw new CircuitOpenError(service);
20
+ }
21
+ recordSuccess(service) {
22
+ this.state[service] = { failures: 0, openedAt: null };
23
+ }
24
+ recordFailure(service) {
25
+ const s = this.state[service] ?? { failures: 0, openedAt: null };
26
+ s.failures++;
27
+ if (s.failures >= this.threshold && s.openedAt === null) {
28
+ s.openedAt = Date.now();
29
+ getLogger().warn({ service, failures: s.failures }, "circuit breaker tripped");
30
+ }
31
+ this.state[service] = s;
32
+ }
33
+ isOpen(service) {
34
+ const s = this.state[service];
35
+ if (!s || s.openedAt === null)
36
+ return false;
37
+ return Date.now() - s.openedAt < this.cooldownMs;
38
+ }
39
+ }
40
+ export async function withRetry(service, fn, opts = {}, breaker) {
41
+ const maxRetries = opts.maxRetries ?? 3;
42
+ const baseDelayMs = opts.baseDelayMs ?? 250;
43
+ const maxDelayMs = opts.maxDelayMs ?? 5_000;
44
+ if (breaker)
45
+ breaker.assertClosed(service);
46
+ let lastErr;
47
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
48
+ try {
49
+ const result = await fn();
50
+ breaker?.recordSuccess(service);
51
+ return result;
52
+ }
53
+ catch (err) {
54
+ lastErr = err;
55
+ const retriable = err instanceof TestRelicMcpError ? err.retriable : true;
56
+ if (!retriable || attempt === maxRetries) {
57
+ breaker?.recordFailure(service);
58
+ throw err;
59
+ }
60
+ if (err instanceof RateLimitedError) {
61
+ // Rate-limited: longer backoff, don't count toward circuit breaker.
62
+ const wait = Math.min(maxDelayMs, baseDelayMs * Math.pow(4, attempt));
63
+ await sleep(jittered(wait));
64
+ continue;
65
+ }
66
+ const wait = Math.min(maxDelayMs, baseDelayMs * Math.pow(2, attempt));
67
+ await sleep(jittered(wait));
68
+ }
69
+ }
70
+ breaker?.recordFailure(service);
71
+ throw lastErr;
72
+ }
73
+ function jittered(ms) {
74
+ return Math.floor(Math.random() * ms);
75
+ }
76
+ function sleep(ms) {
77
+ return new Promise((r) => setTimeout(r, ms));
78
+ }
79
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/clients/retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import type { ActiveAlert, FlakyTest, PaginatedResponse, ProjectConfig, ProjectTrends, RunFailuresResponse, TestRun, UserJourney, CoverageReport, CoverageGap, CodeNode, TestCoverageEntry } from "../types/index.js";
2
+ import type { ServiceClient } from "./http.js";
3
+ /**
4
+ * TestRelic API client methods. v2 adds endpoints for journeys, coverage map,
5
+ * code map, and healing that are served by the mock server (and will be added
6
+ * to the real platform API).
7
+ */
8
+ export declare function testrelicOps(client: ServiceClient): {
9
+ listRuns(params: {
10
+ project_id?: string;
11
+ framework?: string;
12
+ status?: string;
13
+ cursor?: string;
14
+ limit?: number;
15
+ }): Promise<PaginatedResponse<TestRun>>;
16
+ getRun(run_id: string): Promise<TestRun>;
17
+ getRunFailures(run_id: string): Promise<RunFailuresResponse>;
18
+ getFlakyTests(params: {
19
+ project_id?: string;
20
+ days?: number;
21
+ threshold?: number;
22
+ }): Promise<{
23
+ data: FlakyTest[];
24
+ total: number;
25
+ days: number;
26
+ }>;
27
+ dismissFlakyTest(test_id: string, reason: string): Promise<{
28
+ success: boolean;
29
+ test_id: string;
30
+ known_flaky: boolean;
31
+ }>;
32
+ getProjectConfig(project_id: string): Promise<ProjectConfig>;
33
+ getProjectTrends(project_id: string): Promise<ProjectTrends>;
34
+ getActiveAlerts(): Promise<ActiveAlert[]>;
35
+ getAiRca(run_id: string): Promise<{
36
+ run_id: string;
37
+ root_cause: string;
38
+ confidence: number;
39
+ affected_component: string;
40
+ suggested_fix: string;
41
+ evidence: string[];
42
+ generated_at: string;
43
+ }>;
44
+ suggestFix(run_id: string, test_name: string): Promise<{
45
+ run_id: string;
46
+ test_name: string;
47
+ suggestion: {
48
+ description: string;
49
+ code_diff: string;
50
+ affected_files: string[];
51
+ confidence: number;
52
+ };
53
+ }>;
54
+ /** v2: user journeys (Amplitude-derived, persisted on the platform). */
55
+ listJourneys(project_id: string, limit?: number): Promise<{
56
+ data: UserJourney[];
57
+ total: number;
58
+ }>;
59
+ /** v2: test→journey/code-node map. */
60
+ getTestMap(project_id: string): Promise<{
61
+ data: TestCoverageEntry[];
62
+ }>;
63
+ /** v2: static code map. */
64
+ getCodeMap(project_id: string): Promise<{
65
+ data: CodeNode[];
66
+ }>;
67
+ /** v2: the pre-computed coverage report. */
68
+ getCoverageReport(project_id: string): Promise<CoverageReport>;
69
+ /** v2: ranked coverage gaps for a project. */
70
+ getCoverageGaps(project_id: string, limit?: number): Promise<{
71
+ data: CoverageGap[];
72
+ }>;
73
+ /** v2: artefact fetch for replay (video url, trace url, step-level log). */
74
+ getRunArtifacts(run_id: string): Promise<{
75
+ run_id: string;
76
+ artifacts: Array<{
77
+ kind: string;
78
+ url: string;
79
+ note?: string;
80
+ }>;
81
+ }>;
82
+ /** v2: test source by test_id. */
83
+ getTestSource(test_id: string): Promise<{
84
+ test_id: string;
85
+ source: string;
86
+ file: string;
87
+ }>;
88
+ };
89
+ export type TestRelicOps = ReturnType<typeof testrelicOps>;
90
+ //# sourceMappingURL=testrelic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testrelic.d.ts","sourceRoot":"","sources":["../../src/clients/testrelic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * TestRelic API client methods. v2 adds endpoints for journeys, coverage map,
3
+ * code map, and healing that are served by the mock server (and will be added
4
+ * to the real platform API).
5
+ */
6
+ export function testrelicOps(client) {
7
+ return {
8
+ listRuns(params) {
9
+ return client.get("/runs", params);
10
+ },
11
+ getRun(run_id) {
12
+ return client.get(`/runs/${run_id}`);
13
+ },
14
+ getRunFailures(run_id) {
15
+ return client.get(`/runs/${run_id}/failures`);
16
+ },
17
+ getFlakyTests(params) {
18
+ return client.get("/flaky-tests", params);
19
+ },
20
+ dismissFlakyTest(test_id, reason) {
21
+ return client.patch(`/tests/${test_id}/dismiss-flaky`, { reason });
22
+ },
23
+ getProjectConfig(project_id) {
24
+ return client.get(`/projects/${project_id}/config`);
25
+ },
26
+ getProjectTrends(project_id) {
27
+ return client.get(`/projects/${project_id}/trends`);
28
+ },
29
+ getActiveAlerts() {
30
+ return client.get("/alerts/active");
31
+ },
32
+ getAiRca(run_id) {
33
+ return client.post("/ai-rca", { run_id });
34
+ },
35
+ suggestFix(run_id, test_name) {
36
+ return client.post("/suggest-fix", { run_id, test_name });
37
+ },
38
+ /** v2: user journeys (Amplitude-derived, persisted on the platform). */
39
+ listJourneys(project_id, limit = 50) {
40
+ return client.get("/journeys", { project_id, limit });
41
+ },
42
+ /** v2: test→journey/code-node map. */
43
+ getTestMap(project_id) {
44
+ return client.get("/test-map", { project_id });
45
+ },
46
+ /** v2: static code map. */
47
+ getCodeMap(project_id) {
48
+ return client.get("/code-map", { project_id });
49
+ },
50
+ /** v2: the pre-computed coverage report. */
51
+ getCoverageReport(project_id) {
52
+ return client.get(`/projects/${project_id}/coverage-report`);
53
+ },
54
+ /** v2: ranked coverage gaps for a project. */
55
+ getCoverageGaps(project_id, limit = 20) {
56
+ return client.get(`/projects/${project_id}/coverage-gaps`, { limit });
57
+ },
58
+ /** v2: artefact fetch for replay (video url, trace url, step-level log). */
59
+ getRunArtifacts(run_id) {
60
+ return client.get(`/runs/${run_id}/artifacts`);
61
+ },
62
+ /** v2: test source by test_id. */
63
+ getTestSource(test_id) {
64
+ return client.get(`/tests/${test_id}/source`);
65
+ },
66
+ };
67
+ }
68
+ //# sourceMappingURL=testrelic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testrelic.js","sourceRoot":"","sources":["../../src/clients/testrelic.ts"],"names":[],"mappings":"AAgBA;;;;GAIG;AAEH,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,OAAO;QACL,QAAQ,CAAC,MAMR;YACC,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,CAAC,MAAc;YACnB,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,cAAc,CAAC,MAAc;YAC3B,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,WAAW,CAAC,CAAC;QAChD,CAAC;QACD,aAAa,CAAC,MAAkE;YAK9E,OAAO,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,gBAAgB,CAAC,OAAe,EAAE,MAAc;YAK9C,OAAO,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,gBAAgB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,gBAAgB,CAAC,UAAkB;YACjC,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,UAAU,SAAS,CAAC,CAAC;QACtD,CAAC;QACD,gBAAgB,CAAC,UAAkB;YACjC,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,UAAU,SAAS,CAAC,CAAC;QACtD,CAAC;QACD,eAAe;YACb,OAAO,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtC,CAAC;QACD,QAAQ,CAAC,MAAc;YASrB,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,UAAU,CAAC,MAAc,EAAE,SAAiB;YAU1C,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,wEAAwE;QACxE,YAAY,CAAC,UAAkB,EAAE,KAAK,GAAG,EAAE;YACzC,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,sCAAsC;QACtC,UAAU,CAAC,UAAkB;YAC3B,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,2BAA2B;QAC3B,UAAU,CAAC,UAAkB;YAC3B,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,4CAA4C;QAC5C,iBAAiB,CAAC,UAAkB;YAClC,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,UAAU,kBAAkB,CAAC,CAAC;QAC/D,CAAC;QACD,8CAA8C;QAC9C,eAAe,CAAC,UAAkB,EAAE,KAAK,GAAG,EAAE;YAC5C,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,UAAU,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,4EAA4E;QAC5E,eAAe,CAAC,MAAc;YAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,YAAY,CAAC,CAAC;QACjD,CAAC;QACD,kCAAkC;QAClC,aAAa,CAAC,OAAe;YAC3B,OAAO,MAAM,CAAC,GAAG,CAAC,UAAU,OAAO,SAAS,CAAC,CAAC;QAChD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,216 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * All Zod schemas live here. The public type surface is defined directly
4
+ * below and is verified against `src/config.d.ts` by `scripts/copy-config.js`
5
+ * to keep the two surfaces in lock-step.
6
+ *
7
+ * The v2 config is radically simpler than v1: the MCP talks to exactly one
8
+ * upstream (cloud-platform-app). Everything else — Jira, Amplitude, Loki,
9
+ * GitHub — is resolved server-side from the authenticated user's org
10
+ * integrations. See cloud-platform-app/server/src/routes/mcp.routes.ts.
11
+ */
12
+ export declare const CapabilitySchema: z.ZodEnum<["core", "coverage", "creation", "healing", "impact", "triage", "signals", "devtools", "config"]>;
13
+ export declare const TransportSchema: z.ZodEnum<["stdio", "http"]>;
14
+ export declare const LogLevelSchema: z.ZodEnum<["debug", "info", "warn", "error"]>;
15
+ export type Capability = z.infer<typeof CapabilitySchema>;
16
+ export type Transport = z.infer<typeof TransportSchema>;
17
+ export type LogLevel = z.infer<typeof LogLevelSchema>;
18
+ export declare const ServerConfigSchema: z.ZodObject<{
19
+ port: z.ZodOptional<z.ZodNumber>;
20
+ host: z.ZodOptional<z.ZodString>;
21
+ transport: z.ZodOptional<z.ZodEnum<["stdio", "http"]>>;
22
+ }, "strict", z.ZodTypeAny, {
23
+ port?: number | undefined;
24
+ host?: string | undefined;
25
+ transport?: "stdio" | "http" | undefined;
26
+ }, {
27
+ port?: number | undefined;
28
+ host?: string | undefined;
29
+ transport?: "stdio" | "http" | undefined;
30
+ }>;
31
+ export declare const TimeoutConfigSchema: z.ZodObject<{
32
+ action: z.ZodOptional<z.ZodNumber>;
33
+ upstream: z.ZodOptional<z.ZodNumber>;
34
+ analysis: z.ZodOptional<z.ZodNumber>;
35
+ }, "strict", z.ZodTypeAny, {
36
+ action?: number | undefined;
37
+ upstream?: number | undefined;
38
+ analysis?: number | undefined;
39
+ }, {
40
+ action?: number | undefined;
41
+ upstream?: number | undefined;
42
+ analysis?: number | undefined;
43
+ }>;
44
+ /**
45
+ * The ONE place users configure authentication. Everything else is pulled
46
+ * automatically from /api/v1/mcp/bootstrap once the MCP authenticates.
47
+ */
48
+ export declare const CloudConfigSchema: z.ZodObject<{
49
+ baseUrl: z.ZodOptional<z.ZodString>;
50
+ token: z.ZodOptional<z.ZodString>;
51
+ defaultRepoId: z.ZodOptional<z.ZodString>;
52
+ }, "strict", z.ZodTypeAny, {
53
+ baseUrl?: string | undefined;
54
+ token?: string | undefined;
55
+ defaultRepoId?: string | undefined;
56
+ }, {
57
+ baseUrl?: string | undefined;
58
+ token?: string | undefined;
59
+ defaultRepoId?: string | undefined;
60
+ }>;
61
+ export declare const ConfigSchema: z.ZodObject<{
62
+ server: z.ZodOptional<z.ZodObject<{
63
+ port: z.ZodOptional<z.ZodNumber>;
64
+ host: z.ZodOptional<z.ZodString>;
65
+ transport: z.ZodOptional<z.ZodEnum<["stdio", "http"]>>;
66
+ }, "strict", z.ZodTypeAny, {
67
+ port?: number | undefined;
68
+ host?: string | undefined;
69
+ transport?: "stdio" | "http" | undefined;
70
+ }, {
71
+ port?: number | undefined;
72
+ host?: string | undefined;
73
+ transport?: "stdio" | "http" | undefined;
74
+ }>>;
75
+ capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<["core", "coverage", "creation", "healing", "impact", "triage", "signals", "devtools", "config"]>, "many">>;
76
+ timeouts: z.ZodOptional<z.ZodObject<{
77
+ action: z.ZodOptional<z.ZodNumber>;
78
+ upstream: z.ZodOptional<z.ZodNumber>;
79
+ analysis: z.ZodOptional<z.ZodNumber>;
80
+ }, "strict", z.ZodTypeAny, {
81
+ action?: number | undefined;
82
+ upstream?: number | undefined;
83
+ analysis?: number | undefined;
84
+ }, {
85
+ action?: number | undefined;
86
+ upstream?: number | undefined;
87
+ analysis?: number | undefined;
88
+ }>>;
89
+ outputDir: z.ZodOptional<z.ZodString>;
90
+ cacheDir: z.ZodOptional<z.ZodString>;
91
+ isolated: z.ZodOptional<z.ZodBoolean>;
92
+ saveSession: z.ZodOptional<z.ZodBoolean>;
93
+ sharedRepoContext: z.ZodOptional<z.ZodBoolean>;
94
+ cloud: z.ZodOptional<z.ZodObject<{
95
+ baseUrl: z.ZodOptional<z.ZodString>;
96
+ token: z.ZodOptional<z.ZodString>;
97
+ defaultRepoId: z.ZodOptional<z.ZodString>;
98
+ }, "strict", z.ZodTypeAny, {
99
+ baseUrl?: string | undefined;
100
+ token?: string | undefined;
101
+ defaultRepoId?: string | undefined;
102
+ }, {
103
+ baseUrl?: string | undefined;
104
+ token?: string | undefined;
105
+ defaultRepoId?: string | undefined;
106
+ }>>;
107
+ logLevel: z.ZodOptional<z.ZodEnum<["debug", "info", "warn", "error"]>>;
108
+ mockMode: z.ZodOptional<z.ZodBoolean>;
109
+ mockServerUrl: z.ZodOptional<z.ZodString>;
110
+ tokenBudgetPerTool: z.ZodOptional<z.ZodNumber>;
111
+ }, "strict", z.ZodTypeAny, {
112
+ server?: {
113
+ port?: number | undefined;
114
+ host?: string | undefined;
115
+ transport?: "stdio" | "http" | undefined;
116
+ } | undefined;
117
+ capabilities?: ("core" | "coverage" | "creation" | "healing" | "impact" | "triage" | "signals" | "devtools" | "config")[] | undefined;
118
+ timeouts?: {
119
+ action?: number | undefined;
120
+ upstream?: number | undefined;
121
+ analysis?: number | undefined;
122
+ } | undefined;
123
+ outputDir?: string | undefined;
124
+ cacheDir?: string | undefined;
125
+ isolated?: boolean | undefined;
126
+ saveSession?: boolean | undefined;
127
+ sharedRepoContext?: boolean | undefined;
128
+ cloud?: {
129
+ baseUrl?: string | undefined;
130
+ token?: string | undefined;
131
+ defaultRepoId?: string | undefined;
132
+ } | undefined;
133
+ logLevel?: "debug" | "info" | "warn" | "error" | undefined;
134
+ mockMode?: boolean | undefined;
135
+ mockServerUrl?: string | undefined;
136
+ tokenBudgetPerTool?: number | undefined;
137
+ }, {
138
+ server?: {
139
+ port?: number | undefined;
140
+ host?: string | undefined;
141
+ transport?: "stdio" | "http" | undefined;
142
+ } | undefined;
143
+ capabilities?: ("core" | "coverage" | "creation" | "healing" | "impact" | "triage" | "signals" | "devtools" | "config")[] | undefined;
144
+ timeouts?: {
145
+ action?: number | undefined;
146
+ upstream?: number | undefined;
147
+ analysis?: number | undefined;
148
+ } | undefined;
149
+ outputDir?: string | undefined;
150
+ cacheDir?: string | undefined;
151
+ isolated?: boolean | undefined;
152
+ saveSession?: boolean | undefined;
153
+ sharedRepoContext?: boolean | undefined;
154
+ cloud?: {
155
+ baseUrl?: string | undefined;
156
+ token?: string | undefined;
157
+ defaultRepoId?: string | undefined;
158
+ } | undefined;
159
+ logLevel?: "debug" | "info" | "warn" | "error" | undefined;
160
+ mockMode?: boolean | undefined;
161
+ mockServerUrl?: string | undefined;
162
+ tokenBudgetPerTool?: number | undefined;
163
+ }>;
164
+ export type ServerConfig = z.infer<typeof ServerConfigSchema>;
165
+ export type TimeoutConfig = z.infer<typeof TimeoutConfigSchema>;
166
+ export type CloudConfig = z.infer<typeof CloudConfigSchema>;
167
+ export type Config = z.infer<typeof ConfigSchema>;
168
+ export interface ResolvedConfig {
169
+ server: Required<ServerConfig> & {
170
+ port: number;
171
+ };
172
+ capabilities: Capability[];
173
+ timeouts: Required<TimeoutConfig>;
174
+ outputDir: string;
175
+ cacheDir: string;
176
+ isolated: boolean;
177
+ saveSession: boolean;
178
+ sharedRepoContext: boolean;
179
+ cloud: {
180
+ baseUrl: string;
181
+ token: string;
182
+ defaultRepoId: string | undefined;
183
+ };
184
+ logLevel: LogLevel;
185
+ mockMode: boolean;
186
+ mockServerUrl: string;
187
+ tokenBudgetPerTool: number;
188
+ }
189
+ /**
190
+ * Read the token from ~/.testrelic/token if it exists. Silently returns
191
+ * undefined otherwise — callers decide whether missing = fatal.
192
+ */
193
+ export declare function readTokenFile(path?: string): string | undefined;
194
+ export declare function tokenFilePath(): string;
195
+ /**
196
+ * Load a JSON config file from disk and validate it.
197
+ */
198
+ export declare function loadConfigFile(path: string): Config;
199
+ /**
200
+ * Merge precedence (highest wins): CLI flags > env > config file > defaults.
201
+ */
202
+ export declare function mergeConfig(...layers: Array<Config | undefined>): Config;
203
+ /**
204
+ * Apply defaults and normalize.
205
+ *
206
+ * In mockMode, the cloud baseUrl defaults to `${mockServerUrl}/api/v1` so the
207
+ * MCP transparently hits the local mock-server. Otherwise it defaults to the
208
+ * production platform URL and pulls the token from ~/.testrelic/token.
209
+ */
210
+ export declare function resolveConfig(config?: Config): ResolvedConfig;
211
+ /**
212
+ * Pick config from environment variables. Only reads at top level — no secret
213
+ * values are logged.
214
+ */
215
+ export declare function configFromEnv(env?: NodeJS.ProcessEnv): Config;
216
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;;;;;;;GASG;AAEH,eAAO,MAAM,gBAAgB,6GAU3B,CAAC;AAEH,eAAO,MAAM,eAAe,8BAA4B,CAAC;AAEzD,eAAO,MAAM,cAAc,+CAA6C,CAAC;AAEzE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAMpB,CAAC;AAEZ,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAMrB,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAMnB,CAAC;AAEZ,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBd,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAKD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAmB,GAAG,MAAM,GAAG,SAAS,CAQ3E;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBnD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAmBxE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAW,GAAG,cAAc,CAqCjE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CA6B1E"}